18 #include "DCCpp_Uno.h" 27 void Sensor::begin(
int snum,
int pin,
int pullUp) {
28 #if defined(USE_EEPROM) && defined(DCCPP_DEBUG_MODE) 29 if (strncmp(EEStore::data.
id, EESTORE_ID,
sizeof(EESTORE_ID)) != 0) {
30 DCCPP_INTERFACE.println(F(
"Sensor::begin() must be called BEFORE DCCpp.begin() !"));
34 if (firstSensor == NULL) {
37 else if (get(snum) == NULL) {
38 Sensor *tt = firstSensor;
39 while (tt->nextSensor != NULL)
41 tt->nextSensor =
this;
44 this->set(snum, pin, pullUp);
46 #ifdef USE_TEXTCOMMAND 47 DCCPP_INTERFACE.print(
"<O>");
48 #if !defined(USE_ETHERNET) 49 DCCPP_INTERFACE.println(
"");
56 void Sensor::set(
int snum,
int pin,
int pullUp) {
57 this->data.snum = snum;
59 this->data.pullUp = (pullUp == 0 ? LOW : HIGH);
63 dontCheckNextPinAccess =
true;
65 digitalWrite(pin, pullUp);
67 dontCheckNextPinAccess =
true;
74 Sensor* Sensor::get(
int n) {
76 for (tt = firstSensor; tt != NULL && tt->data.snum != n; tt = tt->nextSensor);
81 void Sensor::remove(
int n) {
84 for (tt = firstSensor, pp = NULL; tt != NULL && tt->data.snum != n; pp = tt, tt = tt->nextSensor);
87 #ifdef USE_TEXTCOMMAND 88 DCCPP_INTERFACE.print(
"<X>");
89 #if !defined(USE_ETHERNET) 90 DCCPP_INTERFACE.println(
"");
96 if (tt == firstSensor)
97 firstSensor = tt->nextSensor;
99 pp->nextSensor = tt->nextSensor;
103 #ifdef USE_TEXTCOMMAND 104 DCCPP_INTERFACE.print(
"<O>");
105 #if !defined(USE_ETHERNET) 106 DCCPP_INTERFACE.println(
"");
113 int Sensor::count() {
116 for (tt = firstSensor; tt != NULL; tt = tt->nextSensor)
123 void Sensor::check(){
126 for(tt = firstSensor; tt != NULL; tt = tt->nextSensor){
127 tt->signal = (float)(tt->signal * (1.0 - SENSOR_DECAY) + digitalRead(tt->data.pin) * SENSOR_DECAY);
129 if(!tt->active && tt->signal<0.5){
131 DCCPP_INTERFACE.print(
"<Q");
132 DCCPP_INTERFACE.print(tt->data.snum);
133 DCCPP_INTERFACE.print(
">");
134 #if !defined(USE_ETHERNET) 135 DCCPP_INTERFACE.println(
"");
137 }
else if(tt->active && tt->signal>0.9){
139 DCCPP_INTERFACE.print(
"<q");
140 DCCPP_INTERFACE.print(tt->data.snum);
141 DCCPP_INTERFACE.print(
">");
142 #if !defined(USE_ETHERNET) 143 DCCPP_INTERFACE.println(
"");
150 #ifdef DCCPP_PRINT_DCCPP 153 void Sensor::show() {
156 if (firstSensor == NULL) {
157 DCCPP_INTERFACE.print(
"<X>");
158 #if !defined(USE_ETHERNET) 159 DCCPP_INTERFACE.println(
"");
164 for (tt = firstSensor; tt != NULL; tt = tt->nextSensor) {
165 DCCPP_INTERFACE.print(
"<Q");
166 DCCPP_INTERFACE.print(tt->data.snum);
167 DCCPP_INTERFACE.print(
" ");
168 DCCPP_INTERFACE.print(tt->data.pin);
169 DCCPP_INTERFACE.print(
" ");
170 DCCPP_INTERFACE.print(tt->data.pullUp);
171 DCCPP_INTERFACE.print(
">");
172 #if !defined(USE_ETHERNET) 173 DCCPP_INTERFACE.println(
"");
180 void Sensor::status() {
183 if (firstSensor == NULL) {
184 DCCPP_INTERFACE.print(
"<X>");
185 #if !defined(USE_ETHERNET) 186 DCCPP_INTERFACE.println(
"");
191 for (tt = firstSensor; tt != NULL; tt = tt->nextSensor) {
192 DCCPP_INTERFACE.print(tt->active ?
"<Q" :
"<q");
193 DCCPP_INTERFACE.print(tt->data.snum);
194 DCCPP_INTERFACE.print(
">");
195 #if !defined(USE_ETHERNET) 196 DCCPP_INTERFACE.println(
"");
206 void Sensor::load() {
207 struct SensorData data;
210 for (
int i = 0; i<EEStore::data.nSensors; i++) {
212 EEPROM.get(EEStore::pointer(), (
void *)&(data),
sizeof(SensorData));
214 EEPROM.get(EEStore::pointer(), data);
216 #if defined(USE_TEXTCOMMAND) 217 tt = create(data.snum, data.pin, data.pullUp);
220 #ifdef DCCPP_DEBUG_MODE 222 DCCPP_INTERFACE.println(F(
"Sensor::begin() must be called BEFORE Sensor::load() !"));
225 tt->set(data.snum, data.pin, data.pullUp);
227 EEStore::advance(
sizeof(tt->data));
233 void Sensor::store() {
237 EEStore::data.nSensors = 0;
241 EEPROM.put(EEStore::pointer(), (
void *)&(tt->data),
sizeof(SensorData));
243 EEPROM.put(EEStore::pointer(), tt->data);
245 EEStore::advance(
sizeof(tt->data));
247 EEStore::data.nSensors++;
252 #if defined(USE_TEXTCOMMAND) 255 bool Sensor::parse(
char *c) {
259 switch (sscanf(c,
"%d %d %d", &n, &s, &m)) {
269 #ifdef DCCPP_PRINT_DCCPP 274 #ifdef USE_TEXTCOMMAND 276 DCCPP_INTERFACE.print(
"<X>");
277 #if !defined(USE_ETHERNET) 278 DCCPP_INTERFACE.println(
"");
288 Sensor *Sensor::create(
int snum,
int pin,
int pullUp) {
289 Sensor *tt =
new Sensor();
292 #ifdef USE_TEXTCOMMAND 293 DCCPP_INTERFACE.print(
"<X>");
294 #if !defined(USE_ETHERNET) 295 DCCPP_INTERFACE.println(
"");
301 tt->begin(snum, pin, pullUp);
310 Sensor *Sensor::firstSensor=NULL;