pub const VHF_BAND_EDGE : u32 = 70_000_000; pub const VHF_INITIAL_VFO : u32 = 70_200_000; // Values below are measured with the assembled XTAL filter pub const XTAL_FILT_FREQ : u32 = 11_057_500; pub const BFO_LSB : u32 = XTAL_FILT_FREQ + 1_400; pub const BFO_USB : u32 = XTAL_FILT_FREQ - 1_400; pub const BFO_CW : u32 = XTAL_FILT_FREQ - 1_400; // Defines which parameter is changed by the encoder #[derive(Clone, Copy, PartialEq, Eq)] pub enum UISelection { VFO, RIT, Mode, } #[derive(Clone, Copy, PartialEq, Eq)] pub enum MenuPage { One, Two, } #[derive(Clone, Copy)] pub enum VFOSelection { A, B, } #[derive(PartialEq, Eq, Clone, Copy)] pub enum CWMode { StraightKey, Iambic, } #[derive(PartialEq, Eq, Clone, Copy)] pub enum Mode { LSB, USB, CustomShift(u32), CW(CWMode), } #[derive(Clone, PartialEq, Eq)] pub enum SequenceState { Rx, MutingSpkr, SwitchingSSB, TxSSB, SwitchingCW, TxCW, } impl SequenceState { fn apply_rit(&self) -> bool { *self == SequenceState::Rx } } #[derive(Clone)] pub struct State { pub menu_page : MenuPage, pub ui_sel : UISelection, pub vfo_a : u32, pub vfo_b : u32, pub vfo_sel : VFOSelection, pub rit : i32, pub mode : Mode, pub send_tone : bool, pub sequence_state : SequenceState, pub update_disp_counter : u8, pub cw_wpm : u32, } impl State { pub fn new() -> Self { State { menu_page : MenuPage::One, ui_sel : UISelection::VFO, vfo_a : VHF_INITIAL_VFO, vfo_b : VHF_INITIAL_VFO, vfo_sel : VFOSelection::A, rit : 0, mode : Mode::USB, send_tone : false, sequence_state : SequenceState::Rx, update_disp_counter : 0, cw_wpm : 14, } } pub fn bfo(&self) -> u32 { if self.send_tone { 0 } else { match self.mode { Mode::LSB => BFO_LSB, Mode::USB => BFO_USB, Mode::CustomShift(fs) => fs, Mode::CW(_) => match self.sequence_state { SequenceState::SwitchingCW | SequenceState::TxCW => 0, _ => BFO_CW, }, } } } pub fn vhf_qrg(&self) -> u32 { match self.vfo_sel { VFOSelection::A => self.vfo_a, VFOSelection::B => self.vfo_b, } } pub fn vfo(&self) -> u32 { let cw_offset = match self.sequence_state { SequenceState::SwitchingCW | SequenceState::TxCW => 500, _ => 0, }; let vfo = (self.vhf_qrg() - self.bfo()) as i32 + if self.sequence_state.apply_rit() { self.rit } else { 0 } + cw_offset; vfo as u32 } }