1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
use crate::{Receiver, ReceiverState};
const BUF_LEN: usize = 128;
pub struct TraceReceiver {
pub data: [u16; BUF_LEN],
pub samplerate: u32,
pub prev_pinval: bool,
pub st_prev: u32,
pub event_id: usize,
state: ReceiverState<TraceResult, ()>,
}
#[derive(Clone, Copy)]
pub struct TraceResult {
pub buf: [u16; BUF_LEN],
pub buf_len: usize,
}
const TIMEOUT: u16 = 1000;
impl Receiver for TraceReceiver {
type Command = TraceResult;
type ReceiveError = ();
fn event(&mut self, pinvalue: bool, st: u32) -> ReceiverState<TraceResult, ()> {
match self.state {
ReceiverState::Disabled => return ReceiverState::Disabled,
_ => (),
};
let delta = self.delta(st);
if delta > TIMEOUT {
self.state = ReceiverState::Idle;
return ReceiverState::Done(TraceResult {
buf: self.data,
buf_len: self.event_id,
});
}
if self.prev_pinval != pinvalue {
self.state = ReceiverState::Receiving;
self.data[self.event_id] = delta;
self.event_id += 1;
self.st_prev = st;
self.prev_pinval = pinvalue;
if self.event_id == BUF_LEN {
self.state = ReceiverState::Disabled;
let mut buf = [0; 128];
for i in 0..self.data.len() {
buf[i] = self.data[i];
}
return ReceiverState::Done(TraceResult {
buf,
buf_len: self.event_id,
})
}
}
match self.state {
ReceiverState::Disabled => ReceiverState::Disabled,
ReceiverState::Idle => ReceiverState::Idle,
_ => ReceiverState::Receiving,
}
}
fn reset(&mut self) {
self.st_prev = 0;
self.event_id = 0;
self.prev_pinval = false;
self.state = ReceiverState::Idle;
for i in 0..self.data.len() {
self.data[i] = 0;
}
}
fn disable(&mut self) {
self.state = ReceiverState::Disabled;
}
}
impl TraceReceiver {
pub const fn new(samplerate: u32) -> Self {
Self {
data: [0; BUF_LEN],
samplerate,
prev_pinval: false,
st_prev: 0,
event_id: 0,
state: ReceiverState::Idle
}
}
pub fn delta(&self, ts: u32) -> u16 {
if self.st_prev == 0 {
return 0;
}
ts.wrapping_sub(self.st_prev) as u16
}
}