diff --git a/RMFT2.cpp b/RMFT2.cpp index 5fb9049..0b6e0dd 100644 --- a/RMFT2.cpp +++ b/RMFT2.cpp @@ -20,13 +20,17 @@ /* EXRAILPlus planned FEATURE additions F1. [DONE] DCC accessory packet opcodes (short and long form) F2. [DONE] ONAccessory catchers - F3. Turnout descriptions for Withrottle + F3. [DONE] Turnout descriptions for Withrottle F4. Oled announcements (depends on HAL) F5. Withrottle roster info F6. Multi-occupancy semaphore F7. [DONE see AUTOSTART] Self starting sequences F8. Park/unpark - F9. Analog drive + F9. [DONE] Analog drive + F10. [DONE] Alias anywhere + F11. [DONE]EXRAIL/ENDEXRAIL unnecessary + F12. [DONE] Allow guarded code (as effect of ALIAS anywhere) + F13. [DONE] IFANALOG function */ /* EXRAILPlus planned TRANSPARENT additions T1. [DONE] RAM based fast lookup for sequences ON* event catchers and signals. @@ -495,6 +499,7 @@ bool RMFT2::skipIfBlock() { kill(F("missing ENDIF"), nest); return false; case OPCODE_IF: + case OPCODE_IFANALOG: case OPCODE_IFNOT: case OPCODE_IFRANDOM: case OPCODE_IFRESERVE: @@ -633,6 +638,10 @@ void RMFT2::loop2() { if (!readSensor(operand)) if (!skipIfBlock()) return; break; + case OPCODE_IFANALOG: // do next operand if sensor>= value + if (IODevice::readAnalogue(operand)<(int)(GET_OPERAND(1))) if (!skipIfBlock()) return; + break; + case OPCODE_IFNOT: // do next operand if sensor not set if (readSensor(operand)) if (!skipIfBlock()) return; break; @@ -683,7 +692,7 @@ void RMFT2::loop2() { case OPCODE_DRIVE: { - byte analogSpeed=IODevice::readAnalogue(GET_OPERAND(1)) *127 / 1024; + byte analogSpeed=IODevice::readAnalogue(operand) *127 / 1024; if (speedo!=analogSpeed) driveLoco(analogSpeed); break; } diff --git a/RMFT2.h b/RMFT2.h index dcee6da..441a588 100644 --- a/RMFT2.h +++ b/RMFT2.h @@ -43,7 +43,7 @@ enum OPCODE : byte {OPCODE_THROW,OPCODE_CLOSE, OPCODE_PAUSE, OPCODE_RESUME,OPCODE_POWEROFF, OPCODE_ONCLOSE, OPCODE_ONTHROW, OPCODE_SERVOTURNOUT, OPCODE_PINTURNOUT, OPCODE_PRINT,OPCODE_DCCACTIVATE, - OPCODE_ONACTIVATE,OPCODE_ONDEACTIVATE, + OPCODE_ONACTIVATE,OPCODE_ONDEACTIVATE,OPCODE_IFANALOG, OPCODE_ROUTE,OPCODE_AUTOMATION,OPCODE_SEQUENCE,OPCODE_ENDTASK,OPCODE_ENDEXRAIL }; diff --git a/RMFT2MacroReset.h b/RMFT2MacroReset.h index 74836c8..2034e8c 100644 --- a/RMFT2MacroReset.h +++ b/RMFT2MacroReset.h @@ -52,6 +52,7 @@ #undef FWD #undef GREEN #undef IF +#undef IFANALOG #undef IFNOT #undef IFRANDOM #undef IFRESERVE @@ -133,6 +134,7 @@ #define FWD(speed) #define GREEN(signal_id) #define IF(sensor_id) +#define IFANALOG(sensor_id,value) #define IFNOT(sensor_id) #define IFRANDOM(percent) #define IFRESERVE(block) diff --git a/RMFTMacros.h b/RMFTMacros.h index 712eaf1..5082505 100644 --- a/RMFTMacros.h +++ b/RMFTMacros.h @@ -152,6 +152,7 @@ void RMFT2::emitTurnoutDescription(Print* stream,int16_t turnoutid) { #define FWD(speed) OPCODE_FWD,V(speed), #define GREEN(signal_id) OPCODE_GREEN,V(signal_id), #define IF(sensor_id) OPCODE_IF,V(sensor_id), +#define IFANALOG(sensor_id,value) OPCODE_IFANALOG,V(sensor_id),OPCODE_PAD,V(value), #define IFNOT(sensor_id) OPCODE_IFNOT,V(sensor_id), #define IFRANDOM(percent) OPCODE_IFRANDOM,V(percent), #define IFRESERVE(block) OPCODE_IFRESERVE,V(block),