dashboard/mode/
charging.rs

1use 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    // Define Styles
30    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    // Clear Dead Text
44    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    // Render Battery Voltage
50    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}