refactored led & buzzer feedback in main

This commit is contained in:
Djeeberjr 2025-05-12 22:13:41 +02:00
parent 7225643296
commit 0617092f54

View File

@ -8,7 +8,7 @@ use simplelog::{ConfigBuilder, SimpleLogger};
use std::{env, error::Error, sync::Arc}; use std::{env, error::Error, sync::Arc};
use tally_id::TallyID; use tally_id::TallyID;
use tokio::{ use tokio::{
fs, fs, join,
sync::{Mutex, mpsc}, sync::{Mutex, mpsc},
}; };
use webserver::start_webserver; use webserver::start_webserver;
@ -47,13 +47,45 @@ fn setup_logger() {
let _ = SimpleLogger::init(log_level, config); let _ = SimpleLogger::init(log_level, config);
} }
/// Signal the user success via buzzer and led
async fn feedback_success(gpio_buzzer: &Arc<Mutex<GPIOBuzzer>>, status_led: &Arc<Mutex<Led>>) {
let mut buzzer_guard = gpio_buzzer.lock().await;
let mut led_guard = status_led.lock().await;
let (buzz, led) = join!(buzzer_guard.beep_ack(), led_guard.turn_green_on_1s());
buzz.unwrap_or_else(|err| {
error!("Failed to buzz: {err}");
});
led.unwrap_or_else(|err| {
error!("Failed to set LED: {err}");
});
}
/// Signal the user failure via buzzer and led
async fn feedback_failure(gpio_buzzer: &Arc<Mutex<GPIOBuzzer>>, status_led: &Arc<Mutex<Led>>) {
let mut buzzer_guard = gpio_buzzer.lock().await;
let mut led_guard = status_led.lock().await;
let (buzz, led) = join!(buzzer_guard.beep_nak(), led_guard.turn_red_on_1s());
buzz.unwrap_or_else(|err| {
error!("Failed to buzz: {err}");
});
led.unwrap_or_else(|err| {
error!("Failed to set LED: {err}");
});
}
#[tokio::main] #[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> { async fn main() -> Result<(), Box<dyn Error>> {
setup_logger(); setup_logger();
info!("Starting application"); info!("Starting application");
let (tx, mut rx) = mpsc::channel::<String>(1); let (tx, mut rx) = mpsc::channel::<String>(32);
tokio::spawn(async move { tokio::spawn(async move {
match run_pm3(tx).await { match run_pm3(tx).await {
@ -61,7 +93,7 @@ async fn main() -> Result<(), Box<dyn Error>> {
warn!("PM3 exited with a zero exit code"); warn!("PM3 exited with a zero exit code");
} }
Err(e) => { Err(e) => {
error!("Failed to run PM3: {}", e); error!("Failed to run PM3: {e}");
} }
} }
}); });
@ -107,41 +139,12 @@ async fn main() -> Result<(), Box<dyn Error>> {
if channel_store.lock().await.add_id(tally_id) { if channel_store.lock().await.add_id(tally_id) {
info!("Added new id to current day"); info!("Added new id to current day");
gpio_buzzer feedback_success(&gpio_buzzer, &status_led).await;
.lock()
.await
.beep_ack()
.await
.unwrap_or_else(|e| error!("Failed to beep Ack {}", e));
status_led
.lock()
.await
.turn_green_on_1s()
.await
.unwrap_or_else(|e| {
error!("Failed to blink LED {}", e);
});
if let Err(e) = channel_store.lock().await.export_json(STORE_PATH).await { if let Err(e) = channel_store.lock().await.export_json(STORE_PATH).await {
error!("Failed to save id store to file: {}", e); error!("Failed to save id store to file: {e}");
feedback_failure(&gpio_buzzer, &status_led).await;
// TODO: How to handle a failure to save ? // TODO: How to handle a failure to save ?
gpio_buzzer
.lock()
.await
.beep_nak()
.await
.unwrap_or_else(|e| error!("Failed to beep Nack {}", e));
//TODO: Error routine
status_led
.lock()
.await
.turn_red_on_1s()
.await
.unwrap_or_else(|e| {
error!("Failed to blink LED {}", e);
});
} }
} }
} }
@ -150,7 +153,7 @@ async fn main() -> Result<(), Box<dyn Error>> {
match start_webserver(store.clone()).await { match start_webserver(store.clone()).await {
Ok(()) => {} Ok(()) => {}
Err(e) => { Err(e) => {
error!("Failed to start webserver: {}", e); error!("Failed to start webserver: {e}");
} }
} }