vesc_api/
lib.rs

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}