@@ -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