Skip to main content
RKTK API Docs RKTK Home Repo

rktk_drivers_common/display/
ssd1306.rs

1//! SSD1306 OLED display driver
2
3use 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}