tasks: simulation: better handle certain errors
This commit is contained in:
@@ -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> {
|
||||||
|
|||||||
@@ -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
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user