12 #include "DCCpp_Uno.h" 21 void Sensor::begin(
int snum,
int pin,
int pullUp) {
22 #ifdef DCCPP_DEBUG_MODE 23 if (EEStore::eeStore != NULL)
25 INTERFACE.println(F(
"Sensor::begin() must be called BEFORE DCCpp.begin() !"));
29 if (firstSensor == NULL) {
32 else if (
get(snum) == NULL) {
34 while (tt->nextSensor != NULL)
36 tt->nextSensor =
this;
39 this->
set(snum, pin, pullUp);
41 #ifdef USE_TEXTCOMMAND 42 INTERFACE.print(
"<O>");
43 #if !defined(USE_ETHERNET) 44 INTERFACE.println(
"");
51 void Sensor::set(
int snum,
int pin,
int pullUp) {
52 this->data.snum = snum;
54 this->data.pullUp = (pullUp == 0 ? LOW : HIGH);
58 ArduiEmulator::Arduino::dontCheckNextPinAccess =
true;
60 digitalWrite(pin, pullUp);
62 ArduiEmulator::Arduino::dontCheckNextPinAccess =
true;
69 Sensor* Sensor::get(
int n) {
71 for (tt = firstSensor; tt != NULL && tt->data.snum != n; tt = tt->nextSensor);
76 void Sensor::remove(
int n) {
79 for (tt = firstSensor; tt != NULL && tt->data.snum != n; pp = tt, tt = tt->nextSensor);
82 #ifdef USE_TEXTCOMMAND 83 INTERFACE.print(
"<X>");
84 #if !defined(USE_ETHERNET) 85 INTERFACE.println(
"");
91 if (tt == firstSensor)
92 firstSensor = tt->nextSensor;
94 pp->nextSensor = tt->nextSensor;
98 #ifdef USE_TEXTCOMMAND 99 INTERFACE.print(
"<O>");
100 #if !defined(USE_ETHERNET) 101 INTERFACE.println(
"");
108 int Sensor::count() {
111 for (tt = firstSensor; tt != NULL; tt = tt->nextSensor)
118 void Sensor::check(){
121 for(tt=firstSensor;tt!=NULL;tt=tt->nextSensor){
122 tt->signal=(float)(tt->signal*(1.0-SENSOR_DECAY)+digitalRead(tt->data.pin)*SENSOR_DECAY);
124 if(!tt->active && tt->signal<0.5){
126 INTERFACE.print(
"<Q");
127 INTERFACE.print(tt->data.snum);
128 INTERFACE.print(
">");
129 }
else if(tt->active && tt->signal>0.9){
131 INTERFACE.print(
"<q");
132 INTERFACE.print(tt->data.snum);
133 INTERFACE.print(
">");
135 #if !defined(USE_ETHERNET) 136 INTERFACE.println(
"");
142 #ifdef DCCPP_PRINT_DCCPP 145 void Sensor::show() {
148 if (firstSensor == NULL) {
149 INTERFACE.print(
"<X>");
150 #if !defined(USE_ETHERNET) 151 INTERFACE.println(
"");
156 for (tt = firstSensor; tt != NULL; tt = tt->nextSensor) {
157 INTERFACE.print(
"<Q");
158 INTERFACE.print(tt->data.snum);
159 INTERFACE.print(
" ");
160 INTERFACE.print(tt->data.pin);
161 INTERFACE.print(
" ");
162 INTERFACE.print(tt->data.pullUp);
163 INTERFACE.print(
">");
164 #if !defined(USE_ETHERNET) 165 INTERFACE.println(
"");
172 void Sensor::status() {
175 if (firstSensor == NULL) {
176 INTERFACE.print(
"<X>");
177 #if !defined(USE_ETHERNET) 178 INTERFACE.println(
"");
183 for (tt = firstSensor; tt != NULL; tt = tt->nextSensor) {
184 INTERFACE.print(tt->active ?
"<Q" :
"<q");
185 INTERFACE.print(tt->data.snum);
186 INTERFACE.print(
">");
187 #if !defined(USE_ETHERNET) 188 INTERFACE.println(
"");
198 void Sensor::load() {
202 for (
int i = 0; i<EEStore::eeStore->data.nSensors; i++) {
204 EEPROM.get(EEStore::pointer(), (
void *)&(data),
sizeof(
SensorData));
206 EEPROM.get(EEStore::pointer(), data);
208 #if defined(USE_TEXTCOMMAND) 209 tt = create(data.snum, data.pin, data.pullUp);
212 #ifdef DCCPP_DEBUG_MODE 214 INTERFACE.println(F(
"Sensor::begin() must be called BEFORE Sensor::load() !"));
217 tt->set(data.snum, data.pin, data.pullUp);
219 EEStore::advance(
sizeof(tt->data));
225 void Sensor::store() {
229 EEStore::eeStore->data.nSensors = 0;
233 EEPROM.put(EEStore::pointer(), (
void *)&(tt->data),
sizeof(
SensorData));
235 EEPROM.put(EEStore::pointer(), tt->data);
237 EEStore::advance(
sizeof(tt->data));
239 EEStore::eeStore->data.nSensors++;
244 #if defined(USE_TEXTCOMMAND) 247 void Sensor::parse(
char *c) {
251 switch (sscanf(c,
"%d %d %d", &n, &s, &m)) {
261 #ifdef DCCPP_PRINT_DCCPP 266 #ifdef USE_TEXTCOMMAND 268 INTERFACE.print(
"<X>");
269 #if !defined(USE_ETHERNET) 270 INTERFACE.println(
"");
279 Sensor *Sensor::create(
int snum,
int pin,
int pullUp) {
283 #ifdef USE_TEXTCOMMAND 284 INTERFACE.print(
"<X>");
285 #if !defined(USE_ETHERNET) 286 INTERFACE.println(
"");
292 tt->begin(snum, pin, pullUp);
301 Sensor *Sensor::firstSensor=NULL;