From 651192788b057e501ed8ddd0449a19635f0b1bf4 Mon Sep 17 00:00:00 2001 From: Harald Barth Date: Thu, 17 Jul 2025 17:53:54 +0200 Subject: [PATCH] Bugfix: Keep power status of track when doing join/unjoin, new keep power option for setTrackMode() --- TrackManager.cpp | 15 ++++++--------- TrackManager.h | 2 +- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/TrackManager.cpp b/TrackManager.cpp index c54dc31..1cffcbf 100644 --- a/TrackManager.cpp +++ b/TrackManager.cpp @@ -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; // 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 // Turn off power if we changed the mode of this track - if (mode != oldmode) { + if (mode != oldmode && offAtChange) { track[trackToSet]->setPower(POWERMODE::OFF); } - streamTrackState(NULL,trackToSet); //DIAG(F("TrackMode=%d"),mode); return true; @@ -667,9 +666,9 @@ void TrackManager::setJoin(bool joined) { FOR_EACH_TRACK(t) { if (track[t]->getMode() & TRACK_MODE_PROG) { // find PROG track tempProgTrack = t; // remember PROG track - setTrackMode(t, TRACK_MODE_MAIN); - // setPower() of the track called after - // seperately after setJoin() instead + setTrackMode(t, TRACK_MODE_MAIN, 0, false); // 0 = no DC loco; false = do not turn off pwr + // then in some cases setPower() is called + // seperately after the setJoin() as well break; // there is only one prog track, done } } @@ -677,9 +676,7 @@ void TrackManager::setJoin(bool joined) { if (tempProgTrack != MAX_TRACKS+1) { // setTrackMode defaults to power off, so we // need to preserve that state. - POWERMODE tPTmode = track[tempProgTrack]->getPower(); // get current power status of this track - setTrackMode(tempProgTrack, TRACK_MODE_PROG); // set track mode back to prog - track[tempProgTrack]->setPower(tPTmode); // set power status as it was before + setTrackMode(tempProgTrack, TRACK_MODE_PROG, 0, false); // 0 = no DC loco; false = do not turn off pwr tempProgTrack = MAX_TRACKS+1; } } diff --git a/TrackManager.h b/TrackManager.h index 7dce0ee..02acf4d 100644 --- a/TrackManager.h +++ b/TrackManager.h @@ -71,7 +71,7 @@ class TrackManager { static void setProgPower(POWERMODE mode) {setTrackPower(TRACK_MODE_PROG, mode);} 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 void loop(); static POWERMODE getMainPower();