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.rs41
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();
}
}