diff options
Diffstat (limited to 'sw/eval-clock-cw-tx')
-rw-r--r-- | sw/eval-clock-cw-tx/src/main.rs | 43 | ||||
-rw-r--r-- | sw/eval-clock-cw-tx/src/si_clock.rs | 15 | ||||
-rw-r--r-- | sw/eval-clock-cw-tx/src/state.rs | 12 | ||||
-rw-r--r-- | sw/eval-clock-cw-tx/src/ui.rs | 2 |
4 files changed, 44 insertions, 28 deletions
diff --git a/sw/eval-clock-cw-tx/src/main.rs b/sw/eval-clock-cw-tx/src/main.rs index 4d2dae5..c91c545 100644 --- a/sw/eval-clock-cw-tx/src/main.rs +++ b/sw/eval-clock-cw-tx/src/main.rs @@ -59,13 +59,13 @@ struct SharedWithISR { state : State, last_sequence_state_change : u32, cw_ptt_timestamp : u32, - cw_key_n : gpio::gpioa::PA15<gpio::Output<gpio::OpenDrain>>, + cw_key_out : gpio::gpioa::PA15<gpio::Output<gpio::PushPull>>, ui : ui::UI, cw_pwm: cw::CWPWM, cw_keyer: cw::Keyer, cw_paddle_tip: gpio::gpiob::PB8<gpio::Input<gpio::PullUp>>, cw_paddle_ring: gpio::gpiob::PB9<gpio::Input<gpio::PullUp>>, - ptt_out_n: gpio::gpiob::PB3<gpio::Output<gpio::PushPull>>, + ptt_out: gpio::gpiob::PB3<gpio::Output<gpio::PushPull>>, led : gpio::gpiob::PB14<gpio::Output<gpio::PushPull>>, } @@ -73,7 +73,7 @@ static mut SHARED: MaybeUninit<SharedWithISR> = MaybeUninit::uninit(); static mut CLOCK_TIMER: MaybeUninit<CountDownTimer<pac::TIM2>> = MaybeUninit::uninit(); static mut TICK_COUNTER: MaybeUninit<u32> = MaybeUninit::uninit(); -fn ticks_now() -> u32 { +fn _ticks_now() -> u32 { cortex_m::interrupt::free(|_cs| unsafe { *TICK_COUNTER.as_ptr() }) } @@ -124,8 +124,8 @@ fn main() -> ! { led.set_low().unwrap(); let (pa15, pb3, _pb4) = afio.mapr.disable_jtag(gpioa.pa15, gpiob.pb3, gpiob.pb4); - let cw_key_n = pa15.into_open_drain_output_with_state(&mut gpioa.crh, gpio::State::High); - let ptt_out_n = pb3.into_push_pull_output_with_state(&mut gpiob.crl, gpio::State::High); + let cw_key_out = pa15.into_push_pull_output_with_state(&mut gpioa.crh, gpio::State::Low); + let ptt_out = pb3.into_push_pull_output_with_state(&mut gpiob.crl, gpio::State::Low); let c1 = gpioa.pa6; let c2 = gpioa.pa7; @@ -180,14 +180,14 @@ fn main() -> ! { state : State::new(), last_sequence_state_change : 0, cw_ptt_timestamp : 0, - cw_key_n, + cw_key_out, ui, cw_pwm, cw_keyer : cw::Keyer::new(12, TICKS_PER_SECOND), - cw_paddle_tip, cw_paddle_ring, ptt_out_n, led + cw_paddle_tip, cw_paddle_ring, ptt_out, led }; - si_clock::SiClock::new(i2c_busmanager.acquire_i2c(), 0, shared.state.vfo()) + si_clock::SiClock::new(i2c_busmanager.acquire_i2c(), 0, shared.state.vfo_display()) }; ui::update_disp(&mut lcd, &get_state_copy(), &mut delay); @@ -210,6 +210,7 @@ fn main() -> ! { let mut last_disp_update_counter = 1; let mut previous_vfo = 0; + let mut previous_state = SequenceState::Rx; loop { let mut update_disp_required = false; @@ -229,15 +230,15 @@ fn main() -> ! { } }); - siclock.set_vfo(state.vfo()); update_disp_required = true; } - let vfo = state.vfo(); - if previous_vfo != vfo { - siclock.set_vfo(vfo); + let vfo = state.vfo_display(); + if previous_vfo != vfo || previous_state != state.sequence_state { + siclock.set_vfo(state.vfo_siclock()); } previous_vfo = vfo; + previous_state = state.sequence_state.clone(); if last_disp_update_counter != state.update_disp_counter { update_disp_required = true; @@ -292,7 +293,8 @@ fn TIM2() { let next_state = match shared.state.sequence_state { SequenceState::Rx => { - shared.ptt_out_n.set_high().unwrap(); + shared.ptt_out.set_low().unwrap(); + shared.led.set_high().unwrap(); if cw_ptt { SequenceState::SwitchingCW } @@ -301,7 +303,8 @@ fn TIM2() { } }, SequenceState::SwitchingCW => { - shared.ptt_out_n.set_low().unwrap(); + shared.ptt_out.set_high().unwrap(); + shared.led.set_low().unwrap(); if cw_ptt { SequenceState::TxCW } @@ -310,7 +313,8 @@ fn TIM2() { } }, SequenceState::TxCW => { - shared.ptt_out_n.set_low().unwrap(); + shared.ptt_out.set_high().unwrap(); + shared.led.set_low().unwrap(); if cw_ptt { SequenceState::TxCW } @@ -323,20 +327,17 @@ fn TIM2() { match shared.state.sequence_state { SequenceState::TxCW => { if cw_beep { - shared.led.set_low().unwrap(); shared.cw_pwm.on(); - shared.cw_key_n.set_low().unwrap(); + shared.cw_key_out.set_high().unwrap(); } else { - shared.led.set_high().unwrap(); shared.cw_pwm.off(); - shared.cw_key_n.set_high().unwrap(); + shared.cw_key_out.set_low().unwrap(); } }, _ => { - shared.led.set_high().unwrap(); shared.cw_pwm.off(); - shared.cw_key_n.set_high().unwrap(); + shared.cw_key_out.set_low().unwrap(); }, } diff --git a/sw/eval-clock-cw-tx/src/si_clock.rs b/sw/eval-clock-cw-tx/src/si_clock.rs index a4b0e7a..6de4c25 100644 --- a/sw/eval-clock-cw-tx/src/si_clock.rs +++ b/sw/eval-clock-cw-tx/src/si_clock.rs @@ -84,12 +84,17 @@ fn set_bfo(siclock: &mut dyn Si5351, freq: u32) -> Result<(), si5351::Error> fn set_vfo(siclock: &mut dyn Si5351, freq: u32) { - let (div, mult, num, denom) = clock_settings_with_pll_calculation(freq); + if freq == 0 { + siclock.set_clock_enabled(si5351::ClockOutput::Clk0, false); + } + else { + let (div, mult, num, denom) = clock_settings_with_pll_calculation(freq); - siclock.setup_pll(si5351::PLL::B, mult, num, denom).unwrap(); - siclock.setup_multisynth_int(si5351::Multisynth::MS0, div, si5351::OutputDivider::Div1).unwrap(); - siclock.select_clock_pll(si5351::ClockOutput::Clk0, si5351::PLL::B); - siclock.set_clock_enabled(si5351::ClockOutput::Clk0, true); + siclock.setup_pll(si5351::PLL::B, mult, num, denom).unwrap(); + siclock.setup_multisynth_int(si5351::Multisynth::MS0, div, si5351::OutputDivider::Div1).unwrap(); + siclock.select_clock_pll(si5351::ClockOutput::Clk0, si5351::PLL::B); + siclock.set_clock_enabled(si5351::ClockOutput::Clk0, true); + } siclock.flush_clock_control(si5351::ClockOutput::Clk0).unwrap(); } diff --git a/sw/eval-clock-cw-tx/src/state.rs b/sw/eval-clock-cw-tx/src/state.rs index b3b0b7b..a5891c5 100644 --- a/sw/eval-clock-cw-tx/src/state.rs +++ b/sw/eval-clock-cw-tx/src/state.rs @@ -66,13 +66,23 @@ impl State { } } - pub fn vfo(&self) -> u32 { + 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, diff --git a/sw/eval-clock-cw-tx/src/ui.rs b/sw/eval-clock-cw-tx/src/ui.rs index 564b7d1..3cc8c90 100644 --- a/sw/eval-clock-cw-tx/src/ui.rs +++ b/sw/eval-clock-cw-tx/src/ui.rs @@ -239,7 +239,7 @@ pub fn update_disp<T: hd44780_driver::bus::DataBus>(lcd: &mut HD44780<T>, state: { let mut string = arrayvec::ArrayString::<[_; 16]>::new(); - let disp_freq = state.vfo() as i32; + let disp_freq = state.vfo_display() as i32; write!(string, "{:<05}.{:<03} ", disp_freq / 1000, disp_freq % 1000).unwrap(); write!(string, " CW{:<02}", state.cw_wpm).unwrap(); |