const INITIAL_VFO : u32 = 10_100_000; // Defines which parameter is changed by the encoder #[derive(Clone, Copy, PartialEq, Eq)] pub enum UISelection { VFO, Mode, } #[derive(Clone, Copy)] pub enum VFOSelection { A, B, } #[derive(Clone)] pub enum TuneSpeed { Slow, Mid, Fast } #[derive(PartialEq, Eq, Clone, Copy)] pub enum CWMode { StraightKey, Iambic, } #[derive(PartialEq, Eq, Clone, Copy)] pub enum Mode { CW(CWMode), FeldHell, } #[derive(PartialEq, Eq, Clone, Copy)] pub enum SequenceMode { CW, FeldHell, } #[derive(Clone, PartialEq, Eq)] pub enum SequenceState { Rx, Switching(SequenceMode), Tx(SequenceMode), } #[derive(Clone)] pub struct State { pub ui_sel : UISelection, pub vfo_a : u32, pub vfo_b : u32, pub vfo_sel : VFOSelection, pub mode : Mode, pub tune_speed : TuneSpeed, pub sequence_state : SequenceState, pub update_disp_counter : u8, pub cw_wpm : u32, } impl State { pub fn new() -> Self { State { ui_sel : UISelection::VFO, //mode : Mode::CW(CWMode::StraightKey), mode : Mode::FeldHell, vfo_sel : VFOSelection::A, vfo_a : INITIAL_VFO, vfo_b : INITIAL_VFO, tune_speed : TuneSpeed::Mid, sequence_state : SequenceState::Rx, update_disp_counter : 0, cw_wpm : 12, } } pub fn set_vfo(&mut self, freq : u32) { match self.vfo_sel { VFOSelection::A => self.vfo_a = freq, VFOSelection::B => self.vfo_b = freq, } } pub fn vfo_display(&self) -> u32 { match self.vfo_sel { VFOSelection::A => self.vfo_a, VFOSelection::B => self.vfo_b, } } pub fn vfo_siclock(&self) -> u32 { match self.sequence_state { SequenceState::Rx => 0, _ => match self.vfo_sel { VFOSelection::A => self.vfo_a, VFOSelection::B => self.vfo_b, } } } pub fn vfo_incr(&self) -> i32 { match self.tune_speed { TuneSpeed::Slow => 10, TuneSpeed::Mid => 200, TuneSpeed::Fast => 1000, } } pub fn allow_feldhell_keying(&self) -> bool { self.sequence_state == SequenceState::Tx(SequenceMode::FeldHell) } }