1use {
2 crate::common::{parse_hex, ChannelName, Error, RowType, StartTime},
3 std::time::Duration,
4};
5
6#[derive(Debug)]
8pub struct SerialPacket {
9 pub channel_name: ChannelName,
11 pub row_type: RowType,
13 pub start_time: StartTime,
15 pub duration: Duration,
17 pub data: u8,
19}
20
21impl TryFrom<&str> for SerialPacket {
22 type Error = Error;
23
24 fn try_from(value: &str) -> Result<Self, Self::Error> {
25 let cols = value.trim().split(',').collect::<Vec<_>>();
26 if cols.len() != 5 {
27 return Err(Error::InvalidRow);
28 }
29
30 Ok(Self {
31 channel_name: ChannelName::from(cols[0]),
32 row_type: RowType::try_from(cols[1]).map_err(|_| Error::Parse)?,
33 start_time: StartTime::try_from(cols[2]).map_err(|_| Error::Parse)?,
34 duration: Duration::from_secs_f64(cols[3].parse::<f64>().map_err(|_| Error::Parse)?),
35 data: parse_hex(cols[4]).ok_or(Error::Parse)?,
36 })
37 }
38}
39
40pub fn serial_packets_to_utf8(
42 packets: &[SerialPacket],
43) -> Result<String, std::string::FromUtf8Error> {
44 String::from_utf8(packets.iter().map(|p| p.data).collect::<Vec<_>>())
45}
46
47