From ab72a75d8fe4ac3859655ede97de2f25973a8864 Mon Sep 17 00:00:00 2001 From: Asbelos Date: Fri, 19 Jul 2024 08:33:50 +0100 Subject: [PATCH] EXRAIL MOMENTUM --- DCC.cpp | 16 ++++++++++------ DCCEXParser.cpp | 3 ++- EXRAIL2.cpp | 4 ++++ EXRAIL2.h | 1 + EXRAIL2MacroReset.h | 2 ++ EXRAILMacros.h | 1 + 6 files changed, 20 insertions(+), 7 deletions(-) diff --git a/DCC.cpp b/DCC.cpp index 5b387b2..71f36de 100644 --- a/DCC.cpp +++ b/DCC.cpp @@ -914,13 +914,17 @@ int DCC::lookupSpeedTable(int locoId, bool autoCreate) { } bool DCC::setMomentum(int locoId,int16_t millis_per_notch) { - if (locoId<0 || millis_per_notch<0) return false; - if (locoId==0) defaultMomentum=millis_per_notch; - else { - auto reg=lookupSpeedTable(locoId); - if (reg<0) return false; - speedTable[reg].millis_per_notch=millis_per_notch; + if (locoId==0 && millis_per_notch>=0) { + defaultMomentum=millis_per_notch; + return true; } + // millis=-1 is ok and means this loco should use the default. + // We dont copy the default here because it can be changed + // while running and have immediate effect on all locos using -1. + if (locoId<=0 || millis_per_notch<-1) return false; + auto reg=lookupSpeedTable(locoId); + if (reg<0) return false; // table full + speedTable[reg].millis_per_notch=millis_per_notch; return true; } diff --git a/DCCEXParser.cpp b/DCCEXParser.cpp index 471ad05..0e45072 100644 --- a/DCCEXParser.cpp +++ b/DCCEXParser.cpp @@ -68,7 +68,8 @@ Once a new OPCODE is decided upon, update this list. K, Reserved for future use - Potentially Railcom l, Loco speedbyte/function map broadcast L, Reserved for LCC interface (implemented in EXRAIL) - m, message to throttles broadcast + m, message to throttles (broadcast output) + m, set momentum M, Write DCC packet n, Reserved for SensorCam N, Reserved for Sensorcam diff --git a/EXRAIL2.cpp b/EXRAIL2.cpp index 1a7f888..d65aca4 100644 --- a/EXRAIL2.cpp +++ b/EXRAIL2.cpp @@ -566,6 +566,10 @@ void RMFT2::loop2() { forward=DCC::getThrottleDirection(loco)^invert; driveLoco(operand); break; + + case OPCODE_MOMENTUM: + DCC::setMomentum(loco,operand); + break; case OPCODE_FORGET: if (loco!=0) { diff --git a/EXRAIL2.h b/EXRAIL2.h index 9271bba..b0ed324 100644 --- a/EXRAIL2.h +++ b/EXRAIL2.h @@ -35,6 +35,7 @@ // enum OPCODE : byte {OPCODE_THROW,OPCODE_CLOSE,OPCODE_TOGGLE_TURNOUT, OPCODE_FWD,OPCODE_REV,OPCODE_SPEED,OPCODE_INVERT_DIRECTION, + OPCODE_MOMENTUM, OPCODE_RESERVE,OPCODE_FREE, OPCODE_AT,OPCODE_AFTER, OPCODE_AFTEROVERLOAD,OPCODE_AUTOSTART, diff --git a/EXRAIL2MacroReset.h b/EXRAIL2MacroReset.h index 8f2845c..8773787 100644 --- a/EXRAIL2MacroReset.h +++ b/EXRAIL2MacroReset.h @@ -98,6 +98,7 @@ #undef LCC #undef LCCX #undef LCN +#undef MOMENTUM #undef MOVETT #undef ACON #undef ACOF @@ -265,6 +266,7 @@ #define LCC(eventid) #define LCCX(senderid,eventid) #define LCD(row,msg) +#define MOMENTUM(mspertick) #define SCREEN(display,row,msg) #define LCN(msg) #define MESSAGE(msg) diff --git a/EXRAILMacros.h b/EXRAILMacros.h index edc1088..4f7d41a 100644 --- a/EXRAILMacros.h +++ b/EXRAILMacros.h @@ -551,6 +551,7 @@ int RMFT2::onLCCLookup[RMFT2::countLCCLookup]; #define STEALTH_GLOBAL(code...) #define LCN(msg) PRINT(msg) #define MESSAGE(msg) PRINT(msg) +#define MOMENTUM(mspertick) OPCODE_MOMENTUM,V(mspertick), #define MOVETT(id,steps,activity) OPCODE_SERVO,V(id),OPCODE_PAD,V(steps),OPCODE_PAD,V(EXTurntable::activity),OPCODE_PAD,V(0), #define ONACTIVATE(addr,subaddr) OPCODE_ONACTIVATE,V(addr<<2|subaddr), #define ONACTIVATEL(linear) OPCODE_ONACTIVATE,V(linear+3),