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::header::ProgramSlotHeader;
18use eepy_sys::image::RefreshBlockMode;
19use eepy_sys::input::{has_event, next_event, set_touch_enabled};
20
21#[link_section = ".header"]
22#[used]
23static HEADER: ProgramSlotHeader = ProgramSlotHeader::partial(
24 "ExampleApp",
25 env!("CARGO_PKG_VERSION"),
26 entry,
27);
28
29#[no_mangle]
30pub extern "C" fn entry() {
31 set_touch_enabled(true);
32
33 let mut draw_target = EpdDrawTarget::new();
34
35 let text = Text::new("Example App", Point::new(10, 20), DEFAULT_TEXT_STYLE);
36 let mut button = Button::with_default_style_auto_sized(Point::new(10, 40), "Click me", true);
37 let mut exit_button = Button::with_default_style_auto_sized(Point::new(10, 386), "Exit", false);
38
39 text.draw(&mut draw_target).unwrap();
40 button.draw_init(&mut draw_target);
41 exit_button.draw_init(&mut draw_target);
42 draw_target.refresh(false, RefreshBlockMode::BlockAcknowledge);
43
44 let mut counter = 0;
45
46 loop {
47 while let Some(ev) = next_event() {
48 if exit_button.tick(&mut draw_target, ev).clicked {
49 return;
50 }
51
52 let mut needs_refresh = false;
53
54 let response = button.tick(&mut draw_target, ev);
55 if response.clicked {
56 draw_target.clear(BinaryColor::Off).unwrap();
57 text.draw(&mut draw_target).unwrap();
58 button.draw_init(&mut draw_target);
59 exit_button.draw_init(&mut draw_target);
60
61 counter += 1;
62 let mut s = String::<16>::new();
63 write!(s, "{counter}").unwrap();
64 Text::new(&s, Point::new(10, 80), DEFAULT_TEXT_STYLE)
65 .draw(&mut draw_target)
66 .unwrap();
67 needs_refresh = true;
68 }
69 needs_refresh |= response.needs_refresh;
70
71 if needs_refresh {
72 draw_target.refresh(true, RefreshBlockMode::NonBlocking);
73 }
74 }
75
76 if !has_event() {
77 unsafe { asm!("wfe", "wfe") };
78 }
79 }
80}