Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 80 additions & 0 deletions EXRAIL2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -589,6 +589,86 @@ void RMFT2::loop2() {
if (loco) DCC::setThrottle(loco,operand,DCC::getThrottleDirection(loco));
break;

case OPCODE_SPEEDUP:
if (loco) {
int8_t speed=DCC::getThrottleSpeed(loco);

// do nothing if speed is 1 (emergency stop) or -1 (loco not found)
if ((speed != 1) && (speed != -1))
{
// handle overflow
int16_t newspeed = static_cast<int16_t>(speed) + operand;
if (newspeed > 127) {
speed = 127;
} else if (newspeed == 1) {
speed = 2; // skip emergency stop
} else {
speed = static_cast<int8_t>(newspeed);
}
DCC::setThrottle(loco,speed,DCC::getThrottleDirection(loco));
}
}
break;

case OPCODE_SPEEDUP_REL:
if (loco) {
int8_t speed=DCC::getThrottleSpeed(loco);

// do nothing if speed is 1 (emergency stop) or -1 (loco not found)
if ((speed != 1) && (speed != -1))
{
// handle overflow
int16_t newspeed = static_cast<int16_t>(speed) + (speed * operand)/100;
if (newspeed > 127) {
speed = 127;
} else if (newspeed == 1) {
speed = 2; // skip emergency stop
} else {
speed = static_cast<int8_t>(newspeed);
}
DCC::setThrottle(loco,speed,DCC::getThrottleDirection(loco));
}
}
break;

case OPCODE_SLOWDOWN:
if (loco) {
int8_t speed=DCC::getThrottleSpeed(loco);

// do nothing if speed is 1 (emergency stop) or -1 (loco not found)
if ((speed != 1) && (speed != -1))
{
// handle underflow
int16_t newspeed = static_cast<int16_t>(speed) - operand;
if (newspeed < 2) {
speed = 0; // stop
} else {
speed = static_cast<int8_t>(newspeed);
}
DCC::setThrottle(loco,speed,DCC::getThrottleDirection(loco));
}
}
break;

case OPCODE_SLOWDOWN_REL:
if (loco) {
int8_t speed=DCC::getThrottleSpeed(loco);

// do nothing if speed is 1 (emergency stop) or -1 (loco not found)
if ((speed != 1) && (speed != -1))
{
// handle underflow
int16_t newspeed = static_cast<int16_t>(speed) - (speed * operand)/100;
if (newspeed < 2) {
speed = 0; // stop
} else {
speed = static_cast<int8_t>(newspeed);
}
DCC::setThrottle(loco,speed,DCC::getThrottleDirection(loco));
}
}
break;

case OPCODE_MOMENTUM:
DCC::setMomentum(loco,operand,getOperand(1));
break;
Expand Down
2 changes: 1 addition & 1 deletion EXRAIL2.h
Original file line number Diff line number Diff line change
Expand Up @@ -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_SPEEDUP,OPCODE_SLOWDOWN,OPCODE_SPEEDUP_REL,OPCODE_SLOWDOWN_REL,OPCODE_INVERT_DIRECTION,
OPCODE_MOMENTUM,
OPCODE_RESERVE,OPCODE_FREE,
OPCODE_AT,OPCODE_AFTER,
Expand Down
32 changes: 30 additions & 2 deletions EXRAIL2MacroReset.h
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,11 @@
#undef SETFREQ
#undef SIGNAL
#undef SIGNALH
#undef SPEED
#undef SPEED
#undef SPEEDUP
#undef SPEEDUP_REL
#undef SLOWDOWN
#undef SLOWDOWN_REL
#undef START
#undef STASH
#undef STEALTH
Expand Down Expand Up @@ -1290,7 +1294,31 @@
* @brief Changes current tasks loco speed without changing direction
* @param speed 0..127 (1=ESTOP)
*/
#define SPEED(speed)
#define SPEED(speed)
/**
* @def SPEEDUP(speedstep)
* @brief Increases current tasks loco speed by given amount
* @param speed 0..127
*/
#define SPEEDUP(speedstep)
/**
* @def SLOWDOWN(speedstep)
* @brief Decreases current tasks loco speed by given amount
* @param speed 0..127
*/
#define SLOWDOWN(speedstep)
/**
* @def SPEEDUP_REL(percent)
* @brief Increases current tasks loco speed by given relative % amount
* @param percent 1..500
*/
#define SPEEDUP_REL(percent)
/**
* @def SLOWDOWN_REL(percent)
* @brief Decreases current tasks loco speed by given relative % amount
* @param percent 1..500
*/
#define SLOWDOWN_REL(percent)
/**
* @def START(sequence_id)
* @brief Starts a new task at the given route/animation/sequence
Expand Down
8 changes: 8 additions & 0 deletions EXRAILAsserts.h
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,14 @@ constexpr bool unsafePin(const int16_t value, const int16_t pos=0 ) {
#define FWD(speed) static_assert(speed>=0 && speed<128,"\n\nUSER ERROR: Speed out of valid range 0-127\n");
#undef REV
#define REV(speed) static_assert(speed>=0 && speed<128,"\n\nUSER ERROR: Speed out of valid range 0-127\n");
#undef SPEEDUP
#define SPEEDUP(speedstep) static_assert(speedstep>=0 && speedstep<128,"\n\nUSER ERROR: Speed step out of valid range 0-127\n");
#undef SPEEDUP_REL
#define SPEEDUP_REL(percent) static_assert(percent>0 && percent<=500,"\n\nUSER ERROR: Speed out of valid range 1-500 %\n");
#undef SLOWDOWN
#define SLOWDOWN(speedstep) static_assert(speedstep>=0 && speedstep<128,"\n\nUSER ERROR: Speed step out of valid range 0-127\n");
#undef SLOWDOWN_REL
#define SLOWDOWN_REL(percent) static_assert(percent>0 && percent<=500,"\n\nUSER ERROR: Speed out of valid range 1-500 %\n");

// check duplicate sequences
#undef SEQUENCE
Expand Down
4 changes: 4 additions & 0 deletions EXRAILMacros.h
Original file line number Diff line number Diff line change
Expand Up @@ -623,6 +623,10 @@ int RMFT2::onLCCLookup[RMFT2::countLCCLookup];
#define SIGNAL(redpin,amberpin,greenpin)
#define SIGNALH(redpin,amberpin,greenpin)
#define SPEED(speed) OPCODE_SPEED,V(speed),
#define SPEEDUP(speedstep) OPCODE_SPEEDUP,V(speedstep),
#define SPEEDUP_REL(percent) OPCODE_SPEEDUP_REL,V(percent),
#define SLOWDOWN(speedstep) OPCODE_SLOWDOWN,V(speedstep),
#define SLOWDOWN_REL(percent) OPCODE_SLOWDOWN_REL,V(percent),
#define START(route) OPCODE_START,V(route),
#define STASH(id) OPCODE_STASH,V(id),
#define STOP OPCODE_SPEED,V(0),
Expand Down