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}