From 16f13d9aee104a1acaf08c382a5ec247beb8e9d8 Mon Sep 17 00:00:00 2001 From: Asbelos Date: Mon, 17 Mar 2025 02:42:00 +0000 Subject: [PATCH] zzpase Track Manager --- DCCEXCommands.h | 20 ++++++++++++++++ DCCEXParser.cpp | 6 +---- TrackManager.cpp | 60 ++++++------------------------------------------ TrackManager.h | 3 ++- 4 files changed, 30 insertions(+), 59 deletions(-) diff --git a/DCCEXCommands.h b/DCCEXCommands.h index 8e34fea..d7e16e4 100644 --- a/DCCEXCommands.h +++ b/DCCEXCommands.h @@ -452,5 +452,25 @@ ZZ(J,P,id) auto tto=Turntable::get(id); REPLY("\n", id, p, tto->getPositionAngle(p), tpdesc) } +// Track manager +ZZ(=) TrackManager::list(stream); +ZZ(=,track,MAIN) CHECK(track>='A' && track<='H') CHECK(TrackManager::setTrackMode(track,TRACK_MODE_MAIN)) +ZZ(=,track,MAIN_INV) CHECK(track>='A' && track<='H') CHECK(TrackManager::setTrackMode(track,TRACK_MODE_MAIN_INV)) +ZZ(=,track,MAIN_AUTO) CHECK(track>='A' && track<='H') CHECK(TrackManager::setTrackMode(track,TRACK_MODE_MAIN_AUTO)) +ZZ(=,track,PROG) CHECK(track>='A' && track<='H') CHECK(TrackManager::setTrackMode(track,TRACK_MODE_PROG)) +ZZ(=,track,OFF) CHECK(track>='A' && track<='H') CHECK(TrackManager::setTrackMode(track,TRACK_MODE_NONE)) +ZZ(=,track,NONE) CHECK(track>='A' && track<='H') CHECK(TrackManager::setTrackMode(track,TRACK_MODE_NONE)) +ZZ(=,track,EXT) CHECK(track>='A' && track<='H') CHECK(TrackManager::setTrackMode(track,TRACK_MODE_EXT)) + +#ifdef BOOSTER_INPUT +ZZ(=,track,BOOST) CHECK(TRACK_MODE_BOOST) CHECK(track>='A' && track<='H') CHECK(TrackManager::setTrackMode(track,TRACK_MODE_BOOST)) +ZZ(=,track,BOOST_INV) CHECK(TRACK_MODE_BOOST_INV) CHECK(track>='A' && track<='H') CHECK(TrackManager::setTrackMode(track,TRACK_MODE_BOOST_INV)) +ZZ(=,track,BOOST_AUTO) CHECK(TRACK_MODE_BOOST_AUTO) CHECK(track>='A' && track<='H') CHECK(TrackManager::setTrackMode(track,TRACK_MODE_BOOST_AUTO)) +#endif +ZZ(=,track,AUTO) CHECK(track>='A' && track<='H') CHECK(TrackManager::orTrackMode(track, TRACK_MODIFIER_AUTO)) +ZZ(=,track,INV) CHECK(track>='A' && track<='H') CHECK(TrackManager::orTrackMode(track, TRACK_MODIFIER_INV)) +ZZ(=,track,DC,locoid) CHECK(track>='A' && track<='H') CHECK(TrackManager::setTrackMode(track, TRACK_MODE_DC, locoid)) +ZZ(=,track,DC_INV,locoid) CHECK(track>='A' && track<='H') CHECK(TrackManager::setTrackMode(track, TRACK_MODE_DC_INV, locoid)) +ZZ(=,track,DCX,locoid) CHECK(track>='A' && track<='H') CHECK(TrackManager::setTrackMode(track, TRACK_MODE_DC_INV, locoid)) ZZEND diff --git a/DCCEXParser.cpp b/DCCEXParser.cpp index de29106..b4ed8fa 100644 --- a/DCCEXParser.cpp +++ b/DCCEXParser.cpp @@ -323,10 +323,6 @@ void DCCEXParser::parseOne(Print *stream, byte *com, RingStream * ringStream) filterCamParserCallback(stream, opcode, params, p); if (opcode=='\0') return; // filterCallback asked us to ignore - // todo, revamp as filter - if (opcode=='=') // TRACK MANAGER CONTROL <= [params]> - if (TrackManager::parseEqualSign(stream, params, p)) - return; matchedCommandFormat = F("none"); checkFailedFormat = matchedCommandFormat; @@ -334,7 +330,7 @@ void DCCEXParser::parseOne(Print *stream, byte *com, RingStream * ringStream) // TODO magnificent diagnostics StringFormatter::send(stream, F("\n")); - DIAG(F("Command format <%<> failed CHECK(%S)\n"), matchedCommandFormat, checkFailedFormat); + DIAG(F("Command format <%<> failed CHECK(%S)"), matchedCommandFormat, checkFailedFormat); if (opcode >= ' ' && opcode <= '~') { DIAG(F("Opcode=%c params=%d"), opcode, params); for (int i = 0; i < params; i++) diff --git a/TrackManager.cpp b/TrackManager.cpp index 241ab90..0bf3673 100644 --- a/TrackManager.cpp +++ b/TrackManager.cpp @@ -198,7 +198,12 @@ void TrackManager::setDCSignal(int16_t cab, byte speedbyte) { } } +bool TrackManager::orTrackMode(byte trackToSet, TRACK_MODE mode) { + setTrackMode(trackToSet, track[trackToSet]->getMode() | mode); +} + bool TrackManager::setTrackMode(byte trackToSet, TRACK_MODE mode, int16_t dcAddr) { + if (trackToSet>='A' && trackToSet<='H') trackToSet-='A'; if (trackToSet>lastTrack || track[trackToSet]==NULL) return false; // Remember track mode we came from for later @@ -386,63 +391,12 @@ void TrackManager::applyDCSpeed(byte t) { DCC::getThrottleFrequency(trackDCAddr[t])); } -bool TrackManager::parseEqualSign(Print *stream, int16_t params, int16_t p[]) +bool TrackManager::list(Print *stream) { - if (params==0) { // <=> List track assignments FOR_EACH_TRACK(t) streamTrackState(stream,t); - return true; - - } - - p[0]-="A"_hk; // convert A... to 0.... - - if (params>1 && (p[0]<0 || p[0]>=MAX_TRACKS)) - return false; - - if (params==2 && p[1]=="MAIN"_hk) // <= id MAIN> - return setTrackMode(p[0],TRACK_MODE_MAIN); - if (params==2 && p[1]=="MAIN_INV"_hk) // <= id MAIN_INV> - return setTrackMode(p[0],TRACK_MODE_MAIN_INV); - if (params==2 && p[1]=="MAIN_AUTO"_hk) // <= id MAIN_AUTO> - return setTrackMode(p[0],TRACK_MODE_MAIN_AUTO); - -#ifndef DISABLE_PROG - if (params==2 && p[1]=="PROG"_hk) // <= id PROG> - return setTrackMode(p[0],TRACK_MODE_PROG); -#endif - - if (params==2 && (p[1]=="OFF"_hk || p[1]=="NONE"_hk)) // <= id OFF> <= id NONE> - return setTrackMode(p[0],TRACK_MODE_NONE); - - if (params==2 && p[1]=="EXT"_hk) // <= id EXT> - return setTrackMode(p[0],TRACK_MODE_EXT); -#ifdef BOOSTER_INPUT - if (TRACK_MODE_BOOST != 0 && // compile time optimization - params==2 && p[1]=="BOOST"_hk) // <= id BOOST> - return setTrackMode(p[0],TRACK_MODE_BOOST); - if (TRACK_MODE_BOOST_INV != 0 && // compile time optimization - params==2 && p[1]=="BOOST_INV"_hk) // <= id BOOST_INV> - return setTrackMode(p[0],TRACK_MODE_BOOST_INV); - if (TRACK_MODE_BOOST_AUTO != 0 && // compile time optimization - params==2 && p[1]=="BOOST_AUTO"_hk) // <= id BOOST_AUTO> - return setTrackMode(p[0],TRACK_MODE_BOOST_AUTO); -#endif - if (params==2 && p[1]=="AUTO"_hk) // <= id AUTO> - return setTrackMode(p[0], track[p[0]]->getMode() | TRACK_MODIFIER_AUTO); - - if (params==2 && p[1]=="INV"_hk) // <= id INV> - return setTrackMode(p[0], track[p[0]]->getMode() | TRACK_MODIFIER_INV); - - if (params==3 && p[1]=="DC"_hk && p[2]>0) // <= id DC cab> - return setTrackMode(p[0],TRACK_MODE_DC,p[2]); - - if (params==3 && (p[1]=="DC_INV"_hk || // <= id DC_INV cab> - p[1]=="DCX"_hk) && p[2]>0) // <= id DCX cab> - return setTrackMode(p[0],TRACK_MODE_DC_INV,p[2]); - - return false; + return true; } const FSH* TrackManager::getModeName(TRACK_MODE tm) { diff --git a/TrackManager.h b/TrackManager.h index 8009c38..04b95da 100644 --- a/TrackManager.h +++ b/TrackManager.h @@ -74,7 +74,8 @@ class TrackManager { static const int16_t MAX_TRACKS=8; static bool setTrackMode(byte track, TRACK_MODE mode, int16_t DCaddr=0); - static bool parseEqualSign(Print * stream, int16_t params, int16_t p[]); + static bool orTrackMode(byte track, TRACK_MODE mode); + static bool list(Print * stream); static void loop(); static POWERMODE getMainPower(); static POWERMODE getProgPower();