Skip to content

Commit b05af4a

Browse files
committed
implement automatic reconnect
1 parent 7f09ff7 commit b05af4a

File tree

1 file changed

+13
-2
lines changed

1 file changed

+13
-2
lines changed

src/serial.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ pub fn serial_thread(
102102
print_lock: Arc<RwLock<Vec<Print>>>,
103103
connected_lock: Arc<RwLock<bool>>,
104104
) {
105+
let mut last_connected_device = Device::default();
106+
105107
loop {
106108
let _not_awake = keepawake::Builder::default()
107109
.display(false)
@@ -114,7 +116,7 @@ pub fn serial_thread(
114116
*connected = false;
115117
}
116118

117-
let device = get_device(&devices_lock, &device_lock);
119+
let device = get_device(&devices_lock, &device_lock, &last_connected_device);
118120

119121
let mut port = match serialport::new(&device.name, device.baud_rate)
120122
.timeout(Duration::from_millis(100))
@@ -160,7 +162,9 @@ pub fn serial_thread(
160162
*write_guard = devices.clone();
161163
}
162164

163-
if let Some(message) = disconnected(&device, &devices, &device_lock) {
165+
if let Some(message) =
166+
disconnected(&device, &devices, &device_lock, &mut last_connected_device)
167+
{
164168
print_to_console(&print_lock, message);
165169
break 'connected_loop;
166170
}
@@ -185,13 +189,18 @@ fn available_devices() -> Vec<String> {
185189
fn get_device(
186190
devices_lock: &Arc<RwLock<Vec<String>>>,
187191
device_lock: &Arc<RwLock<Device>>,
192+
last_connected_device: &Device,
188193
) -> Device {
189194
loop {
190195
let devices = available_devices();
191196
if let Ok(mut write_guard) = devices_lock.write() {
192197
*write_guard = devices.clone();
193198
}
194199

200+
if devices.contains(&last_connected_device.name) {
201+
return last_connected_device.clone();
202+
}
203+
195204
if let Ok(device) = device_lock.read() {
196205
if devices.contains(&device.name) {
197206
return device.clone();
@@ -205,6 +214,7 @@ fn disconnected(
205214
device: &Device,
206215
devices: &[String],
207216
device_lock: &Arc<RwLock<Device>>,
217+
last_connected_device: &mut Device,
208218
) -> Option<Print> {
209219
// disconnection by button press
210220
if let Ok(read_guard) = device_lock.read() {
@@ -221,6 +231,7 @@ fn disconnected(
221231
if let Ok(mut write_guard) = device_lock.write() {
222232
write_guard.name.clear();
223233
}
234+
*last_connected_device = device.clone();
224235
return Some(Print::Error(format!(
225236
"Device has disconnected from serial port: {}",
226237
device.name

0 commit comments

Comments
 (0)