64 lines
1.9 KiB
Rust
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();
|
|
},
|
|
}
|
|
}
|
|
}
|