improve error handling with fatal!()
This commit is contained in:
@@ -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::<u8>())
|
||||
.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!(
|
||||
|
||||
Reference in New Issue
Block a user