From 8fcc2b00835a0dbeba5cb6837d3686f6134b8cce Mon Sep 17 00:00:00 2001 From: Harald Barth Date: Thu, 17 Apr 2025 21:29:57 +0200 Subject: [PATCH] EXRAIL: ONRAILSYNCON/OFF events added --- CommandStation-EX.ino | 8 ++++++++ EXRAIL2.cpp | 25 +++++++++++++++++++++++-- EXRAIL2.h | 9 ++++++++- EXRAIL2MacroReset.h | 4 ++++ EXRAILMacros.h | 2 ++ GITHUB_SHA.h | 2 +- Sniffer.cpp | 6 ++++++ Sniffer.h | 3 +++ 8 files changed, 55 insertions(+), 4 deletions(-) diff --git a/CommandStation-EX.ino b/CommandStation-EX.ino index 33cc23d..691c5e3 100644 --- a/CommandStation-EX.ino +++ b/CommandStation-EX.ino @@ -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() diff --git a/EXRAIL2.cpp b/EXRAIL2.cpp index 3007440..d516bb9 100644 --- a/EXRAIL2.cpp +++ b/EXRAIL2.cpp @@ -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,7 +1129,11 @@ void RMFT2::loop2() { case OPCODE_ONROTATE: #endif case OPCODE_ONOVERLOAD: - +#ifdef BOOSTER_INPUT + case OPCODE_ONRAILSYNCON: + case OPCODE_ONRAILSYNCOFF: +#endif + break; default: @@ -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. diff --git a/EXRAIL2.h b/EXRAIL2.h index 5b95f8e..2e7be1d 100644 --- a/EXRAIL2.h +++ b/EXRAIL2.h @@ -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; diff --git a/EXRAIL2MacroReset.h b/EXRAIL2MacroReset.h index 4db69df..7decdec 100644 --- a/EXRAIL2MacroReset.h +++ b/EXRAIL2MacroReset.h @@ -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) diff --git a/EXRAILMacros.h b/EXRAILMacros.h index d0f640a..c31cdab 100644 --- a/EXRAILMacros.h +++ b/EXRAILMacros.h @@ -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), diff --git a/GITHUB_SHA.h b/GITHUB_SHA.h index c00a0ca..5455610 100644 --- a/GITHUB_SHA.h +++ b/GITHUB_SHA.h @@ -1 +1 @@ -#define GITHUB_SHA "devel-202503312038Z" +#define GITHUB_SHA "devel-202504171929Z" diff --git a/Sniffer.cpp b/Sniffer.cpp index 2eeeadf..d0bb106 100644 --- a/Sniffer.cpp +++ b/Sniffer.cpp @@ -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 diff --git a/Sniffer.h b/Sniffer.h index d576c5c..5994c79 100644 --- a/Sniffer.h +++ b/Sniffer.h @@ -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 outpacket; DCCPacket prevpacket; + volatile unsigned long lastendofpacket = 0; // timestamp millis + }; #endif