1
0
mirror of https://github.com/DCC-EX/CommandStation-EX.git synced 2025-07-19 19:38:55 +02:00

Bugfix: Keep power status of track when doing join/unjoin, new keep power option for setTrackMode()

This commit is contained in:
Harald Barth 2025-07-17 17:53:54 +02:00
parent d21bffcaf6
commit 651192788b
2 changed files with 7 additions and 10 deletions

View File

@ -197,7 +197,7 @@ void TrackManager::setDCSignal(int16_t cab, byte speedbyte) {
} }
} }
bool TrackManager::setTrackMode(byte trackToSet, TRACK_MODE mode, int16_t dcAddr) { bool TrackManager::setTrackMode(byte trackToSet, TRACK_MODE mode, int16_t dcAddr, bool offAtChange) {
if (trackToSet>lastTrack || track[trackToSet]==NULL) return false; if (trackToSet>lastTrack || track[trackToSet]==NULL) return false;
// Remember track mode we came from for later // Remember track mode we came from for later
@ -369,10 +369,9 @@ bool TrackManager::setTrackMode(byte trackToSet, TRACK_MODE mode, int16_t dcAddr
#endif #endif
#endif #endif
// Turn off power if we changed the mode of this track // Turn off power if we changed the mode of this track
if (mode != oldmode) { if (mode != oldmode && offAtChange) {
track[trackToSet]->setPower(POWERMODE::OFF); track[trackToSet]->setPower(POWERMODE::OFF);
} }
streamTrackState(NULL,trackToSet); streamTrackState(NULL,trackToSet);
//DIAG(F("TrackMode=%d"),mode); //DIAG(F("TrackMode=%d"),mode);
return true; return true;
@ -667,9 +666,9 @@ void TrackManager::setJoin(bool joined) {
FOR_EACH_TRACK(t) { FOR_EACH_TRACK(t) {
if (track[t]->getMode() & TRACK_MODE_PROG) { // find PROG track if (track[t]->getMode() & TRACK_MODE_PROG) { // find PROG track
tempProgTrack = t; // remember PROG track tempProgTrack = t; // remember PROG track
setTrackMode(t, TRACK_MODE_MAIN); setTrackMode(t, TRACK_MODE_MAIN, 0, false); // 0 = no DC loco; false = do not turn off pwr
// setPower() of the track called after // then in some cases setPower() is called
// seperately after setJoin() instead // seperately after the setJoin() as well
break; // there is only one prog track, done break; // there is only one prog track, done
} }
} }
@ -677,9 +676,7 @@ void TrackManager::setJoin(bool joined) {
if (tempProgTrack != MAX_TRACKS+1) { if (tempProgTrack != MAX_TRACKS+1) {
// setTrackMode defaults to power off, so we // setTrackMode defaults to power off, so we
// need to preserve that state. // need to preserve that state.
POWERMODE tPTmode = track[tempProgTrack]->getPower(); // get current power status of this track setTrackMode(tempProgTrack, TRACK_MODE_PROG, 0, false); // 0 = no DC loco; false = do not turn off pwr
setTrackMode(tempProgTrack, TRACK_MODE_PROG); // set track mode back to prog
track[tempProgTrack]->setPower(tPTmode); // set power status as it was before
tempProgTrack = MAX_TRACKS+1; tempProgTrack = MAX_TRACKS+1;
} }
} }

View File

@ -71,7 +71,7 @@ class TrackManager {
static void setProgPower(POWERMODE mode) {setTrackPower(TRACK_MODE_PROG, mode);} static void setProgPower(POWERMODE mode) {setTrackPower(TRACK_MODE_PROG, mode);}
static const int16_t MAX_TRACKS=8; static const int16_t MAX_TRACKS=8;
static bool setTrackMode(byte track, TRACK_MODE mode, int16_t DCaddr=0); static bool setTrackMode(byte track, TRACK_MODE mode, int16_t DCaddr=0, bool offAtChange=true);
static bool parseEqualSign(Print * stream, int16_t params, int16_t p[]); static bool parseEqualSign(Print * stream, int16_t params, int16_t p[]);
static void loop(); static void loop();
static POWERMODE getMainPower(); static POWERMODE getMainPower();