diff options
Diffstat (limited to 'sw/picardy/src/main.rs')
-rw-r--r-- | sw/picardy/src/main.rs | 54 |
1 files changed, 44 insertions, 10 deletions
diff --git a/sw/picardy/src/main.rs b/sw/picardy/src/main.rs index 071f4e9..d6f2bf9 100644 --- a/sw/picardy/src/main.rs +++ b/sw/picardy/src/main.rs @@ -60,9 +60,18 @@ enum TuneSpeed { Fast } +enum FilterShift { + LSB, + USB, + Custom(u32), +} + +const BFO_LSB : u32 = 4_915_940; +const BFO_USB : u32 = 4_914_910; + struct State { mode : Mode, - bfo : u32, + filter_shift : FilterShift, bfo_tune_fail : bool, qrg : u32, tune_speed : TuneSpeed, @@ -71,8 +80,16 @@ struct State { } impl State { + fn bfo(&self) -> u32 { + match self.filter_shift { + FilterShift::LSB => BFO_LSB, + FilterShift::USB => BFO_USB, + FilterShift::Custom(fs) => fs, + } + } + fn vfo(&self) -> u32 { - self.qrg - self.bfo + self.qrg - self.bfo() } fn vfo_incr(&self) -> i32 { @@ -101,7 +118,13 @@ fn update_disp<T: hd44780_driver::bus::DataBus>(lcd: &mut HD44780<T>, state: &St (false, Mode::BFO) => write!(string, ">").unwrap(), (false, Mode::VFO) => write!(string, " ").unwrap(), } - write!(string, "{:<10}", state.bfo).unwrap(); + write!(string, "{:<10}", state.bfo()).unwrap(); + + match state.filter_shift { + FilterShift::USB => write!(string, "U").unwrap(), + FilterShift::LSB => write!(string, "L").unwrap(), + FilterShift::Custom(_) => write!(string, " ").unwrap(), + } if state.transmit { write!(string, " T").unwrap(); @@ -133,7 +156,7 @@ fn update_disp<T: hd44780_driver::bus::DataBus>(lcd: &mut HD44780<T>, state: &St fn main() -> ! { let mut state = State { mode : Mode::VFO, - bfo : 4_916_550, + filter_shift : FilterShift::USB, bfo_tune_fail : false, qrg : 28_000_000, tune_speed : TuneSpeed::Mid, @@ -246,7 +269,7 @@ fn main() -> ! { ); let i2c_busmanager = shared_bus::BusManagerSimple::new(i2c); - let mut siclock = si_clock::SiClock::new(i2c_busmanager.acquire_i2c(), state.bfo, state.vfo()); + let mut siclock = si_clock::SiClock::new(i2c_busmanager.acquire_i2c(), state.bfo(), state.vfo()); update_disp(&mut lcd, &state, &mut delay); @@ -271,8 +294,9 @@ fn main() -> ! { state.qrg = (state.qrg as i32 + delta * state.vfo_incr()) as u32; }, Mode::BFO => { - state.bfo = (state.bfo as i32 + delta * state.bfo_incr()) as u32; - state.bfo_tune_fail = !siclock.set_bfo(state.bfo).is_ok(); + let new_bfo = (state.bfo() as i32 + delta * state.bfo_incr()) as u32; + state.filter_shift = FilterShift::Custom(new_bfo); + state.bfo_tune_fail = !siclock.set_bfo(state.bfo()).is_ok(); }, } @@ -292,6 +316,17 @@ fn main() -> ! { update_disp_required = true; } + if button_state.f { + state.filter_shift = match state.filter_shift { + FilterShift::USB => FilterShift::LSB, + FilterShift::LSB => FilterShift::USB, + FilterShift::Custom(_) => FilterShift::USB, + }; + state.bfo_tune_fail = !siclock.set_bfo(state.bfo()).is_ok(); + update_disp_required = true; + } + + if button_state.g { state.tune_speed = match state.tune_speed { TuneSpeed::Slow => TuneSpeed::Mid, @@ -301,9 +336,8 @@ fn main() -> ! { update_disp_required = true; } - let ptt = false; //ui.read_ptt(); - update_disp_required |= state.transmit != ptt; - state.transmit = ptt; + update_disp_required |= state.transmit != button_state.ptt; + state.transmit = button_state.ptt; if state.transmit { mute_spkr.set_high().unwrap(); |