From 271069504e351cbd4f5ba87fe39814a9aa7acbbe Mon Sep 17 00:00:00 2001 From: JP Stringham Date: Mon, 5 Jan 2026 09:13:12 -0500 Subject: [PATCH] Updated algorithm to allow full speed tasks while pushing graphics at intervals --- Cargo.lock | 1 - Cargo.toml | 1 - src/main.rs | 39 +++++++++++++++++++++++++++------------ 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3e3ac4d..228d953 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -334,7 +334,6 @@ dependencies = [ "cortex-m-rt", "defmt", "defmt-rtt", - "embedded-hal 0.2.7", "embedded-hal 1.0.0", "panic-probe", "rp2040-boot2", diff --git a/Cargo.toml b/Cargo.toml index 26282a6..61c11b9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,6 @@ cortex-m-rt = "0.7.5" defmt = "1.0.1" defmt-rtt = "1.0.0" embedded-hal = "1.0.0" -embedded_hal_0_2 = {package = "embedded-hal", version = "0.2.5", features = ["unproven"]} panic-probe = { version = "1.0.0", features = [ "print-rtt" ]} rp2040-boot2 = "0.3.0" rp2040-hal = "0.11.0" diff --git a/src/main.rs b/src/main.rs index 5f61544..752af20 100644 --- a/src/main.rs +++ b/src/main.rs @@ -27,7 +27,6 @@ use sh1106_pico_rs::{sh1106::SH1106Dev, graphics::GraphicsBuf}; // Some traits we need use embedded_hal::digital::OutputPin; -use embedded_hal_0_2::{adc::OneShot, digital::v2::ToggleableOutputPin}; /// The linker will place this boot block at the start of our program image. We /// need this to help the ROM bootloader get our code up and running. @@ -114,24 +113,40 @@ fn main() -> ! { &clocks.system_clock, ); - let sh1106_dev = SH1106Dev::new(&mut delay, &mut i2c); + let mut sh1106_dev = SH1106Dev::new(&mut delay, &mut i2c); + sh1106_dev.set_vertical_flip(&mut i2c, true); + let sh1106_dev = sh1106_dev; let mut gfx_buf = GraphicsBuf::new(); println!("Graphics ready"); led_pin.set_low().unwrap(); - loop { - gfx_buf.clear(); + // for tracking graphics frame timing + let mut tick = 0u32; + let mut last_gfx_push = 0u32; - println!("{} samples", adc_fifo.len()); - for _ in 0..adc_fifo.len() { - adc_samps[adc_samp_i] = adc_fifo.read(); - adc_samp_i += 1; - if adc_samp_i >= 30 { - adc_samp_i = 0; + loop { + let samples = adc_fifo.len(); + + if samples > 4 { + // println!("{} samples", adc_fifo.len()); + for _ in 0..adc_fifo.len() { + adc_samps[adc_samp_i] = adc_fifo.read(); + adc_samp_i += 1; + if adc_samp_i >= 30 { + adc_samp_i = 0; + } } } + tick = tick.wrapping_add(1); + // tweak this magic number for lower/higher fps + if tick.abs_diff(last_gfx_push) < 100_000 { + continue; + } + last_gfx_push = tick; + gfx_buf.clear(); + let mut adc_hi = 0u16; let mut adc_lo = 0xFFFFu16; @@ -191,10 +206,11 @@ fn main() -> ! { deg_buf[9] = b'.'; itoa_result.len += 1; + gfx_buf.draw_string(10, 10, "Probe temp"); let deg_str = itoa_result.as_str(); println!("tenths of a deg {}, deg {}", deg, deg_str); - gfx_buf.draw_textfield(10, 10, 100, 60, deg_str); + gfx_buf.draw_textfield(10, 22, 100, 60, deg_str); gfx_buf.sprites[0].y = 40 + ((test_val as i32) / 4) % 2; @@ -202,7 +218,6 @@ fn main() -> ! { sh1106_dev.blit_framebuffer(&mut i2c, &mut gfx_buf); test_val = test_val.wrapping_add(1); - delay.delay_ms(30); } }