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