implement basic keyboard firmware for my 40% ortho prototype, along with debug display info
This commit is contained in:
85
src/display.rs
Normal file
85
src/display.rs
Normal file
@@ -0,0 +1,85 @@
|
||||
use embedded_graphics::{
|
||||
mono_font::{MonoTextStyleBuilder, ascii::FONT_6X10},
|
||||
pixelcolor::BinaryColor,
|
||||
prelude::Point,
|
||||
text::{Baseline, Text},
|
||||
draw_target::DrawTarget,
|
||||
Drawable,
|
||||
};
|
||||
use ssd1306::{prelude::*, I2CDisplayInterface, Ssd1306, mode::BufferedGraphicsMode};
|
||||
use embassy_rp::i2c::I2c;
|
||||
use core::fmt::Write;
|
||||
|
||||
/// Display type encapsulating the I2C interface, its size and graphics mode
|
||||
pub type Display = Ssd1306<
|
||||
I2CInterface<I2c<'static, embassy_rp::peripherals::I2C0, embassy_rp::i2c::Async>>,
|
||||
DisplaySize128x32,
|
||||
BufferedGraphicsMode<DisplaySize128x32>
|
||||
>;
|
||||
|
||||
/// Function that initializes the display with given settings
|
||||
pub fn init_display(bus: I2c<'static, embassy_rp::peripherals::I2C0, embassy_rp::i2c::Async>) -> Option<Display> {
|
||||
let interface = I2CDisplayInterface::new(bus);
|
||||
let mut display = Ssd1306::new(
|
||||
interface,
|
||||
DisplaySize128x32,
|
||||
DisplayRotation::Rotate180,
|
||||
)
|
||||
.into_buffered_graphics_mode();
|
||||
|
||||
match display.init() {
|
||||
Ok(_) => Some(display),
|
||||
Err(_) => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Temp function which updates the display with currently pressed keys
|
||||
pub fn update_display(
|
||||
display: &mut Option<Display>,
|
||||
pressed_keys: &[(usize, usize, crate::keymap::KeyCode)],
|
||||
) -> Option<()> {
|
||||
if let Some(display) = display {
|
||||
display.clear(BinaryColor::Off).ok()?;
|
||||
|
||||
let text_style = MonoTextStyleBuilder::new()
|
||||
.font(&FONT_6X10)
|
||||
.text_color(BinaryColor::On)
|
||||
.build();
|
||||
|
||||
if pressed_keys.is_empty() {
|
||||
Text::with_baseline("No keys", Point::zero(), text_style, Baseline::Top)
|
||||
.draw(display)
|
||||
.ok()?;
|
||||
} else {
|
||||
let mut y_pos = 0;
|
||||
for (row_idx, col_idx, keycode) in pressed_keys.iter().take(3) {
|
||||
let mut msg = heapless::String::<32>::new();
|
||||
write!(&mut msg, "R{}C{}: 0x{:02X}", row_idx, col_idx, keycode.as_u8()).ok();
|
||||
|
||||
Text::with_baseline(&msg, Point::new(0, y_pos), text_style, Baseline::Top)
|
||||
.draw(display)
|
||||
.ok()?;
|
||||
|
||||
y_pos += 10;
|
||||
}
|
||||
}
|
||||
|
||||
display.flush().ok()?;
|
||||
Some(())
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
/// Helper function to clear the display
|
||||
pub fn clear_display(
|
||||
display: &mut Option<Display>,
|
||||
) -> Option<()> {
|
||||
if let Some(display) = display {
|
||||
display.clear(BinaryColor::Off).ok()?;
|
||||
display.flush().ok()?;
|
||||
Some(())
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user