diff --git a/DCCEXParser.cpp b/DCCEXParser.cpp index 12592df..20181d5 100644 --- a/DCCEXParser.cpp +++ b/DCCEXParser.cpp @@ -2,7 +2,7 @@ * © 2022 Paul M Antoine * © 2021 Neil McKechnie * © 2021 Mike S - * © 2021-2025 Herb Morton + * © 2021-2024 Herb Morton * © 2020-2023 Harald Barth * © 2020-2021 M Steve Todd * © 2020-2021 Fred Decker @@ -632,19 +632,7 @@ void DCCEXParser::parseOne(Print *stream, byte *com, RingStream * ringStream) else break; // will reply } //TrackManager::streamTrackState(NULL,t); - - // reinitialize DC mode timer settings following powerON - #ifdef ARDUINO_ARCH_STM32 - for (uint8_t i = 0; i < 8; i++) { - TrackManager::setTrackPowerF439ZI(i); - } - // repeated in case the 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/DCCTimerSTM32.cpp b/DCCTimerSTM32.cpp index 8ab3c5e..df00df3 100644 --- a/DCCTimerSTM32.cpp +++ b/DCCTimerSTM32.cpp @@ -1,7 +1,6 @@ /* * © 2023 Neil McKechnie * © 2022-2024 Paul M. Antoine - * © 2025 Herb Morton * © 2021 Mike S * © 2021, 2023 Harald Barth * © 2021 Fred Decker @@ -37,21 +36,6 @@ #include "DIAG.h" #include -// DC mode timers enable the PWM signal on select pins. -// Code added to sync timers which have the same frequency. -// Function prototypes -void refreshDCmodeTimers(); -void resetCounterDCmodeTimers(); - -HardwareTimer *Timer1 = new HardwareTimer(TIM1); -HardwareTimer *Timer2 = new HardwareTimer(TIM2); -HardwareTimer *Timer3 = new HardwareTimer(TIM3); -HardwareTimer *Timer4 = new HardwareTimer(TIM4); -HardwareTimer *Timer9 = new HardwareTimer(TIM9); -#if defined(TIM13) -HardwareTimer *Timer13 = new HardwareTimer(TIM13); -#endif - #if defined(ARDUINO_NUCLEO_F401RE) // Nucleo-64 boards don't have additional serial ports defined by default // Serial1 is available on the F401RE, but not hugely convenient. @@ -306,7 +290,7 @@ void DCCTimer::DCCEXanalogWriteFrequency(uint8_t pin, uint32_t f) { else if (f >= 3) DCCTimer::DCCEXanalogWriteFrequencyInternal(pin, 16000); else if (f >= 2) - DCCTimer::DCCEXanalogWriteFrequencyInternal(pin, 3600); + DCCTimer::DCCEXanalogWriteFrequencyInternal(pin, 3400); else if (f == 1) DCCTimer::DCCEXanalogWriteFrequencyInternal(pin, 480); else @@ -344,8 +328,7 @@ void DCCTimer::DCCEXanalogWriteFrequencyInternal(uint8_t pin, uint32_t frequency if (pin_timer[pin] != NULL) { pin_timer[pin]->setPWM(pin_channel[pin], pin, frequency, 0); // set frequency in Hertz, 0% dutycycle - DIAG(F("DCCEXanalogWriteFrequency::Pin %d on Timer %d Channel %d, frequency %d"), pin, pin_timer[pin], pin_channel[pin], frequency); - resetCounterDCmodeTimers(); + DIAG(F("DCCEXanalogWriteFrequency::Pin %d on Timer Channel %d, frequency %d"), pin, pin_channel[pin], frequency); } else DIAG(F("DCCEXanalogWriteFrequency::failed to allocate HardwareTimer instance!")); @@ -353,13 +336,11 @@ void DCCTimer::DCCEXanalogWriteFrequencyInternal(uint8_t pin, uint32_t frequency else { // Frequency change request - //DIAG(F("DCCEXanalogWriteFrequency_356::pin %d frequency %d"), pin, frequency); if (frequency != channel_frequency[pin]) { pinmap_pinout(digitalPinToPinName(pin), PinMap_TIM); // ensure the pin has been configured! pin_timer[pin]->setOverflow(frequency, HERTZ_FORMAT); // Just change the frequency if it's already running! DIAG(F("DCCEXanalogWriteFrequency::setting frequency to %d"), frequency); - resetCounterDCmodeTimers(); } } channel_frequency[pin] = frequency; @@ -384,9 +365,6 @@ void DCCTimer::DCCEXanalogWrite(uint8_t pin, int value, bool invert) { pin_timer[pin]->setCaptureCompare(pin_channel[pin], duty_cycle, PERCENT_COMPARE_FORMAT); // DCC_EX_PWM_FREQ Hertz, duty_cycle% dutycycle DIAG(F("DCCEXanalogWrite::Pin %d, value %d, duty cycle %d"), pin, value, duty_cycle); // } - - refreshDCmodeTimers(); - resetCounterDCmodeTimers(); } else DIAG(F("DCCEXanalogWrite::Pin %d is not configured for PWM!"), pin); @@ -681,35 +659,4 @@ void ADCee::begin() { #endif interrupts(); } - -// NOTE: additional testing is needed to check the DCC signal -// where the DCC signal pin is a pwm pin on timers 1, 4, 9, 13 -// or the brake pin is defined on a different timer. -// -- example: F411RE/F446RE - pin 10 on stacked EX8874 -// lines added to sync timers -- -// not exact sync, but timers with the same frequency should be in sync -void refreshDCmodeTimers() { - Timer1->refresh(); - Timer2->refresh(); - Timer3->refresh(); - Timer4->refresh(); - Timer9->refresh(); - #if defined(TIM13) - Timer13->refresh(); - #endif -} - -// Function to synchronize timers - called every time there is powerON commmand for any DC track -void resetCounterDCmodeTimers() { - // Reset the counter for all DC mode timers - TIM1->CNT = 0; - TIM2->CNT = 0; - TIM3->CNT = 0; - TIM4->CNT = 0; - TIM9->CNT = 0; - #if defined(TIM13) - TIM13->CNT = 0; - #endif -} - #endif diff --git a/IODeviceList.h b/IODeviceList.h index f02a0d6..2b82e1b 100644 --- a/IODeviceList.h +++ b/IODeviceList.h @@ -1,7 +1,5 @@ /* - * © 2024, Chris Harlow. - * © 2025 Herb Morton - * All rights reserved. + * © 2024, Chris Harlow. All rights reserved. * * This file is part of CommandStation-EX * @@ -37,4 +35,4 @@ It has been moved here to be easier to maintain than editing IODevice.h #include "IO_EXSensorCAM.h" #include "IO_DS1307.h" #include "IO_I2CRailcom.h" -#include "IO_HALDisplay.h" + diff --git a/MotorDriver.cpp b/MotorDriver.cpp index 550b874..39ec08d 100644 --- a/MotorDriver.cpp +++ b/MotorDriver.cpp @@ -1,6 +1,6 @@ /* * © 2022-2024 Paul M Antoine - * © 2024-2025 Herb Morton + * © 2024 Herb Morton * © 2021 Mike S * © 2021 Fred Decker * © 2020-2023 Harald Barth @@ -371,10 +371,8 @@ void MotorDriver::setDCSignal(byte speedcode, uint8_t frequency /*default =0*/) } #endif //DIAG(F("Brake pin %d value %d freqency %d"), brakePin, brake, f); - //DIAG(F("MotorDriver_cpp_374_DCCEXanalogWriteFequency::Pin %d, frequency %d, tSpeed %d"), brakePin, f, tSpeed); + DCCTimer::DCCEXanalogWrite(brakePin, brake, invertBrake); DCCTimer::DCCEXanalogWriteFrequency(brakePin, f); // set DC PWM frequency - //DIAG(F("MotorDriver_cpp_375_DCCEXanalogWrite::brakePin %d, frequency %d, invertBrake"), brakePin, brake, invertBrake); - DCCTimer::DCCEXanalogWrite(brakePin, brake, invertBrake); // line swapped to set frequency first #else // all AVR here DCCTimer::DCCEXanalogWriteFrequency(brakePin, frequency); // frequency steps analogWrite(brakePin, invertBrake ? 255-brake : brake); diff --git a/TrackManager.cpp b/TrackManager.cpp index 241ab90..b793de1 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-2025 Herb Morton + * © 2024 Herb Morton * © 2023 Colin Murdoch * All rights reserved. * @@ -42,7 +42,6 @@ MotorDriver * TrackManager::track[MAX_TRACKS] = { NULL }; int16_t TrackManager::trackDCAddr[MAX_TRACKS] = { 0 }; -int16_t TrackManager::tPwr_mA[8]={0,0,0,0,0,0,0,0}; int8_t TrackManager::lastTrack=-1; bool TrackManager::progTrackSyncMain=false; @@ -647,33 +646,6 @@ void TrackManager::reportCurrent(Print* stream) { StringFormatter::send(stream,F(">\n")); } -void TrackManager::reportCurrentLCD(uint8_t display, byte row) { - 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 - tPwr_mA[t]=(3*tPwr_mA[t]>>2) + ((track[t]->getPower()==POWERMODE::OVERLOAD) ? -1 : - track[t]->raw2mA(track[t]->getCurrentRaw(false))); - if (tMode & TRACK_MODE_DC) { // Test if track is in DC or DCX mode - SCREEN(display, row+t, F("%c: %S %d ON %dmA"), t+'A', (TrackManager::getModeName(tMode)),DCAddr, tPwr_mA[t]>>2); - } - else { // formats without DCAddress - SCREEN(display, row+t, F("%c: %S ON %dmA"), t+'A', (TrackManager::getModeName(tMode)), tPwr_mA[t]>>2); - } - } - else { // if power is off do this section - if (tMode & TRACK_MODE_DC) { // DC / DCX - SCREEN(display, row+t, F("Track %c: %S %d OFF"), t+'A', (TrackManager::getModeName(tMode)),DCAddr); - } - else { // Not DC or DCX - SCREEN(display, row+t, F("Track %c: %S OFF"), t+'A', (TrackManager::getModeName(tMode))); - } - } - } - } - void TrackManager::reportGauges(Print* stream) { StringFormatter::send(stream,F("getMode(); - POWERMODE powermode = driver->getPower(); // line added to enable processing for DC mode tracks - POWERMODE oldpower = driver->getPower(); - //if (trackmode & TRACK_MODE_NONE) { - // driver->setBrake(true); // Track is unused. Brake is good to have. - // powermode = POWERMODE::OFF; // Track is unused. Force it to OFF - //} else - if (trackmode & TRACK_MODE_DC) { // includes inverted DC (called DCX) - if (powermode == POWERMODE::ON) { - driver->setBrake(true); // DC starts with brake on - applyDCSpeed(t); // speed match DCC throttles - } - } - //else /* MAIN PROG EXT BOOST */ { - // if (powermode == POWERMODE::ON) { - // // toggle brake before turning power on - resets overcurrent error - // // on the Pololu board if brake is wired to ^D2. - // driver->setBrake(true); - // driver->setBrake(false); // DCC runs with brake off - // } - //} - driver->setPower(powermode); - if (oldpower != driver->getPower()) - CommandDistributor::broadcastPower(); -} \ No newline at end of file diff --git a/TrackManager.h b/TrackManager.h index 8009c38..7dce0ee 100644 --- a/TrackManager.h +++ b/TrackManager.h @@ -1,7 +1,6 @@ /* * © 2022 Chris Harlow * © 2022-2024 Harald Barth - * © 2025 Herb Morton * © 2023 Colin Murdoch * * All rights reserved. @@ -67,7 +66,6 @@ class TrackManager { static void setPower(POWERMODE mode) {setMainPower(mode); setProgPower(mode);} static void setTrackPower(POWERMODE mode, byte t); - static void setTrackPowerF439ZI(byte t); static void setTrackPower(TRACK_MODE trackmode, POWERMODE powermode); static void setMainPower(POWERMODE mode) {setTrackPower(TRACK_MODE_MAIN, mode);} static void setProgPower(POWERMODE mode) {setTrackPower(TRACK_MODE_PROG, mode);} @@ -89,7 +87,6 @@ class TrackManager { static void sampleCurrent(); static void reportGauges(Print* stream); static void reportCurrent(Print* stream); - static void reportCurrentLCD(uint8_t display, byte row); static void reportObsoleteCurrent(Print* stream); static void streamTrackState(Print* stream, byte t); static bool isPowerOn(byte t); @@ -108,7 +105,6 @@ class TrackManager { private: #endif static MotorDriver* track[MAX_TRACKS]; - static int16_t tPwr_mA[8]; // for command private: static void addTrack(byte t, MotorDriver* driver);