11 #ifdef ARDUINO_ARCH_AVR 19 #include "DCCpp_Uno.h" 28 void Sensor::begin(
int snum,
int pin,
int pullUp) {
29 #if defined(USE_EEPROM) && defined(DCCPP_DEBUG_MODE) 30 if (strncmp(EEStore::data.
id, EESTORE_ID,
sizeof(EESTORE_ID)) != 0) {
31 INTERFACE.println(F(
"Sensor::begin() must be called BEFORE DCCpp.begin() !"));
35 if (firstSensor == NULL) {
38 else if (
get(snum) == NULL) {
39 Sensor *tt = firstSensor;
40 while (tt->nextSensor != NULL)
42 tt->nextSensor =
this;
45 this->
set(snum, pin, pullUp);
47 #ifdef USE_TEXTCOMMAND 48 INTERFACE.print(
"<O>");
49 #if !defined(USE_ETHERNET) 50 INTERFACE.println(
"");
57 void Sensor::set(
int snum,
int pin,
int pullUp) {
58 this->data.snum = snum;
60 this->data.pullUp = (pullUp == 0 ? LOW : HIGH);
64 ArduiEmulator::Arduino::dontCheckNextPinAccess =
true;
66 digitalWrite(pin, pullUp);
68 ArduiEmulator::Arduino::dontCheckNextPinAccess =
true;
75 Sensor* Sensor::get(
int n) {
77 for (tt = firstSensor; tt != NULL && tt->data.snum != n; tt = tt->nextSensor);
82 void Sensor::remove(
int n) {
85 for (tt = firstSensor; tt != NULL && tt->data.snum != n; pp = tt, tt = tt->nextSensor);
88 #ifdef USE_TEXTCOMMAND 89 INTERFACE.print(
"<X>");
90 #if !defined(USE_ETHERNET) 91 INTERFACE.println(
"");
97 if (tt == firstSensor)
98 firstSensor = tt->nextSensor;
100 pp->nextSensor = tt->nextSensor;
104 #ifdef USE_TEXTCOMMAND 105 INTERFACE.print(
"<O>");
106 #if !defined(USE_ETHERNET) 107 INTERFACE.println(
"");
114 int Sensor::count() {
117 for (tt = firstSensor; tt != NULL; tt = tt->nextSensor)
124 void Sensor::check(){
127 for(tt = firstSensor; tt != NULL; tt = tt->nextSensor){
128 tt->signal = (float)(tt->signal * (1.0 - SENSOR_DECAY) + digitalRead(tt->data.pin) * SENSOR_DECAY);
130 if(!tt->active && tt->signal<0.5){
132 INTERFACE.print(
"<Q");
133 INTERFACE.print(tt->data.snum);
134 INTERFACE.print(
">");
135 #if !defined(USE_ETHERNET) 136 INTERFACE.println(
"");
138 }
else if(tt->active && tt->signal>0.9){
140 INTERFACE.print(
"<q");
141 INTERFACE.print(tt->data.snum);
142 INTERFACE.print(
">");
143 #if !defined(USE_ETHERNET) 144 INTERFACE.println(
"");
151 #ifdef DCCPP_PRINT_DCCPP 154 void Sensor::show() {
157 if (firstSensor == NULL) {
158 INTERFACE.print(
"<X>");
159 #if !defined(USE_ETHERNET) 160 INTERFACE.println(
"");
165 for (tt = firstSensor; tt != NULL; tt = tt->nextSensor) {
166 INTERFACE.print(
"<Q");
167 INTERFACE.print(tt->data.snum);
168 INTERFACE.print(
" ");
169 INTERFACE.print(tt->data.pin);
170 INTERFACE.print(
" ");
171 INTERFACE.print(tt->data.pullUp);
172 INTERFACE.print(
">");
173 #if !defined(USE_ETHERNET) 174 INTERFACE.println(
"");
181 void Sensor::status() {
184 if (firstSensor == NULL) {
185 INTERFACE.print(
"<X>");
186 #if !defined(USE_ETHERNET) 187 INTERFACE.println(
"");
192 for (tt = firstSensor; tt != NULL; tt = tt->nextSensor) {
193 INTERFACE.print(tt->active ?
"<Q" :
"<q");
194 INTERFACE.print(tt->data.snum);
195 INTERFACE.print(
">");
196 #if !defined(USE_ETHERNET) 197 INTERFACE.println(
"");
207 void Sensor::load() {
208 struct SensorData data;
211 for (
int i = 0; i<EEStore::data.nSensors; i++) {
213 EEPROM.get(EEStore::pointer(), (
void *)&(data),
sizeof(SensorData));
215 EEPROM.get(EEStore::pointer(), data);
217 #if defined(USE_TEXTCOMMAND) 218 tt = create(data.snum, data.pin, data.pullUp);
221 #ifdef DCCPP_DEBUG_MODE 223 INTERFACE.println(F(
"Sensor::begin() must be called BEFORE Sensor::load() !"));
226 tt->set(data.snum, data.pin, data.pullUp);
228 EEStore::advance(
sizeof(tt->data));
234 void Sensor::store() {
238 EEStore::data.nSensors = 0;
242 EEPROM.put(EEStore::pointer(), (
void *)&(tt->data),
sizeof(SensorData));
244 EEPROM.put(EEStore::pointer(), tt->data);
246 EEStore::advance(
sizeof(tt->data));
248 EEStore::data.nSensors++;
253 #if defined(USE_TEXTCOMMAND) 256 void Sensor::parse(
char *c) {
260 switch (sscanf(c,
"%d %d %d", &n, &s, &m)) {
270 #ifdef DCCPP_PRINT_DCCPP 275 #ifdef USE_TEXTCOMMAND 277 INTERFACE.print(
"<X>");
278 #if !defined(USE_ETHERNET) 279 INTERFACE.println(
"");
288 Sensor *Sensor::create(
int snum,
int pin,
int pullUp) {
289 Sensor *tt =
new Sensor();
292 #ifdef USE_TEXTCOMMAND 293 INTERFACE.print(
"<X>");
294 #if !defined(USE_ETHERNET) 295 INTERFACE.println(
"");
301 tt->begin(snum, pin, pullUp);
310 Sensor *Sensor::firstSensor=NULL;