tasks: simulation: better handle certain errors

This commit is contained in:
2026-01-02 15:56:28 +01:00
parent d2b10288a7
commit 4f8131b189
2 changed files with 26 additions and 15 deletions

View File

@@ -18,7 +18,8 @@ pub enum SimDataError<E> {
DecodeError(E), DecodeError(E),
EndOfStream, EndOfStream,
UnsupportedStreamType(ExtMeta), UnsupportedStreamType(ExtMeta),
EventHeaderMissing EventHeaderMissing,
PartitionNotFound
} }
impl<E> From<E> for SimDataError<E> { impl<E> From<E> for SimDataError<E> {

View File

@@ -67,7 +67,7 @@ impl<S: ReadStorage + Clone> SimDataTable<S> where S::Error: core::fmt::Debug +
info!("Searching for sim data partition"); info!("Searching for sim data partition");
let data_partition = partitions.iter().find(|partition| { let data_partition = partitions.iter().find(|partition| {
partition.partition_type() == partition_type && partition.label_as_str() == "sim" partition.partition_type() == partition_type && partition.label_as_str() == "sim"
}).expect("Unable to locate 'sim' data partition!"); }).ok_or(SimDataError::PartitionNotFound)?;
let start = data_partition.offset() as usize; let start = data_partition.offset() as usize;
let end = data_partition.len() as usize + start; let end = data_partition.len() as usize + start;
@@ -97,11 +97,18 @@ impl<S: ReadStorage + Clone + core::fmt::Debug> Iterator for SimDataTable<S> whe
loop { loop {
match StreamHeader::from_rmp(&mut self.reader) { match StreamHeader::from_rmp(&mut self.reader) {
Ok(header) => { Ok(header) => {
let sensor_reader = self.reader.subset(header.size as usize); match self.reader.subset(header.size) {
self.reader.seek(header.size as usize); Ok(sensor_reader) => {
self.index += 1; self.reader.seek(header.size);
debug!("Found header={header:?}"); self.index += 1;
return Some(SimDataReader::open(sensor_reader, header.id)); debug!("Found header={header:?}");
return Some(SimDataReader::open(sensor_reader, header.id));
},
err => {
error!("Read error while opening simulation stream {err:?}");
return None;
}
}
}, },
Err(SimDataError::UnsupportedStreamType(meta)) => { Err(SimDataError::UnsupportedStreamType(meta)) => {
error!("Found unknown simulation data chunk {meta:?}"); error!("Found unknown simulation data chunk {meta:?}");
@@ -109,7 +116,7 @@ impl<S: ReadStorage + Clone + core::fmt::Debug> Iterator for SimDataTable<S> whe
self.index += 1; self.index += 1;
} }
Err(err) => { Err(err) => {
error!("Read error while decoding simulation data {err:?}"); error!("Read error while decoding simulation stream table {err:?}");
return None; return None;
} }
} }
@@ -142,14 +149,17 @@ impl<S: ReadStorage> RangeReader<S> {
self.offset += offset; self.offset += offset;
} }
pub fn subset(&self, size: usize) -> Self where S: Clone + core::fmt::Debug { pub fn subset(&self, size: usize) -> Result<Self, SimDataError<S::Error>> where S: Clone + core::fmt::Debug {
trace!("subset {:#02x}:{:#02x} -> {:#02x}:{:#02x}", self.start, self.end, self.start + self.offset, self.start + self.offset + size); trace!("subset {:#02x}:{:#02x} -> {:#02x}:{:#02x}", self.start, self.end, self.start + self.offset, self.start + self.offset + size);
assert!(self.start + self.offset + size < self.end); if self.start + self.offset + size < self.end {
Self { Err(SimDataError::EndOfStream)
storage: self.storage.clone(), } else {
start: self.offset + self.start, Ok(Self {
end: self.start + self.offset + size, storage: self.storage.clone(),
offset: 0 start: self.offset + self.start,
end: self.start + self.offset + size,
offset: 0
})
} }
} }
} }