diff --git a/DCCEXParser.cpp b/DCCEXParser.cpp index f4f3fa5..1202506 100644 --- a/DCCEXParser.cpp +++ b/DCCEXParser.cpp @@ -631,7 +631,23 @@ void DCCEXParser::parseOne(Print *stream, byte *com, RingStream * ringStream) else break; // will reply } //TrackManager::streamTrackState(NULL,t); - + + TrackManager::setTrackPowerF439ZI(0); + TrackManager::setTrackPowerF439ZI(1); + TrackManager::setTrackPowerF439ZI(2); + TrackManager::setTrackPowerF439ZI(3); + TrackManager::setTrackPowerF439ZI(4); + TrackManager::setTrackPowerF439ZI(5); + TrackManager::setTrackPowerF439ZI(6); + TrackManager::setTrackPowerF439ZI(7); + TrackManager::setTrackPowerF439ZI(0); // repeated in case the setPWM(pin_channel[pin], pin, frequency, 0); // set frequency in Hertz, 0% dutycycle - DIAG(F("DCCEXanalogWriteFrequency::Pin %d on Timer Channel %d, frequency %d"), pin, pin_channel[pin], frequency); + DIAG(F("DCCEXanalogWriteFrequency::Pin %d on Timer %d Channel %d, frequency %d"), pin, pin_timer[pin], pin_channel[pin], frequency); resetCounterDCmodeTimers(); } else @@ -353,6 +353,7 @@ 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! diff --git a/MotorDriver.cpp b/MotorDriver.cpp index b7df4a1..550b874 100644 --- a/MotorDriver.cpp +++ b/MotorDriver.cpp @@ -371,7 +371,9 @@ 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::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 diff --git a/TrackManager.cpp b/TrackManager.cpp index 25004a5..241ab90 100644 --- a/TrackManager.cpp +++ b/TrackManager.cpp @@ -738,3 +738,38 @@ TRACK_MODE TrackManager::getMode(byte t) { int16_t TrackManager::returnDCAddr(byte t) { return (trackDCAddr[t]); } + +// Set track power for EACH track, independent of mode +// This updates the settings so that speed is correct +// following a frequency change - DC mode +void TrackManager::setTrackPowerF439ZI(byte t) { + MotorDriver *driver=track[t]; + if (driver == NULL) { // track is not defined at all + // DIAG(F("Error: Track %c does not exist"), t+'A'); + return; + } + TRACK_MODE trackmode = driver->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 5d6b907..8009c38 100644 --- a/TrackManager.h +++ b/TrackManager.h @@ -67,6 +67,7 @@ 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);}