#[cfg(feature = "serde")]
use super::SerializeUbxPacketFields;
#[cfg(feature = "serde")]
use crate::serde::ser::SerializeMap;
use crate::{error::ParserError, UbxPacketMeta};
use ublox_derive::ubx_packet_recv;
#[ubx_packet_recv]
#[ubx(class = 0x0d, id = 0x01, fixed_payload_len = 16)]
struct TimTp {
tow_ms: u32,
tow_sub_ms: u32,
q_err: i32,
week: u16,
#[ubx(map_type = TimTpFlags, from = TimTpFlags)]
flags: u8,
#[ubx(map_type = TimTpRefInfo, from = TimTpRefInfo)]
ref_info: u8,
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
pub struct TimTpFlags(u8);
impl TimTpFlags {
pub fn time_base(&self) -> TimTpTimeBase {
if self.0 & 0b1 == 0 {
TimTpTimeBase::Gnss
} else {
TimTpTimeBase::Utc
}
}
pub fn utc_available(&self) -> bool {
self.0 & 0b10 != 0
}
pub fn raim_active(&self) -> Option<bool> {
match (self.0 >> 2) & 0b11 {
0b01 => Some(false),
0b10 => Some(true),
_ => None,
}
}
pub fn q_err_valid(&self) -> bool {
self.0 & 0b10000 == 0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TimTpTimeBase {
Gnss,
Utc,
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
pub struct TimTpRefInfo(u8);
impl TimTpRefInfo {
pub fn time_ref_gnss(&self) -> Option<TimTpRefInfoTimeRefGnss> {
Some(match self.0 & 0b1111 {
0 => TimTpRefInfoTimeRefGnss::Gps,
1 => TimTpRefInfoTimeRefGnss::Glo,
2 => TimTpRefInfoTimeRefGnss::Bds,
3 => TimTpRefInfoTimeRefGnss::Gal,
4 => TimTpRefInfoTimeRefGnss::NavIc,
_ => return None,
})
}
pub fn utc_standard(&self) -> Option<TimTpRefInfoUtcStandard> {
Some(match self.0 >> 4 {
1 => TimTpRefInfoUtcStandard::Crl,
2 => TimTpRefInfoUtcStandard::Nist,
3 => TimTpRefInfoUtcStandard::Usno,
4 => TimTpRefInfoUtcStandard::Bipm,
5 => TimTpRefInfoUtcStandard::Eu,
6 => TimTpRefInfoUtcStandard::Su,
7 => TimTpRefInfoUtcStandard::Ntsc,
8 => TimTpRefInfoUtcStandard::Npli,
_ => return None,
})
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum TimTpRefInfoTimeRefGnss {
Gps,
Glo,
Bds,
Gal,
NavIc,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum TimTpRefInfoUtcStandard {
Crl,
Nist,
Usno,
Bipm,
Eu,
Su,
Ntsc,
Npli,
}