Skip to main content

inkview_eg/
lib.rs

1use embedded_graphics_core::draw_target::DrawTarget;
2use embedded_graphics_core::geometry::{OriginDimensions, Size};
3use embedded_graphics_core::pixelcolor::{Gray8, GrayColor};
4use inkview::bindings;
5use inkview::screen::{Screen, ScreenOrientation, BB8};
6use std::convert::Infallible;
7
8pub struct InkviewDisplay {
9    iv_screen: Screen<'static>,
10    fast_updates_max: usize,
11    fast_updates_n: usize,
12}
13
14impl InkviewDisplay {
15    pub fn new(iv: &'static bindings::inkview) -> Self {
16        let iv_screen = inkview::screen::Screen::new(iv);
17
18        Self {
19            iv_screen,
20            fast_updates_max: 5,
21            fast_updates_n: 0,
22        }
23    }
24
25    pub fn flush(&mut self) {
26        if self.fast_updates_n < self.fast_updates_max {
27            self.iv_screen.fast_update();
28            self.fast_updates_n += 1;
29        } else {
30            self.fast_updates_n = 0;
31            self.iv_screen.full_update();
32        }
33    }
34
35    pub fn iv_screen_ref(&self) -> &Screen<'static> {
36        &self.iv_screen
37    }
38
39    pub fn iv_screen_mut(&mut self) -> &mut Screen<'static> {
40        &mut self.iv_screen
41    }
42}
43
44impl OriginDimensions for InkviewDisplay {
45    fn size(&self) -> Size {
46        match self.iv_screen.orientation() {
47            ScreenOrientation::Portrait0Deg | ScreenOrientation::Portrait180Deg => Size::new(
48                self.iv_screen.width() as u32,
49                self.iv_screen.height() as u32,
50            ),
51            ScreenOrientation::Landscape90Deg | ScreenOrientation::Landscape270Deg => Size::new(
52                self.iv_screen.height() as u32,
53                self.iv_screen.width() as u32,
54            ),
55        }
56    }
57}
58
59impl DrawTarget for InkviewDisplay {
60    type Color = Gray8;
61
62    type Error = Infallible;
63
64    fn draw_iter<I>(&mut self, pixels: I) -> Result<(), Self::Error>
65    where
66        I: IntoIterator<Item = embedded_graphics_core::prelude::Pixel<Self::Color>>,
67    {
68        for pixel in pixels {
69            let x = pixel.0.x as usize;
70            let y = pixel.0.y as usize;
71            let color = pixel.1.luma();
72            self.iv_screen.draw(x, y, BB8(color));
73        }
74        Ok(())
75    }
76}