fixed hardware_db and improved stability and robustness of generic sal

This commit is contained in:
2026-02-26 15:52:44 +01:00
parent f87efa1d24
commit 073414a25e
13 changed files with 488 additions and 225 deletions

View File

@@ -5,6 +5,7 @@ use ratatui::{
widgets::{Block, Borders, List, ListItem, Paragraph, Chart, Dataset, Axis, BorderType, GraphType},
symbols::Marker,
Frame,
prelude::Stylize,
};
use crate::mediator::TelemetryState;
use crate::ui::theme::*;
@@ -83,6 +84,55 @@ pub fn draw_dashboard(
draw_freq_graph(f, right_side_chunks[2], state);
draw_logs(f, chunks[3], ui_state);
if state.is_emergency {
draw_emergency_overlay(f, area, state);
}
}
fn draw_emergency_overlay(f: &mut Frame, area: Rect, state: &TelemetryState) {
let block = Block::default()
.borders(Borders::ALL)
.border_type(BorderType::Double)
.border_style(Style::default().fg(Color::Red).add_modifier(Modifier::BOLD))
.bg(Color::Black)
.title(" 🚨 EMERGENCY ABORT 🚨 ");
let area = centered_rect(60, 20, area);
let inner = block.inner(area);
f.render_widget(block, area);
let reason = state.emergency_reason.as_deref().unwrap_or("Unknown safety trigger");
let text = vec![
Line::from(vec![Span::styled("CRITICAL SAFETY LIMIT TRIGGERED", Style::default().fg(Color::Red).add_modifier(Modifier::BOLD))]),
Line::from(""),
Line::from(vec![Span::raw("Reason: "), Span::styled(reason, Style::default().fg(Color::Yellow))]),
Line::from(""),
Line::from("Hardware has been restored to safe defaults."),
Line::from("Exiting in 1 second..."),
];
f.render_widget(Paragraph::new(text).alignment(ratatui::layout::Alignment::Center), inner);
}
fn centered_rect(percent_x: u16, percent_y: u16, r: Rect) -> Rect {
let popup_layout = Layout::default()
.direction(Direction::Vertical)
.constraints([
Constraint::Percentage((100 - percent_y) / 2),
Constraint::Percentage(percent_y),
Constraint::Percentage((100 - percent_y) / 2),
])
.split(r);
Layout::default()
.direction(Direction::Horizontal)
.constraints([
Constraint::Percentage((100 - percent_x) / 2),
Constraint::Percentage(percent_x),
Constraint::Percentage((100 - percent_x) / 2),
])
.split(popup_layout[1])[1]
}
fn draw_header(f: &mut Frame, area: Rect, state: &TelemetryState) {