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-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",
]

View file

@ -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

View file

@ -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;
}
}