tangled
alpha
login
or
join now
sachy.dev
/
striker
0
fork
atom
Bevy+Ratutui powered Monitoring of Pico-Strike devices
0
fork
atom
overview
issues
pulls
pipelines
Organise into widgets
sachy.dev
1 week ago
cacc7dcc
ac77fa45
+100
-41
2 changed files
expand all
collapse all
unified
split
src
device.rs
views
monitoring.rs
+30
src/device.rs
···
14
14
prelude::Deref,
15
15
};
16
16
use rapidhash::RapidHashSet;
17
17
+
use ratatui::{
18
18
+
style::{Color, Stylize},
19
19
+
text::{Line, Span, Text, ToSpan},
20
20
+
widgets::{Block, Padding, Paragraph, Widget},
21
21
+
};
17
22
18
23
use crate::net::DiscoverResponse;
19
24
···
37
42
pub blip_size: usize,
38
43
pub max_duty: u16,
39
44
pub duty: u16,
45
45
+
}
46
46
+
47
47
+
impl Widget for DeviceDetector {
48
48
+
fn render(self, area: ratatui::prelude::Rect, buf: &mut ratatui::prelude::Buffer)
49
49
+
where
50
50
+
Self: Sized,
51
51
+
{
52
52
+
let detector_lines = [
53
53
+
Line::from_iter([Span::raw("Threshold: "), self.blip_threshold.to_span()]),
54
54
+
Line::from_iter([Span::raw("Blip Size: "), self.blip_size.to_span()]),
55
55
+
Line::from_iter([Span::raw("Max Duty: "), self.max_duty.to_span()]),
56
56
+
Line::from_iter([Span::raw("Current Duty: "), self.duty.to_span()]),
57
57
+
];
58
58
+
59
59
+
let detector_info = Paragraph::new(Text::from_iter(detector_lines))
60
60
+
.block(
61
61
+
Block::bordered()
62
62
+
.title("Settings")
63
63
+
.padding(Padding::horizontal(1))
64
64
+
.border_style(Color::LightGreen),
65
65
+
)
66
66
+
.white();
67
67
+
68
68
+
detector_info.render(area, buf);
69
69
+
}
40
70
}
41
71
42
72
fn on_remove_device(mut world: DeferredWorld, context: HookContext) {
+70
-41
src/views/monitoring.rs
···
20
20
layout::{Constraint, HorizontalAlignment, Layout},
21
21
style::{Color, Stylize},
22
22
text::{Line, Span, Text, ToSpan},
23
23
-
widgets::{Axis, Block, Chart, Dataset, Padding, Paragraph},
23
23
+
widgets::{Axis, Block, Chart, Dataset, Padding, Paragraph, Widget},
24
24
};
25
25
use striker_proto::{Response, StrikerRequest, StrikerResponse, Update};
26
26
···
206
206
207
207
let timestamp = latest_signal.map(|(t, _, _)| t);
208
208
209
209
+
let info = DeviceInfo {
210
210
+
name: device,
211
211
+
connected: &connected,
212
212
+
timestamp,
213
213
+
level: latest_level,
214
214
+
};
215
215
+
216
216
+
let signal_chart = SignalChart {
217
217
+
signal: latest_signal,
218
218
+
};
219
219
+
220
220
+
let help = Paragraph::new("Keys: 'q'/ESC Quit, BACKSPACE Return to Device select")
221
221
+
.block(
222
222
+
Block::bordered()
223
223
+
.padding(Padding::horizontal(2))
224
224
+
.border_style(Color::LightGreen),
225
225
+
)
226
226
+
.white();
227
227
+
228
228
+
let detector = detector.copied().unwrap_or_default();
229
229
+
230
230
+
frame.render_widget(info, device_block);
231
231
+
frame.render_widget(signal_chart, chart_block);
232
232
+
frame.render_widget(detector, detector_block);
233
233
+
frame.render_widget(help, bottom);
234
234
+
})?;
235
235
+
236
236
+
Ok(())
237
237
+
}
238
238
+
239
239
+
struct DeviceInfo<'a> {
240
240
+
name: &'a Name,
241
241
+
connected: &'a ConnectedDevice,
242
242
+
timestamp: Option<&'a Timestamp>,
243
243
+
level: Option<&'a StormLevel>,
244
244
+
}
245
245
+
246
246
+
impl Widget for DeviceInfo<'_> {
247
247
+
fn render(self, area: ratatui::prelude::Rect, buf: &mut ratatui::prelude::Buffer)
248
248
+
where
249
249
+
Self: Sized,
250
250
+
{
209
251
let lines = [
210
210
-
Line::from(device.to_span()),
211
211
-
Line::from_iter([Span::raw("Status: "), connected.connection_state.to_span()]),
252
252
+
Line::from(self.name.to_span()),
253
253
+
Line::from_iter([
254
254
+
Span::raw("Status: "),
255
255
+
self.connected.connection_state.to_span(),
256
256
+
]),
212
257
]
213
258
.into_iter()
214
214
-
.chain(timestamp.map(|t| Line::from(t.0.to_span())))
259
259
+
.chain(self.timestamp.map(|t| Line::from(t.0.to_span())))
215
260
.chain(
216
216
-
latest_level.map(|level| Line::from_iter([Span::raw("Level: "), level.0.to_span()])),
261
261
+
self.level
262
262
+
.map(|level| Line::from_iter([Span::raw("Level: "), level.0.to_span()])),
217
263
);
218
264
219
265
let info = Paragraph::new(Text::from_iter(lines))
220
266
.block(
221
267
Block::bordered()
222
222
-
.padding(Padding::horizontal(2))
268
268
+
.padding(Padding::horizontal(1))
223
269
.title("Device")
224
270
.title_alignment(HorizontalAlignment::Center)
225
271
.border_style(Color::LightGreen),
226
272
)
227
273
.white();
228
274
229
229
-
let (data, detected) = latest_signal
275
275
+
info.render(area, buf);
276
276
+
}
277
277
+
}
278
278
+
279
279
+
struct SignalChart<'a> {
280
280
+
signal: Option<(&'a Timestamp, &'a StormSignal, &'a SignalPeaks)>,
281
281
+
}
282
282
+
283
283
+
impl Widget for SignalChart<'_> {
284
284
+
fn render(self, area: ratatui::prelude::Rect, buf: &mut ratatui::prelude::Buffer)
285
285
+
where
286
286
+
Self: Sized,
287
287
+
{
288
288
+
let (data, detected) = self
289
289
+
.signal
230
290
.map(|(_, samples, signals)| {
231
291
(
232
292
samples
···
298
358
)
299
359
.block(block);
300
360
301
301
-
let help = Paragraph::new("Keys: 'q'/ESC Quit, BACKSPACE Return to Device select")
302
302
-
.block(
303
303
-
Block::bordered()
304
304
-
.padding(Padding::horizontal(2))
305
305
-
.border_style(Color::LightGreen),
306
306
-
)
307
307
-
.white();
308
308
-
309
309
-
let detector = detector.copied().unwrap_or_default();
310
310
-
311
311
-
let detector_lines = [
312
312
-
Line::from_iter([Span::raw("Threshold: "), detector.blip_threshold.to_span()]),
313
313
-
Line::from_iter([Span::raw("Blip Size: "), detector.blip_size.to_span()]),
314
314
-
Line::from_iter([Span::raw("Max Duty: "), detector.max_duty.to_span()]),
315
315
-
Line::from_iter([Span::raw("Current Duty: "), detector.duty.to_span()]),
316
316
-
];
317
317
-
318
318
-
let detector_info = Paragraph::new(Text::from_iter(detector_lines))
319
319
-
.block(
320
320
-
Block::bordered()
321
321
-
.title("Settings")
322
322
-
.padding(Padding::horizontal(2))
323
323
-
.border_style(Color::LightGreen),
324
324
-
)
325
325
-
.white();
326
326
-
327
327
-
frame.render_widget(info, device_block);
328
328
-
frame.render_widget(chart2, chart_block);
329
329
-
frame.render_widget(chart, chart_block);
330
330
-
frame.render_widget(detector_info, detector_block);
331
331
-
frame.render_widget(help, bottom);
332
332
-
})?;
333
333
-
334
334
-
Ok(())
361
361
+
chart2.render(area, buf);
362
362
+
chart.render(area, buf);
363
363
+
}
335
364
}