Read and print key states

This commit is contained in:
Adam Gausmann 2025-10-27 22:40:37 -05:00
parent 04a6c0afd3
commit 347b0c6477
3 changed files with 57 additions and 16 deletions

2
firmware/Cargo.lock generated
View file

@ -752,6 +752,7 @@ dependencies = [
"defmt", "defmt",
"defmt-rtt", "defmt-rtt",
"embassy-executor", "embassy-executor",
"embassy-futures",
"embassy-rp", "embassy-rp",
"embassy-sync", "embassy-sync",
"embassy-time", "embassy-time",
@ -762,6 +763,7 @@ dependencies = [
"embedded-io", "embedded-io",
"embedded-io-async", "embedded-io-async",
"embedded-storage", "embedded-storage",
"heapless",
"mipidsi", "mipidsi",
"panic-probe", "panic-probe",
] ]

View file

@ -35,10 +35,19 @@ embassy-time = { version = "0.5", features = [
"defmt-timestamp-uptime", "defmt-timestamp-uptime",
] } ] }
cortex-m = { version = "0.7.7" } 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" embedded-graphics = "0.8"
mipidsi = "0.9.0" mipidsi = "0.9.0"
embedded-hal-bus = "0.3.0" embedded-hal-bus = "0.3.0"
embassy-futures = "0.1.2"
heapless = "0.8.0"
[profile.release] [profile.release]
debug = 2 debug = 2

View file

@ -2,10 +2,12 @@
#![no_main] #![no_main]
use embassy_executor::Spawner; use embassy_executor::Spawner;
use embassy_futures::select::{select_array, select4};
use embassy_rp::gpio::{Input, Level, Output, Pull}; use embassy_rp::gpio::{Input, Level, Output, Pull};
use embassy_rp::pwm::{self, Pwm}; use embassy_rp::pwm::{self, Pwm};
use embassy_time::{Delay, Timer}; use embassy_time::{Delay, Timer};
use embedded_hal_bus::spi::ExclusiveDevice; use embedded_hal_bus::spi::ExclusiveDevice;
use heapless::String;
use mipidsi::interface::SpiInterface; use mipidsi::interface::SpiInterface;
use mipidsi::models::ST7789; use mipidsi::models::ST7789;
use mipidsi::options::Orientation; use mipidsi::options::Orientation;
@ -56,20 +58,16 @@ async fn main(_spawner: Spawner) -> ! {
.expect("display init") .expect("display init")
}; };
let _display_backlight = Output::new(p.PIN_20, Level::High); 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 raw_image_data = ImageRawLE::new(include_bytes!("assets/ferris.raw"), 86);
let ferris = Image::new(&raw_image_data, Point::new(0, 0)); let ferris = Image::new(&raw_image_data, Point::new(0, 0));
ferris.draw(&mut display).unwrap();
let style = MonoTextStyle::new(&FONT_10X20, Rgb565::GREEN); let style = MonoTextStyle::new(&FONT_10X20, Rgb565::GREEN);
Text::new( let hello_text = Text::new(
"Hello embedded_graphics \n + embassy + RP2040!", "Hello embedded_graphics \n + embassy + RP2040!",
Point::new(0, 68), Point::new(0, 68),
style, style,
) );
.draw(&mut display)
.unwrap();
// setup RGB LED // setup RGB LED
let mut rg_config = pwm::Config::default(); let mut rg_config = pwm::Config::default();
@ -88,20 +86,52 @@ async fn main(_spawner: Spawner) -> ! {
b_pwm.set_config(&b_config); 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 // Setup buttons
let _btn_a = Input::new(p.PIN_12, Pull::Up); let _btn_a = Input::new(p.PIN_12, Pull::Up);
let _btn_b = Input::new(p.PIN_13, 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 _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 { loop {
Timer::after_millis(100).await; let state = [
set_led(0, 0, 63); 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;
} }
} }