1
0
mirror of https://github.com/DCC-EX/CommandStation-EX.git synced 2025-02-26 18:46:04 +01:00
CommandStation-EX/BoosterAutomation.h
2025-02-23 08:48:17 +01:00

63 lines
1.6 KiB
C

// Booster/CS switch automations
// uses BOOSTER_INPUT from config.h
// uses sequences BOOSTER_START, BOOSTER_CSMODE, BOOSTER_BOOSTERMODE, BOOSTER_CHANGELOGIC
// uses latches 200
#if defined(ARDUINO_ARCH_ESP32)
#ifndef BOOSTER_INPUT
#error You need to define BOOSTER_INPUT in config.h
#endif
ALIAS(BOOSTER_START)
ALIAS(BOOSTER_CSMODE)
ALIAS(BOOSTER_BOOSTERMODE)
ALIAS(BOOSTER_CHANGELOGIC)
AUTOSTART // remove this if you want manual start
ROUTE(BOOSTER_START, "BOOSTER/CS auto START")
PRINT("BOOTER/CS auto mode starting for both tracks")
CALL(BOOSTER_BOOSTERMODE) // try booster mode
FOLLOW(BOOSTER_CHANGELOGIC) // goto automatic mode
ROUTE(BOOSTER_CSMODE, "RUN AS CS")
SET_TRACK(A, MAIN)
// SET_POWER(A, ON)
SET_TRACK(B, PROG)
// SET_POWER(B, ON)
PRINT("CS START")
LATCH(200)
RETURN
ROUTE(BOOSTER_BOOSTERMODE, "RUN AS BOOSTER")
SET_TRACK(A, BOOST)
SET_POWER(A, ON)
SET_TRACK(B, BOOST)
SET_POWER(B, ON)
PRINT("BOOSTER START")
UNLATCH(200)
RETURN
#define BOOSTER_TIMEOUT 500
SEQUENCE(BOOSTER_CHANGELOGIC)
// Monitor pin change and get a timeout if not
IF(BOOSTER_INPUT)
ATTIMEOUT(-BOOSTER_INPUT,BOOSTER_TIMEOUT)
ELSE
ATTIMEOUT(BOOSTER_INPUT,BOOSTER_TIMEOUT)
ENDIF
IFTIMEOUT
IF(200)
// already switched to CS mode
ELSE
CALL(BOOSTER_CSMODE)
ENDIF
// hang here and wait for pin change
IF(BOOSTER_INPUT)
AT(-BOOSTER_INPUT)
ELSE
AT(BOOSTER_INPUT)
ENDIF
// pin change has happened, go to booster mode
CALL(BOOSTER_BOOSTERMODE)
ENDIF
FOLLOW(BOOSTER_CHANGELOGIC)
#undef BOOSTER_TIMEOUT
#endif