From 1b1d6e5bb390f705e857cbcc251660d1419ace1f Mon Sep 17 00:00:00 2001 From: Kristian Kalweit Date: Wed, 8 Oct 2025 16:26:13 +0200 Subject: [PATCH 1/7] save/restore speed --- EXRAIL2.cpp | 10 +++++++++- EXRAIL2.h | 3 ++- EXRAILMacros.h | 2 ++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/EXRAIL2.cpp b/EXRAIL2.cpp index 0982510f..a7a26a7a 100644 --- a/EXRAIL2.cpp +++ b/EXRAIL2.cpp @@ -607,7 +607,15 @@ void RMFT2::loop2() { case OPCODE_INVERT_DIRECTION: invert= !invert; break; - + + case OPCODE_SAVESPEED: + if (loco) saveSpeed = DCC::getThrottleSpeedByte(loco); + break; + + case OPCODE_RESTORESPEED: + if (loco) DCC::setThrottle(loco,saveSpeed,DCC::getThrottleDirection(loco)); + break; + case OPCODE_RESERVE: if (getFlag(operand,SECTION_FLAG)) { if (loco) DCC::setThrottle(loco,1,DCC::getThrottleDirection(loco)); diff --git a/EXRAIL2.h b/EXRAIL2.h index 0a9e7ada..2b0de741 100644 --- a/EXRAIL2.h +++ b/EXRAIL2.h @@ -35,7 +35,7 @@ // searching easier as a parameter can never be confused with an opcode. // enum OPCODE : byte {OPCODE_THROW,OPCODE_CLOSE,OPCODE_TOGGLE_TURNOUT, - OPCODE_FWD,OPCODE_REV,OPCODE_SPEED,OPCODE_INVERT_DIRECTION, + OPCODE_FWD,OPCODE_REV,OPCODE_SPEED,OPCODE_INVERT_DIRECTION,OPCODE_SAVESPEED,OPCODE_RESTORESPEED, OPCODE_MOMENTUM, OPCODE_RESERVE,OPCODE_FREE, OPCODE_AT,OPCODE_AFTER, @@ -302,6 +302,7 @@ class LookList { uint16_t loco; bool invert; byte pauseSpeed; + byte saveSpeed; int onEventStartPosition; byte stackDepth; int callStack[MAX_STACK_DEPTH]; diff --git a/EXRAILMacros.h b/EXRAILMacros.h index 484aae3a..5e6042e6 100644 --- a/EXRAILMacros.h +++ b/EXRAILMacros.h @@ -602,6 +602,8 @@ int RMFT2::onLCCLookup[RMFT2::countLCCLookup]; #define ROUTE_HIDDEN(id) OPCODE_ROUTE_HIDDEN,V(id), #define ROUTE_DISABLED(id) OPCODE_ROUTE_DISABLED,V(id), #define ROUTE_CAPTION(id,caption) PRINT(caption) +#define SAVESPEED,0,0, +#define RESTORESPEED,0,0, #define SENDLOCO(cab,route) OPCODE_SENDLOCO,V(cab),OPCODE_PAD,V(route), #define SEQUENCE(id) OPCODE_SEQUENCE, V(id), #define SERIAL(msg) PRINT(msg) From c502547436a66931c40f48b61aa09be5454e0472 Mon Sep 17 00:00:00 2001 From: Kristian Kalweit Date: Wed, 8 Oct 2025 20:02:06 +0200 Subject: [PATCH 2/7] add macro comments --- EXRAIL2MacroReset.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/EXRAIL2MacroReset.h b/EXRAIL2MacroReset.h index 18acd883..20f6cf75 100644 --- a/EXRAIL2MacroReset.h +++ b/EXRAIL2MacroReset.h @@ -153,6 +153,7 @@ #undef RED #undef RESERVE #undef RESET +#undef RESTORESPEED #undef RESUME #undef RETURN #undef REV @@ -165,6 +166,7 @@ #undef ROUTE_HIDDEN #undef ROUTE_DISABLED #undef ROUTE_CAPTION +#undef SAVESPEED #undef SENDLOCO #undef SEQUENCE #undef SERIAL @@ -1049,6 +1051,12 @@ * @param count... Number of consecutive pins, default 1 */ #define RESET(vpin,count...) +/** + * @def RESTORESPEED + * @brief Restore current loco speed + * @see SAVESPEED + */ +#define RESTORESPEED /** * @def RESUME * @brief Resumes PAUSEd tasks @@ -1140,6 +1148,12 @@ * @param caption */ #define ROUTE_CAPTION(sequence_id,caption) +/** + * @def SAVESPEED + * @brief Save current loco speed + * @see RESTORESPEED + */ +#define SAVESPEED /** * @def SENDLOCO(cab,sequence_id) * @brief Start a new task to drive the loco From 5f2fdb0f90dfaf622228be8e99f5b2f30482c24a Mon Sep 17 00:00:00 2001 From: Kristian Kalweit Date: Wed, 8 Oct 2025 22:04:41 +0200 Subject: [PATCH 3/7] fix --- EXRAILMacros.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/EXRAILMacros.h b/EXRAILMacros.h index 5e6042e6..9d8a7eee 100644 --- a/EXRAILMacros.h +++ b/EXRAILMacros.h @@ -602,8 +602,8 @@ int RMFT2::onLCCLookup[RMFT2::countLCCLookup]; #define ROUTE_HIDDEN(id) OPCODE_ROUTE_HIDDEN,V(id), #define ROUTE_DISABLED(id) OPCODE_ROUTE_DISABLED,V(id), #define ROUTE_CAPTION(id,caption) PRINT(caption) -#define SAVESPEED,0,0, -#define RESTORESPEED,0,0, +#define SAVESPEED OPCODE_SAVESPEED,0,0, +#define RESTORESPEED OPCODE_RESTORESPEED,0,0, #define SENDLOCO(cab,route) OPCODE_SENDLOCO,V(cab),OPCODE_PAD,V(route), #define SEQUENCE(id) OPCODE_SEQUENCE, V(id), #define SERIAL(msg) PRINT(msg) From 1515948d564f70498dd24ef644d851ca3db1fb94 Mon Sep 17 00:00:00 2001 From: Kristian Kalweit Date: Wed, 8 Oct 2025 23:00:10 +0200 Subject: [PATCH 4/7] honor invert flag --- EXRAIL2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EXRAIL2.cpp b/EXRAIL2.cpp index a7a26a7a..93b5f9be 100644 --- a/EXRAIL2.cpp +++ b/EXRAIL2.cpp @@ -613,7 +613,7 @@ void RMFT2::loop2() { break; case OPCODE_RESTORESPEED: - if (loco) DCC::setThrottle(loco,saveSpeed,DCC::getThrottleDirection(loco)); + if (loco) DCC::setThrottle(loco,saveSpeed,invert); break; case OPCODE_RESERVE: From d9eddaef22207b4c8636c1d1c5ba21e5abb95222 Mon Sep 17 00:00:00 2001 From: Kristian Kalweit Date: Mon, 13 Oct 2025 23:17:58 +0200 Subject: [PATCH 5/7] move speed save from task -> locoslot. I don't like how the restore works. I would prefer a method at locoslot, but there are any calls to DCC until now. Maybe by reason. --- EXRAIL2.cpp | 12 ++++++++++-- EXRAIL2.h | 1 - LocoSlot.cpp | 6 ++++++ LocoSlot.h | 4 ++++ 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/EXRAIL2.cpp b/EXRAIL2.cpp index 93b5f9be..bd30aaad 100644 --- a/EXRAIL2.cpp +++ b/EXRAIL2.cpp @@ -609,11 +609,19 @@ void RMFT2::loop2() { break; case OPCODE_SAVESPEED: - if (loco) saveSpeed = DCC::getThrottleSpeedByte(loco); + if (loco) { + auto slot=LocoSlot::getSlot(loco,false); + if (slot) { + slot->saveSpeed(); + } + } break; case OPCODE_RESTORESPEED: - if (loco) DCC::setThrottle(loco,saveSpeed,invert); + if (loco) { + auto slot=LocoSlot::getSlot(loco,false); + if (slot) DCC::setThrottle(loco,slot->getSavedSpeed(),invert); + } break; case OPCODE_RESERVE: diff --git a/EXRAIL2.h b/EXRAIL2.h index 2b0de741..20802fab 100644 --- a/EXRAIL2.h +++ b/EXRAIL2.h @@ -302,7 +302,6 @@ class LookList { uint16_t loco; bool invert; byte pauseSpeed; - byte saveSpeed; int onEventStartPosition; byte stackDepth; int callStack[MAX_STACK_DEPTH]; diff --git a/LocoSlot.cpp b/LocoSlot.cpp index 26a690df..256761aa 100644 --- a/LocoSlot.cpp +++ b/LocoSlot.cpp @@ -31,6 +31,7 @@ void LocoSlot::prepare(uint16_t locoId) { momentumA=MOMENTUM_USE_DEFAULT; momentumD=MOMENTUM_USE_DEFAULT; targetSpeed=128; + savedSpeed=128; blockOccupied=0; snifferSpeedCode=128; // default direction forward @@ -80,6 +81,11 @@ void LocoSlot::forget() { chainModified=true; } +void LocoSlot::saveSpeed() { + // targetSpeed should eventually to be the speed we want to reach and save + savedSpeed=targetSpeed; +} + /* static */ void LocoSlot::forgetAll() { // remove entire list LocoSlot * killnext=nullptr; diff --git a/LocoSlot.h b/LocoSlot.h index 85886fd4..98cd5e97 100644 --- a/LocoSlot.h +++ b/LocoSlot.h @@ -45,6 +45,7 @@ class LocoSlot { uint16_t blockOccupied; // railcom detected block byte targetSpeed; // speed set by throttle + byte savedSpeed; byte speedCode; // current DCC speed and direction byte snifferSpeedCode; // sniffer speed and direction byte momentumA; // momentum accelerating @@ -82,6 +83,8 @@ class LocoSlot { void setMomentumBase(uint32_t v) { momentum_base=v; } byte getTargetSpeed() { return targetSpeed; } void setTargetSpeed(byte v) { targetSpeed=v; } + byte getSavedSpeed() { return savedSpeed; } + void setSavedSpeed(byte v) { savedSpeed=v; } byte getSpeedCode() { return speedCode; } void setSpeedCode(byte v) { speedCode=v; } @@ -92,6 +95,7 @@ class LocoSlot { uint16_t getBlockOccupied() { return blockOccupied; } void setBlockOccupied(uint16_t v) { blockOccupied=v; } void forget(); + void saveSpeed(); }; #endif \ No newline at end of file From 3cfa33f7b96f4218457923c0db89584cdf21b220 Mon Sep 17 00:00:00 2001 From: Kristian Kalweit Date: Tue, 14 Oct 2025 21:33:32 +0200 Subject: [PATCH 6/7] restore speed with current dcc direction --- EXRAIL2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EXRAIL2.cpp b/EXRAIL2.cpp index bd30aaad..f9a6a747 100644 --- a/EXRAIL2.cpp +++ b/EXRAIL2.cpp @@ -620,7 +620,7 @@ void RMFT2::loop2() { case OPCODE_RESTORESPEED: if (loco) { auto slot=LocoSlot::getSlot(loco,false); - if (slot) DCC::setThrottle(loco,slot->getSavedSpeed(),invert); + if (slot) DCC::setThrottle(loco,slot->getSavedSpeed(),DCC::getThrottleDirection(loco)); } break; From a6ff1f210bf4b66f189fb8ee2d2d4c677979fa59 Mon Sep 17 00:00:00 2001 From: Kristian Kalweit Date: Wed, 15 Oct 2025 01:25:40 +0200 Subject: [PATCH 7/7] workaround for missing DCC::restore, may feasible --- EXRAIL2.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/EXRAIL2.cpp b/EXRAIL2.cpp index f9a6a747..536eee7e 100644 --- a/EXRAIL2.cpp +++ b/EXRAIL2.cpp @@ -620,7 +620,8 @@ void RMFT2::loop2() { case OPCODE_RESTORESPEED: if (loco) { auto slot=LocoSlot::getSlot(loco,false); - if (slot) DCC::setThrottle(loco,slot->getSavedSpeed(),DCC::getThrottleDirection(loco)); + + if (slot) DCC::setThrottle(loco,slot->getSavedSpeed() & 0x7F,DCC::getThrottleDirection(loco)); } break;