diff --git a/DCCEXParser.cpp b/DCCEXParser.cpp index 20181d5..5189d92 100644 --- a/DCCEXParser.cpp +++ b/DCCEXParser.cpp @@ -2,7 +2,7 @@ * © 2022 Paul M Antoine * © 2021 Neil McKechnie * © 2021 Mike S - * © 2021-2024 Herb Morton + * © 2021-2025 Herb Morton * © 2020-2023 Harald Barth * © 2020-2021 M Steve Todd * © 2020-2021 Fred Decker @@ -789,6 +789,11 @@ void DCCEXParser::parseOne(Print *stream, byte *com, RingStream * ringStream) TrackManager::reportCurrent(stream); // return; + case "L"_hk: // track state and mA value on display + if (params<3) break; + TrackManager::reportCurrentLCD(p[1], p[2]); // Track power status + return; + case "A"_hk: // intercepted by EXRAIL// returns automations/routes if (params!=1) break; // StringFormatter::send(stream, F("\n")); diff --git a/TrackManager.cpp b/TrackManager.cpp index b793de1..d0499b5 100644 --- a/TrackManager.cpp +++ b/TrackManager.cpp @@ -2,7 +2,7 @@ * © 2022-2025 Chris Harlow * © 2022-2024 Harald Barth * © 2023-2024 Paul M. Antoine - * © 2024 Herb Morton + * © 2024-2025 Herb Morton * © 2023 Colin Murdoch * All rights reserved. * @@ -42,6 +42,7 @@ MotorDriver * TrackManager::track[MAX_TRACKS] = { NULL }; int16_t TrackManager::trackDCAddr[MAX_TRACKS] = { 0 }; +int16_t TrackManager::trackPwrMA[MAX_TRACKS] = { 0 }; int8_t TrackManager::lastTrack=-1; bool TrackManager::progTrackSyncMain=false; @@ -451,7 +452,7 @@ const FSH* TrackManager::getModeName(TRACK_MODE tm) { if(tm & TRACK_MODIFIER_AUTO) modename=F("MAIN A"); else if (tm & TRACK_MODIFIER_INV) - modename=F("MAIN I>\n"); + modename=F("MAIN I"); else modename=F("MAIN"); } @@ -646,6 +647,37 @@ void TrackManager::reportCurrent(Print* stream) { StringFormatter::send(stream,F(">\n")); } +void TrackManager::reportCurrentLCD(uint8_t display, byte row) { + int16_t trackPwrTotalMA = 0; + FOR_EACH_TRACK(t) { + bool pstate = TrackManager::isPowerOn(t); // checks if power is on or off + TRACK_MODE tMode=(TrackManager::getMode(t)); // gets to current power mode + int16_t DCAddr=(TrackManager::returnDCAddr(t)); + + if (pstate) { // if power is on do this section + trackPwrMA[t]=(3*trackPwrMA[t]>>2) + ((track[t]->getPower()==POWERMODE::OVERLOAD) ? -1 : + track[t]->raw2mA(track[t]->getCurrentRaw(false))); + trackPwrTotalMA += trackPwrMA[t]; + if (tMode & TRACK_MODE_DC) { // Test if track is in DC or DCX mode + SCREEN(display, row+t, F("%c: %S %d %dmA"), t+'A', (TrackManager::getModeName(tMode)),DCAddr, trackPwrMA[t]>>2); + } + else { // formats without DCAddress + SCREEN(display, row+t, F("%c: %S %dmA"), t+'A', (TrackManager::getModeName(tMode)), trackPwrMA[t]>>2); + } + } + else { // if power is off do this section + trackPwrMA[t] = 0; + if (tMode & TRACK_MODE_DC) { // DC / DCX + SCREEN(display, row+t, F("%c: %S %d"), t+'A', (TrackManager::getModeName(tMode)),DCAddr); + } + else { // Not DC or DCX + SCREEN(display, row+t, F("%c: %S"), t+'A', (TrackManager::getModeName(tMode))); + } + } + } + SCREEN(display, row+lastTrack+1, F("%d Districts %dmA"), lastTrack+1, trackPwrTotalMA>>2); +} + void TrackManager::reportGauges(Print* stream) { StringFormatter::send(stream,F(" command #ifdef ARDUINO_ARCH_ESP32 static byte tempProgTrack; // holds the prog track number during join #endif