embedded_charts/dashboard/
simple.rs1use super::{GridLayout, GridPosition};
4use crate::error::ChartResult;
5use embedded_graphics::primitives::Rectangle;
6use heapless::Vec;
7
8pub const MAX_DASHBOARD_CHARTS: usize = 16;
10
11pub struct SimpleDashboard {
13 grid: GridLayout,
15 spacing: u32,
17}
18
19impl SimpleDashboard {
20 pub fn new(rows: u8, cols: u8, spacing: u32) -> Self {
22 Self {
23 grid: GridLayout::new(rows, cols),
24 spacing,
25 }
26 }
27
28 pub fn get_viewport(&self, position: GridPosition, total_viewport: Rectangle) -> Rectangle {
30 self.grid
31 .calculate_cell_viewport(total_viewport, position, self.spacing)
32 }
33
34 pub fn get_all_viewports<const N: usize>(
36 &self,
37 total_viewport: Rectangle,
38 panel_count: usize,
39 ) -> ChartResult<Vec<Rectangle, N>> {
40 let mut positions: Vec<GridPosition, N> = Vec::new();
41 let mut index = 0;
42
43 'outer: for row in 0..self.grid.rows {
44 for col in 0..self.grid.cols {
45 if index >= panel_count {
46 break 'outer;
47 }
48 positions
49 .push(GridPosition::new(row, col))
50 .map_err(|_| crate::error::ChartError::MemoryFull)?;
51 index += 1;
52 }
53 }
54
55 self.grid
56 .calculate_viewports(total_viewport, &positions, self.spacing)
57 }
58}
59
60#[cfg(test)]
61mod tests {
62 use super::*;
63 use embedded_graphics::prelude::*;
64
65 #[test]
66 fn test_simple_dashboard() {
67 let dashboard = SimpleDashboard::new(2, 2, 10);
68 let total_viewport = Rectangle::new(Point::new(0, 0), Size::new(200, 200));
69
70 let viewport = dashboard.get_viewport(GridPosition::new(0, 0), total_viewport);
72 assert_eq!(viewport.top_left, Point::new(0, 0));
73 assert_eq!(viewport.size, Size::new(95, 95));
74
75 let viewports: Vec<Rectangle, 4> = dashboard.get_all_viewports(total_viewport, 3).unwrap();
77 assert_eq!(viewports.len(), 3);
78 }
79}