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
extern crate serialport; extern crate e_drone; use serialport::{*}; use std::time::{Duration, Instant}; use e_drone::communication::{*}; use e_drone::communication::receiver::{*}; use e_drone::base::system::{*}; use e_drone::protocol::{*}; pub struct Drone { pub time_start: Instant, pub time_transfer: Instant, pub time_receive: Instant, pub receiver: Receiver, pub buffer: [u8; 1024], pub port: Result<Box<dyn SerialPort>>, } impl Drone { pub fn new(port_name: &str) -> Drone{ Drone{ time_start: Instant::now(), time_transfer: Instant::now(), time_receive: Instant::now(), receiver: Receiver::new(), buffer: [0u8; 1024], port: serialport::new(port_name, 57_600) .timeout(Duration::from_millis(100)) .open() } } pub fn is_connected(&mut self) -> bool { match &mut self.port { Ok(_port) => { true }, _ => { false }, } } pub fn check(&mut self) -> Data { match &mut self.port { Ok(port) => { let length_read = &port.read(&mut self.buffer); match length_read { Ok(len) => { if *len > 0 { self.receiver.push_slice(&self.buffer[..*len]); } if let messaging::State::Loaded = self.receiver.check() { self.receiver.clear(); self.time_receive = Instant::now(); return handler::check(self.receiver.get_header(), self.receiver.get_data()) } }, _ => {}, } }, _ => {}, } Data::None } pub fn get_time_passed_from_start(&self) -> u128 { self.time_start.elapsed().as_millis() } pub fn get_time_passed_from_last_transfer(&self) -> u128 { self.time_transfer.elapsed().as_millis() } pub fn get_time_passed_from_last_receive(&self) -> u128 { self.time_receive.elapsed().as_millis() } pub fn request(&mut self, device_type: DeviceType, data_type: DataType) { match &mut self.port { Ok(port) => { match port.write(&transfer::request(device_type, data_type)) { Ok(_len) => { self.time_transfer = Instant::now(); }, _ => {}, } }, _ => {}, } } }