diff --git a/src/views/monitoring.rs b/src/views/monitoring.rs index e4a8ff4..106f6db 100644 --- a/src/views/monitoring.rs +++ b/src/views/monitoring.rs @@ -181,7 +181,7 @@ pub fn monitoring_view( With, >, q_levels: Query<&StormLevel>, - q_signals: Query<(&Timestamp, &StormSignal)>, + q_signals: Query<(&Timestamp, &StormSignal, &SignalPeaks)>, ) -> Result { context.draw(|frame| { let [top, mid, bottom] = Layout::vertical([ @@ -223,7 +223,7 @@ pub fn monitoring_view( ) .white(); - let timestamp = latest_signal.map(|(t, _)| t); + let timestamp = latest_signal.map(|(t, _, _)| t); let timestamp = Paragraph::new(Line::from_iter( timestamp.map(|t| Span::from(format!("{}", t.0))), @@ -261,15 +261,23 @@ pub fn monitoring_view( .border_style(Color::LightGreen), ); - let data = latest_signal - .map(|(_, samples)| { - samples - .iter() - .enumerate() - .map(|(x, y)| (x as f64, *y as f64)) - .collect() + let (data, detected) = latest_signal + .map(|(_, samples, signals)| { + ( + samples + .iter() + .enumerate() + .map(|(x, y)| (x as f64, *y as f64)) + .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)), + )) + }), + ) }) - .unwrap_or_else(Vec::new); + .unwrap_or_else(|| (Vec::new(), None)); let y_bounds = data .iter() @@ -277,6 +285,12 @@ pub fn monitoring_view( .reduce(f64::max) .unwrap_or(0.0); + let detected = detected.map_or_else(Vec::new, |signal| { + (signal.0..=signal.1) + .map(|i| (i as f64, y_bounds)) + .collect() + }); + let datasets = vec![ Dataset::default() .graph_type(ratatui::widgets::GraphType::Line) @@ -289,9 +303,34 @@ pub fn monitoring_view( .title("Details") .border_style(Color::LightGreen); + let chart_labels = [ + (-y_bounds).to_string(), + "0".to_string(), + y_bounds.to_string(), + ]; + + let chart2 = Chart::new(vec![ + Dataset::default() + .graph_type(ratatui::widgets::GraphType::Bar) + .marker(ratatui::symbols::Marker::Dot) + .style(Color::Indexed(22)) + .data(&detected), + ]) + .x_axis(Axis::default().bounds([0.0, 512.0])) + .y_axis( + Axis::default() + .bounds([0.0, 1.0]) + .labels(chart_labels.clone()), + ) + .block(block.clone()); + let chart = Chart::new(datasets) .x_axis(Axis::default().bounds([0.0, 512.0])) - .y_axis(Axis::default().bounds([-y_bounds, y_bounds])) + .y_axis( + Axis::default() + .bounds([-y_bounds, y_bounds]) + .labels(chart_labels), + ) .block(block); let help = Paragraph::new("Keys: 'q'/ESC Quit, BACKSPACE Return to Device select") @@ -319,6 +358,7 @@ pub fn monitoring_view( frame.render_widget(timestamp, top_mid_left); frame.render_widget(warn_level, top_mid_right); frame.render_widget(connection, top_right); + frame.render_widget(chart2, chart_block); frame.render_widget(chart, chart_block); frame.render_widget(detector_info, detector_block); frame.render_widget(help, bottom);