diff options
Diffstat (limited to 'sw/picardy/src/main.rs')
-rw-r--r-- | sw/picardy/src/main.rs | 41 |
1 files changed, 31 insertions, 10 deletions
diff --git a/sw/picardy/src/main.rs b/sw/picardy/src/main.rs index ed9d799..0d27f7a 100644 --- a/sw/picardy/src/main.rs +++ b/sw/picardy/src/main.rs @@ -32,6 +32,7 @@ use panic_semihosting as _; use stm32f1xx_hal::{ prelude::*, + adc, pac, pac::interrupt, i2c, @@ -47,6 +48,7 @@ use hd44780_driver::{Cursor, CursorBlink, Display, DisplayMode, HD44780}; pub mod ui; pub mod state; pub mod si_clock; +pub mod log10f; use state::*; @@ -84,6 +86,10 @@ fn main() -> ! { let adc1 = dp.ADC1; let mut ui = ui::UI::new(mic_sw1, mic_sw2, pb0, pb1, adc1, &mut rcc.apb2, &clocks, pb12, pb13, pc15); + let mut s_meter = gpioa.pa5.into_analog(&mut gpioa.crl); + let mut adc2 = adc::Adc::adc2(dp.ADC2, &mut rcc.apb2, clocks); + let mut last_s_meter_update_time = 0; + let mut last_sequence_state_change = 0; // Configure PB14 as output. (LED) let mut led = gpiob.pb14.into_push_pull_output(&mut gpiob.crh); @@ -166,7 +172,8 @@ fn main() -> ! { let mut siclock = si_clock::SiClock::new(i2c_busmanager.acquire_i2c(), state.bfo(), state.vfo()); - ui::update_disp(&mut lcd, &state, &mut delay); + let mut last_s_meter_value = 0; + ui::update_disp(&mut lcd, &state, &mut delay, last_s_meter_value); let mut last_encoder_count = qei.count(); @@ -220,12 +227,12 @@ fn main() -> ! { }, SequenceState::ToTxStep1 => { led.set_low().unwrap(); - seq1_pa.set_high().unwrap(); + seq0n.set_low().unwrap(); SequenceState::ToTxStep2 }, SequenceState::ToTxStep2 => { led.set_high().unwrap(); - seq0n.set_low().unwrap(); + seq1_pa.set_high().unwrap(); SequenceState::Tx }, SequenceState::Tx => { @@ -234,13 +241,13 @@ fn main() -> ! { SequenceState::Tx } else { - seq0n.set_high().unwrap(); + seq1_pa.set_low().unwrap(); SequenceState::ToRxStep1 } }, SequenceState::ToRxStep1 => { + seq0n.set_high().unwrap(); led.set_high().unwrap(); - seq1_pa.set_low().unwrap(); SequenceState::ToRxStep2 }, SequenceState::ToRxStep2 => { @@ -252,21 +259,35 @@ fn main() -> ! { let t_now = unsafe { *DECISECONDS_COUNTER.as_ptr() }; if state.sequence_state != next_state && - state.last_sequence_state_change + 1 <= t_now { + last_sequence_state_change + 1 <= t_now { update_disp_required = true; state.sequence_state = next_state; - state.last_sequence_state_change = t_now; + last_sequence_state_change = t_now; + } + + let s_meter_value: u16 = adc2.read(&mut s_meter).unwrap(); + + // Avoid 0 because of log10 + let s_meter_value = f32::from(if s_meter_value == 0 { 1 } else { s_meter_value }); + + // ADC is 12-bit, convert to dB full-scale + let s_meter_value = 10f32 * log10f::log10f(f32::from(s_meter_value) / 4092f32); + let s_meter_value = s_meter_value as i32; + if last_s_meter_update_time + 10 < t_now { + update_disp_required = s_meter_value != last_s_meter_value; + last_s_meter_value = s_meter_value; + last_s_meter_update_time = t_now; } if update_disp_required { - ui::update_disp(&mut lcd, &state, &mut delay); + ui::update_disp(&mut lcd, &state, &mut delay, s_meter_value); } last_encoder_count = encoder_count; - //delay.delay_ms(20u8); + //delay.delay_ms(5u8); - //cortex_m::asm::wfi(); + cortex_m::asm::wfi(); } } |