diff --git a/src/lib.rs b/src/lib.rs index 75225a4..a5c3e7d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,14 @@ pub mod sources; pub mod targets; +#[macro_export] +macro_rules! fatal { + ($($arg:tt)*) => {{ + tracing::error!($($arg)*); + std::process::exit(-1); + }}; +} + use async_trait::async_trait; use chrono::{DateTime, Utc}; use figment::{ diff --git a/src/main.rs b/src/main.rs index d334bf2..2035e8b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -206,6 +206,10 @@ async fn main() -> Result<(), Box> { debug!("Task setup complete, tasks: {}", tasks.len()); ctrlc::set_handler(move || { + if shutdown_token.is_cancelled() { + info!("Forced shutdown"); + std::process::exit(1); + } info!("Shutting down"); shutdown_token.cancel() }) diff --git a/src/sources/prs10.rs b/src/sources/prs10.rs index cf1f264..9a63ef1 100644 --- a/src/sources/prs10.rs +++ b/src/sources/prs10.rs @@ -15,7 +15,7 @@ use tracing::{debug, debug_span, error, info, instrument, warn}; use crate::{ ChimemonMessage, ChimemonSource, ChimemonSourceChannel, MetricTags, Prs10Config, SourceMetric, - SourceReport, SourceReportDetails, SourceStatus, + SourceReport, SourceReportDetails, SourceStatus, fatal, }; #[derive(Debug)] @@ -205,19 +205,28 @@ impl TryFrom<&[u8]> for Prs10Status { .map(|s| str::from_utf8(s).unwrap().parse::()) .collect_tuple() .ok_or("Not enough parts in ST reply")?; + + let volt_lamp_flags = volt_lamp_flags?; + let rf_flags = rf_flags?; + let temp_flags = temp_flags?; + let fll_flags = fll_flags?; + let pps_flags = pps_flags?; + let system_flags = system_flags?; + Ok(Self { - volt_lamp_flags: Prs10PowerLampFlags::from_bits(volt_lamp_flags?) - .ok_or("Invalid bits set ({volt_lamp_flags}) for power/lamp flags")?, - rf_flags: Prs10RfFlags::from_bits(rf_flags?) - .ok_or("Invalid bits set ({rf_flags}) for RF flags")?, - temp_flags: Prs10TempFlags::from_bits(temp_flags?) - .ok_or("Invalid bits set ({temp_flags}) for temp flags")?, - fll_flags: Prs10FllFlags::from_bits(fll_flags?) - .ok_or("Invalid bits set ({fll_flags}) for FLL flags")?, - pps_flags: Prs10PpsFlags::from_bits(pps_flags?) - .ok_or("Invalid bits set ({pps_flags}) for PPS flags")?, - system_flags: Prs10SystemFlags::from_bits(system_flags?) - .ok_or("Invalid bits set ({system_flags}) for system flags")?, + volt_lamp_flags: Prs10PowerLampFlags::from_bits(volt_lamp_flags).ok_or_else(|| { + format!("Invalid bits set ({volt_lamp_flags}) for power/lamp flags") + })?, + rf_flags: Prs10RfFlags::from_bits(rf_flags) + .ok_or_else(|| format!("Invalid bits set ({rf_flags}) for RF flags"))?, + temp_flags: Prs10TempFlags::from_bits(temp_flags) + .ok_or_else(|| format!("Invalid bits set ({temp_flags}) for temp flags"))?, + fll_flags: Prs10FllFlags::from_bits(fll_flags) + .ok_or_else(|| format!("Invalid bits set ({fll_flags}) for FLL flags"))?, + pps_flags: Prs10PpsFlags::from_bits(pps_flags) + .ok_or_else(|| format!("Invalid bits set ({pps_flags}) for PPS flags"))?, + system_flags: Prs10SystemFlags::from_bits(system_flags) + .ok_or_else(|| format!("Invalid bits set ({system_flags}) for system flags"))?, }) } } @@ -488,8 +497,20 @@ impl ChimemonSource for Prs10Monitor { .parity(tokio_serial::Parity::None) .stop_bits(tokio_serial::StopBits::One) .flow_control(tokio_serial::FlowControl::None); - let mut port = SerialStream::open(&builder).expect("Must be able to open serial port"); - port.set_exclusive(true).expect("Can't lock serial port"); + let mut port = SerialStream::open(&builder).unwrap_or_else(|e| { + fatal!( + "Failed to open serial port `{}` ({})", + config.port, + e.to_string() + ) + }); + port.set_exclusive(true).unwrap_or_else(|e| { + fatal!( + "Can't lock serial port `{}` ({})", + config.port, + e.to_string() + ) + }); info!( "Opened serial port {}@{}", port.name().unwrap(), @@ -505,10 +526,15 @@ impl ChimemonSource for Prs10Monitor { info: OnceCell::new(), } } + async fn run(mut self, chan: ChimemonSourceChannel, cancel: CancellationToken) { info!("PRS10 task started"); + if let Err(e) = self.reset_rx_state().await { + error!(error = ?e, "Error clearing PRS10 RX state"); + return; + } if let Err(e) = self.set_info().await { - error!("Error starting PRS10: {e:?}"); + error!(error = ?e, "Error starting PRS10"); return; } info!(