saleae_csv/
serial.rs

1use {
2    crate::common::{parse_hex, ChannelName, Error, RowType, StartTime},
3    std::time::Duration,
4};
5
6/// Serial packet
7#[derive(Debug)]
8pub struct SerialPacket {
9    /// Saleae Logic 2 channel name
10    pub channel_name: ChannelName,
11    /// Row type
12    pub row_type: RowType,
13    /// Time since capture start
14    pub start_time: StartTime,
15    /// Transaction duration
16    pub duration: Duration,
17    /// Data sent/received
18    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
40/// Try to create a UTF-8 string from serial packets
41pub 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// impl<A: AsRef<[SerialPacket]>> TryFrom<A> for String {
48//     type Error = std::string::FromUtf8Error;
49
50//     fn try_from(value: A) -> Result<Self, Self::Error> {
51//         let a = value.as_ref().iter().map(|p| p.data).collect::<Vec<_>>();
52//         String::from_utf8(a)
53//     }
54// }