tasks: simulation: better handle certain errors
This commit is contained in:
@@ -18,7 +18,8 @@ pub enum SimDataError<E> {
|
||||
DecodeError(E),
|
||||
EndOfStream,
|
||||
UnsupportedStreamType(ExtMeta),
|
||||
EventHeaderMissing
|
||||
EventHeaderMissing,
|
||||
PartitionNotFound
|
||||
}
|
||||
|
||||
impl<E> From<E> for SimDataError<E> {
|
||||
|
||||
@@ -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
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user