From b9e2bffb93cbcae1abfbbab9dd1f73ca93a21ef5 Mon Sep 17 00:00:00 2001 From: Sassa NF Date: Sun, 6 Oct 2024 17:26:08 +0100 Subject: [PATCH] drone_sound_alarm as event listener --- lib/scan/scan.cpp | 15 +++++++++++++++ lib/scan/scan.h | 1 + src/main.cpp | 29 ++++++++++++++++++++--------- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/lib/scan/scan.cpp b/lib/scan/scan.cpp index 028cf42..8c4fbed 100644 --- a/lib/scan/scan.cpp +++ b/lib/scan/scan.cpp @@ -154,6 +154,21 @@ size_t Scan::addEventListener(EventType t, Listener &l) return c; } +struct CallbackFunction : Listener +{ + void (*cb)(void *arg, Event &e); + void *arg; + + CallbackFunction(void cb(void *arg, Event &e), void *arg) : cb(cb), arg(arg) {} + + void onEvent(Event &e) { cb(arg, e); } +}; + +size_t Scan::addEventListener(EventType t, void cb(void *arg, Event &e), void *arg) +{ + return addEventListener(t, *(new CallbackFunction(cb, arg))); +} + void Scan::fireEvent(Event &event) { Listener **list = eventListeners[(size_t)event.type]; diff --git a/lib/scan/scan.h b/lib/scan/scan.h index 68b8cb5..b46ef83 100644 --- a/lib/scan/scan.h +++ b/lib/scan/scan.h @@ -69,6 +69,7 @@ struct Scan int samples); size_t addEventListener(EventType t, Listener &l); + size_t addEventListener(EventType t, void cb(void *, Event &), void *arg); void fireEvent(Event &e); }; diff --git a/src/main.cpp b/src/main.cpp index c6e6514..9ddba7a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -520,6 +520,8 @@ void logToSerialTask(void *parameter) } } +void drone_sound_alarm(void *arg, Event &e); + void setup(void) { #ifdef LILYGO @@ -678,12 +680,10 @@ void setup(void) r.trigger_level = TRIGGER_LEVEL; stacked.reset(0, 0, display.width(), display.height()); - r.addEventListener(SCAN_TASK_COMPLETE, stacked); bar = new DecoratedBarChart(display, 0, 0, display.width(), 0, FREQ_BEGIN, FREQ_END, LO_RSSI_THRESHOLD, HI_RSSI_THRESHOLD, r.trigger_level); - r.addEventListener(DETECTED, bar->bar); size_t b = stacked.addChart(bar); Chart *statusBar = new StatusBar(display, 0, 0, display.width(), r); @@ -709,6 +709,10 @@ void setup(void) size_t d = stacked.addChart(statusBar); stacked.setHeight(b, stacked.height); + r.addEventListener(DETECTED, bar->bar); + r.addEventListener(DETECTED, drone_sound_alarm, &r); + r.addEventListener(SCAN_TASK_COMPLETE, stacked); + #ifdef UPTIME_CLOCK uptime = new UptimeClock(display, millis()); #endif @@ -796,9 +800,21 @@ bool buttonPressHandler(float freq) return true; } -void drone_sound_alarm(int drone_detection_level, int detection_count, - int tone_freq_db = 205) +void drone_sound_alarm(void *arg, Event &e) { + if (e.type != DETECTED) + { + return; + } + + Scan &r = *((Scan *)arg); + if (!r.sound_on) + return; + + int tone_freq_db = e.detected.detected_at * 2; + int drone_detection_level = r.drone_detection_level; + int detection_count = r.detection_count; + // If level is set to sensitive, // start beeping every 10th frequency and shorter // it improves performance less short beep delays... @@ -1115,11 +1131,6 @@ void loop(void) // mark freq end ... will shift right to last detected range drone_detected_frequency_end = r.current_frequency; - if (r.sound_on) - { - drone_sound_alarm(r.drone_detection_level, r.detection_count, - max_rssi_x * 2); - } #ifdef LOG_DATA_JSON frequency_scan_result.begin = drone_detected_frequency_start;