From 693498fb762b77e5a043bfd30004a034e9b58a81 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Mon, 1 Oct 2018 14:07:30 +0200 Subject: [PATCH] Handle suspend/resume if serial port disappears Similar to minicom behaviour. Automatically reopens the port only if it takes the same name (could be improved based on vid/pid) --- app/src/processing/app/AbstractMonitor.java | 28 +++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/app/src/processing/app/AbstractMonitor.java b/app/src/processing/app/AbstractMonitor.java index 1efbec7e2..ad1ed87eb 100644 --- a/app/src/processing/app/AbstractMonitor.java +++ b/app/src/processing/app/AbstractMonitor.java @@ -1,6 +1,7 @@ package processing.app; import cc.arduino.packages.BoardPort; +import cc.arduino.packages.DiscoveryManager; import processing.app.legacy.PApplet; import javax.swing.*; @@ -9,6 +10,7 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; +import java.util.List; @SuppressWarnings("serial") public abstract class AbstractMonitor extends JFrame implements ActionListener { @@ -17,6 +19,7 @@ public abstract class AbstractMonitor extends JFrame implements ActionListener { private StringBuffer updateBuffer; private Timer updateTimer; + private Timer portExistsTimer; private BoardPort boardPort; @@ -73,6 +76,26 @@ public abstract class AbstractMonitor extends JFrame implements ActionListener { updateTimer = new Timer(33, this); // redraw serial monitor at 30 Hz updateTimer.start(); + ActionListener portExists = new ActionListener() { + @Override + public void actionPerformed(ActionEvent ae) { + try { + if (!Base.getDiscoveryManager().discovery().contains(boardPort)) { + if (!closed) { + suspend(); + } + } else { + if (closed) { + resume(boardPort); + } + } + } catch (Exception e) {} + } + }; + + portExistsTimer = new Timer(1000, portExists); // check if the port is still there every second + portExistsTimer.start(); + closed = false; } @@ -92,6 +115,11 @@ public abstract class AbstractMonitor extends JFrame implements ActionListener { close(); } + public void dispose() { + super.dispose(); + portExistsTimer.stop(); + } + public void resume(BoardPort boardPort) throws Exception { setBoardPort(boardPort);