rktk_drivers_common/display/
ssd1306.rs1use display_interface::DisplayError;
4use embedded_graphics::draw_target::DrawTarget;
5use embedded_hal::i2c::I2c as I2cSync;
6use embedded_hal_async::i2c::I2c as I2cAsync;
7use rktk::drivers::interface::display::DisplayDriver;
8pub use ssd1306::prelude;
9use ssd1306::{
10 I2CDisplayInterface, Ssd1306Async, mode::BufferedGraphicsModeAsync, prelude::*,
11 size::DisplaySizeAsync,
12};
13
14use embedded_graphics::pixelcolor::BinaryColor;
15
16type Ssd1306<I2C, SIZE> = Ssd1306Async<I2CInterface<I2C>, SIZE, BufferedGraphicsModeAsync<SIZE>>;
17
18pub struct Ssd1306Driver<I2C: I2cAsync + I2cSync, SIZE: DisplaySizeAsync>(Ssd1306<I2C, SIZE>);
19
20impl<I2C, SIZE> Ssd1306Driver<I2C, SIZE>
21where
22 I2C: I2cAsync + I2cSync + 'static,
23 SIZE: DisplaySizeAsync + DisplaySize + 'static,
24{
25 pub fn new(i2c: I2C, size: SIZE, rotation: DisplayRotation) -> Self {
26 let interface = I2CDisplayInterface::new(i2c);
27 Self(Ssd1306Async::new(interface, size, rotation).into_buffered_graphics_mode())
28 }
29}
30
31impl<I2C, SIZE> DisplayDriver for Ssd1306Driver<I2C, SIZE>
32where
33 I2C: I2cAsync + I2cSync + 'static,
34 SIZE: DisplaySizeAsync + DisplaySize + 'static,
35{
36 type Color = BinaryColor;
37 type Display = Ssd1306Async<I2CInterface<I2C>, SIZE, BufferedGraphicsModeAsync<SIZE>>;
38
39 fn draw_target(&mut self) -> &mut Self::Display {
40 &mut self.0
41 }
42
43 async fn init(&mut self) -> Result<(), DisplayError> {
44 self.0.init().await
45 }
46
47 async fn flush(&mut self) -> Result<(), DisplayError> {
48 self.0.flush().await
49 }
50
51 async fn clear(&mut self) -> Result<(), DisplayError> {
52 self.0.clear(BinaryColor::Off).map_err(|_| DisplayError::BusWriteError)
53 }
54
55 async fn set_brightness(&mut self, brightness: u8) -> Result<(), DisplayError> {
56 self.0.set_brightness(Brightness::custom(1, brightness)).await
57 }
58
59 async fn set_display_on(&mut self, on: bool) -> Result<(), DisplayError> {
60 self.0.set_display_on(on).await
61 }
62}