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 mut button = Button::with_default_style_auto_sized(Point::new(10, 40), "Click me", true);
36 let mut exit_button = Button::with_default_style_auto_sized(Point::new(10, 386), "Exit", false);
37 button.draw_init(&mut draw_target);
38 exit_button.draw_init(&mut draw_target);
39 draw_target.refresh(false, RefreshBlockMode::BlockAcknowledge);
40
41 let mut counter = 0;
42
43 loop {
44 while let Some(ev) = next_event() {
45 if exit_button.tick(&mut draw_target, ev).clicked {
46 return;
47 }
48
49 let mut needs_refresh = false;
50
51 let response = button.tick(&mut draw_target, ev);
52 if response.clicked {
53 draw_target.clear(BinaryColor::Off).unwrap();
54 button.draw_init(&mut draw_target);
55 exit_button.draw_init(&mut draw_target);
56
57 counter += 1;
58 let mut s = String::<16>::new();
59 write!(s, "{counter}").unwrap();
60 Text::new(&s, Point::new(10, 80), DEFAULT_TEXT_STYLE)
61 .draw(&mut draw_target)
62 .unwrap();
63 needs_refresh = true;
64 }
65 needs_refresh |= response.needs_refresh;
66
67 if needs_refresh {
68 draw_target.refresh(true, RefreshBlockMode::NonBlocking);
69 }
70 }
71
72 if !has_event() {
73 unsafe { asm!("wfe", "wfe") };
74 }
75 }
76}