1extern crate serial;
2
3use std::io::{Read, Write};
4
5use packet::get_packet;
6use serial::{prelude::*, SystemPort};
7
8pub use packet::PacketData;
9pub use serial::BaudRate;
10pub use serial::Error;
11
12mod packet;
13
14pub struct Vesc {
15 port: SystemPort,
16}
17
18impl Vesc {
19 pub fn new(port_name: &str, baud_rate: serial::BaudRate) -> Result<Vesc, serial::Error> {
20 let port = serial::open(port_name)?;
21 let mut vesc = Vesc { port };
22 vesc.init(baud_rate)?;
23 Ok(vesc)
24 }
25
26 fn init(&mut self, baud_rate: serial::BaudRate) -> Result<(), serial::Error> {
27 self.port.reconfigure(&|settings| {
28 settings.set_baud_rate(baud_rate)?;
29 settings.set_char_size(serial::Bits8);
30 settings.set_parity(serial::ParityNone);
31 settings.set_stop_bits(serial::Stop1);
32 settings.set_flow_control(serial::FlowNone);
33 Ok(())
34 })?;
35
36 self.port.set_timeout(std::time::Duration::from_secs(1))?;
37 Ok(())
38 }
39
40 pub fn set_duty_cycle(&mut self, duty_cycle: f32) -> Result<(), Error> {
41 let mut duty_cycle = duty_cycle;
42 if duty_cycle > 1.0 {
43 duty_cycle = 1.0;
44 } else if duty_cycle < -1.0 {
45 duty_cycle = -1.0;
46 }
47
48 let command = packet::commands::SetDutyCycle::new((duty_cycle * 100000.0) as i32);
49 let packet = get_packet(command);
50 self.port.write_all(&packet)?;
51 Ok(())
52 }
53
54 pub fn get_values(&mut self) -> Result<PacketData, Error> {
55 let command = packet::commands::GetValues::default();
56 let packet = get_packet(command);
57 self.port.write_all(&packet).unwrap();
58 std::thread::sleep(std::time::Duration::from_secs(1));
59 self.receive_packet()
60 }
61
62 pub fn send_alive(&mut self) -> Result<(), Error> {
63 let command = packet::commands::Alive::default();
64 let packet = get_packet(command);
65 self.port.write_all(&packet)?;
66 Ok(())
67 }
68
69 fn receive_packet(&mut self) -> Result<PacketData, Error> {
70 let mut buffer = [0; 256];
71 let mut packet = Vec::new();
72
73 let bytes_read = self.port.read(&mut buffer)?;
74 packet.extend_from_slice(&buffer[..bytes_read]);
75
76 Ok(packet::process_packet(packet)?)
77 }
78}