* refactored buzzer concept to UITask

* moved buzzer.h/cpp to helpers/ui
This commit is contained in:
Scott Powell 2025-05-20 11:52:55 +10:00
parent 4a60548b7d
commit 7e90d386e2
7 changed files with 35 additions and 26 deletions

View file

@ -53,6 +53,18 @@ void UITask::begin(DisplayDriver* display, NodePrefs* node_prefs, const char* bu
// v1.2.3 (1 Jan 2025)
sprintf(_version_info, "%s (%s)", version, build_date);
#ifdef PIN_BUZZER
buzzer.begin();
#endif
}
void UITask::soundBuzzer() {
#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
}
void UITask::msgRead(int msgcount) {
@ -248,6 +260,10 @@ void UITask::loop() {
buttonHandler();
userLedHandler();
#ifdef PIN_BUZZER
if (buzzer.isPlaying()) buzzer.loop();
#endif
if (_display != NULL && _display->isOn()) {
static bool _firstBoot = true;
if(_firstBoot && millis() >= BOOT_SCREEN_MILLIS) {

View file

@ -4,11 +4,18 @@
#include <helpers/ui/DisplayDriver.h>
#include <stddef.h>
#ifdef PIN_BUZZER
#include <helpers/ui/buzzer.h>
#endif
#include "NodePrefs.h"
class UITask {
DisplayDriver* _display;
mesh::MainBoard* _board;
#ifdef PIN_BUZZER
genericBuzzer buzzer;
#endif
unsigned long _next_refresh, _auto_off;
bool _connected;
uint32_t _pin_code;
@ -37,5 +44,6 @@ public:
void clearMsgPreview();
void msgRead(int msgcount);
void newMsg(uint8_t path_len, const char* from_name, const char* text, int msgcount);
void soundBuzzer();
void loop();
};

View file

@ -1,54 +0,0 @@
#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

View file

@ -1,36 +0,0 @@
#pragma once
#include <Arduino.h>
#include <NonBlockingRtttl.h>
/* 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;
};

View file

@ -66,11 +66,6 @@
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;
@ -488,15 +483,6 @@ class MyMesh : public BaseChatMesh {
return 0; // queue is empty
}
void soundBuzzer() {
#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:
float getAirtimeBudgetFactor() const override {
return _prefs.airtime_factor;
@ -533,7 +519,9 @@ protected:
_serial->writeFrame(out_frame, 1 + PUB_KEY_SIZE);
}
} else {
soundBuzzer();
#ifdef DISPLAY_CLASS
ui_task.soundBuzzer();
#endif
}
saveContacts();
@ -594,7 +582,9 @@ protected:
frame[0] = PUSH_CODE_MSG_WAITING; // send push 'tickle'
_serial->writeFrame(frame, 1);
} else {
soundBuzzer();
#ifdef DISPLAY_CLASS
ui_task.soundBuzzer();
#endif
}
#ifdef DISPLAY_CLASS
ui_task.newMsg(path_len, from.name, text, offline_queue_len);
@ -645,7 +635,9 @@ protected:
frame[0] = PUSH_CODE_MSG_WAITING; // send push 'tickle'
_serial->writeFrame(frame, 1);
} else {
soundBuzzer();
#ifdef DISPLAY_CLASS
ui_task.soundBuzzer();
#endif
}
#ifdef DISPLAY_CLASS
ui_task.newMsg(path_len, "Public", text, offline_queue_len);
@ -1563,10 +1555,6 @@ public:
ui_task.setHasConnection(_serial->isConnected());
ui_task.loop();
#endif
#ifdef PIN_BUZZER
if (buzzer.isPlaying()) buzzer.loop();
#endif
}
};
@ -1634,10 +1622,6 @@ void setup() {
board.begin();
#ifdef PIN_BUZZER
buzzer.begin();
#endif
#ifdef DISPLAY_CLASS
DisplayDriver* disp = NULL;
if (display.begin()) {