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) {
33 Sensor *tt = firstSensor;
34 while (tt->nextSensor != NULL)
36 tt->nextSensor =
this;
39 this->
set(snum, pin, pullUp);
41 #ifdef DCCPP_DEBUG_MODE 42 INTERFACE.println(
"<O>");
48 void Sensor::set(
int snum,
int pin,
int pullUp) {
49 this->data.snum = snum;
51 this->data.pullUp = (pullUp == 0 ? LOW : HIGH);
55 ArduiEmulator::Arduino::dontCheckNextPinAccess =
true;
57 digitalWrite(pin, pullUp);
59 ArduiEmulator::Arduino::dontCheckNextPinAccess =
true;
66 Sensor* Sensor::get(
int n) {
68 for (tt = firstSensor; tt != NULL && tt->data.snum != n; tt = tt->nextSensor);
73 void Sensor::remove(
int n) {
76 for (tt = firstSensor; tt != NULL && tt->data.snum != n; pp = tt, tt = tt->nextSensor);
79 INTERFACE.println(
"<X>");
83 if (tt == firstSensor)
84 firstSensor = tt->nextSensor;
86 pp->nextSensor = tt->nextSensor;
90 INTERFACE.println(
"<O>");
98 for (tt = firstSensor; tt != NULL; tt = tt->nextSensor)
105 void Sensor::check(){
108 for(tt=firstSensor;tt!=NULL;tt=tt->nextSensor){
109 tt->signal=(float)(tt->signal*(1.0-SENSOR_DECAY)+digitalRead(tt->data.pin)*SENSOR_DECAY);
111 if(!tt->active && tt->signal<0.5){
113 INTERFACE.print(
"<Q");
114 INTERFACE.print(tt->data.snum);
115 INTERFACE.println(
">");
116 }
else if(tt->active && tt->signal>0.9){
118 INTERFACE.print(
"<q");
119 INTERFACE.print(tt->data.snum);
120 INTERFACE.println(
">");
126 #ifdef DCCPP_PRINT_DCCPP 129 void Sensor::show() {
132 if (firstSensor == NULL) {
133 INTERFACE.println(
"<X>");
137 for (tt = firstSensor; tt != NULL; tt = tt->nextSensor) {
138 INTERFACE.print(
"<Q");
139 INTERFACE.print(tt->data.snum);
140 INTERFACE.print(
" ");
141 INTERFACE.print(tt->data.pin);
142 INTERFACE.print(
" ");
143 INTERFACE.print(tt->data.pullUp);
144 INTERFACE.println(
">");
150 void Sensor::status() {
153 if (firstSensor == NULL) {
154 INTERFACE.println(
"<X>");
158 for (tt = firstSensor; tt != NULL; tt = tt->nextSensor) {
159 INTERFACE.print(tt->active ?
"<Q" :
"<q");
160 INTERFACE.print(tt->data.snum);
161 INTERFACE.println(
">");
170 void Sensor::load() {
171 struct SensorData data;
174 for (
int i = 0; i<EEStore::eeStore->data.nSensors; i++) {
176 EEPROM.get(EEStore::pointer(), (
void *)&(data),
sizeof(SensorData));
178 EEPROM.get(EEStore::pointer(), data);
180 #if defined(USE_TEXTCOMMAND) 181 tt = create(data.snum, data.pin, data.pullUp);
184 #ifdef DCCPP_DEBUG_MODE 186 INTERFACE.println(F(
"Sensor::begin() must be called BEFORE Sensor::load() !"));
189 tt->set(data.snum, data.pin, data.pullUp);
191 EEStore::advance(
sizeof(tt->data));
197 void Sensor::store() {
201 EEStore::eeStore->data.nSensors = 0;
205 EEPROM.put(EEStore::pointer(), (
void *)&(tt->data),
sizeof(SensorData));
207 EEPROM.put(EEStore::pointer(), tt->data);
209 EEStore::advance(
sizeof(tt->data));
211 EEStore::eeStore->data.nSensors++;
216 #if defined(USE_TEXTCOMMAND) 219 void Sensor::parse(
char *c) {
223 switch (sscanf(c,
"%d %d %d", &n, &s, &m)) {
233 #ifdef DCCPP_DEBUG_MODE 239 INTERFACE.print(
"<X>");
247 Sensor *Sensor::create(
int snum,
int pin,
int pullUp) {
248 Sensor *tt =
new Sensor();
251 #ifdef DCCPP_DEBUG_MODE 252 INTERFACE.println(
"<X>");
257 tt->begin(snum, pin, pullUp);
266 Sensor *Sensor::firstSensor=NULL;