diff --git a/firmware/Cargo.lock b/firmware/Cargo.lock index d4a8c52..4b793c9 100644 --- a/firmware/Cargo.lock +++ b/firmware/Cargo.lock @@ -752,6 +752,7 @@ dependencies = [ "defmt", "defmt-rtt", "embassy-executor", + "embassy-futures", "embassy-rp", "embassy-sync", "embassy-time", @@ -762,6 +763,7 @@ dependencies = [ "embedded-io", "embedded-io-async", "embedded-storage", + "heapless", "mipidsi", "panic-probe", ] diff --git a/firmware/Cargo.toml b/firmware/Cargo.toml index 181e6a2..02d10e0 100644 --- a/firmware/Cargo.toml +++ b/firmware/Cargo.toml @@ -35,10 +35,19 @@ embassy-time = { version = "0.5", features = [ "defmt-timestamp-uptime", ] } cortex-m = { version = "0.7.7" } -embassy-rp = { version = "0.8", features = ["defmt", "unstable-pac", "time-driver", "critical-section-impl", "rp2040", "boot2-w25q080"] } +embassy-rp = { version = "0.8", features = [ + "defmt", + "unstable-pac", + "time-driver", + "critical-section-impl", + "rp2040", + "boot2-w25q080", +] } embedded-graphics = "0.8" mipidsi = "0.9.0" embedded-hal-bus = "0.3.0" +embassy-futures = "0.1.2" +heapless = "0.8.0" [profile.release] debug = 2 diff --git a/firmware/src/main.rs b/firmware/src/main.rs index 6eb6cf8..0cabe29 100644 --- a/firmware/src/main.rs +++ b/firmware/src/main.rs @@ -2,10 +2,12 @@ #![no_main] use embassy_executor::Spawner; +use embassy_futures::select::{select_array, select4}; use embassy_rp::gpio::{Input, Level, Output, Pull}; use embassy_rp::pwm::{self, Pwm}; use embassy_time::{Delay, Timer}; use embedded_hal_bus::spi::ExclusiveDevice; +use heapless::String; use mipidsi::interface::SpiInterface; use mipidsi::models::ST7789; use mipidsi::options::Orientation; @@ -56,20 +58,16 @@ async fn main(_spawner: Spawner) -> ! { .expect("display init") }; let _display_backlight = Output::new(p.PIN_20, Level::High); - display.clear(Rgb565::BLACK).unwrap(); let raw_image_data = ImageRawLE::new(include_bytes!("assets/ferris.raw"), 86); let ferris = Image::new(&raw_image_data, Point::new(0, 0)); - ferris.draw(&mut display).unwrap(); let style = MonoTextStyle::new(&FONT_10X20, Rgb565::GREEN); - Text::new( + let hello_text = Text::new( "Hello embedded_graphics \n + embassy + RP2040!", Point::new(0, 68), style, - ) - .draw(&mut display) - .unwrap(); + ); // setup RGB LED let mut rg_config = pwm::Config::default(); @@ -88,20 +86,52 @@ async fn main(_spawner: Spawner) -> ! { b_pwm.set_config(&b_config); }; - // Setup buzzer - let mut buzzer_config = pwm::Config::default(); - buzzer_config.compare_b = 0x4000; - buzzer_config.enable = false; - let _buzzer_pwm = Pwm::new_output_b(p.PWM_SLICE5, p.PIN_11, buzzer_config.clone()); - // Setup buttons let _btn_a = Input::new(p.PIN_12, Pull::Up); let _btn_b = Input::new(p.PIN_13, Pull::Up); - let _btn_x = Input::new(p.PIN_14, Pull::Up); + // let _btn_x = Input::new(p.PIN_14, Pull::Up); let _btn_y = Input::new(p.PIN_15, Pull::Up); + let mut btn_f1 = Input::new(p.PIN_11, Pull::Up); + let mut btn_f2 = Input::new(p.PIN_14, Pull::Up); + let mut btn_f3 = Input::new(p.PIN_9, Pull::Up); + let mut btn_f4 = Input::new(p.PIN_3, Pull::Up); + + let mut render = |f_keys: [bool; 4]| { + display.clear(Rgb565::BLACK).ok(); + ferris.draw(&mut display).ok(); + hello_text.draw(&mut display).ok(); + + let mut f_key_string: String<16> = String::new(); + for (f, s) in f_keys.into_iter().zip(["1", "2", "3", "4"]) { + f_key_string.push_str(f.then_some(s).unwrap_or(" ")).ok(); + } + + Text::new(&f_key_string, Point::new(0, 108), style) + .draw(&mut display) + .ok(); + }; + + let mut last_state = None; + loop { - Timer::after_millis(100).await; - set_led(0, 0, 63); + let state = [ + btn_f1.is_low(), + btn_f2.is_low(), + btn_f3.is_low(), + btn_f4.is_low(), + ]; + if Some(state) != last_state { + render(state); + last_state = Some(state); + continue; + } + select_array([ + btn_f1.wait_for_any_edge(), + btn_f2.wait_for_any_edge(), + btn_f3.wait_for_any_edge(), + btn_f4.wait_for_any_edge(), + ]) + .await; } }