mirror of
https://github.com/DCC-EX/CommandStation-EX.git
synced 2025-04-04 04:30:12 +02:00
Revert "Merge branch 'devel-Ash-F439sync' into devel"
This reverts commit3d794c59d8
, reversing changes made to84918cbf36
.
This commit is contained in:
parent
764639ed79
commit
3f8ecf2a52
@ -2,7 +2,7 @@
|
|||||||
* © 2022 Paul M Antoine
|
* © 2022 Paul M Antoine
|
||||||
* © 2021 Neil McKechnie
|
* © 2021 Neil McKechnie
|
||||||
* © 2021 Mike S
|
* © 2021 Mike S
|
||||||
* © 2021-2025 Herb Morton
|
* © 2021-2024 Herb Morton
|
||||||
* © 2020-2023 Harald Barth
|
* © 2020-2023 Harald Barth
|
||||||
* © 2020-2021 M Steve Todd
|
* © 2020-2021 M Steve Todd
|
||||||
* © 2020-2021 Fred Decker
|
* © 2020-2021 Fred Decker
|
||||||
@ -632,19 +632,7 @@ void DCCEXParser::parseOne(Print *stream, byte *com, RingStream * ringStream)
|
|||||||
else break; // will reply <X>
|
else break; // will reply <X>
|
||||||
}
|
}
|
||||||
//TrackManager::streamTrackState(NULL,t);
|
//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 <F29..31 was set on a later track than power
|
|
||||||
// Note: this retains power but prevents speed doubling
|
|
||||||
for (uint8_t i = 0; i < 7; i++) {
|
|
||||||
TrackManager::setTrackPowerF439ZI(i);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -801,11 +789,6 @@ void DCCEXParser::parseOne(Print *stream, byte *com, RingStream * ringStream)
|
|||||||
TrackManager::reportCurrent(stream); // <g limit...limit>
|
TrackManager::reportCurrent(stream); // <g limit...limit>
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case "L"_hk: // <JL display row> track state and mA value on display
|
|
||||||
if (params!=3) break;
|
|
||||||
TrackManager::reportCurrentLCD(p[1], p[2]); // Track power status
|
|
||||||
return;
|
|
||||||
|
|
||||||
case "A"_hk: // <JA> intercepted by EXRAIL// <JA> returns automations/routes
|
case "A"_hk: // <JA> intercepted by EXRAIL// <JA> returns automations/routes
|
||||||
if (params!=1) break; // <JA>
|
if (params!=1) break; // <JA>
|
||||||
StringFormatter::send(stream, F("<jA>\n"));
|
StringFormatter::send(stream, F("<jA>\n"));
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* © 2023 Neil McKechnie
|
* © 2023 Neil McKechnie
|
||||||
* © 2022-2024 Paul M. Antoine
|
* © 2022-2024 Paul M. Antoine
|
||||||
* © 2025 Herb Morton
|
|
||||||
* © 2021 Mike S
|
* © 2021 Mike S
|
||||||
* © 2021, 2023 Harald Barth
|
* © 2021, 2023 Harald Barth
|
||||||
* © 2021 Fred Decker
|
* © 2021 Fred Decker
|
||||||
@ -37,21 +36,6 @@
|
|||||||
#include "DIAG.h"
|
#include "DIAG.h"
|
||||||
#include <wiring_private.h>
|
#include <wiring_private.h>
|
||||||
|
|
||||||
// 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)
|
#if defined(ARDUINO_NUCLEO_F401RE)
|
||||||
// Nucleo-64 boards don't have additional serial ports defined by default
|
// Nucleo-64 boards don't have additional serial ports defined by default
|
||||||
// Serial1 is available on the F401RE, but not hugely convenient.
|
// 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)
|
else if (f >= 3)
|
||||||
DCCTimer::DCCEXanalogWriteFrequencyInternal(pin, 16000);
|
DCCTimer::DCCEXanalogWriteFrequencyInternal(pin, 16000);
|
||||||
else if (f >= 2)
|
else if (f >= 2)
|
||||||
DCCTimer::DCCEXanalogWriteFrequencyInternal(pin, 3600);
|
DCCTimer::DCCEXanalogWriteFrequencyInternal(pin, 3400);
|
||||||
else if (f == 1)
|
else if (f == 1)
|
||||||
DCCTimer::DCCEXanalogWriteFrequencyInternal(pin, 480);
|
DCCTimer::DCCEXanalogWriteFrequencyInternal(pin, 480);
|
||||||
else
|
else
|
||||||
@ -344,8 +328,7 @@ void DCCTimer::DCCEXanalogWriteFrequencyInternal(uint8_t pin, uint32_t frequency
|
|||||||
if (pin_timer[pin] != NULL)
|
if (pin_timer[pin] != NULL)
|
||||||
{
|
{
|
||||||
pin_timer[pin]->setPWM(pin_channel[pin], pin, frequency, 0); // set frequency in Hertz, 0% dutycycle
|
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);
|
DIAG(F("DCCEXanalogWriteFrequency::Pin %d on Timer Channel %d, frequency %d"), pin, pin_channel[pin], frequency);
|
||||||
resetCounterDCmodeTimers();
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
DIAG(F("DCCEXanalogWriteFrequency::failed to allocate HardwareTimer instance!"));
|
DIAG(F("DCCEXanalogWriteFrequency::failed to allocate HardwareTimer instance!"));
|
||||||
@ -353,13 +336,11 @@ void DCCTimer::DCCEXanalogWriteFrequencyInternal(uint8_t pin, uint32_t frequency
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Frequency change request
|
// Frequency change request
|
||||||
//DIAG(F("DCCEXanalogWriteFrequency_356::pin %d frequency %d"), pin, frequency);
|
|
||||||
if (frequency != channel_frequency[pin])
|
if (frequency != channel_frequency[pin])
|
||||||
{
|
{
|
||||||
pinmap_pinout(digitalPinToPinName(pin), PinMap_TIM); // ensure the pin has been configured!
|
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!
|
pin_timer[pin]->setOverflow(frequency, HERTZ_FORMAT); // Just change the frequency if it's already running!
|
||||||
DIAG(F("DCCEXanalogWriteFrequency::setting frequency to %d"), frequency);
|
DIAG(F("DCCEXanalogWriteFrequency::setting frequency to %d"), frequency);
|
||||||
resetCounterDCmodeTimers();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
channel_frequency[pin] = frequency;
|
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
|
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);
|
DIAG(F("DCCEXanalogWrite::Pin %d, value %d, duty cycle %d"), pin, value, duty_cycle);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
refreshDCmodeTimers();
|
|
||||||
resetCounterDCmodeTimers();
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
DIAG(F("DCCEXanalogWrite::Pin %d is not configured for PWM!"), pin);
|
DIAG(F("DCCEXanalogWrite::Pin %d is not configured for PWM!"), pin);
|
||||||
@ -681,35 +659,4 @@ void ADCee::begin() {
|
|||||||
#endif
|
#endif
|
||||||
interrupts();
|
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
|
#endif
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* © 2024, Chris Harlow.
|
* © 2024, Chris Harlow. All rights reserved.
|
||||||
* © 2025 Herb Morton
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
*
|
||||||
* This file is part of CommandStation-EX
|
* 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_EXSensorCAM.h"
|
||||||
#include "IO_DS1307.h"
|
#include "IO_DS1307.h"
|
||||||
#include "IO_I2CRailcom.h"
|
#include "IO_I2CRailcom.h"
|
||||||
#include "IO_HALDisplay.h"
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* © 2022-2024 Paul M Antoine
|
* © 2022-2024 Paul M Antoine
|
||||||
* © 2024-2025 Herb Morton
|
* © 2024 Herb Morton
|
||||||
* © 2021 Mike S
|
* © 2021 Mike S
|
||||||
* © 2021 Fred Decker
|
* © 2021 Fred Decker
|
||||||
* © 2020-2023 Harald Barth
|
* © 2020-2023 Harald Barth
|
||||||
@ -371,10 +371,8 @@ void MotorDriver::setDCSignal(byte speedcode, uint8_t frequency /*default =0*/)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
//DIAG(F("Brake pin %d value %d freqency %d"), brakePin, brake, f);
|
//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
|
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
|
#else // all AVR here
|
||||||
DCCTimer::DCCEXanalogWriteFrequency(brakePin, frequency); // frequency steps
|
DCCTimer::DCCEXanalogWriteFrequency(brakePin, frequency); // frequency steps
|
||||||
analogWrite(brakePin, invertBrake ? 255-brake : brake);
|
analogWrite(brakePin, invertBrake ? 255-brake : brake);
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* © 2022-2025 Chris Harlow
|
* © 2022-2025 Chris Harlow
|
||||||
* © 2022-2024 Harald Barth
|
* © 2022-2024 Harald Barth
|
||||||
* © 2023-2024 Paul M. Antoine
|
* © 2023-2024 Paul M. Antoine
|
||||||
* © 2024-2025 Herb Morton
|
* © 2024 Herb Morton
|
||||||
* © 2023 Colin Murdoch
|
* © 2023 Colin Murdoch
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@ -42,7 +42,6 @@
|
|||||||
|
|
||||||
MotorDriver * TrackManager::track[MAX_TRACKS] = { NULL };
|
MotorDriver * TrackManager::track[MAX_TRACKS] = { NULL };
|
||||||
int16_t TrackManager::trackDCAddr[MAX_TRACKS] = { 0 };
|
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;
|
int8_t TrackManager::lastTrack=-1;
|
||||||
bool TrackManager::progTrackSyncMain=false;
|
bool TrackManager::progTrackSyncMain=false;
|
||||||
@ -647,33 +646,6 @@ void TrackManager::reportCurrent(Print* stream) {
|
|||||||
StringFormatter::send(stream,F(">\n"));
|
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) {
|
void TrackManager::reportGauges(Print* stream) {
|
||||||
StringFormatter::send(stream,F("<jG"));
|
StringFormatter::send(stream,F("<jG"));
|
||||||
FOR_EACH_TRACK(t) {
|
FOR_EACH_TRACK(t) {
|
||||||
@ -738,38 +710,3 @@ TRACK_MODE TrackManager::getMode(byte t) {
|
|||||||
int16_t TrackManager::returnDCAddr(byte t) {
|
int16_t TrackManager::returnDCAddr(byte t) {
|
||||||
return (trackDCAddr[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();
|
|
||||||
}
|
|
@ -1,7 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* © 2022 Chris Harlow
|
* © 2022 Chris Harlow
|
||||||
* © 2022-2024 Harald Barth
|
* © 2022-2024 Harald Barth
|
||||||
* © 2025 Herb Morton
|
|
||||||
* © 2023 Colin Murdoch
|
* © 2023 Colin Murdoch
|
||||||
*
|
*
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
@ -67,7 +66,6 @@ class TrackManager {
|
|||||||
|
|
||||||
static void setPower(POWERMODE mode) {setMainPower(mode); setProgPower(mode);}
|
static void setPower(POWERMODE mode) {setMainPower(mode); setProgPower(mode);}
|
||||||
static void setTrackPower(POWERMODE mode, byte t);
|
static void setTrackPower(POWERMODE mode, byte t);
|
||||||
static void setTrackPowerF439ZI(byte t);
|
|
||||||
static void setTrackPower(TRACK_MODE trackmode, POWERMODE powermode);
|
static void setTrackPower(TRACK_MODE trackmode, POWERMODE powermode);
|
||||||
static void setMainPower(POWERMODE mode) {setTrackPower(TRACK_MODE_MAIN, mode);}
|
static void setMainPower(POWERMODE mode) {setTrackPower(TRACK_MODE_MAIN, mode);}
|
||||||
static void setProgPower(POWERMODE mode) {setTrackPower(TRACK_MODE_PROG, mode);}
|
static void setProgPower(POWERMODE mode) {setTrackPower(TRACK_MODE_PROG, mode);}
|
||||||
@ -89,7 +87,6 @@ class TrackManager {
|
|||||||
static void sampleCurrent();
|
static void sampleCurrent();
|
||||||
static void reportGauges(Print* stream);
|
static void reportGauges(Print* stream);
|
||||||
static void reportCurrent(Print* stream);
|
static void reportCurrent(Print* stream);
|
||||||
static void reportCurrentLCD(uint8_t display, byte row);
|
|
||||||
static void reportObsoleteCurrent(Print* stream);
|
static void reportObsoleteCurrent(Print* stream);
|
||||||
static void streamTrackState(Print* stream, byte t);
|
static void streamTrackState(Print* stream, byte t);
|
||||||
static bool isPowerOn(byte t);
|
static bool isPowerOn(byte t);
|
||||||
@ -108,7 +105,6 @@ class TrackManager {
|
|||||||
private:
|
private:
|
||||||
#endif
|
#endif
|
||||||
static MotorDriver* track[MAX_TRACKS];
|
static MotorDriver* track[MAX_TRACKS];
|
||||||
static int16_t tPwr_mA[8]; // for <JL ..> command
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void addTrack(byte t, MotorDriver* driver);
|
static void addTrack(byte t, MotorDriver* driver);
|
||||||
|
Loading…
Reference in New Issue
Block a user