Skip to content

Commit 0a4ee98

Browse files
committed
add TRACK_MODIFIER_RAILCOM to Trackmanager
1 parent 1b7df8a commit 0a4ee98

File tree

3 files changed

+28
-10
lines changed

3 files changed

+28
-10
lines changed

DCCWaveformRMT.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,11 @@ void DCCWaveform::begin() {
5454
//DIAG(F("new MAIN channel with pins %d %d"), p.pin, p.invpin);
5555
rmtMainChannel = new RMTChannel(p, true); /* create new main channel */
5656
}
57-
int16_t brakePin = md->getBrakePinSigned();
58-
// if RC and so on XXX
59-
rmtMainChannel->addRCPin(brakePin);
57+
// if RC and so on XXX
58+
TRACK_MODE m = md->getMode();
59+
if (m & TRACK_MODIFIER_RAILCOM) {
60+
rmtMainChannel->addRCPin(md->getBrakePinSigned());
61+
}
6062
}
6163
MotorDriver *md = TrackManager::getProgDriver();
6264
if (md) {

MotorDriver.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,17 @@
3333
// For example TRACK_MODE_DC_INV is (TRACK_MODE_DC|TRACK_MODIFIER_INV)
3434
enum TRACK_MODE : byte {
3535
// main modes
36-
TRACK_MODE_NONE = 1, TRACK_MODE_MAIN = 2, TRACK_MODE_PROG = 4,
37-
TRACK_MODE_DC = 8, TRACK_MODE_EXT = 16,
36+
TRACK_MODE_NONE = 0, TRACK_MODE_MAIN = 1, TRACK_MODE_PROG = 2,
37+
TRACK_MODE_DC = 4, TRACK_MODE_EXT = 8,
3838
// modifiers
3939
TRACK_MODIFIER_INV = 64, TRACK_MODIFIER_AUTO = 128,
4040
#ifdef ARDUINO_ARCH_ESP32
41+
TRACK_MODIFIER_RAILCOM = 16,
4142
TRACK_MODE_BOOST = 32,
4243
TRACK_MODE_BOOST_INV = TRACK_MODE_BOOST|TRACK_MODIFIER_INV,
4344
TRACK_MODE_BOOST_AUTO = TRACK_MODE_BOOST|TRACK_MODIFIER_AUTO,
4445
#else
46+
TRACK_MODIFIER_RAILCOM = 0,
4547
TRACK_MODE_BOOST = 0,
4648
TRACK_MODE_BOOST_INV = 0,
4749
TRACK_MODE_BOOST_AUTO = 0,
@@ -220,6 +222,7 @@ class MotorDriver {
220222
};
221223
inline pinpair getSignalPin() { return pinpair(signalPin,signalPin2); };
222224
inline int16_t getBrakePinSigned() { return invertBrake ? -brakePin : brakePin; };
225+
inline int16_t getBrakePin() { return brakePin; };
223226
void setDCSignal(byte speedByte, uint8_t frequency=0);
224227
void throttleInrush(bool on);
225228
inline void detachDCSignal() {

TrackManager.cpp

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,13 @@ bool TrackManager::setTrackMode(byte trackToSet, TRACK_MODE mode, int16_t dcAddr
226226
//DIAG(F("Track=%c remove ^pin %d"),trackToSet+'A', p.invpin);
227227
gpio_reset_pin((gpio_num_t)p.invpin);
228228
}
229+
if (mode & TRACK_MODIFIER_RAILCOM) {
230+
byte bp = track[trackToSet]->getBrakePin();
231+
if (bp != UNUSED_PIN) {
232+
gpio_reset_pin((gpio_num_t)bp);
233+
digitalWrite(bp, LOW);
234+
}
235+
}
229236
#ifdef BOOSTER_INPUT
230237
if (mode & TRACK_MODE_BOOST) {
231238
//DIAG(F("Track=%c mode boost pin %d"),trackToSet+'A', p.pin);
@@ -400,12 +407,18 @@ bool TrackManager::parseEqualSign(Print *stream, int16_t params, int16_t p[])
400407
if (params>1 && (p[0]<0 || p[0]>=MAX_TRACKS))
401408
return false;
402409

403-
if (params==2 && p[1]=="MAIN"_hk) // <= id MAIN>
410+
if (params==2 && p[1]=="MAIN"_hk) // <= id MAIN>
404411
return setTrackMode(p[0],TRACK_MODE_MAIN);
405-
if (params==2 && p[1]=="MAIN_INV"_hk) // <= id MAIN_INV>
412+
if (TRACK_MODIFIER_RAILCOM != 0 && params==2 && p[1]=="MAIN_RAILCOM"_hk) // <= id MAIN_RAILCOM>
413+
return setTrackMode(p[0],TRACK_MODE_MAIN|TRACK_MODIFIER_RAILCOM);
414+
if (params==2 && p[1]=="MAIN_INV"_hk) // <= id MAIN_INV>
406415
return setTrackMode(p[0],TRACK_MODE_MAIN_INV);
407-
if (params==2 && p[1]=="MAIN_AUTO"_hk) // <= id MAIN_AUTO>
416+
if (TRACK_MODIFIER_RAILCOM != 0 && params==2 && p[1]=="MAIN_INV_RAILCOM"_hk) // <= id MAIN_INV_RAILCOM>
417+
return setTrackMode(p[0],TRACK_MODE_MAIN_INV|TRACK_MODIFIER_RAILCOM);
418+
if (params==2 && p[1]=="MAIN_AUTO"_hk) // <= id MAIN_AUTO>
408419
return setTrackMode(p[0],TRACK_MODE_MAIN_AUTO);
420+
if (TRACK_MODIFIER_RAILCOM != 0 && params==2 && p[1]=="MAIN_AUTO_RAILCOM"_hk)// <= id MAIN_AUTO_RAILCOM>
421+
return setTrackMode(p[0],TRACK_MODE_MAIN_AUTO|TRACK_MODIFIER_RAILCOM);
409422

410423
#ifndef DISABLE_PROG
411424
if (params==2 && p[1]=="PROG"_hk) // <= id PROG>
@@ -459,7 +472,7 @@ const FSH* TrackManager::getModeName(TRACK_MODE tm) {
459472
else if (tm & TRACK_MODE_PROG)
460473
modename=F("PROG");
461474
#endif
462-
else if (tm & TRACK_MODE_NONE)
475+
else if (tm == TRACK_MODE_NONE)
463476
modename=F("NONE");
464477
else if(tm & TRACK_MODE_EXT)
465478
modename=F("EXT");
@@ -568,7 +581,7 @@ void TrackManager::setTrackPower(POWERMODE powermode, byte t) {
568581
}
569582
TRACK_MODE trackmode = driver->getMode();
570583
POWERMODE oldpower = driver->getPower();
571-
if (trackmode & TRACK_MODE_NONE) {
584+
if (trackmode == TRACK_MODE_NONE) {
572585
driver->setBrake(true); // Track is unused. Brake is good to have.
573586
powermode = POWERMODE::OFF; // Track is unused. Force it to OFF
574587
} else if (trackmode & TRACK_MODE_DC) { // includes inverted DC (called DCX)

0 commit comments

Comments
 (0)