use std::{io, thread};
use std::sync::mpsc::Sender;
use json::JsonValue;
use log::info;
use crate::{BLACKLIST, Device, DEVICES, SubDevice};
use serial2::SerialPort;
use crate::protocol::Protocol;
#[derive(Clone, Debug)]
pub struct Usb {
pub com: String,
pub step: i32,
pub tx: Sender<SubDevice>,
}
impl Usb {
pub fn get_device(&mut self) -> Device {
let data = DEVICES.lock().unwrap().get(&*self.com).unwrap().clone();
data
}
pub fn connect(&mut self) {
let mut device = self.get_device();
match SerialPort::open(device.com.clone(), device.rate.clone()) {
Ok(port) => {
device.state = 1;
device.save_data();
let mut that = self.clone();
thread::spawn(move || {
that.start(port);
});
}
Err(_) => {
if device.reconnect >= 10 {
info!("连接断开: {} {} {}",device.com.clone(), device.rate.clone(), device.uuid.clone());
BLACKLIST.lock().unwrap().insert(device.com.clone(), "".to_string());
DEVICES.lock().unwrap().remove(&*device.com.clone()).unwrap();
} else {
info!("重试连接: {} {} {}",device.com.clone(), device.rate.clone(), device.uuid.clone());
device.reconnect += 1;
match device.reconnect {
3..=6 => {
device.rate = 9600;
}
_ => {
device.rate = 115200;
}
}
device.save_data();
}
}
};
}
pub fn start(&mut self, port: SerialPort) {
let device = self.get_device();
info!("连接成功: {} {} {}",device.com.clone(), device.rate.clone(), device.uuid.clone());
loop {
let mut device = self.get_device();
let mut serial_buf: Vec<u8> = vec![0; 1000];
match port.read(serial_buf.as_mut_slice()) {
Ok(t) => {
let data = serial_buf[..t].to_vec();
let res = Protocol::new(data.clone());
if res.is_empty() {
DEVICES.lock().unwrap().remove(&*device.com.clone()).unwrap();
return;
}
if res["data_type"] == "values" {
for item in res["value"].members() {
self.send(item.clone());
}
} else {
self.send(res.clone());
}
continue;
}
Err(ref e) if e.kind() == io::ErrorKind::TimedOut => (),
Err(_) => {
device.state = 0;
device.save_data();
return;
}
}
}
}
pub fn send(&mut self, data: JsonValue) {
let mut device = self.get_device();
let id = data["id"].to_string();
let sub_device = device.sub_device.get(&*id.clone()).is_none();
if sub_device {
device.sub_device.insert(id.clone(), SubDevice {
mode: "USB".to_string(),
id: id.clone(),
name: "".to_string(),
state: 4,
device: true,
device_id: device.uuid.clone(),
data_mode: data["data_mode"].to_string(),
data_type: data["data_type"].to_string(),
value: data["value"].as_f64().unwrap_or(0.0),
});
device.save_data();
}
let mut res = device.sub_device.get(&*id.clone()).unwrap().clone();
res.value = data["value"].as_f64().unwrap_or(0.0);
self.tx.send(res).unwrap();
}
}