From be88bea42d45919ecccd11aefefc9ab0b559fed9 Mon Sep 17 00:00:00 2001 From: seagull9000 Date: Tue, 20 May 2025 13:26:40 +1200 Subject: [PATCH] initial support for generic RTTTL notifier --- examples/companion_radio/buzzer.cpp | 54 +++++++++++++++++++++++++++++ examples/companion_radio/buzzer.h | 36 +++++++++++++++++++ examples/companion_radio/main.cpp | 20 ++++++++++- variants/t1000-e/platformio.ini | 3 ++ 4 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 examples/companion_radio/buzzer.cpp create mode 100644 examples/companion_radio/buzzer.h diff --git a/examples/companion_radio/buzzer.cpp b/examples/companion_radio/buzzer.cpp new file mode 100644 index 00000000..0465bf16 --- /dev/null +++ b/examples/companion_radio/buzzer.cpp @@ -0,0 +1,54 @@ +#ifdef PIN_BUZZER +#include "buzzer.h" + +void genericBuzzer::begin() { + Serial.print("DBG: Setting up buzzer on pin "); + Serial.println(PIN_BUZZER); + #ifdef PIN_BUZZER_EN + pinMode(PIN_BUZZER_EN, OUTPUT); + digitalWrite(PIN_BUZZER_EN, HIGH); + #endif + + quiet(false); + pinMode(PIN_BUZZER, OUTPUT); + startup(); +} + +void genericBuzzer::play(const char *melody) { + if (isPlaying()) // interrupt existing + { + rtttl::stop(); + } + + if (_is_quiet) return; + + rtttl::begin(PIN_BUZZER,melody); +// Serial.print("DBG: Playing melody - isQuiet: "); +// Serial.println(isQuiet()); +} + +bool genericBuzzer::isPlaying() { + return rtttl::isPlaying(); +} + +void genericBuzzer::loop() { + if (!rtttl::done()) rtttl::play(); +} + +void genericBuzzer::startup() { + play(startup_song); +} + +void genericBuzzer::shutdown() { + play(shutdown_song); +} + +void genericBuzzer::quiet(bool buzzer_state) { + _is_quiet = buzzer_state; +} + +bool genericBuzzer::isQuiet() { + return _is_quiet; +} + +#endif // ifdef PIN_BUZZER \ No newline at end of file diff --git a/examples/companion_radio/buzzer.h b/examples/companion_radio/buzzer.h new file mode 100644 index 00000000..9f3f3fd3 --- /dev/null +++ b/examples/companion_radio/buzzer.h @@ -0,0 +1,36 @@ +#pragma once + +#include +#include + +/* class abstracts underlying RTTTL library + + Just a simple imlementation to start. At the moment use same + melody for message and discovery + Suggest enum type for different sounds + - on message + - on discovery + + TODO + - make message ring tone configurable + +*/ +class genericBuzzer +{ + public: + void begin(); // set up buzzer port + void play(const char *melody); // Generic play function + void loop(); // loop driven-nonblocking + void startup(); // play startup sound + void shutdown(); // play shutdown sound + bool isPlaying(); // returns true if a sound is still playing else false + void quiet(bool buzzer_state); // enables or disables the buzzer + bool isQuiet(); // get buzzer state on/off + + private: + // gemini's picks: + const char *startup_song = "Startup:d=4,o=5,b=160:16c6,16e6,8g6"; + const char *shutdown_song = "Shutdown:d=4,o=5,b=100:8g5,16e5,16c5"; + + bool _is_quiet = true; +}; diff --git a/examples/companion_radio/main.cpp b/examples/companion_radio/main.cpp index 2cfb833b..8b4b437f 100644 --- a/examples/companion_radio/main.cpp +++ b/examples/companion_radio/main.cpp @@ -66,6 +66,11 @@ static UITask ui_task(&board); #endif +#ifdef PIN_BUZZER + #include "buzzer.h" + genericBuzzer buzzer; +#endif + // Believe it or not, this std C function is busted on some platforms! static uint32_t _atoi(const char* sp) { uint32_t n = 0; @@ -484,7 +489,12 @@ class MyMesh : public BaseChatMesh { } void soundBuzzer() { - // TODO + #if defined(PIN_BUZZER) + // gemini's pick + buzzer.play("MsgRcv3:d=4,o=6,b=200:32e,32g,32b,16c7"); + //Serial.println("DBG: Buzzzzzz"); + #endif + } protected: @@ -1553,6 +1563,10 @@ public: ui_task.setHasConnection(_serial->isConnected()); ui_task.loop(); #endif + + #ifdef PIN_BUZZER + if (buzzer.isPlaying()) buzzer.loop(); + #endif } }; @@ -1620,6 +1634,10 @@ void setup() { board.begin(); +#ifdef PIN_BUZZER + buzzer.begin(); +#endif + #ifdef DISPLAY_CLASS DisplayDriver* disp = NULL; if (display.begin()) { diff --git a/variants/t1000-e/platformio.ini b/variants/t1000-e/platformio.ini index 927655af..e61ea939 100644 --- a/variants/t1000-e/platformio.ini +++ b/variants/t1000-e/platformio.ini @@ -47,9 +47,12 @@ build_flags = ${t1000-e.build_flags} -D RX_BOOSTED_GAIN=true -D RF_SWITCH_TABLE -D DISPLAY_CLASS=NullDisplayDriver + -D PIN_BUZZER=25 + -D PIN_BUZZER_EN=37 ; P1/5 - required for T1000-E build_src_filter = ${t1000-e.build_src_filter} + +<../examples/companion_radio/*.cpp> lib_deps = ${t1000-e.lib_deps} densaugeo/base64 @ ~1.4.0 stevemarple/MicroNMEA @ ^2.0.6 + end2endzone/NonBlockingRTTTL@^1.3.0 \ No newline at end of file