trace_recorder_parser/streaming/
timestamp_info.rs1use 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 timer_frequency = Frequency(r.read_u32()?);
36 timer_period = r.read_u32()?;
37 } else {
38 timer_period = r.read_u32()?;
40 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}