diff --git a/firmware/application/event_m0.cpp b/firmware/application/event_m0.cpp index f0f0bdb4..33c81ad3 100644 --- a/firmware/application/event_m0.cpp +++ b/firmware/application/event_m0.cpp @@ -57,7 +57,36 @@ CH_IRQ_HANDLER(M4Core_IRQHandler) { } -MessageHandlerMap EventDispatcher::message_map_; +class MessageHandlerMap { +public: + using MessageHandler = std::function; + + void register_handler(const Message::ID id, MessageHandler&& handler) { + if( map_[toUType(id)] != nullptr ) { + chDbgPanic("MsgDblReg"); + } + map_[toUType(id)] = std::move(handler); + } + + void unregister_handler(const Message::ID id) { + map_[toUType(id)] = nullptr; + } + + void send(Message* const message) { + if( message->id < Message::ID::MAX ) { + auto& fn = map_[toUType(message->id)]; + if( fn ) { + fn(message); + } + } + } + +private: + using MapType = std::array; + MapType map_; +}; + +static MessageHandlerMap message_map; Thread* EventDispatcher::thread_event_loop = nullptr; EventDispatcher::EventDispatcher( @@ -90,6 +119,10 @@ void EventDispatcher::request_stop() { is_running = false; } +void EventDispatcher::send_message(Message* const message) { + message_map.send(message); +} + void EventDispatcher::set_display_sleep(const bool sleep) { // TODO: Distribute display sleep message more broadly, shut down data generation // on baseband side, since all that data is being discarded during sleep. @@ -137,7 +170,7 @@ void EventDispatcher::dispatch(const eventmask_t events) { void EventDispatcher::handle_application_queue() { shared_memory.application_queue.handle([](Message* const message) { - message_map().send(message); + message_map.send(message); }); } @@ -193,7 +226,7 @@ void EventDispatcher::on_touch_event(ui::TouchEvent event) { void EventDispatcher::handle_lcd_frame_sync() { DisplayFrameSyncMessage message; - message_map().send(&message); + message_map.send(&message); painter.paint_widget_tree(top_widget); } @@ -262,9 +295,9 @@ MessageHandlerRegistration::MessageHandlerRegistration( MessageHandlerMap::MessageHandler&& callback ) : message_id { message_id } { - EventDispatcher::message_map().register_handler(message_id, std::move(callback)); + message_map.register_handler(message_id, std::move(callback)); } MessageHandlerRegistration::~MessageHandlerRegistration() { - EventDispatcher::message_map().unregister_handler(message_id); + message_map.unregister_handler(message_id); } diff --git a/firmware/application/event_m0.hpp b/firmware/application/event_m0.hpp index 5b3b2fd2..cdf73e84 100644 --- a/firmware/application/event_m0.hpp +++ b/firmware/application/event_m0.hpp @@ -80,16 +80,13 @@ public: } } - static MessageHandlerMap& message_map() { - return message_map_; - } + static void send_message(Message* const message); private: static constexpr auto EVT_MASK_RTC_TICK = EVENT_MASK(0); static constexpr auto EVT_MASK_LCD_FRAME_SYNC = EVENT_MASK(1); static constexpr auto EVT_MASK_APPLICATION = EVENT_MASK(6); - static MessageHandlerMap message_map_; static Thread* thread_event_loop; touch::Manager touch_manager; @@ -128,7 +125,7 @@ class MessageHandlerRegistration { public: MessageHandlerRegistration( const Message::ID message_id, - MessageHandlerMap::MessageHandler&& callback + std::function&& callback ); ~MessageHandlerRegistration(); diff --git a/firmware/application/ui_navigation.cpp b/firmware/application/ui_navigation.cpp index bb554d05..59de5a23 100644 --- a/firmware/application/ui_navigation.cpp +++ b/firmware/application/ui_navigation.cpp @@ -63,7 +63,7 @@ SystemStatusView::SystemStatusView() { button_sleep.on_select = [this](ImageButton&) { DisplaySleepMessage message; - EventDispatcher::message_map().send(&message); + EventDispatcher::send_message(&message); }; } diff --git a/firmware/common/message.hpp b/firmware/common/message.hpp index bc94fe12..640cd1d0 100644 --- a/firmware/common/message.hpp +++ b/firmware/common/message.hpp @@ -494,33 +494,4 @@ public: CaptureConfig* const config; }; -class MessageHandlerMap { -public: - using MessageHandler = std::function; - - void register_handler(const Message::ID id, MessageHandler&& handler) { - if( map_[toUType(id)] != nullptr ) { - chDbgPanic("MsgDblReg"); - } - map_[toUType(id)] = std::move(handler); - } - - void unregister_handler(const Message::ID id) { - map_[toUType(id)] = nullptr; - } - - void send(Message* const message) { - if( message->id < Message::ID::MAX ) { - auto& fn = map_[toUType(message->id)]; - if( fn ) { - fn(message); - } - } - } - -private: - using MapType = std::array; - MapType map_; -}; - #endif/*__MESSAGE_H__*/