diff --git a/firmware/application/event_m0.cpp b/firmware/application/event_m0.cpp index 0d8946feb..384887496 100644 --- a/firmware/application/event_m0.cpp +++ b/firmware/application/event_m0.cpp @@ -32,7 +32,7 @@ CH_IRQ_HANDLER(M4Core_IRQHandler) { CH_IRQ_PROLOGUE(); chSysLockFromIsr(); - events_flag_isr(EVT_MASK_APPLICATION); + EventDispatcher::events_flag_isr(EVT_MASK_APPLICATION); chSysUnlockFromIsr(); creg::m4txevent::clear(); @@ -41,3 +41,5 @@ CH_IRQ_HANDLER(M4Core_IRQHandler) { } } + +Thread* EventDispatcher::thread_event_loop = nullptr; diff --git a/firmware/application/event_m0.hpp b/firmware/application/event_m0.hpp index 890fdcb93..41e74f7bb 100644 --- a/firmware/application/event_m0.hpp +++ b/firmware/application/event_m0.hpp @@ -66,6 +66,7 @@ public: painter(painter), context(context) { + thread_event_loop = chThdSelf(); touch_manager.on_event = [this](const ui::TouchEvent event) { this->on_touch_event(event); }; @@ -86,7 +87,21 @@ public: is_running = false; } + static inline void events_flag(const eventmask_t events) { + if( thread_event_loop ) { + chEvtSignal(thread_event_loop, events); + } + } + + static inline void events_flag_isr(const eventmask_t events) { + if( thread_event_loop ) { + chEvtSignalI(thread_event_loop, events); + } + } + private: + static Thread* thread_event_loop; + touch::Manager touch_manager; ui::Widget* const top_widget; ui::Painter& painter; diff --git a/firmware/application/irq_controls.cpp b/firmware/application/irq_controls.cpp index bba6f54d2..5a789721d 100644 --- a/firmware/application/irq_controls.cpp +++ b/firmware/application/irq_controls.cpp @@ -165,7 +165,7 @@ void timer0_callback(GPTDriver* const) { /* Signal event loop */ if( event_mask ) { chSysLockFromIsr(); - events_flag_isr(event_mask); + EventDispatcher::events_flag_isr(event_mask); chSysUnlockFromIsr(); } diff --git a/firmware/application/irq_lcd_frame.cpp b/firmware/application/irq_lcd_frame.cpp index 6ea2ed2df..585feb1f0 100644 --- a/firmware/application/irq_lcd_frame.cpp +++ b/firmware/application/irq_lcd_frame.cpp @@ -54,7 +54,7 @@ CH_IRQ_HANDLER(PIN_INT4_IRQHandler) { CH_IRQ_PROLOGUE(); chSysLockFromIsr(); - events_flag_isr(EVT_MASK_LCD_FRAME_SYNC); + EventDispatcher::events_flag_isr(EVT_MASK_LCD_FRAME_SYNC); chSysUnlockFromIsr(); LPC_GPIO_INT->IST = (1U << 4); diff --git a/firmware/application/irq_rtc.cpp b/firmware/application/irq_rtc.cpp index 9a7243201..332f1b3e9 100644 --- a/firmware/application/irq_rtc.cpp +++ b/firmware/application/irq_rtc.cpp @@ -39,7 +39,7 @@ CH_IRQ_HANDLER(RTC_IRQHandler) { CH_IRQ_PROLOGUE(); chSysLockFromIsr(); - events_flag_isr(EVT_MASK_RTC_TICK); + EventDispatcher::events_flag_isr(EVT_MASK_RTC_TICK); chSysUnlockFromIsr(); rtc::interrupt::clear_all(); diff --git a/firmware/application/main.cpp b/firmware/application/main.cpp index 2746beeb7..788a44522 100755 --- a/firmware/application/main.cpp +++ b/firmware/application/main.cpp @@ -66,7 +66,6 @@ int main(void) { sdcStart(&SDCD1, nullptr); - events_initialize(chThdSelf()); init_message_queues(); ui::Context context; diff --git a/firmware/baseband/event_m4.cpp b/firmware/baseband/event_m4.cpp index ae72c8426..00f8bf1e8 100644 --- a/firmware/baseband/event_m4.cpp +++ b/firmware/baseband/event_m4.cpp @@ -32,7 +32,7 @@ CH_IRQ_HANDLER(MAPP_IRQHandler) { CH_IRQ_PROLOGUE(); chSysLockFromIsr(); - events_flag_isr(EVT_MASK_BASEBAND); + EventDispatcher::events_flag_isr(EVT_MASK_BASEBAND); chSysUnlockFromIsr(); creg::m0apptxevent::clear(); @@ -41,3 +41,5 @@ CH_IRQ_HANDLER(MAPP_IRQHandler) { } } + +Thread* EventDispatcher::thread_event_loop = nullptr; diff --git a/firmware/baseband/event_m4.hpp b/firmware/baseband/event_m4.hpp index b257c158f..e330226a4 100644 --- a/firmware/baseband/event_m4.hpp +++ b/firmware/baseband/event_m4.hpp @@ -44,7 +44,7 @@ constexpr auto EVT_MASK_SPECTRUM = EVENT_MASK(1); class EventDispatcher { public: void run() { - events_initialize(chThdSelf()); + thread_event_loop = chThdSelf(); lpc43xx::creg::m0apptxevent::enable(); baseband_thread.thread_main = chThdSelf(); @@ -63,7 +63,21 @@ public: is_running = false; } + static inline void events_flag(const eventmask_t events) { + if( thread_event_loop ) { + chEvtSignal(thread_event_loop, events); + } + } + + static inline void events_flag_isr(const eventmask_t events) { + if( thread_event_loop ) { + chEvtSignalI(thread_event_loop, events); + } + } + private: + static Thread* thread_event_loop; + BasebandThread baseband_thread; RSSIThread rssi_thread; diff --git a/firmware/baseband/spectrum_collector.cpp b/firmware/baseband/spectrum_collector.cpp index 7a262ba66..2b661c9a8 100644 --- a/firmware/baseband/spectrum_collector.cpp +++ b/firmware/baseband/spectrum_collector.cpp @@ -27,6 +27,8 @@ #include "event_m4.hpp" #include "portapack_shared_memory.hpp" +#include "event_m4.hpp" + #include void SpectrumCollector::on_message(const Message* const message) { @@ -97,7 +99,7 @@ void SpectrumCollector::post_message(const buffer_c16_t& data) { fft_swap(data, channel_spectrum); channel_spectrum_sampling_rate = data.sampling_rate; channel_spectrum_request_update = true; - events_flag(EVT_MASK_SPECTRUM); + EventDispatcher::events_flag(EVT_MASK_SPECTRUM); } } diff --git a/firmware/common/event.cpp b/firmware/common/event.cpp index 28f1151d1..eee675cdf 100644 --- a/firmware/common/event.cpp +++ b/firmware/common/event.cpp @@ -22,9 +22,3 @@ #include "event.hpp" #include "ch.h" - -Thread* thread_event_loop = nullptr; - -void events_initialize(Thread* const event_loop_thread) { - thread_event_loop = event_loop_thread; -} diff --git a/firmware/common/event.hpp b/firmware/common/event.hpp index d05a0a325..a6432674c 100644 --- a/firmware/common/event.hpp +++ b/firmware/common/event.hpp @@ -24,20 +24,4 @@ #include "ch.h" -void events_initialize(Thread* const event_loop_thread); - -extern Thread* thread_event_loop; - -inline void events_flag(const eventmask_t events) { - if( thread_event_loop ) { - chEvtSignal(thread_event_loop, events); - } -} - -inline void events_flag_isr(const eventmask_t events) { - if( thread_event_loop ) { - chEvtSignalI(thread_event_loop, events); - } -} - #endif/*__EVENT_H__*/