rill_view/flow/data/
pulse.rs1use rill_protocol::flow::core::{Flow, TimedEvent};
2use rill_protocol::frame::Frame;
4use rill_protocol::io::provider::StreamType;
5use rill_protocol::range::Range;
6use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct PulsePoint {
10 pub value: f64,
11}
12
13#[derive(Debug, Clone, Serialize, Deserialize)]
14pub struct PulseState {
15 pub range: Option<Range>,
17
18 pub frame: Frame<TimedEvent<PulsePoint>>,
20 value: f64,
22}
23
24impl PulseState {
25 pub fn new(range: Option<Range>, depth: Option<u32>) -> Self {
26 let depth = depth.unwrap_or(128);
27 Self {
28 range,
29 frame: Frame::new(depth),
31 value: 0.0,
32 }
33 }
34
35 }
48
49impl Flow for PulseState {
50 type Action = ();
51 type Event = PulseEvent;
52
53 fn stream_type() -> StreamType {
54 StreamType::from("rillrate.data.pulse.v0")
55 }
56
57 fn apply(&mut self, event: TimedEvent<Self::Event>) {
58 match event.event {
59 PulseEvent::Inc(delta) => {
60 self.value += delta;
61 }
62 PulseEvent::Dec(delta) => {
63 self.value -= delta;
64 }
65 PulseEvent::Set(value) => {
66 self.value = value;
67 }
68 }
69 let mut value = self.value;
71 if let Some(range) = self.range.as_ref() {
72 range.clamp(&mut value);
73 }
74 let point = PulsePoint { value };
75 let timed_event = TimedEvent {
76 timestamp: event.timestamp,
77 event: point,
78 };
79 self.frame.insert_pop(timed_event);
80 }
81}
82
83pub type PulseDelta = Vec<TimedEvent<PulseEvent>>;
84
85#[derive(Debug, Clone, Serialize, Deserialize)]
86pub enum PulseEvent {
87 Inc(f64),
88 Dec(f64),
89 Set(f64),
90}