From 634f92988f04a52c19ec5698fca78b4208cf0896 Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 29 Jun 2026 17:14:56 +0200 Subject: [PATCH] Added message bus and PowerEventMsg --- src/WiThrottle.h | 11 +++++++---- src/event_bus.hpp | 24 ++++++++++++++++++++++++ src/main.cpp | 10 ++++++++-- 3 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 src/event_bus.hpp diff --git a/src/WiThrottle.h b/src/WiThrottle.h index ca066f1..d0d120a 100644 --- a/src/WiThrottle.h +++ b/src/WiThrottle.h @@ -10,7 +10,7 @@ #include "CommandStation.h" #include "Watchdog.h" -#include "dcc/power_event.hpp" +#include "event_bus.hpp" #include #include @@ -32,7 +32,7 @@ #endif -class WiThrottleServer: public dcc::PowerObserver { +class WiThrottleServer: public etl::message_router { public: constexpr static uint16_t DEF_PORT = 4444; @@ -45,10 +45,13 @@ class WiThrottleServer: public dcc::PowerObserver { server.end(); } - void notification(const dcc::PowerEvent &event) override { - notifyPowerStatus(); + void on_receive(const PowerEventMsg &msg) { + //if(msg.event.channel == CS.getMainTrack()) + notifyPowerStatus(); } + void on_receive_unknown(const etl::imessage& msg) {} + void notifyPowerStatus(AsyncClient *c=nullptr) { bool v = CS.getPowerState(); powerStatus = v ? '1' : '0'; diff --git a/src/event_bus.hpp b/src/event_bus.hpp new file mode 100644 index 0000000..c895333 --- /dev/null +++ b/src/event_bus.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include + +enum { + PowerEventId = 0 +}; + +class PowerEventMsg: public etl::message { +public: + dcc::PowerEvent event; + PowerEventMsg(const dcc::PowerEvent &e): event{e} {} +}; + +/** Main event bus for application. + * Passes through all messages like power changes, users connecting/disconnecting, etc. + * Interested parties can subscribe to relevant events. + */ +inline etl::message_bus<20> event_bus; + + +inline etl::imessage_bus &get_event_bus() { + return event_bus; +} diff --git a/src/main.cpp b/src/main.cpp index 097ee06..f931ebc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,6 +13,8 @@ #include "WiThrottle.h" +#include "event_bus.hpp" + #include #include @@ -21,6 +23,8 @@ #include +#include + #include #include #include @@ -85,6 +89,7 @@ TimerType timerController; etl::timer::id::type ledTimer; etl::timer::id::type checkCurrentTimer; + class PowerStatusObserver: public dcc::PowerObserver { void notification(const dcc::PowerEvent &event) override { if(!event.state && event.reason == dcc::PowerEvent::Reason::Overcurrent) { @@ -95,11 +100,12 @@ class PowerStatusObserver: public dcc::PowerObserver { Serial.println("Overcurrent on prog"); } - } + event_bus.receive(PowerEventMsg{event}); } } powerStatusObserver; + void setup() { Serial.begin(115200); @@ -212,7 +218,7 @@ void setup() { MDNS.setInstanceName(CS_NAME); lbServer.begin(); withrottleServer.begin(); - dccMain.add_observer(withrottleServer); // withrottle doesn't need prog channel + get_event_bus().subscribe(withrottleServer); // withrottle doesn't need prog channel #endif