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
116
117
use radio_api::{Connection, RadioResult, Stream};
use serial;
use serial::prelude::*;
use std::io;
use std::io::prelude::*;
use std::time::Duration;
pub fn serial_connection(bus: &str) -> Connection {
Connection::new(Box::new(SerialStream::new(bus)))
}
struct SerialStream {
bus: String,
}
impl SerialStream {
pub fn new(bus: &str) -> SerialStream {
SerialStream {
bus: bus.to_owned(),
}
}
}
impl Stream for SerialStream {
fn write(&self, data: &[u8]) -> RadioResult<()> {
serial_send(&self.bus, data)?;
Ok(())
}
fn read(&self) -> RadioResult<Vec<u8>> {
Ok(serial_receive(&self.bus)?)
}
}
fn serial_send(bus: &str, data: &[u8]) -> io::Result<()> {
let mut port = serial::open(bus)?;
let settings: serial::PortSettings = serial::PortSettings {
baud_rate: serial::Baud38400,
char_size: serial::Bits8,
parity: serial::ParityNone,
stop_bits: serial::Stop1,
flow_control: serial::FlowNone,
};
port.configure(&settings)?;
port.set_timeout(Duration::from_millis(100))?;
let be_data = {
let mut v = Vec::<u8>::new();
for item in data {
v.push(item.to_be());
}
v
};
port.flush()?;
port.write_all(&be_data[..])?;
Ok(())
}
fn serial_receive(bus: &str) -> io::Result<Vec<u8>> {
let mut ret_msg: Vec<u8> = Vec::new();
let mut port = serial::open(bus)?;
let settings: serial::PortSettings = serial::PortSettings {
baud_rate: serial::Baud38400,
char_size: serial::Bits8,
parity: serial::ParityNone,
stop_bits: serial::Stop1,
flow_control: serial::FlowNone,
};
port.configure(&settings)?;
port.set_timeout(Duration::from_millis(100))?;
let mut tries = 0;
loop {
let mut read_buffer: Vec<u8> = vec![0; 1];
match port.read(&mut read_buffer[..]) {
Ok(c) => {
if c > 0 {
ret_msg.extend(read_buffer);
} else {
tries += 1;
}
}
Err(_e) => {
tries += 1;
}
};
if tries > 5 {
break;
}
}
Ok(ret_msg)
}