From 2075bc50e827851c2ed8ad5f918c945377f6320f Mon Sep 17 00:00:00 2001 From: Asbelos Date: Thu, 23 Nov 2023 10:41:35 +0000 Subject: [PATCH] EXRAIL basic stash implementation --- EXRAIL2.cpp | 46 +++++++++++++++++++++++++++++++++++++++++++-- EXRAIL2.h | 4 ++++ EXRAIL2MacroReset.h | 12 ++++++++++-- EXRAILMacros.h | 13 +++++++++++++ myHalKCS.cpp | 1 - 5 files changed, 71 insertions(+), 5 deletions(-) delete mode 100644 myHalKCS.cpp diff --git a/EXRAIL2.cpp b/EXRAIL2.cpp index 6f0a835..f085700 100644 --- a/EXRAIL2.cpp +++ b/EXRAIL2.cpp @@ -86,6 +86,8 @@ LookList * RMFT2::onRotateLookup=NULL; LookList * RMFT2::onOverloadLookup=NULL; byte * RMFT2::routeStateArray=nullptr; const FSH * * RMFT2::routeCaptionArray=nullptr; +int16_t * RMFT2::stashArray=nullptr; +int16_t RMFT2::maxStashId=0; // getOperand instance version, uses progCounter from instance. uint16_t RMFT2::getOperand(byte n) { @@ -232,6 +234,12 @@ if (compileFeatures & FEATURE_SIGNAL) { IODevice::configureInput((VPIN)pin,true); break; } + case OPCODE_STASH: + case OPCODE_CLEAR_STASH: + case OPCODE_PICKUP_STASH: { + maxStashId=max(maxStashId,((int16_t)operand)); + break; + } case OPCODE_ATGTE: case OPCODE_ATLT: @@ -311,8 +319,14 @@ if (compileFeatures & FEATURE_SIGNAL) { } } SKIPOP; // include ENDROUTES opcode - - DIAG(F("EXRAIL %db, fl=%d"),progCounter,MAX_FLAGS); + + if (compileFeatures & FEATURE_STASH) { + // create the stash array from the highest id found + if (maxStashId>0) stashArray=(int16_t*)calloc(maxStashId+1, sizeof(int16_t)); + //TODO check EEPROM and fetch stashArray + } + + DIAG(F("EXRAIL %db, fl=%d, stash=%d"),progCounter,MAX_FLAGS, maxStashArray); // Removed for 4.2.31 new RMFT2(0); // add the startup route diag=saved_diag; @@ -935,6 +949,34 @@ void RMFT2::loop2() { case OPCODE_ROUTE_DISABLED: manageRouteState(operand,4); break; + + case OPCODE_STASH: + if (compileFeatures & FEATURE_STASH) + stashArray[operand] = invert? -loco : loco; + break; + + case OPCODE_CLEAR_STASH: + if (compileFeatures & FEATURE_STASH) + stashArray[operand] = 0; + break; + + case OPCODE_CLEAR_ALL_STASH: + if (compileFeatures & FEATURE_STASH) + for (int i=0;i<=maxStashId;i++) stashArray[operand]=0; + break; + + case OPCODE_PICKUP_STASH: + if (compileFeatures & FEATURE_STASH) { + int16_t x=stashArray[operand]; + if (x>=0) { + loco=x; + invert=false; + break; + } + loco=-x; + invert=true; + } + break; case OPCODE_ROUTE: case OPCODE_AUTOMATION: diff --git a/EXRAIL2.h b/EXRAIL2.h index 5249f72..30a2f45 100644 --- a/EXRAIL2.h +++ b/EXRAIL2.h @@ -70,6 +70,7 @@ enum OPCODE : byte {OPCODE_THROW,OPCODE_CLOSE, OPCODE_ONOVERLOAD, OPCODE_ROUTE_ACTIVE,OPCODE_ROUTE_INACTIVE,OPCODE_ROUTE_HIDDEN, OPCODE_ROUTE_DISABLED, + OPCODE_STASH,OPCODE_CLEAR_STASH,OPCODE_CLEAR_ALL_STASH,OPCODE_PICKUP_STASH, // OPcodes below this point are skip-nesting IF operations // placed here so that they may be skipped as a group @@ -102,6 +103,7 @@ enum thrunger: byte { static const byte FEATURE_LCC = 0x40; static const byte FEATURE_ROSTER= 0x20; static const byte FEATURE_ROUTESTATE= 0x10; + static const byte FEATURE_STASH = 0x08; // Flag bits for status of hardware and TPL @@ -229,6 +231,8 @@ private: static void manageRouteCaption(uint16_t id, const FSH* caption); static byte * routeStateArray; static const FSH ** routeCaptionArray; + static int16_t * stashArray; + static int16_t maxStashId; // Local variables - exist for each instance/task RMFT2 *next; // loop chain diff --git a/EXRAIL2MacroReset.h b/EXRAIL2MacroReset.h index ee240ed..9d23f04 100644 --- a/EXRAIL2MacroReset.h +++ b/EXRAIL2MacroReset.h @@ -39,6 +39,8 @@ #undef AUTOSTART #undef BROADCAST #undef CALL +#undef CLEAR_STASH +#undef CLEAR_ALL_STASH #undef CLOSE #undef DCC_SIGNAL #undef DCC_TURNTABLE @@ -108,6 +110,7 @@ #undef ONCHANGE #undef PARSE #undef PAUSE +#undef PICKUP_STASH #undef PIN_TURNOUT #undef PRINT #ifndef DISABLE_PROG @@ -152,6 +155,7 @@ #undef SIGNALH #undef SPEED #undef START +#undef STASH #undef STOP #undef THROW #undef TT_ADDPOSITION @@ -184,7 +188,9 @@ #define AUTOMATION(id,description) #define AUTOSTART #define BROADCAST(msg) -#define CALL(route) +#define CALL(route) +#define CLEAR_STASH(id) +#define CLEAR_ALL_STASH(id) #define CLOSE(id) #define DCC_SIGNAL(id,add,subaddr) #define DCC_TURNTABLE(id,home,description) @@ -256,6 +262,7 @@ #define PIN_TURNOUT(id,pin,description...) #define PRINT(msg) #define PARSE(msg) +#define PICKUP_STASH(id) #ifndef DISABLE_PROG #define POM(cv,value) #endif @@ -297,7 +304,8 @@ #define SIGNAL(redpin,amberpin,greenpin) #define SIGNALH(redpin,amberpin,greenpin) #define SPEED(speed) -#define START(route) +#define START(route) +#define STASH(id) #define STOP #define THROW(id) #define TT_ADDPOSITION(turntable_id,position,value,angle,description...) diff --git a/EXRAILMacros.h b/EXRAILMacros.h index 0e9842c..ac76efc 100644 --- a/EXRAILMacros.h +++ b/EXRAILMacros.h @@ -113,6 +113,15 @@ void exrailHalSetup() { #undef ROUTE_CAPTION #define ROUTE_CAPTION(id,caption) | FEATURE_ROUTESTATE +#undef CLEAR_STASH +#define CLEAR_STASH(id) | FEATURE_STASH +#undef CLEAR_ALL_STASH +#define CLEAR_ALL_STASH | FEATURE_STASH +#undef PICKUP_STASH +#define PICKUP_STASH(id) | FEATURE_STASH +#undef STASH +#define STASH(id) | FEATURE_STASH + const byte RMFT2::compileFeatures = 0 #include "myAutomation.h" ; @@ -353,6 +362,8 @@ int RMFT2::onLCCLookup[RMFT2::countLCCLookup]; #define AUTOSTART OPCODE_AUTOSTART,0,0, #define BROADCAST(msg) PRINT(msg) #define CALL(route) OPCODE_CALL,V(route), +#define CLEAR_STASH(id) OPCODE_CLEAR_STASH,V(id), +#define CLEAR_ALL_STASH OPCODE_CLEAR_ALL_STASH,V(0), #define CLOSE(id) OPCODE_CLOSE,V(id), #ifndef IO_NO_HAL #define DCC_TURNTABLE(id,home,description...) OPCODE_DCCTURNTABLE,V(id),OPCODE_PAD,V(home), @@ -435,6 +446,7 @@ int RMFT2::onLCCLookup[RMFT2::countLCCLookup]; #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 PICKUP_STASH(id) OPCODE_PICKUP_STASH,V(id), #define PIN_TURNOUT(id,pin,description...) OPCODE_PINTURNOUT,V(id),OPCODE_PAD,V(pin), #ifndef DISABLE_PROG #define POM(cv,value) OPCODE_POM,V(cv),OPCODE_PAD,V(value), @@ -482,6 +494,7 @@ int RMFT2::onLCCLookup[RMFT2::countLCCLookup]; #define SIGNALH(redpin,amberpin,greenpin) #define SPEED(speed) OPCODE_SPEED,V(speed), #define START(route) OPCODE_START,V(route), +#define STASH(id) OPCODE_STASH,V(id), #define STOP OPCODE_SPEED,V(0), #define THROW(id) OPCODE_THROW,V(id), #ifndef IO_NO_HAL diff --git a/myHalKCS.cpp b/myHalKCS.cpp deleted file mode 100644 index a330ae7..0000000 --- a/myHalKCS.cpp +++ /dev/null @@ -1 +0,0 @@ -// If you are planning to use multiple mux devices, perhaps it is good to use the 3-position syntax for all.