aboutsummaryrefslogtreecommitdiffstats
path: root/sw/picardy/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'sw/picardy/src/main.rs')
-rw-r--r--sw/picardy/src/main.rs54
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();