alpha
Login
or
Join now
arthomnix.dev
/
eepy
Star
0
Fork
0
Atom
Configure Feed
Issues
Pull Requests
Commits
Tags
Feed URL
Select the types of activity you want to include in your feed.
firmware for my Touchscreen E-Paper Input Module for Framework Laptop 16
Star
0
Fork
0
Atom
Configure Feed
Issues
Pull Requests
Commits
Tags
Feed URL
Select the types of activity you want to include in your feed.
Overview
Issues
Pulls
Pipelines
fw16-epd-main: testing scratchpad
author
arthomnix
date
1 year ago
(Jan 12, 2025, 8:52 PM UTC)
commit
e1b37933
e1b37933502284f4937d42a393284af3f5b527b1
parent
4a793548
4a793548696960923ede47ad4007534a7dd4c99b
+168
-34
3 changed files
Expand all
Collapse all
Unified
Split
fw16-epd-gui
src
element
button.rs
mod.rs
fw16-epd-main
src
gui.rs
+38
-2
fw16-epd-gui/src/element/button.rs
Reviewed
···
2
2
use embedded_graphics::prelude::*;
3
3
use embedded_graphics::mono_font::MonoTextStyle;
4
4
use embedded_graphics::pixelcolor::BinaryColor;
5
5
-
use embedded_graphics::primitives::{PrimitiveStyle, Rectangle, RoundedRectangle};
5
5
+
use embedded_graphics::primitives::{CornerRadii, PrimitiveStyle, Rectangle, RoundedRectangle};
6
6
use embedded_graphics::text::{Alignment, Baseline, Text, TextStyle, TextStyleBuilder};
7
7
+
use embedded_graphics::text::renderer::TextRenderer;
7
8
use fw16_epd_program_interface::{TouchEvent, TouchEventType};
8
9
use crate::draw_target::EpdDrawTarget;
9
9
-
use crate::element::GuiElement;
10
10
+
use crate::element::{GuiElement, DEFAULT_PRIMITIVE_STYLE, DEFAULT_TEXT_STYLE};
10
11
11
12
const CENTRE_STYLE: TextStyle = TextStyleBuilder::new()
12
13
.alignment(Alignment::Center)
···
43
44
}
44
45
}
45
46
47
47
+
pub fn auto_sized(top_left: Point, corner_radii: CornerRadii, label: &'a str, rect_style: PrimitiveStyle<BinaryColor>, char_style: MonoTextStyle<'a, BinaryColor>) -> Self {
48
48
+
let size = Size::new((char_style.font.character_size.width + char_style.font.character_spacing) * (label.len() as u32 + 1), char_style.line_height());
49
49
+
Self {
50
50
+
rect: RoundedRectangle::new(Rectangle::new(top_left, size), corner_radii),
51
51
+
label,
52
52
+
rect_style,
53
53
+
char_style,
54
54
+
click_state: ClickState::None,
55
55
+
}
56
56
+
}
57
57
+
58
58
+
pub fn with_default_style(rect: Rectangle, label: &'a str) -> Self {
59
59
+
Self {
60
60
+
rect: RoundedRectangle::new(rect, CornerRadii::new(Size::new(3, 3))),
61
61
+
label,
62
62
+
rect_style: DEFAULT_PRIMITIVE_STYLE,
63
63
+
char_style: DEFAULT_TEXT_STYLE,
64
64
+
click_state: ClickState::None,
65
65
+
}
66
66
+
}
67
67
+
68
68
+
pub fn with_default_style_auto_sized(top_left: Point, label: &'a str) -> Self {
69
69
+
Self::auto_sized(
70
70
+
top_left,
71
71
+
CornerRadii::new(Size::new(3, 3)),
72
72
+
label,
73
73
+
DEFAULT_PRIMITIVE_STYLE,
74
74
+
DEFAULT_TEXT_STYLE
75
75
+
)
76
76
+
}
77
77
+
46
78
pub fn clicked(&mut self, clear: bool) -> bool {
47
79
if self.click_state == ClickState::Clicked {
48
80
if clear {
···
53
85
} else {
54
86
false
55
87
}
88
88
+
}
89
89
+
90
90
+
pub fn rect(&self) -> Rectangle {
91
91
+
self.rect.bounding_box()
56
92
}
57
93
}
58
94
+10
fw16-epd-gui/src/element/mod.rs
Reviewed
···
1
1
pub mod button;
2
2
3
3
+
use embedded_graphics::mono_font::ascii::FONT_10X20;
4
4
+
use embedded_graphics::mono_font::MonoTextStyle;
3
5
use embedded_graphics::pixelcolor::BinaryColor;
4
6
use embedded_graphics::prelude::*;
7
7
+
use embedded_graphics::primitives::{PrimitiveStyle, PrimitiveStyleBuilder};
5
8
use fw16_epd_program_interface::TouchEvent;
6
9
use crate::draw_target::EpdDrawTarget;
10
10
+
11
11
+
pub const DEFAULT_PRIMITIVE_STYLE: PrimitiveStyle<BinaryColor> = PrimitiveStyleBuilder::new()
12
12
+
.stroke_width(2)
13
13
+
.stroke_color(BinaryColor::On)
14
14
+
.fill_color(BinaryColor::Off)
15
15
+
.build();
16
16
+
pub const DEFAULT_TEXT_STYLE: MonoTextStyle<BinaryColor> = MonoTextStyle::new(&FONT_10X20, BinaryColor::On);
7
17
8
18
pub trait GuiElement {
9
19
fn draw_element(&self, target: &mut EpdDrawTarget);
+120
-32
fw16-epd-main/src/gui.rs
Reviewed
···
1
1
-
use core::fmt::Write;
2
1
use defmt::debug;
3
3
-
use embedded_graphics::mono_font::ascii::FONT_10X20;
4
4
-
use embedded_graphics::mono_font::MonoTextStyle;
2
2
+
use embedded_graphics::geometry::AnchorPoint;
5
3
use embedded_graphics::pixelcolor::BinaryColor;
6
4
use embedded_graphics::prelude::*;
7
7
-
use embedded_graphics::primitives::{PrimitiveStyle, Rectangle, RoundedRectangle};
8
8
-
use embedded_graphics::text::Text;
9
9
-
use heapless::String;
5
5
+
use embedded_graphics::primitives::Line;
10
6
use fw16_epd_gui::draw_target::EpdDrawTarget;
11
7
use fw16_epd_gui::element::button::Button;
12
12
-
use fw16_epd_gui::element::GuiElement;
8
8
+
use fw16_epd_gui::element::{GuiElement, DEFAULT_PRIMITIVE_STYLE};
9
9
+
use fw16_epd_program_interface::{SafeOption, TouchEvent, TouchEventType};
13
10
use crate::{next_touch_event, set_touch_enabled};
14
11
15
15
-
pub(crate) fn gui_main(mut draw_target: EpdDrawTarget) -> ! {
16
16
-
debug!("gui_main");
12
12
+
struct MainPage {
13
13
+
scratchpad_button: Button<'static>,
14
14
+
}
17
15
18
18
-
draw_target.refresh(false, true);
16
16
+
impl MainPage {
17
17
+
fn new() -> Self {
18
18
+
Self {
19
19
+
scratchpad_button: Button::with_default_style_auto_sized(Point::new(10, 10), "Scratchpad"),
20
20
+
}
21
21
+
}
22
22
+
}
19
23
20
20
-
unsafe { set_touch_enabled(true) };
24
24
+
impl GuiElement for MainPage {
25
25
+
fn draw_element(&self, target: &mut EpdDrawTarget) {
26
26
+
self.scratchpad_button.draw_element(target);
27
27
+
}
21
28
22
22
-
let mut button = Button::new(
23
23
-
RoundedRectangle::with_equal_corners(Rectangle::new(Point::new(10, 40), Size::new(100, 20)), Size::new(3, 3)),
24
24
-
"Click me",
25
25
-
PrimitiveStyle::with_stroke(BinaryColor::On, 2),
26
26
-
MonoTextStyle::new(&FONT_10X20, BinaryColor::On)
27
27
-
);
28
28
-
button.draw_element(&mut draw_target);
29
29
-
draw_target.refresh(true, false);
29
29
+
fn handle_touch(&mut self, ev: TouchEvent) {
30
30
+
self.scratchpad_button.handle_touch(ev);
31
31
+
}
32
32
+
}
30
33
31
31
-
let mut counter = 0;
34
34
+
struct ScratchpadPage {
35
35
+
exit_button: Button<'static>,
36
36
+
clear_button: Button<'static>,
37
37
+
prev_pos: Option<Point>,
38
38
+
}
32
39
33
33
-
loop {
34
34
-
while let Some(ev) = next_touch_event().into() {
35
35
-
button.handle_touch(ev);
40
40
+
impl ScratchpadPage {
41
41
+
fn new() -> Self {
42
42
+
let exit_button = Button::with_default_style_auto_sized(Point::new(10, 416 - 10 - 20), "Exit");
43
43
+
let next_pos = exit_button
44
44
+
.rect()
45
45
+
.translate(Point::new(10, 0))
46
46
+
.anchor_point(AnchorPoint::TopRight);
47
47
+
let clear_button = Button::with_default_style_auto_sized(next_pos, "Clear");
48
48
+
49
49
+
Self {
50
50
+
exit_button,
51
51
+
clear_button,
52
52
+
prev_pos: None,
36
53
}
54
54
+
}
55
55
+
}
37
56
38
38
-
if button.clicked(true) {
39
39
-
counter += 1;
57
57
+
impl GuiElement for ScratchpadPage {
58
58
+
fn draw_element(&self, target: &mut EpdDrawTarget) {
59
59
+
self.exit_button.draw_element(target);
60
60
+
self.clear_button.draw_element(target);
61
61
+
}
40
62
41
41
-
let mut s = String::<10>::new();
42
42
-
write!(s, "{counter}").unwrap();
63
63
+
fn handle_touch(&mut self, ev: TouchEvent) {
64
64
+
self.exit_button.handle_touch(ev);
65
65
+
self.clear_button.handle_touch(ev);
66
66
+
if matches!(ev.ev_type, TouchEventType::Down | TouchEventType::Move) {
67
67
+
self.prev_pos = Some(ev.eg_point());
68
68
+
}
69
69
+
}
70
70
+
}
43
71
44
44
-
draw_target.clear(BinaryColor::Off).unwrap();
45
45
-
button.draw_element(&mut draw_target);
72
72
+
enum Gui {
73
73
+
MainPage(MainPage),
74
74
+
ScratchpadPage(ScratchpadPage),
75
75
+
}
46
76
47
47
-
Text::new(&s, Point::new(10, 80), MonoTextStyle::new(&FONT_10X20, BinaryColor::On))
48
48
-
.draw_element(&mut draw_target);
49
49
-
draw_target.refresh(true, false);
77
77
+
impl Gui {
78
78
+
fn tick(&mut self, target: &mut EpdDrawTarget, ev: TouchEvent) {
79
79
+
match self {
80
80
+
Gui::MainPage(page) => {
81
81
+
page.handle_touch(ev);
82
82
+
83
83
+
if page.scratchpad_button.clicked(true) {
84
84
+
let scratchpad = ScratchpadPage::new();
85
85
+
target.clear(BinaryColor::Off).unwrap();
86
86
+
scratchpad.draw_element(target);
87
87
+
target.refresh(false, true);
88
88
+
*self = Gui::ScratchpadPage(scratchpad);
89
89
+
return;
90
90
+
}
91
91
+
}
92
92
+
93
93
+
Gui::ScratchpadPage(page) => {
94
94
+
if matches!(ev.ev_type, TouchEventType::Move | TouchEventType::Up) {
95
95
+
if let Some(prev) = page.prev_pos {
96
96
+
Line::new(prev, ev.eg_point())
97
97
+
.into_styled(DEFAULT_PRIMITIVE_STYLE)
98
98
+
.draw(target)
99
99
+
.unwrap();
100
100
+
page.draw_element(target);
101
101
+
target.refresh(true, false);
102
102
+
}
103
103
+
}
104
104
+
105
105
+
page.handle_touch(ev);
106
106
+
107
107
+
if page.exit_button.clicked(true) {
108
108
+
let main = MainPage::new();
109
109
+
target.clear(BinaryColor::Off).unwrap();
110
110
+
main.draw_element(target);
111
111
+
target.refresh(false, true);
112
112
+
*self = Gui::MainPage(main);
113
113
+
return;
114
114
+
}
115
115
+
116
116
+
if page.clear_button.clicked(true) {
117
117
+
target.clear(BinaryColor::Off).unwrap();
118
118
+
page.draw_element(target);
119
119
+
target.refresh(false, false);
120
120
+
}
121
121
+
}
122
122
+
}
123
123
+
}
124
124
+
}
125
125
+
126
126
+
pub(crate) fn gui_main(mut draw_target: EpdDrawTarget) -> ! {
127
127
+
debug!("gui_main");
128
128
+
129
129
+
unsafe { set_touch_enabled(true) };
130
130
+
let main = MainPage::new();
131
131
+
main.draw_element(&mut draw_target);
132
132
+
draw_target.refresh(false, true);
133
133
+
let mut gui = Gui::MainPage(main);
134
134
+
135
135
+
loop {
136
136
+
while let SafeOption::Some(ev) = next_touch_event() {
137
137
+
gui.tick(&mut draw_target, ev);
50
138
}
51
139
}
52
140
}