trace_recorder_parser/streaming/
timestamp_info.rs

1use crate::streaming::Error;
2use crate::time::{Frequency, Timestamp};
3use crate::types::{Endianness, TimerCounter};
4use byteordered::ByteOrdered;
5use std::io::Read;
6
7#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
8pub struct TimestampInfo {
9    pub timer_type: TimerCounter,
10    pub timer_frequency: Frequency,
11    pub timer_period: u32,
12    pub timer_wraparounds: u32,
13    pub os_tick_rate_hz: Frequency,
14    pub latest_timestamp: Timestamp,
15    pub os_tick_count: u32,
16}
17
18impl TimestampInfo {
19    pub(crate) fn read<R: Read>(
20        r: &mut R,
21        endianness: Endianness,
22        format_version: u16,
23    ) -> Result<Self, Error> {
24        let mut r = ByteOrdered::new(r, byteordered::Endianness::from(endianness));
25
26        let hwtc_type = r.read_u32()?;
27        let timer_type =
28            TimerCounter::from_hwtc_type(hwtc_type).ok_or(Error::InvalidTimerCounter(hwtc_type))?;
29
30        let timer_frequency;
31        let timer_period;
32
33        if format_version == 10 || format_version == 12 {
34            // NOTE: we assume TRC_BASE_TYPE and TRC_UNSIGNED_BASE_TYPE are 32-bit
35            timer_frequency = Frequency(r.read_u32()?);
36            timer_period = r.read_u32()?;
37        } else {
38            // v13+
39            timer_period = r.read_u32()?;
40            // NOTE: we assume TRC_BASE_TYPE and TRC_UNSIGNED_BASE_TYPE are 32-bit
41            timer_frequency = Frequency(r.read_u32()?);
42        }
43
44        let timer_wraparounds = r.read_u32()?;
45        let os_tick_rate_hz = Frequency(r.read_u32()?);
46        let latest_timestamp = Timestamp(r.read_u32()?.into());
47        let os_tick_count = r.read_u32()?;
48
49        Ok(TimestampInfo {
50            timer_type,
51            timer_frequency,
52            timer_period,
53            timer_wraparounds,
54            os_tick_rate_hz,
55            latest_timestamp,
56            os_tick_count,
57        })
58    }
59}