1
0
mirror of https://github.com/DCC-EX/CommandStation-EX.git synced 2024-12-23 12:51:24 +01:00

make usePWM per track (trackPWM) 2nd half

This commit is contained in:
Harald Barth 2022-06-11 19:57:45 +02:00
parent 62e471606d
commit 40dfda47c7
3 changed files with 22 additions and 8 deletions

View File

@ -1 +1 @@
#define GITHUB_SHA "TM-PORTX-20220607"
#define GITHUB_SHA "TM-PORTX-20220607-1"

View File

@ -2,6 +2,7 @@
* © 2021 Mike S
* © 2021 Fred Decker
* © 2020 Chris Harlow
* © 2022 Harald Barth
* All rights reserved.
*
* This file is part of Asbelos DCC API
@ -87,7 +88,7 @@ class MotorDriver {
virtual void setPower( POWERMODE mode);
virtual POWERMODE getPower() { return powerMode;}
__attribute__((always_inline)) inline void setSignal( bool high) {
if (usePWM) {
if (trackPWM) {
DCCTimer::setPWM(signalPin,high);
}
else {
@ -121,7 +122,8 @@ class MotorDriver {
}
bool isPWMCapable();
bool canMeasureCurrent();
static bool usePWM;
bool trackPWM;
static bool usePWM; // TODO: Remove
static bool commonFaultPin; // This is a stupid motor shield which has only a common fault pin for both outputs
inline byte getFaultPin() {
return faultPin;

View File

@ -190,14 +190,26 @@ bool TrackManager::setTrackMode(byte trackToSet, TRACK_MODE mode, int16_t dcAddr
// capable tracks is now DC or DCX.
if (trackMode[t]==TRACK_MODE_DC || trackMode[t]==TRACK_MODE_DCX) {
if (track[t]->isPWMCapable()) {
canDo=false;
break;
canDo=false; // this track is capable but can not run PWM
break; // in this mode, so abort and prevent globally below
} else {
track[t]->trackPWM=false; // this track sure can not run with PWM
//DIAG(F("Track %c trackPWM 0 (not capable)"), t+'A');
}
} else if (trackMode[t]==TRACK_MODE_MAIN || trackMode[t]==TRACK_MODE_PROG)
canDo &= track[t]->isPWMCapable();
} else if (trackMode[t]==TRACK_MODE_MAIN || trackMode[t]==TRACK_MODE_PROG) {
track[t]->trackPWM = track[t]->isPWMCapable(); // trackPWM is still a guess here
//DIAG(F("Track %c trackPWM %d"), t+'A', track[t]->trackPWM);
canDo &= track[t]->trackPWM;
}
}
if (!canDo) {
DCCTimer::clearPWM();
// if we discover that HA mode was globally impossible
// we must adjust the trackPWM capabilities
FOR_EACH_TRACK(t) {
track[t]->trackPWM=false;
//DIAG(F("Track %c trackPWM 0 (global override)"), t+'A');
}
DCCTimer::clearPWM(); // has to be AFTER trackPWM changes because if trackPWM==true this is undone for that track
}
//if (MotorDriver::usePWM != canDo)
// DIAG(F("HA mode changed from %d to %d"), MotorDriver::usePWM, canDo);