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),
EndOfStream,
UnsupportedStreamType(ExtMeta),
EventHeaderMissing
EventHeaderMissing,
PartitionNotFound
}
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");
let data_partition = partitions.iter().find(|partition| {
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 end = data_partition.len() as usize + start;
@@ -97,11 +97,18 @@ impl<S: ReadStorage + Clone + core::fmt::Debug> Iterator for SimDataTable<S> whe
loop {
match StreamHeader::from_rmp(&mut self.reader) {
Ok(header) => {
let sensor_reader = self.reader.subset(header.size as usize);
self.reader.seek(header.size as usize);
self.index += 1;
debug!("Found header={header:?}");
return Some(SimDataReader::open(sensor_reader, header.id));
match self.reader.subset(header.size) {
Ok(sensor_reader) => {
self.reader.seek(header.size);
self.index += 1;
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)) => {
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;
}
Err(err) => {
error!("Read error while decoding simulation data {err:?}");
error!("Read error while decoding simulation stream table {err:?}");
return None;
}
}
@@ -142,14 +149,17 @@ impl<S: ReadStorage> RangeReader<S> {
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);
assert!(self.start + self.offset + size < self.end);
Self {
storage: self.storage.clone(),
start: self.offset + self.start,
end: self.start + self.offset + size,
offset: 0
if self.start + self.offset + size < self.end {
Err(SimDataError::EndOfStream)
} else {
Ok(Self {
storage: self.storage.clone(),
start: self.offset + self.start,
end: self.start + self.offset + size,
offset: 0
})
}
}
}