firmware for my Touchscreen E-Paper Input Module for Framework Laptop 16
1#![no_std]
2#![no_main]
3
4extern crate panic_halt;
5
6use core::fmt::Write;
7use embedded_graphics::draw_target::DrawTarget;
8use embedded_graphics::Drawable;
9use embedded_graphics::pixelcolor::BinaryColor;
10use embedded_graphics::prelude::Point;
11use embedded_graphics::text::Text;
12use heapless::String;
13use eepy_gui::draw_target::EpdDrawTarget;
14use eepy_gui::element::button::Button;
15use eepy_gui::element::{Gui, DEFAULT_TEXT_STYLE};
16use eepy_sys::input::{eep, next_event, set_touch_enabled};
17use eepy_sys::{eepy_app, kv_store};
18
19fn load_counter() -> u32 {
20 let mut buf = [0u8; size_of::<i32>()];
21 match kv_store::get(b"counter", &mut buf) {
22 Ok(_) => u32::from_ne_bytes(buf),
23 Err(_) => 0,
24 }
25}
26
27fn save_counter(counter: u32) {
28 let _ = kv_store::put(b"counter", &counter.to_ne_bytes());
29}
30
31fn render_counter(draw_target: &mut EpdDrawTarget, counter: u32) {
32 let mut s = String::<16>::new();
33 write!(s, "{counter}").unwrap();
34 Text::new(&s, Point::new(10, 80), DEFAULT_TEXT_STYLE)
35 .draw(draw_target)
36 .unwrap();
37}
38
39#[eepy_app(name = "ExampleApp")]
40fn main() {
41 set_touch_enabled(true);
42
43 let mut draw_target = EpdDrawTarget::default();
44
45 let text = Text::new("Example App", Point::new(10, 20), DEFAULT_TEXT_STYLE);
46 let mut button = Button::with_default_style_auto_sized(Point::new(10, 40), "Click me", true);
47 let mut exit_button = Button::with_default_style_auto_sized(Point::new(10, 386), "Exit", false);
48
49 let mut counter = load_counter();
50
51 text.draw(&mut draw_target).unwrap();
52 button.draw_init(&mut draw_target);
53 exit_button.draw_init(&mut draw_target);
54 render_counter(&mut draw_target, counter);
55 draw_target.refresh(false);
56
57
58 loop {
59 while let Some(ev) = next_event() {
60 let mut needs_refresh = false;
61
62 let exit_res = exit_button.tick(&mut draw_target, ev);
63 if exit_res.clicked {
64 save_counter(counter);
65 return;
66 } else if exit_res.needs_refresh {
67 draw_target.refresh(true);
68 }
69
70 let response = button.tick(&mut draw_target, ev);
71 if response.clicked {
72 draw_target.clear(BinaryColor::Off).unwrap();
73 text.draw(&mut draw_target).unwrap();
74 button.draw_init(&mut draw_target);
75 exit_button.draw_init(&mut draw_target);
76
77 counter += 1;
78 render_counter(&mut draw_target, counter);
79 needs_refresh = true;
80 }
81 needs_refresh |= response.needs_refresh;
82
83 if needs_refresh {
84 draw_target.maybe_refresh(true);
85 }
86 }
87
88 eep();
89 }
90}