|
|
@@ -1,8 +1,12 @@
|
|
1
|
1
|
use embedded_hal::blocking::delay::DelayUs;
|
|
2
|
2
|
use embedded_hal::digital::v2::OutputPin;
|
|
3
|
|
-use epd_waveshare::{epd4in2::*, prelude::*};
|
|
|
3
|
+use epd_waveshare::epd4in2::EPD4in2;
|
|
|
4
|
+use epd_waveshare::prelude::{DisplayStream, WaveshareDisplay};
|
|
4
|
5
|
use mkl25z4_hal::time::CopyableMonoTimer;
|
|
|
6
|
+use tinygfx::color::BlackWhite::{self, Black, White};
|
|
|
7
|
+use tinygfx::{Frame, Rectangle, Renderer, Text};
|
|
5
|
8
|
|
|
|
9
|
+use super::assets::ROBOTO_30;
|
|
6
|
10
|
use super::information::Information;
|
|
7
|
11
|
use super::pins::{
|
|
8
|
12
|
DisplayBmeSpi, DisplayBusy, DisplayCs, DisplayDc, DisplayPins, DisplayPwr, DisplayRst,
|
|
|
@@ -63,8 +67,18 @@ impl Display {
|
|
63
|
67
|
self.epd.wake_up(spi, &mut time).ok();
|
|
64
|
68
|
|
|
65
|
69
|
// TODO: Draw the display contents.
|
|
66
|
|
- self.epd.set_background_color(Color::Black);
|
|
67
|
|
- let checkerboard = Checkerboard::new(400, 300, true);
|
|
|
70
|
+ let r = Rectangle::new(10, 10, 100, 50, Black);
|
|
|
71
|
+ let t = Text::new(20, 100, "asdf", &ROBOTO_30, Black);
|
|
|
72
|
+ let mut frame = Frame::new(400, 300, |mut renderer| {
|
|
|
73
|
+ let clip = renderer.full_frame();
|
|
|
74
|
+ renderer.clear(White);
|
|
|
75
|
+ r.draw(clip, &mut renderer);
|
|
|
76
|
+ t.draw(clip, &mut renderer);
|
|
|
77
|
+ });
|
|
|
78
|
+ frame.mirror_x(true);
|
|
|
79
|
+ frame.mirror_y(true);
|
|
|
80
|
+ //self.epd.set_background_color(Color::Black);
|
|
|
81
|
+ let checkerboard = TinyGfxStream::new(frame);
|
|
68
|
82
|
self.epd.update_frame_stream(spi, checkerboard).unwrap();
|
|
69
|
83
|
self.epd.display_frame(spi).unwrap();
|
|
70
|
84
|
|
|
|
@@ -73,34 +87,36 @@ impl Display {
|
|
73
|
87
|
}
|
|
74
|
88
|
}
|
|
75
|
89
|
|
|
76
|
|
-struct Checkerboard {
|
|
77
|
|
- width: usize,
|
|
78
|
|
- height: usize,
|
|
79
|
|
- index: usize,
|
|
80
|
|
- buffer: [u8; 1],
|
|
|
90
|
+struct TinyGfxStream<Draw> {
|
|
|
91
|
+ frame: Frame<Draw, BlackWhite>,
|
|
|
92
|
+ buffer: [u8; 400 / 8],
|
|
|
93
|
+ row: u32,
|
|
81
|
94
|
}
|
|
82
|
95
|
|
|
83
|
|
-impl Checkerboard {
|
|
84
|
|
- fn new(width: usize, height: usize, start_black: bool) -> Self {
|
|
|
96
|
+impl<Draw> TinyGfxStream<Draw>
|
|
|
97
|
+where
|
|
|
98
|
+ Draw: Fn(Renderer<BlackWhite>),
|
|
|
99
|
+{
|
|
|
100
|
+ fn new(frame: Frame<Draw, BlackWhite>) -> Self {
|
|
85
|
101
|
Self {
|
|
86
|
|
- width: width / 8,
|
|
87
|
|
- height,
|
|
88
|
|
- index: 0,
|
|
89
|
|
- buffer: [if start_black { 0x55 } else { 0xaa }],
|
|
|
102
|
+ frame,
|
|
|
103
|
+ buffer: [0u8; 400 / 8],
|
|
|
104
|
+ row: 0,
|
|
90
|
105
|
}
|
|
91
|
106
|
}
|
|
92
|
107
|
}
|
|
93
|
108
|
|
|
94
|
|
-impl DisplayStream for Checkerboard {
|
|
|
109
|
+impl<Draw> DisplayStream for TinyGfxStream<Draw>
|
|
|
110
|
+where
|
|
|
111
|
+ Draw: Fn(Renderer<BlackWhite>),
|
|
|
112
|
+{
|
|
95
|
113
|
fn next<'a>(&'a mut self) -> Option<&'a [u8]> {
|
|
96
|
|
- if self.index != self.width * self.height {
|
|
97
|
|
- self.index += 1;
|
|
98
|
|
- if (self.index - 1) % self.width == 0 {
|
|
99
|
|
- self.buffer[0] = !self.buffer[0];
|
|
100
|
|
- }
|
|
101
|
|
- Some(&self.buffer)
|
|
102
|
|
- } else {
|
|
|
114
|
+ if self.row == self.frame.height() {
|
|
103
|
115
|
None
|
|
|
116
|
+ } else {
|
|
|
117
|
+ self.frame.draw_row(self.row, &mut self.buffer);
|
|
|
118
|
+ self.row += 1;
|
|
|
119
|
+ Some(&self.buffer)
|
|
104
|
120
|
}
|
|
105
|
121
|
}
|
|
106
|
122
|
}
|