dashboard/mode/
charging.rs1use super::init_charging::*;
2use crate::display_mod::{CENTER_POINT, DisplayDevice};
3use eg_seven_segment::SevenSegmentStyleBuilder;
4use embedded_graphics::primitives::StyledDrawable;
5use embedded_graphics::text::renderer::CharacterStyle;
6use embedded_graphics::{
7 Drawable,
8 pixelcolor::Rgb666,
9 prelude::*,
10 primitives::{Arc, PrimitiveStyle},
11 text::{Alignment, Text},
12};
13
14fn render_battery_voltage_gui(
15 display: &mut DisplayDevice,
16 batt_voltage: u32,
17 prev_batt_voltage: u32,
18) {
19 const DIGIT_SPACING: u32 = 3;
20 const VOLTAGE_POS: Point = Point::new(
21 CENTER_POINT.x + BATT_FONT_WIDTH as i32,
22 CENTER_POINT.y + BATT_FONT_HEIGHT as i32 / 2,
23 );
24 const CLEAR_TEXT_POS: Point = Point::new(
25 CENTER_POINT.x - DIGIT_SPACING as i32,
26 CENTER_POINT.y + BATT_FONT_HEIGHT as i32 / 2,
27 );
28
29 let batt_style = SevenSegmentStyleBuilder::new()
31 .digit_size(Size::new(BATT_FONT_WIDTH, BATT_FONT_HEIGHT))
32 .digit_spacing(DIGIT_SPACING)
33 .segment_width(4)
34 .segment_color(Rgb666::WHITE)
35 .inactive_segment_color(Rgb666::BLACK)
36 .build();
37 let mut clear_style = batt_style.clone();
38 clear_style.set_text_color(Some(Rgb666::BLACK));
39
40 let mut str_buffer = itoa::Buffer::new();
41 let batt_voltage_str = str_buffer.format(batt_voltage);
42
43 if prev_batt_voltage >= 10 && batt_voltage < 10 {
45 Text::with_alignment("8", CLEAR_TEXT_POS, clear_style, Alignment::Right)
46 .draw(display)
47 .unwrap();
48 }
49 Text::with_alignment(batt_voltage_str, VOLTAGE_POS, batt_style, Alignment::Right)
51 .draw(display)
52 .unwrap();
53}
54
55fn render_battery_meter_gui(display: &mut DisplayDevice, battery_percent: f32) {
56 let empty_style = PrimitiveStyle::with_stroke(Rgb666::BLACK, 12);
57 let fill_style = PrimitiveStyle::with_stroke(Rgb666::GREEN, 12);
58
59 const ANGLE_END: f32 = ANGLE_START + (360.0 - (ANGLE_START - 90.0) * 2.0);
60 const MAX_METER_LENGTH: f32 = 360.0 - (ANGLE_START - 90.0) * 2.0;
61
62 let charge_length = MAX_METER_LENGTH * battery_percent;
63 let empty_length = ANGLE_END - (charge_length + ANGLE_START);
64
65 Arc::with_center(
66 CENTER_POINT,
67 ARC_DIAMTER,
68 ANGLE_START.deg() + charge_length.deg(),
69 empty_length.deg(),
70 )
71 .draw_styled(&empty_style, display)
72 .unwrap();
73
74 Arc::with_center(
75 CENTER_POINT,
76 ARC_DIAMTER,
77 ANGLE_START.deg(),
78 charge_length.deg(),
79 )
80 .draw_styled(&fill_style, display)
81 .unwrap();
82}
83
84pub fn render_charging_gui(display: &mut DisplayDevice) {
85 let prev_batt_voltage = 0;
86 let batt_voltage = 0;
87 render_battery_voltage_gui(display, batt_voltage, prev_batt_voltage);
88 render_battery_meter_gui(display, 50.0);
89}