1
0
mirror of https://github.com/DCC-EX/CommandStation-EX.git synced 2025-06-29 10:35:24 +02:00

EXRAIL: ONRAILSYNCON/OFF events added

This commit is contained in:
Harald Barth 2025-04-17 21:29:57 +02:00
parent 978671a688
commit 8fcc2b0083
8 changed files with 55 additions and 4 deletions

View File

@ -153,7 +153,14 @@ void setup()
void loop()
{
#ifdef ARDUINO_ARCH_ESP32
#ifdef BOOSTER_INPUT
static bool oldactive = false;
if (dccSniffer) {
bool newactive = dccSniffer->inputActive();
if (oldactive != newactive) {
RMFT2::railsyncEvent(newactive);
oldactive = newactive;
}
DCCPacket p = dccSniffer->fetchPacket();
if (p.len() != 0) {
if (DCCDecoder::parse(p)) {
@ -161,6 +168,7 @@ void loop()
}
}
}
#endif // BOOSTER_INPUT
#endif // ARDUINO_ARCH_ESP32
// The main sketch has responsibilities during loop()

View File

@ -88,6 +88,10 @@ LookList * RMFT2::onClockLookup=NULL;
LookList * RMFT2::onRotateLookup=NULL;
#endif
LookList * RMFT2::onOverloadLookup=NULL;
#ifdef BOOSTER_INPUT
LookList * RMFT2::onRailSyncOnLookup=NULL;
LookList * RMFT2::onRailSyncOffLookup=NULL;
#endif
byte * RMFT2::routeStateArray=nullptr;
const FSH * * RMFT2::routeCaptionArray=nullptr;
int16_t * RMFT2::stashArray=nullptr;
@ -204,6 +208,10 @@ LookList* RMFT2::LookListLoader(OPCODE op1, OPCODE op2, OPCODE op3) {
onRotateLookup=LookListLoader(OPCODE_ONROTATE);
#endif
onOverloadLookup=LookListLoader(OPCODE_ONOVERLOAD);
#ifdef BOOSTER_INPUT
onRailSyncOnLookup=LookListLoader(OPCODE_ONRAILSYNCON);
onRailSyncOffLookup=LookListLoader(OPCODE_ONRAILSYNCOFF);
#endif
// onLCCLookup is not the same so not loaded here.
// Second pass startup, define any turnouts or servos, set signals red
@ -1121,6 +1129,10 @@ void RMFT2::loop2() {
case OPCODE_ONROTATE:
#endif
case OPCODE_ONOVERLOAD:
#ifdef BOOSTER_INPUT
case OPCODE_ONRAILSYNCON:
case OPCODE_ONRAILSYNCOFF:
#endif
break;
@ -1343,7 +1355,16 @@ void RMFT2::powerEvent(int16_t track, bool overload) {
onOverloadLookup->handleEvent(F("POWER"),track);
}
}
#ifdef BOOSTER_INPUT
void RMFT2::railsyncEvent(bool on) {
if (Diag::CMD)
DIAG(F("railsyncEvent : %d"), on);
if (on)
onRailSyncOnLookup->handleEvent(F("RAILSYNCON"), 0);
else
onRailSyncOffLookup->handleEvent(F("RAILSYNCOFF"), 0);
}
#endif
// This function is used when setting pins so that a SET or RESET
// will cause any blink task on that pin to terminate.
// It will be compiled out of existence if no BLINK feature is used.

View File

@ -73,6 +73,7 @@ enum OPCODE : byte {OPCODE_THROW,OPCODE_CLOSE,OPCODE_TOGGLE_TURNOUT,
OPCODE_ACON, OPCODE_ACOF,
OPCODE_ONACON, OPCODE_ONACOF,
OPCODE_ONOVERLOAD,
OPCODE_ONRAILSYNCON,OPCODE_ONRAILSYNCOFF,
OPCODE_ROUTE_ACTIVE,OPCODE_ROUTE_INACTIVE,OPCODE_ROUTE_HIDDEN,
OPCODE_ROUTE_DISABLED,
OPCODE_STASH,OPCODE_CLEAR_STASH,OPCODE_CLEAR_ALL_STASH,OPCODE_PICKUP_STASH,
@ -188,6 +189,9 @@ class LookList {
static void clockEvent(int16_t clocktime, bool change);
static void rotateEvent(int16_t id, bool change);
static void powerEvent(int16_t track, bool overload);
#ifdef BOOSTER_INPUT
static void railsyncEvent(bool on);
#endif
static bool signalAspectEvent(int16_t address, byte aspect );
// Throttle Info Access functions built by exrail macros
static const byte rosterNameCount;
@ -255,7 +259,10 @@ private:
static LookList * onRotateLookup;
#endif
static LookList * onOverloadLookup;
#ifdef BOOSTER_INPUT
static LookList * onRailSyncOnLookup;
static LookList * onRailSyncOffLookup;
#endif
static const int countLCCLookup;
static int onLCCLookup[];
static const byte compileFeatures;

View File

@ -119,6 +119,8 @@
#undef ONCLOCKTIME
#undef ONCLOCKMINS
#undef ONOVERLOAD
#undef ONRAILSYNCON
#undef ONRAILSYNCOFF
#undef ONGREEN
#undef ONRED
#undef ONROTATE
@ -288,6 +290,8 @@
#define ONCLOCKTIME(hours,mins)
#define ONCLOCKMINS(mins)
#define ONOVERLOAD(track_id)
#define ONRAILSYNCON
#define ONRAILSYNCOFF
#define ONDEACTIVATE(addr,subaddr)
#define ONDEACTIVATEL(linear)
#define ONCLOSE(turnout_id)

View File

@ -584,6 +584,8 @@ int RMFT2::onLCCLookup[RMFT2::countLCCLookup];
#define ONCLOCKTIME(hours,mins) OPCODE_ONTIME,V((STRIP_ZERO(hours)*60)+STRIP_ZERO(mins)),
#define ONCLOCKMINS(mins) ONCLOCKTIME(25,mins)
#define ONOVERLOAD(track_id) OPCODE_ONOVERLOAD,V(TRACK_NUMBER_##track_id),
#define ONRAILSYNCON OPCODE_ONRAILSYNCON,0,0,
#define ONRAILSYNCOFF OPCODE_ONRAILSYNCOFF,0,0,
#define ONDEACTIVATE(addr,subaddr) OPCODE_ONDEACTIVATE,V(addr<<2|subaddr),
#define ONDEACTIVATEL(linear) OPCODE_ONDEACTIVATE,V(linear+3),
#define ONGREEN(signal_id) OPCODE_ONGREEN,V(signal_id),

View File

@ -1 +1 @@
#define GITHUB_SHA "devel-202503312038Z"
#define GITHUB_SHA "devel-202504171929Z"

View File

@ -103,6 +103,11 @@ Sniffer::Sniffer(byte snifferpin) {
ESP_ERROR_CHECK(mcpwm_capture_enable_channel(MCPWM_UNIT_0, MCPWM_SELECT_CAP0, &MCPWM_cap_config));
}
bool Sniffer::inputActive(){
unsigned long now = millis();
return ((now - lastendofpacket) < 1000);
}
#define DCC_TOO_SHORT 4000L // 4000 ticks are 50usec
#define DCC_ONE_LIMIT 6400L // 6400 ticks are 80usec
@ -191,6 +196,7 @@ void IRAM_ATTR Sniffer::processInterrupt(int32_t capticks, bool posedge) {
// blink_diag(1);
packeterror(); // or better?
}
lastendofpacket = millis();
DCCPacket temppacket(dccbytes, dcclen);
if (!(temppacket == prevpacket)) {
// we have something new to offer to the fetch routine

View File

@ -57,6 +57,7 @@ public:
interrupts();
return p;
};
bool inputActive();
private:
// keep these vars in processInterrupt only
uint64_t bitfield = 0;
@ -73,5 +74,7 @@ private:
bool fetchflag = false;
std::list<DCCPacket> outpacket;
DCCPacket prevpacket;
volatile unsigned long lastendofpacket = 0; // timestamp millis
};
#endif