15 #include "DCCpp_Uno.h" 24 void Sensor::begin(
int snum,
int pin,
int pullUp) {
25 #if defined(USE_EEPROM) && defined(DCCPP_DEBUG_MODE) 26 if (strncmp(EEStore::data.
id, EESTORE_ID,
sizeof(EESTORE_ID)) != 0) {
27 INTERFACE.println(F(
"Sensor::begin() must be called BEFORE DCCpp.begin() !"));
31 if (firstSensor == NULL) {
34 else if (
get(snum) == NULL) {
35 Sensor *tt = firstSensor;
36 while (tt->nextSensor != NULL)
38 tt->nextSensor =
this;
41 this->
set(snum, pin, pullUp);
43 #ifdef USE_TEXTCOMMAND 44 INTERFACE.print(
"<O>");
45 #if !defined(USE_ETHERNET) 46 INTERFACE.println(
"");
53 void Sensor::set(
int snum,
int pin,
int pullUp) {
54 this->data.snum = snum;
56 this->data.pullUp = (pullUp == 0 ? LOW : HIGH);
60 ArduiEmulator::Arduino::dontCheckNextPinAccess =
true;
62 digitalWrite(pin, pullUp);
64 ArduiEmulator::Arduino::dontCheckNextPinAccess =
true;
71 Sensor* Sensor::get(
int n) {
73 for (tt = firstSensor; tt != NULL && tt->data.snum != n; tt = tt->nextSensor);
78 void Sensor::remove(
int n) {
81 for (tt = firstSensor; tt != NULL && tt->data.snum != n; pp = tt, tt = tt->nextSensor);
84 #ifdef USE_TEXTCOMMAND 85 INTERFACE.print(
"<X>");
86 #if !defined(USE_ETHERNET) 87 INTERFACE.println(
"");
93 if (tt == firstSensor)
94 firstSensor = tt->nextSensor;
96 pp->nextSensor = tt->nextSensor;
100 #ifdef USE_TEXTCOMMAND 101 INTERFACE.print(
"<O>");
102 #if !defined(USE_ETHERNET) 103 INTERFACE.println(
"");
110 int Sensor::count() {
113 for (tt = firstSensor; tt != NULL; tt = tt->nextSensor)
120 void Sensor::check(){
123 for(tt = firstSensor; tt != NULL; tt = tt->nextSensor){
124 tt->signal = (float)(tt->signal * (1.0 - SENSOR_DECAY) + digitalRead(tt->data.pin) * SENSOR_DECAY);
126 if(!tt->active && tt->signal<0.5){
128 #if defined(USE_ETHERNET) 129 INTERFACE.print(
"<Q");
130 INTERFACE.print(tt->data.snum);
131 INTERFACE.print(
">");
133 }
else if(tt->active && tt->signal>0.9){
135 #if defined(USE_ETHERNET) 136 INTERFACE.print(
"<q");
137 INTERFACE.print(tt->data.snum);
138 INTERFACE.print(
">");
145 #ifdef DCCPP_PRINT_DCCPP 148 void Sensor::show() {
151 if (firstSensor == NULL) {
152 INTERFACE.print(
"<X>");
153 #if !defined(USE_ETHERNET) 154 INTERFACE.println(
"");
159 for (tt = firstSensor; tt != NULL; tt = tt->nextSensor) {
160 INTERFACE.print(
"<Q");
161 INTERFACE.print(tt->data.snum);
162 INTERFACE.print(
" ");
163 INTERFACE.print(tt->data.pin);
164 INTERFACE.print(
" ");
165 INTERFACE.print(tt->data.pullUp);
166 INTERFACE.print(
">");
167 #if !defined(USE_ETHERNET) 168 INTERFACE.println(
"");
175 void Sensor::status() {
178 if (firstSensor == NULL) {
179 INTERFACE.print(
"<X>");
180 #if !defined(USE_ETHERNET) 181 INTERFACE.println(
"");
186 for (tt = firstSensor; tt != NULL; tt = tt->nextSensor) {
187 INTERFACE.print(tt->active ?
"<Q" :
"<q");
188 INTERFACE.print(tt->data.snum);
189 INTERFACE.print(
">");
190 #if !defined(USE_ETHERNET) 191 INTERFACE.println(
"");
201 void Sensor::load() {
202 struct SensorData data;
205 for (
int i = 0; i<EEStore::data.nSensors; i++) {
207 EEPROM.get(EEStore::pointer(), (
void *)&(data),
sizeof(SensorData));
209 EEPROM.get(EEStore::pointer(), data);
211 #if defined(USE_TEXTCOMMAND) 212 tt = create(data.snum, data.pin, data.pullUp);
215 #ifdef DCCPP_DEBUG_MODE 217 INTERFACE.println(F(
"Sensor::begin() must be called BEFORE Sensor::load() !"));
220 tt->set(data.snum, data.pin, data.pullUp);
222 EEStore::advance(
sizeof(tt->data));
228 void Sensor::store() {
232 EEStore::data.nSensors = 0;
236 EEPROM.put(EEStore::pointer(), (
void *)&(tt->data),
sizeof(SensorData));
238 EEPROM.put(EEStore::pointer(), tt->data);
240 EEStore::advance(
sizeof(tt->data));
242 EEStore::data.nSensors++;
247 #if defined(USE_TEXTCOMMAND) 250 void Sensor::parse(
char *c) {
254 switch (sscanf(c,
"%d %d %d", &n, &s, &m)) {
264 #ifdef DCCPP_PRINT_DCCPP 269 #ifdef USE_TEXTCOMMAND 271 INTERFACE.print(
"<X>");
272 #if !defined(USE_ETHERNET) 273 INTERFACE.println(
"");
282 Sensor *Sensor::create(
int snum,
int pin,
int pullUp) {
283 Sensor *tt =
new Sensor();
286 #ifdef USE_TEXTCOMMAND 287 INTERFACE.print(
"<X>");
288 #if !defined(USE_ETHERNET) 289 INTERFACE.println(
"");
295 tt->begin(snum, pin, pullUp);
304 Sensor *Sensor::firstSensor=NULL;