diff --git a/src/views/monitoring.rs b/src/views/monitoring.rs --- a/src/views/monitoring.rs +++ b/src/views/monitoring.rs @@ -19,7 +19,7 @@ use ratatui::{ layout::{Constraint, HorizontalAlignment, Layout}, style::{Color, Stylize}, - text::{Line, Span}, + text::{Line, Span, Text, ToSpan}, widgets::{Axis, Block, Chart, Dataset, Padding, Paragraph}, }; use striker_proto::{Response, StrikerRequest, StrikerResponse, Update}; @@ -184,23 +184,14 @@ q_signals: Query<(&Timestamp, &StormSignal, &SignalPeaks)>, ) -> Result { context.draw(|frame| { - let [top, mid, bottom] = Layout::vertical([ - Constraint::Length(3), - Constraint::Fill(1), - Constraint::Length(3), - ]) - .areas(frame.area()); + let [mid, bottom] = + Layout::vertical([Constraint::Fill(1), Constraint::Length(3)]).areas(frame.area()); - let [top_left, top_mid_left, top_mid_right, top_right] = Layout::horizontal([ - Constraint::Fill(1), - Constraint::Fill(1), - Constraint::Fill(1), - Constraint::Fill(1), - ]) - .areas(top); + let [chart_block, side_block] = + Layout::horizontal([Constraint::Fill(3), Constraint::Fill(1)]).areas(mid); - let [chart_block, detector_block] = - Layout::vertical([Constraint::Fill(1), Constraint::Length(3)]).areas(mid); + let [device_block, detector_block] = + Layout::vertical([Constraint::Fill(1), Constraint::Fill(1)]).areas(side_block); let (device, detector, levels, signals) = q_devices.get(connected.device).unwrap(); @@ -213,7 +204,19 @@ .and_then(|s| s.last().copied()) .and_then(|entity| q_signals.get(entity).ok()); - let name = Paragraph::new(device.as_str()) + let timestamp = latest_signal.map(|(t, _, _)| t); + + let lines = [ + Line::from(device.to_span()), + Line::from_iter([Span::raw("Status: "), connected.connection_state.to_span()]), + ] + .into_iter() + .chain(timestamp.map(|t| Line::from(t.0.to_span()))) + .chain( + latest_level.map(|level| Line::from_iter([Span::raw("Level: "), level.0.to_span()])), + ); + + let info = Paragraph::new(Text::from_iter(lines)) .block( Block::bordered() .padding(Padding::horizontal(2)) @@ -222,44 +225,6 @@ .border_style(Color::LightGreen), ) .white(); - - let timestamp = latest_signal.map(|(t, _, _)| t); - - let timestamp = Paragraph::new(Line::from_iter( - timestamp.map(|t| Span::from(format!("{}", t.0))), - )) - .white() - .block( - Block::bordered() - .padding(Padding::horizontal(2)) - .title("Timestamp") - .title_alignment(HorizontalAlignment::Center) - .border_style(Color::LightGreen), - ); - - let warn_level = Paragraph::new(Line::from_iter( - Some(Span::raw("Level: ")) - .into_iter() - .chain(latest_level.map(|s| Span::from(format!("{}", s.0)))), - )) - .white() - .block( - Block::bordered() - .padding(Padding::horizontal(2)) - .title("Storm Warning") - .title_alignment(HorizontalAlignment::Center) - .border_style(Color::LightGreen), - ); - - let connection = Paragraph::new(connected.connection_state.to_string()) - .white() - .block( - Block::bordered() - .padding(Padding::horizontal(2)) - .title("State") - .title_alignment(HorizontalAlignment::Center) - .border_style(Color::LightGreen), - ); let (data, detected) = latest_signal .map(|(_, samples, signals)| { @@ -271,8 +236,8 @@ .collect(), signals.iter().fold(None, |acc, el| { Some(acc.map_or_else( - || (el.0, el.0 + 16), - |prev: (usize, usize)| (prev.0, prev.1.max(el.0 + 16)), + || (el.0, el.0 + 32), + |prev: (usize, usize)| (prev.0, prev.1.max(el.0 + 32)), )) }), ) @@ -343,21 +308,23 @@ let detector = detector.copied().unwrap_or_default(); - let detector_info = Paragraph::new(format!( - "Threshold: {}, Blip Size: {}, Max Duty {}, Current Duty: {}", - detector.blip_threshold, detector.blip_size, detector.max_duty, detector.duty - )) - .block( - Block::bordered() - .padding(Padding::horizontal(2)) - .border_style(Color::LightGreen), - ) - .white(); + let detector_lines = [ + Line::from_iter([Span::raw("Threshold: "), detector.blip_threshold.to_span()]), + Line::from_iter([Span::raw("Blip Size: "), detector.blip_size.to_span()]), + Line::from_iter([Span::raw("Max Duty: "), detector.max_duty.to_span()]), + Line::from_iter([Span::raw("Current Duty: "), detector.duty.to_span()]), + ]; - frame.render_widget(name, top_left); - frame.render_widget(timestamp, top_mid_left); - frame.render_widget(warn_level, top_mid_right); - frame.render_widget(connection, top_right); + let detector_info = Paragraph::new(Text::from_iter(detector_lines)) + .block( + Block::bordered() + .title("Settings") + .padding(Padding::horizontal(2)) + .border_style(Color::LightGreen), + ) + .white(); + + frame.render_widget(info, device_block); frame.render_widget(chart2, chart_block); frame.render_widget(chart, chart_block); frame.render_widget(detector_info, detector_block);