#![allow(dead_code)]
#![allow(unused_parens)]
use heapless::HistoryBuf;
use libm::floorf;
use modular_bitfield_msb::prelude::*;
pub struct Group {
pub a: Option<u16>, pub b: Option<u16>, pub c: Option<u16>, pub d: Option<u16>, }
pub const NUM_TDC: usize = 32;
pub const TDC_LEN: usize = 32;
#[derive(BitfieldSpecifier, Debug, PartialEq, Eq)]
#[bits = 1]
pub enum GroupVersion {
A = 0,
B = 1,
}
#[bitfield(bits = 5)]
#[derive(BitfieldSpecifier, Default, Copy, Clone, PartialEq, Eq)]
pub struct GroupType {
#[skip(setters)]
pub code: B4, #[skip(setters)]
pub version: GroupVersion, }
#[bitfield(bits = 4)]
#[derive(Default, Debug, Clone, PartialEq, Eq)]
pub struct DiCodes {
pub dynamic_pty: bool, pub compressed: bool, pub artificial_head: bool, pub stereo: bool, }
#[bitfield(bits = 16)]
#[derive(Default, Clone, Copy, PartialEq, Eq)]
pub struct Pin {
#[skip(setters)]
pub day: B5,
#[skip(setters)]
pub hour: B5,
#[skip(setters)]
pub minute: B6,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub struct Clock {
pub mjd: u32, pub hour: u8, pub minute: u8, pub utc_offset_half_hours: i8, }
const AVG_DAYS_PER_MONTH: f32 = 30.6001;
const AVT_DAYS_PER_YEAR: f32 = 365.25;
const MJD_JAN_1_2000: f32 = 15078.2;
impl Clock {
fn yp(&self) -> i32 {
(((self.mjd as f32) - 15078.2) / AVT_DAYS_PER_YEAR) as i32
}
fn k(&self) -> i32 {
match self.mp() {
14 | 15 => 1,
_ => 0,
}
}
pub fn year(&self) -> i32 {
1900 + self.yp() + self.k()
}
fn mp(&self) -> i32 {
let a: f32 = (self.mjd as f32) - 14956.1;
let b: f32 = (self.yp() as f32) * AVT_DAYS_PER_YEAR;
((a - floorf(b)) / AVG_DAYS_PER_MONTH) as i32
}
pub fn month(&self) -> i32 {
self.mp() - 1 - self.k() * 12
}
pub fn day(&self) -> i32 {
let a: i32 = ((self.yp() as f32) * AVT_DAYS_PER_YEAR) as i32;
let b: i32 = ((self.mp() as f32) * AVG_DAYS_PER_MONTH) as i32;
(self.mjd as i32) - 14956 - a - b
}
}
#[bitfield(bits = 21)]
#[derive(Default, Debug, Clone, Copy, PartialEq, Eq)]
pub struct ValidFields {
pub af: bool,
pub on_freqs: bool,
pub map_freqs: bool,
pub clock: bool,
pub ews: bool,
pub pin: bool,
pub pin_on: bool,
pub pi: bool,
pub ps: bool,
pub ps_on: bool,
pub pty: bool,
pub ptyn: bool,
pub rt: bool,
pub slc: bool,
pub tdc: bool,
pub ta: bool,
pub ta_on: bool,
pub tp: bool,
pub tp_on: bool,
pub ms: bool,
pub eon: bool,
}
#[bitfield(bits = 16)]
#[derive(Default, Debug, Clone, PartialEq, Eq)]
pub struct ProgramInformation {
#[skip(setters)]
pub country_code: B4,
#[skip(setters)]
pub program_type: B4,
#[skip(setters)]
pub program_reference_number: u8,
}
#[bitfield(bits = 2)]
#[derive(Default, Clone, PartialEq, Eq)]
pub struct TrafficCodes {
pub tp: bool, pub ta: bool, }
#[derive(BitfieldSpecifier, Debug, Default, Clone, Copy, PartialEq, Eq)]
#[bits = 5]
pub enum ProgramType {
#[default]
None = 0,
News = 1,
Information = 2,
Sports = 3,
Talk = 4,
Rock = 5,
ClassicRock = 6,
AdultHits = 7,
SoftRock = 8,
Top40 = 9,
Country = 10,
Oldies = 11,
Soft = 12,
Nostalgia = 13,
Jazz = 14,
Classical = 15,
RhythmAndBlues = 16,
SoftRhythmAndBlues = 17,
ForeignLanguage = 18,
ReligiousMusic = 19,
ReligiousTalk = 20,
Personality = 21,
Public = 22,
College = 23,
Unnasigned1 = 24,
Unnasigned2 = 25,
Unnasigned3 = 26,
Unnasigned4 = 27,
Unnasigned5 = 28,
Weather = 29,
EmergencyTest = 30,
Emergency = 31,
}
#[derive(BitfieldSpecifier, Debug, Default, Clone, Copy, PartialEq, Eq)]
#[bits = 1]
pub enum Content {
Speech = 0,
#[default]
Music = 1,
}
#[derive(BitfieldSpecifier, Default, Clone, PartialEq, Eq)]
#[bits = 3]
pub enum SlcVariant {
#[default]
Paging = 0,
TmcId = 1,
PagingId = 2,
Language = 3,
NotAssigned4 = 4,
NotAssigned5 = 5,
Broadcaster = 6,
Ews = 7,
}
#[bitfield(bits = 16)]
#[derive(Default, Clone, PartialEq, Eq)]
pub struct SlcData {
#[skip(setters)]
pub linkage_actuator: bool, #[skip(setters)]
pub variant: SlcVariant,
#[skip(setters)]
pub data: B12,
}
#[derive(Debug, Default, Clone, PartialEq)]
pub struct TdcData {
pub data: [HistoryBuf<u8, TDC_LEN>; NUM_TDC],
pub current_channel: u8,
}
#[bitfield(bits = 37)]
#[derive(Default, Clone, PartialEq, Eq)]
pub struct EwsData {
pub block_b_lsb: B5,
pub block_c: u16,
pub block_d: u16,
}