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 INTERFACE.print(
"<Q");
129 INTERFACE.print(tt->data.snum);
130 INTERFACE.print(
">");
131 #if !defined(USE_ETHERNET) 132 INTERFACE.println(
"");
134 }
else if(tt->active && tt->signal>0.9){
136 INTERFACE.print(
"<q");
137 INTERFACE.print(tt->data.snum);
138 INTERFACE.print(
">");
139 #if !defined(USE_ETHERNET) 140 INTERFACE.println(
"");
147 #ifdef DCCPP_PRINT_DCCPP 150 void Sensor::show() {
153 if (firstSensor == NULL) {
154 INTERFACE.print(
"<X>");
155 #if !defined(USE_ETHERNET) 156 INTERFACE.println(
"");
161 for (tt = firstSensor; tt != NULL; tt = tt->nextSensor) {
162 INTERFACE.print(
"<Q");
163 INTERFACE.print(tt->data.snum);
164 INTERFACE.print(
" ");
165 INTERFACE.print(tt->data.pin);
166 INTERFACE.print(
" ");
167 INTERFACE.print(tt->data.pullUp);
168 INTERFACE.print(
">");
169 #if !defined(USE_ETHERNET) 170 INTERFACE.println(
"");
177 void Sensor::status() {
180 if (firstSensor == NULL) {
181 INTERFACE.print(
"<X>");
182 #if !defined(USE_ETHERNET) 183 INTERFACE.println(
"");
188 for (tt = firstSensor; tt != NULL; tt = tt->nextSensor) {
189 INTERFACE.print(tt->active ?
"<Q" :
"<q");
190 INTERFACE.print(tt->data.snum);
191 INTERFACE.print(
">");
192 #if !defined(USE_ETHERNET) 193 INTERFACE.println(
"");
203 void Sensor::load() {
204 struct SensorData data;
207 for (
int i = 0; i<EEStore::data.nSensors; i++) {
209 EEPROM.get(EEStore::pointer(), (
void *)&(data),
sizeof(SensorData));
211 EEPROM.get(EEStore::pointer(), data);
213 #if defined(USE_TEXTCOMMAND) 214 tt = create(data.snum, data.pin, data.pullUp);
217 #ifdef DCCPP_DEBUG_MODE 219 INTERFACE.println(F(
"Sensor::begin() must be called BEFORE Sensor::load() !"));
222 tt->set(data.snum, data.pin, data.pullUp);
224 EEStore::advance(
sizeof(tt->data));
230 void Sensor::store() {
234 EEStore::data.nSensors = 0;
238 EEPROM.put(EEStore::pointer(), (
void *)&(tt->data),
sizeof(SensorData));
240 EEPROM.put(EEStore::pointer(), tt->data);
242 EEStore::advance(
sizeof(tt->data));
244 EEStore::data.nSensors++;
249 #if defined(USE_TEXTCOMMAND) 252 void Sensor::parse(
char *c) {
256 switch (sscanf(c,
"%d %d %d", &n, &s, &m)) {
266 #ifdef DCCPP_PRINT_DCCPP 271 #ifdef USE_TEXTCOMMAND 273 INTERFACE.print(
"<X>");
274 #if !defined(USE_ETHERNET) 275 INTERFACE.println(
"");
284 Sensor *Sensor::create(
int snum,
int pin,
int pullUp) {
285 Sensor *tt =
new Sensor();
288 #ifdef USE_TEXTCOMMAND 289 INTERFACE.print(
"<X>");
290 #if !defined(USE_ETHERNET) 291 INTERFACE.println(
"");
297 tt->begin(snum, pin, pullUp);
306 Sensor *Sensor::firstSensor=NULL;