Bevy+Ratutui powered Monitoring of Pico-Strike devices
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Highlight detected signal

+51 -11
+51 -11
src/views/monitoring.rs
··· 181 181 With<Device>, 182 182 >, 183 183 q_levels: Query<&StormLevel>, 184 - q_signals: Query<(&Timestamp, &StormSignal)>, 184 + q_signals: Query<(&Timestamp, &StormSignal, &SignalPeaks)>, 185 185 ) -> Result { 186 186 context.draw(|frame| { 187 187 let [top, mid, bottom] = Layout::vertical([ ··· 223 223 ) 224 224 .white(); 225 225 226 - let timestamp = latest_signal.map(|(t, _)| t); 226 + let timestamp = latest_signal.map(|(t, _, _)| t); 227 227 228 228 let timestamp = Paragraph::new(Line::from_iter( 229 229 timestamp.map(|t| Span::from(format!("{}", t.0))), ··· 261 261 .border_style(Color::LightGreen), 262 262 ); 263 263 264 - let data = latest_signal 265 - .map(|(_, samples)| { 266 - samples 267 - .iter() 268 - .enumerate() 269 - .map(|(x, y)| (x as f64, *y as f64)) 270 - .collect() 264 + let (data, detected) = latest_signal 265 + .map(|(_, samples, signals)| { 266 + ( 267 + samples 268 + .iter() 269 + .enumerate() 270 + .map(|(x, y)| (x as f64, *y as f64)) 271 + .collect(), 272 + signals.iter().fold(None, |acc, el| { 273 + Some(acc.map_or_else( 274 + || (el.0, el.0 + 16), 275 + |prev: (usize, usize)| (prev.0, prev.1.max(el.0 + 16)), 276 + )) 277 + }), 278 + ) 271 279 }) 272 - .unwrap_or_else(Vec::new); 280 + .unwrap_or_else(|| (Vec::new(), None)); 273 281 274 282 let y_bounds = data 275 283 .iter() ··· 277 285 .reduce(f64::max) 278 286 .unwrap_or(0.0); 279 287 288 + let detected = detected.map_or_else(Vec::new, |signal| { 289 + (signal.0..=signal.1) 290 + .map(|i| (i as f64, y_bounds)) 291 + .collect() 292 + }); 293 + 280 294 let datasets = vec![ 281 295 Dataset::default() 282 296 .graph_type(ratatui::widgets::GraphType::Line) ··· 289 303 .title("Details") 290 304 .border_style(Color::LightGreen); 291 305 306 + let chart_labels = [ 307 + (-y_bounds).to_string(), 308 + "0".to_string(), 309 + y_bounds.to_string(), 310 + ]; 311 + 312 + let chart2 = Chart::new(vec![ 313 + Dataset::default() 314 + .graph_type(ratatui::widgets::GraphType::Bar) 315 + .marker(ratatui::symbols::Marker::Dot) 316 + .style(Color::Indexed(22)) 317 + .data(&detected), 318 + ]) 319 + .x_axis(Axis::default().bounds([0.0, 512.0])) 320 + .y_axis( 321 + Axis::default() 322 + .bounds([0.0, 1.0]) 323 + .labels(chart_labels.clone()), 324 + ) 325 + .block(block.clone()); 326 + 292 327 let chart = Chart::new(datasets) 293 328 .x_axis(Axis::default().bounds([0.0, 512.0])) 294 - .y_axis(Axis::default().bounds([-y_bounds, y_bounds])) 329 + .y_axis( 330 + Axis::default() 331 + .bounds([-y_bounds, y_bounds]) 332 + .labels(chart_labels), 333 + ) 295 334 .block(block); 296 335 297 336 let help = Paragraph::new("Keys: 'q'/ESC Quit, BACKSPACE Return to Device select") ··· 319 358 frame.render_widget(timestamp, top_mid_left); 320 359 frame.render_widget(warn_level, top_mid_right); 321 360 frame.render_widget(connection, top_right); 361 + frame.render_widget(chart2, chart_block); 322 362 frame.render_widget(chart, chart_block); 323 363 frame.render_widget(detector_info, detector_block); 324 364 frame.render_widget(help, bottom);