use crate::twos_complement;
const WORD3_IODE_MASK: u32 = 0x3fc00000;
const WORD3_IODE_SHIFT: u32 = 22;
const WORD3_CRS_MASK: u32 = 0x003fffc0;
const WORD3_CRS_SHIFT: u32 = 6;
const WORD4_DELTA_N_MASK: u32 = 0x3fffc000;
const WORD4_DELTA_N_SHIFT: u32 = 14;
const WORD4_M0_MSB_MASK: u32 = 0x00003fc0;
const WORD4_M0_MSB_SHIFT: u32 = 6;
const WORD5_M0_LSB_MASK: u32 = 0x3fffffc0;
const WORD5_M0_LSB_SHIFT: u32 = 6;
const WORD6_CUC_MASK: u32 = 0x3fffc000;
const WORD6_CUC_SHIFT: u32 = 14;
const WORD6_E_MSB_MASK: u32 = 0x00003fc0;
const WORD6_E_MSB_SHIFT: u32 = 6;
const WORD7_E_LSB_MASK: u32 = 0x3fffffc0;
const WORD7_E_LSB_SHIFT: u32 = 6;
const WORD8_CUS_MASK: u32 = 0x3fffc000;
const WORD8_CUS_SHIFT: u32 = 14;
const WORD8_SQRTA_MSB_MASK: u32 = 0x00003fc0;
const WORD8_SQRTA_MSB_SHIFT: u32 = 6;
const WORD9_SQRTA_LSB_MASK: u32 = 0x3fffffc0;
const WORD9_SQRTA_LSB_SHIFT: u32 = 6;
const WORD10_TOE_MASK: u32 = 0x3fffc000;
const WORD10_TOE_SHIFT: u32 = 14;
const WORD10_FITINT_MASK: u32 = 0x00002000;
const WORD10_AODO_MASK: u32 = 0x00001f00;
const WORD10_AODO_SHIFT: u32 = 8;
#[derive(Debug, Default, Copy, Clone, PartialEq)]
pub struct GpsQzssFrame2 {
pub toe: u32,
pub iode: u8,
pub m0: f64,
pub dn: f64,
pub cuc: f64,
pub cus: f64,
pub crs: f64,
pub e: f64,
pub sqrt_a: f64,
pub fit_int_flag: bool,
pub aodo: u8,
}
#[derive(Debug, Default, Clone)]
pub struct Word3 {
pub iode: u8,
pub crs: i32,
}
impl Word3 {
pub(crate) fn decode(dword: u32) -> Self {
let iode = ((dword & WORD3_IODE_MASK) >> WORD3_IODE_SHIFT) as u8;
let crs = ((dword & WORD3_CRS_MASK) >> WORD3_CRS_SHIFT) as u32;
let crs = twos_complement(crs, 0xffff, 0x8000);
Self { iode, crs }
}
}
#[derive(Debug, Default, Clone)]
pub struct Word4 {
pub dn: i16,
pub m0_msb: u8,
}
impl Word4 {
pub(crate) fn decode(dword: u32) -> Self {
let dn = ((dword & WORD4_DELTA_N_MASK) >> WORD4_DELTA_N_SHIFT) as i16;
let m0_msb = ((dword & WORD4_M0_MSB_MASK) >> WORD4_M0_MSB_SHIFT) as u8;
Self { dn, m0_msb }
}
}
#[derive(Debug, Default, Clone)]
pub struct Word5 {
pub m0_lsb: u32,
}
impl Word5 {
pub(crate) fn decode(dword: u32) -> Self {
let m0_lsb = ((dword & WORD5_M0_LSB_MASK) >> WORD5_M0_LSB_SHIFT) as u32;
Self { m0_lsb }
}
}
#[derive(Debug, Default, Clone)]
pub struct Word6 {
pub cuc: i16,
pub e_msb: u8,
}
impl Word6 {
pub(crate) fn decode(dword: u32) -> Self {
let cuc = ((dword & WORD6_CUC_MASK) >> WORD6_CUC_SHIFT) as i16;
let e_msb = ((dword & WORD6_E_MSB_MASK) >> WORD6_E_MSB_SHIFT) as u8;
Self { cuc, e_msb }
}
}
#[derive(Debug, Default, Clone)]
pub struct Word7 {
pub e_lsb: u32,
}
impl Word7 {
pub(crate) fn decode(dword: u32) -> Self {
let e_lsb = ((dword & WORD7_E_LSB_MASK) >> WORD7_E_LSB_SHIFT) as u32;
Self { e_lsb }
}
}
#[derive(Debug, Default, Clone)]
pub struct Word8 {
pub cus: i32,
pub sqrt_a_msb: u8,
}
impl Word8 {
pub(crate) fn decode(dword: u32) -> Self {
let cus = ((dword & WORD8_CUS_MASK) >> WORD8_CUS_SHIFT) as u32;
println!("CUS={:08x}", cus);
let cus = twos_complement(cus, 0xffff, 0x8000);
let sqrt_a_msb = ((dword & WORD8_SQRTA_MSB_MASK) >> WORD8_SQRTA_MSB_SHIFT) as u8;
Self { cus, sqrt_a_msb }
}
}
#[derive(Debug, Default, Clone)]
pub struct Word9 {
pub sqrt_a_lsb: u32,
}
impl Word9 {
pub(crate) fn decode(dword: u32) -> Self {
let sqrt_a_lsb = ((dword & WORD9_SQRTA_LSB_MASK) >> WORD9_SQRTA_LSB_SHIFT) as u32;
Self { sqrt_a_lsb }
}
}
#[derive(Debug, Default, Clone)]
pub struct Word10 {
pub toe: u16,
pub fitint: bool,
pub aodo: u8,
}
impl Word10 {
pub(crate) fn decode(dword: u32) -> Self {
let toe = ((dword & WORD10_TOE_MASK) >> WORD10_TOE_SHIFT) as u16;
let fitint = (dword & WORD10_FITINT_MASK) > 0;
let aodo = ((dword & WORD10_AODO_MASK) >> WORD10_AODO_SHIFT) as u8;
Self { toe, fitint, aodo }
}
}