cheapsdo2.0/hostsoftware/src/serial.rs

64 lines
1.9 KiB
Rust

use std::io;
use std::time::Duration;
use crossbeam_channel::{select, Receiver, Sender};
use eframe::egui;
use postcard::{from_bytes_cobs, to_stdvec_cobs};
use cheapsdo_protocol::*;
#[derive(PartialEq, Debug)]
pub enum Cmd {
Disconnect,
}
#[derive(PartialEq, Debug)]
pub enum Data {
DeviceState(StatusMessage),
}
pub fn poll_device(port: String, cmd_rx: Receiver<Cmd>, data_tx: Sender<Data>, ctx: egui::Context) {
let mut port = serialport::new(port, 115_200)
.timeout(Duration::from_millis(10))
.open()
.expect("Failed to open port");
let host_msg = HostMessage::RequestStatus;
let msg_bytes = to_stdvec_cobs(&host_msg).unwrap();
port.write_all(&msg_bytes).unwrap();
loop {
let mut serial_buf: Vec<u8> = vec![0; 128];
match port.read(serial_buf.as_mut_slice()) {
Ok(t) => {
serial_buf.truncate(t);
println!("Data: {:?}", serial_buf);
let dev_msg = from_bytes_cobs::<DeviceMessage>(&mut serial_buf).unwrap();
match dev_msg {
DeviceMessage::Status(status_msg) => {
data_tx.send(Data::DeviceState(status_msg)).unwrap();
ctx.request_repaint();
}
DeviceMessage::PLLSettings(_) => {}
}
}
Err(ref e) if e.kind() == io::ErrorKind::TimedOut => (),
Err(e) => eprintln!("{:?}", e),
}
select! {
recv(cmd_rx) -> cmd => match cmd {
Ok(Cmd::Disconnect) => return,
Err(_) => {},
},
default(Duration::from_secs(1)) => {
let host_msg = HostMessage::RequestStatus;
let msg_bytes = to_stdvec_cobs(&host_msg).unwrap();
port.write_all(&msg_bytes).unwrap();
},
}
}
}