diff --git a/src/pipe.rs b/src/pipe.rs index 2e84d1a..debd5de 100644 --- a/src/pipe.rs +++ b/src/pipe.rs @@ -281,7 +281,7 @@ where State::Idle => { // invariant: BUFFER_SIZE >= PACKET_SIZE match command.chain() { - Chain::BeginsAndEnds => { + Ok(Chain::BeginsAndEnds) => { info!("begins and ends"); self.reset_interchange(); let Some(message) = self.interchange.request_mut() else { @@ -299,7 +299,7 @@ where self.state = State::Processing; // self.send_empty_datablock(); } - Chain::Begins => { + Ok(Chain::Begins) => { info!("begins"); self.reset_interchange(); let Some(message) = self.interchange.request_mut() else { @@ -316,6 +316,10 @@ where self.state = State::Receiving; self.send_empty_datablock(Chain::ExpectingMore); } + Err(_) => { + error!("Unknown chain"); + self.reset_state(); + } _ => { error!("unexpectedly in idle state"); self.reset_state(); @@ -324,7 +328,7 @@ where } State::Receiving => match command.chain() { - Chain::Continues => { + Ok(Chain::Continues) => { info!("continues"); let Some(message) = self.interchange.request_mut() else { error!("Interchange is busy"); @@ -338,7 +342,7 @@ where } self.send_empty_datablock(Chain::ExpectingMore); } - Chain::Ends => { + Ok(Chain::Ends) => { info!("ends"); let Some(message) = self.interchange.request_mut() else { error!("Interchange is busy"); @@ -353,6 +357,10 @@ where self.call_app(); self.state = State::Processing; } + Err(_) => { + error!("Unknown chain"); + self.reset_state(); + } _ => { error!("unexpectedly in receiving state"); self.reset_state(); @@ -368,7 +376,7 @@ where } State::Sending => match command.chain() { - Chain::ExpectingMore => { + Ok(Chain::ExpectingMore) => { self.prime_outbox(); } _chain => { diff --git a/src/types/packet.rs b/src/types/packet.rs index 9011e6e..c6e3491 100644 --- a/src/types/packet.rs +++ b/src/types/packet.rs @@ -61,17 +61,20 @@ pub trait PacketWithData: Packet { } } +#[derive(Debug, Default, Clone, Copy)] +pub struct UnknownChaining; + pub trait ChainedPacket: Packet { #[inline(always)] - fn chain(&self) -> Chain { + fn chain(&self) -> Result { let level_parameter = u16::from_le_bytes(self[8..10].try_into().unwrap()); match level_parameter { - 0 => Chain::BeginsAndEnds, - 1 => Chain::Begins, - 2 => Chain::Ends, - 3 => Chain::Continues, - 0x10 => Chain::ExpectingMore, - _ => panic!("invalid power select parameter"), + 0 => Ok(Chain::BeginsAndEnds), + 1 => Ok(Chain::Begins), + 2 => Ok(Chain::Ends), + 3 => Ok(Chain::Continues), + 0x10 => Ok(Chain::ExpectingMore), + _ => Err(UnknownChaining), } } }