1
0
mirror of https://github.com/DCC-EX/CommandStation-EX.git synced 2025-03-14 18:13:09 +01:00

EXRAIL MOMENTUM

This commit is contained in:
Asbelos 2024-07-19 08:33:50 +01:00
parent 8a623aa1cb
commit ab72a75d8f
6 changed files with 20 additions and 7 deletions

16
DCC.cpp
View File

@ -914,13 +914,17 @@ int DCC::lookupSpeedTable(int locoId, bool autoCreate) {
} }
bool DCC::setMomentum(int locoId,int16_t millis_per_notch) { bool DCC::setMomentum(int locoId,int16_t millis_per_notch) {
if (locoId<0 || millis_per_notch<0) return false; if (locoId==0 && millis_per_notch>=0) {
if (locoId==0) defaultMomentum=millis_per_notch; defaultMomentum=millis_per_notch;
else { return true;
auto reg=lookupSpeedTable(locoId);
if (reg<0) return false;
speedTable[reg].millis_per_notch=millis_per_notch;
} }
// 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; return true;
} }

View File

@ -68,7 +68,8 @@ Once a new OPCODE is decided upon, update this list.
K, Reserved for future use - Potentially Railcom K, Reserved for future use - Potentially Railcom
l, Loco speedbyte/function map broadcast l, Loco speedbyte/function map broadcast
L, Reserved for LCC interface (implemented in EXRAIL) 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 M, Write DCC packet
n, Reserved for SensorCam n, Reserved for SensorCam
N, Reserved for Sensorcam N, Reserved for Sensorcam

View File

@ -566,6 +566,10 @@ void RMFT2::loop2() {
forward=DCC::getThrottleDirection(loco)^invert; forward=DCC::getThrottleDirection(loco)^invert;
driveLoco(operand); driveLoco(operand);
break; break;
case OPCODE_MOMENTUM:
DCC::setMomentum(loco,operand);
break;
case OPCODE_FORGET: case OPCODE_FORGET:
if (loco!=0) { if (loco!=0) {

View File

@ -35,6 +35,7 @@
// //
enum OPCODE : byte {OPCODE_THROW,OPCODE_CLOSE,OPCODE_TOGGLE_TURNOUT, 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_MOMENTUM,
OPCODE_RESERVE,OPCODE_FREE, OPCODE_RESERVE,OPCODE_FREE,
OPCODE_AT,OPCODE_AFTER, OPCODE_AT,OPCODE_AFTER,
OPCODE_AFTEROVERLOAD,OPCODE_AUTOSTART, OPCODE_AFTEROVERLOAD,OPCODE_AUTOSTART,

View File

@ -98,6 +98,7 @@
#undef LCC #undef LCC
#undef LCCX #undef LCCX
#undef LCN #undef LCN
#undef MOMENTUM
#undef MOVETT #undef MOVETT
#undef ACON #undef ACON
#undef ACOF #undef ACOF
@ -265,6 +266,7 @@
#define LCC(eventid) #define LCC(eventid)
#define LCCX(senderid,eventid) #define LCCX(senderid,eventid)
#define LCD(row,msg) #define LCD(row,msg)
#define MOMENTUM(mspertick)
#define SCREEN(display,row,msg) #define SCREEN(display,row,msg)
#define LCN(msg) #define LCN(msg)
#define MESSAGE(msg) #define MESSAGE(msg)

View File

@ -551,6 +551,7 @@ int RMFT2::onLCCLookup[RMFT2::countLCCLookup];
#define STEALTH_GLOBAL(code...) #define STEALTH_GLOBAL(code...)
#define LCN(msg) PRINT(msg) #define LCN(msg) PRINT(msg)
#define MESSAGE(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 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 ONACTIVATE(addr,subaddr) OPCODE_ONACTIVATE,V(addr<<2|subaddr),
#define ONACTIVATEL(linear) OPCODE_ONACTIVATE,V(linear+3), #define ONACTIVATEL(linear) OPCODE_ONACTIVATE,V(linear+3),