sampling only in the middle
This commit is contained in:
@@ -116,25 +116,9 @@ pub fn decode_uart_samples(
|
|||||||
let frame_bits = 1 + nbits + parity_bits + stop_bits_count;
|
let frame_bits = 1 + nbits + parity_bits + stop_bits_count;
|
||||||
let frame_len = frame_bits * ovs;
|
let frame_len = frame_bits * ovs;
|
||||||
|
|
||||||
// Majority vote over 3 samples centered at `i`
|
// Get sample in the middle of the bit
|
||||||
let get_bit = |i: usize| -> u8 {
|
let get_bit = |i: usize| -> u8 {
|
||||||
let mut votes = 0;
|
if samples[i] != 0 { 1 } else { 0 }
|
||||||
// Check i-1, i, i+1. Saturating sub/add handles boundaries roughly.
|
|
||||||
if i > 0 && samples.get(i - 1).map_or(true, |&x| x != 0) {
|
|
||||||
votes += 1;
|
|
||||||
}
|
|
||||||
if samples.get(i).map_or(true, |&x| x != 0) {
|
|
||||||
votes += 1;
|
|
||||||
}
|
|
||||||
if samples.get(i + 1).map_or(true, |&x| x != 0) {
|
|
||||||
votes += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if votes >= 2 {
|
|
||||||
1
|
|
||||||
} else {
|
|
||||||
0
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Decode while remaining samples for a full frame
|
// Decode while remaining samples for a full frame
|
||||||
|
|||||||
Reference in New Issue
Block a user