From 6dd49234df38305782c416677b664a48ab64b8db Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sun, 21 Jan 2024 01:28:43 +0100 Subject: [PATCH] Switched to integer math to save flash space --- firmware/src/main.rs | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/firmware/src/main.rs b/firmware/src/main.rs index 96b7a62..aba29d0 100644 --- a/firmware/src/main.rs +++ b/firmware/src/main.rs @@ -66,7 +66,7 @@ mod app { buffer: Vec, } - const TARGET_FREQ: f64 = 10.0f64; + const TARGET_FREQ: u64 = 10_000_000_000; // in millihertz #[init] fn init(cx: init::Context) -> (Shared, Local) { @@ -288,11 +288,11 @@ mod app { let mut last_ic = ic2 << 16 | ic1; - let mut samples: [f64; WINDOW_LEN] = [10.0; WINDOW_LEN]; - let mut short_avg: f64 = 10.0; + let mut samples: [u64; WINDOW_LEN] = [10_000_000_000; WINDOW_LEN]; + let mut short_avg: u64 = 10_000_000_000; loop { - let mut last_freq = 10.0f64; + let mut last_freq: u64 = 10_000_000_000; let mut count = 0; while count < WINDOW_LEN { @@ -317,26 +317,28 @@ mod app { last_ic = sum_ic; - let freq = (diff_ic as f64) / 1_000_000f64; - defmt::info!("freq:\t{} MHz", freq); + let freq = (diff_ic as u64) * 1000; + defmt::info!("freq:\t{} mHz", freq as i64); + defmt::info!("last_freq:\t{} mHz", last_freq as i64); - let diff = freq - last_freq; + let diff = freq as i64 - last_freq as i64; last_freq = freq; - if diff > 0.000_100 || diff < -0.000_100 { + if diff.abs() > 50_000 { defmt::info!("Out of range, dropping sample."); continue; } samples[count] = freq; - short_avg = 0.0; + short_avg = 0; for i in 0..WINDOW_LEN { - short_avg += samples[i] / WINDOW_LEN as f64; + short_avg += samples[i]; } - defmt::info!("short_avg:\t{} MHz", short_avg); + short_avg = short_avg / WINDOW_LEN as u64; + defmt::info!("short_avg:\t{} mHz", short_avg); cx.shared.device_status.lock(|device_status| { - device_status.measured_frequency = freq; - device_status.average_frequency = short_avg; + device_status.measured_frequency = (freq as f64) / 1_000_000_000.0; + device_status.average_frequency = (short_avg as f64) / 1_000_000_000.0; device_status.pwm = cur_pwm as u16; }); @@ -344,14 +346,12 @@ mod app { board_led.toggle(); } - defmt::info!("short_avg:\t{} MHz", short_avg); - - let diff = (TARGET_FREQ - short_avg) * 1_000_000.0; - if diff > 0.1 || diff < -0.1 { - cur_pwm += (diff * 30.0) as i32; - } else if diff < -0.01 { + let diff = TARGET_FREQ as i64 - short_avg as i64; + if diff.abs() > 100 { + cur_pwm += (diff * 30 / 1000) as i32; + } else if diff < -10 { cur_pwm -= 1; - } else if diff > 0.01 { + } else if diff > 10 { cur_pwm += 1; }