diff --git a/EXRAIL2.cpp b/EXRAIL2.cpp index 9095de8..32022b8 100644 --- a/EXRAIL2.cpp +++ b/EXRAIL2.cpp @@ -90,6 +90,7 @@ LookList * RMFT2::onDeactivateLookup=NULL; LookList * RMFT2::onRedLookup=NULL; LookList * RMFT2::onAmberLookup=NULL; LookList * RMFT2::onGreenLookup=NULL; +LookList * RMFT2::onChangeLookup=NULL; #define GET_OPCODE GETFLASH(RMFT2::RouteCode+progCounter) #define GET_OPERAND(n) GETFLASHW(RMFT2::RouteCode+progCounter+1+(n*3)) @@ -153,6 +154,7 @@ LookList* RMFT2::LookListLoader(OPCODE op1, OPCODE op2, OPCODE op3) { onRedLookup=LookListLoader(OPCODE_ONRED); onAmberLookup=LookListLoader(OPCODE_ONAMBER); onGreenLookup=LookListLoader(OPCODE_ONGREEN); + onChangeLookup=LookListLoader(OPCODE_ONCHANGE); // Second pass startup, define any turnouts or servos, set signals red // add sequences onRoutines to the lookups @@ -721,6 +723,10 @@ void RMFT2::loop2() { case OPCODE_IFNOT: // do next operand if sensor not set skipIf=readSensor(operand); break; + + case OPCODE_IFRE: // do next operand if rotary encoder != position + skipIf=IODevice::readAnalogue(operand)!=(int)(GET_OPERAND(1)); + break; case OPCODE_IFRANDOM: // do block on random percentage skipIf=(int16_t)(micros()%100) >= operand; @@ -944,6 +950,7 @@ void RMFT2::loop2() { case OPCODE_ONRED: case OPCODE_ONAMBER: case OPCODE_ONGREEN: + case OPCODE_ONCHANGE: break; @@ -1063,13 +1070,17 @@ void RMFT2::turnoutEvent(int16_t turnoutId, bool closed) { else handleEvent(F("THROW"),onThrowLookup,turnoutId); } - void RMFT2::activateEvent(int16_t addr, bool activate) { // Hunt for an ONACTIVATE/ONDEACTIVATE for this accessory if (activate) handleEvent(F("ACTIVATE"),onActivateLookup,addr); else handleEvent(F("DEACTIVATE"),onDeactivateLookup,addr); } - + +void RMFT2::changeEvent(int16_t vpin, bool change) { + // Hunt for an ONCHANGE for this sensor + if (change) handleEvent(F("CHANGE"),onChangeLookup,vpin); +} + void RMFT2::handleEvent(const FSH* reason,LookList* handlers, int16_t id) { int pc= handlers->find(id); if (pc<0) return; diff --git a/EXRAIL2.h b/EXRAIL2.h index 323ae57..29c6cd2 100644 --- a/EXRAIL2.h +++ b/EXRAIL2.h @@ -54,6 +54,7 @@ enum OPCODE : byte {OPCODE_THROW,OPCODE_CLOSE, OPCODE_ENDTASK,OPCODE_ENDEXRAIL, OPCODE_SET_TRACK, OPCODE_ONRED,OPCODE_ONAMBER,OPCODE_ONGREEN, + OPCODE_ONCHANGE, // OPcodes below this point are skip-nesting IF operations // placed here so that they may be skipped as a group @@ -64,7 +65,8 @@ enum OPCODE : byte {OPCODE_THROW,OPCODE_CLOSE, OPCODE_IFTIMEOUT, OPCODE_IF,OPCODE_IFNOT, OPCODE_IFRANDOM,OPCODE_IFRESERVE, - OPCODE_IFCLOSED,OPCODE_IFTHROWN + OPCODE_IFCLOSED,OPCODE_IFTHROWN, + OPCODE_IFRE, }; @@ -107,6 +109,7 @@ class LookList { static void createNewTask(int route, uint16_t cab); static void turnoutEvent(int16_t id, bool closed); static void activateEvent(int16_t addr, bool active); + static void changeEvent(int16_t id, bool change); static const int16_t SERVO_SIGNAL_FLAG=0x4000; static const int16_t ACTIVE_HIGH_SIGNAL_FLAG=0x2000; static const int16_t DCC_SIGNAL_FLAG=0x1000; @@ -161,6 +164,7 @@ private: static LookList * onRedLookup; static LookList * onAmberLookup; static LookList * onGreenLookup; + static LookList * onChangeLookup; // Local variables - exist for each instance/task diff --git a/EXRAIL2MacroReset.h b/EXRAIL2MacroReset.h index 0211e22..99d2476 100644 --- a/EXRAIL2MacroReset.h +++ b/EXRAIL2MacroReset.h @@ -72,6 +72,7 @@ #undef IFRESERVE #undef IFTHROWN #undef IFTIMEOUT +#undef IFRE #undef INVERT_DIRECTION #undef JOIN #undef KILLALL @@ -88,6 +89,7 @@ #undef ONGREEN #undef ONRED #undef ONTHROW +#undef ONCHANGE #undef PARSE #undef PAUSE #undef PIN_TURNOUT @@ -182,6 +184,7 @@ #define IFTHROWN(turnout_id) #define IFRESERVE(block) #define IFTIMEOUT +#define IFRE(sensor_id,value) #define INVERT_DIRECTION #define JOIN #define KILLALL @@ -198,6 +201,7 @@ #define ONGREEN(signal_id) #define ONRED(signal_id) #define ONTHROW(turnout_id) +#define ONCHANGE(sensor_id) #define PAUSE #define PIN_TURNOUT(id,pin,description...) #define PRINT(msg) diff --git a/EXRAILMacros.h b/EXRAILMacros.h index d5424c6..f959336 100644 --- a/EXRAILMacros.h +++ b/EXRAILMacros.h @@ -261,6 +261,7 @@ const FLASH int16_t RMFT2::SignalDefinitions[] = { #define IFRESERVE(block) OPCODE_IFRESERVE,V(block), #define IFTHROWN(turnout_id) OPCODE_IFTHROWN,V(turnout_id), #define IFTIMEOUT OPCODE_IFTIMEOUT,0,0, +#define IFRE(sensor_id,value) OPCODE_IFRE,V(sensor_id),OPCODE_PAD,V(value), #define INVERT_DIRECTION OPCODE_INVERT_DIRECTION,0,0, #define JOIN OPCODE_JOIN,0,0, #define KILLALL OPCODE_KILLALL,0,0, @@ -277,6 +278,7 @@ const FLASH int16_t RMFT2::SignalDefinitions[] = { #define ONGREEN(signal_id) OPCODE_ONGREEN,V(signal_id), #define ONRED(signal_id) OPCODE_ONRED,V(signal_id), #define ONTHROW(turnout_id) OPCODE_ONTHROW,V(turnout_id), +#define ONCHANGE(sensor_id) OPCODE_ONCHANGE,V(sensor_id), #define PAUSE OPCODE_PAUSE,0,0, #define PIN_TURNOUT(id,pin,description...) OPCODE_PINTURNOUT,V(id),OPCODE_PAD,V(pin), #define POM(cv,value) OPCODE_POM,V(cv),OPCODE_PAD,V(value),