From 3c1290aec33f454423be792cdcff2c6e271767f1 Mon Sep 17 00:00:00 2001 From: Djeeberjr Date: Thu, 5 Jun 2025 14:34:23 +0200 Subject: [PATCH] added error state flag --- README.md | 4 ++++ src/feedback.rs | 6 ++++++ src/main.rs | 34 ++++++++++++++++++++++++++++------ 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index f4ba799..e27e54d 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,10 @@ I²C fpr RTC `sudo raspi-config` -> interface -> enable I²C # Config +Flags: + +`--error` or `-e`: Enters error state. The LED turns red and the hotspot is activated. This state gets called from systemd if the service is in a failure state. + Environment variables: - `PM3_BIN`: Path to the pm3 binary. Seach in path if not set. Can also be set to the `pm3_mock.sh` for testing. diff --git a/src/feedback.rs b/src/feedback.rs index 9f48c6a..796f120 100644 --- a/src/feedback.rs +++ b/src/feedback.rs @@ -42,6 +42,12 @@ impl Feedback { }); } + pub async fn activate_error_state(&mut self) -> Result<()> { + self.led.turn_on(RED)?; + Self::beep_nak(&mut self.buzzer).await?; + Ok(()) + } + async fn blink_led_for_duration(led: &mut L, color: RGB8, duration: Duration) -> Result<()> { led.turn_on(color)?; sleep(duration).await; diff --git a/src/main.rs b/src/main.rs index cdf9298..c855968 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,15 +1,21 @@ #![allow(dead_code)] use activity_fairing::{ActivityNotifier, spawn_idle_watcher}; +use anyhow::Result; use feedback::{Feedback, FeedbackImpl}; use hardware::{Hotspot, create_hotspot}; use id_store::IDStore; use log::{error, info, warn}; use pm3::run_pm3; -use std::{env, sync::Arc, time::Duration}; +use std::{ + env::{self, args}, + sync::Arc, + time::Duration, +}; use tally_id::TallyID; use tokio::{ fs, + signal::unix::{SignalKind, signal}, sync::{ Mutex, broadcast::{self, Receiver, Sender}, @@ -17,7 +23,6 @@ use tokio::{ try_join, }; use webserver::start_webserver; -use anyhow::Result; mod activity_fairing; mod feedback; @@ -123,20 +128,36 @@ async fn handle_ids_loop( Ok(()) } +async fn enter_error_state(mut feedback: FeedbackImpl, hotspot: Arc>) { + let _ = feedback.activate_error_state().await; + let _ = hotspot.lock().await.enable_hotspot().await; + + let mut sigterm = signal(SignalKind::terminate()).unwrap(); + sigterm.recv().await; +} + #[tokio::main] async fn main() -> Result<()> { logger::setup_logger(); info!("Starting application"); - let (tx, rx) = broadcast::channel::(32); - let sse_tx = tx.clone(); - - let store: Arc> = Arc::new(Mutex::new(load_or_create_store().await?)); let user_feedback = Feedback::new()?; let hotspot = Arc::new(Mutex::new(create_hotspot()?)); + + let error_flag_set = args().any(|e| e == "--error" || e == "-e"); + if error_flag_set { + error!("Error flag set. Entering error state"); + enter_error_state(user_feedback, hotspot).await; + return Ok(()); + } + + let store: Arc> = Arc::new(Mutex::new(load_or_create_store().await?)); let hotspot_enable_ids = get_hotspot_enable_ids(); + let (tx, rx) = broadcast::channel::(32); + let sse_tx = tx.clone(); + let pm3_handle = run_pm3(tx); let loop_handle = handle_ids_loop( @@ -153,6 +174,7 @@ async fn main() -> Result<()> { if let Err(e) = run_result { error!("Failed to run application: {e}"); + return Err(e); } Ok(())