diff --git a/src/enginuity/logger/EcuLogger.java b/src/enginuity/logger/EcuLogger.java index 228e1af2..428e210f 100644 --- a/src/enginuity/logger/EcuLogger.java +++ b/src/enginuity/logger/EcuLogger.java @@ -5,11 +5,13 @@ import enginuity.logger.definition.EcuDataLoader; import enginuity.logger.definition.EcuDataLoaderImpl; import enginuity.logger.definition.EcuParameter; import enginuity.logger.definition.EcuSwitch; +import enginuity.logger.io.serial.SerialPortRefresher; import enginuity.logger.ui.LoggerDataTableModel; import enginuity.logger.ui.MessageListener; import enginuity.logger.ui.ParameterListTableModel; import enginuity.logger.ui.ParameterRegistrationBroker; import enginuity.logger.ui.ParameterRegistrationBrokerImpl; +import enginuity.logger.ui.SerialPortComboBox; import enginuity.logger.ui.handler.DashboardUpdateHandler; import enginuity.logger.ui.handler.DataUpdateHandlerManager; import enginuity.logger.ui.handler.DataUpdateHandlerManagerImpl; @@ -44,7 +46,6 @@ TODO: finish dashboard tab TODO: add configuration screen (log file destination, etc) TODO: add user definable addresses TODO: Clean up this class! -TODO: Periodically refresh com port list */ public final class EcuLogger extends JFrame implements WindowListener, PropertyChangeListener, MessageListener { @@ -54,7 +55,7 @@ public final class EcuLogger extends JFrame implements WindowListener, PropertyC private final LoggerController controller = new LoggerControllerImpl(settings, this); private final JLabel statusBarLabel = new JLabel("Enginuity ECU Logger"); private final JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.BOTTOM); - private final JComboBox portsComboBox = new JComboBox(); + private final SerialPortComboBox portsComboBox = new SerialPortComboBox(settings); private final LoggerDataTableModel dataTableModel = new LoggerDataTableModel(); private final JPanel graphPanel = new JPanel(); private final DataUpdateHandlerManager dataHandlerManager = new DataUpdateHandlerManagerImpl(); @@ -73,6 +74,9 @@ public final class EcuLogger extends JFrame implements WindowListener, PropertyC public EcuLogger(String title) { super(title); + // start port list refresher thread + startPortRefresherThread(); + // setup the user interface initUserInterface(); @@ -84,6 +88,12 @@ public final class EcuLogger extends JFrame implements WindowListener, PropertyC } + private void startPortRefresherThread() { + Thread portRefresherThread = new Thread(new SerialPortRefresher(portsComboBox, controller)); + portRefresherThread.setDaemon(true); + portRefresherThread.start(); + } + private void initUserInterface() { // setup main panel JPanel mainPanel = new JPanel(); @@ -170,7 +180,6 @@ public final class EcuLogger extends JFrame implements WindowListener, PropertyC } private JComboBox buildPortsComboBox() { - refreshPortsComboBox(); portsComboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { settings.setLoggerPort((String) portsComboBox.getSelectedItem()); @@ -182,14 +191,6 @@ public final class EcuLogger extends JFrame implements WindowListener, PropertyC return portsComboBox; } - private void refreshPortsComboBox() { - List ports = controller.listSerialPorts(); - for (String port : ports) { - portsComboBox.addItem(port); - } - settings.setLoggerPort((String) portsComboBox.getSelectedItem()); - } - private JButton buildStartButton() { JButton startButton = new JButton("Start"); startButton.addActionListener(new ActionListener() { diff --git a/src/enginuity/logger/LoggerController.java b/src/enginuity/logger/LoggerController.java index 33270b00..ec559a44 100644 --- a/src/enginuity/logger/LoggerController.java +++ b/src/enginuity/logger/LoggerController.java @@ -3,11 +3,11 @@ package enginuity.logger; import enginuity.logger.definition.EcuData; import enginuity.logger.query.LoggerCallback; -import java.util.List; +import java.util.Set; public interface LoggerController { - List listSerialPorts(); + Set listSerialPorts(); void addLogger(EcuData ecuData, LoggerCallback callback); diff --git a/src/enginuity/logger/LoggerControllerImpl.java b/src/enginuity/logger/LoggerControllerImpl.java index de7b12ad..297fdc59 100644 --- a/src/enginuity/logger/LoggerControllerImpl.java +++ b/src/enginuity/logger/LoggerControllerImpl.java @@ -13,8 +13,9 @@ import enginuity.logger.ui.MessageListener; import static enginuity.util.ParamChecker.checkNotNull; import gnu.io.CommPortIdentifier; -import java.util.ArrayList; import java.util.List; +import java.util.Set; +import java.util.TreeSet; public final class LoggerControllerImpl implements LoggerController { private final QueryManager queryManager; @@ -24,12 +25,15 @@ public final class LoggerControllerImpl implements LoggerController { queryManager = new QueryManagerImpl(txManager, messageListener); } - public List listSerialPorts() { + public Set listSerialPorts() { SerialPortDiscoverer serialPortDiscoverer = new SerialPortDiscovererImpl(); List portIdentifiers = serialPortDiscoverer.listPorts(); - List portNames = new ArrayList(portIdentifiers.size()); + Set portNames = new TreeSet(); for (CommPortIdentifier portIdentifier : portIdentifiers) { - portNames.add(portIdentifier.getName()); + String portName = portIdentifier.getName(); + if (!portNames.contains(portName)) { + portNames.add(portName); + } } return portNames; } diff --git a/src/enginuity/logger/io/serial/SerialPortRefreshListener.java b/src/enginuity/logger/io/serial/SerialPortRefreshListener.java new file mode 100644 index 00000000..afb443c9 --- /dev/null +++ b/src/enginuity/logger/io/serial/SerialPortRefreshListener.java @@ -0,0 +1,9 @@ +package enginuity.logger.io.serial; + +import java.util.Set; + +public interface SerialPortRefreshListener { + + void refreshPortList(Set ports); + +} diff --git a/src/enginuity/logger/io/serial/SerialPortRefresher.java b/src/enginuity/logger/io/serial/SerialPortRefresher.java new file mode 100644 index 00000000..f3c376e1 --- /dev/null +++ b/src/enginuity/logger/io/serial/SerialPortRefresher.java @@ -0,0 +1,27 @@ +package enginuity.logger.io.serial; + +import enginuity.logger.LoggerController; +import static enginuity.util.ParamChecker.checkNotNull; + +public final class SerialPortRefresher implements Runnable { + private SerialPortRefreshListener listener; + private LoggerController controller; + + public SerialPortRefresher(SerialPortRefreshListener listener, LoggerController controller) { + checkNotNull(listener, controller); + this.listener = listener; + this.controller = controller; + } + + public void run() { + while (true) { + listener.refreshPortList(controller.listSerialPorts()); + try { + Thread.sleep(15000); + } catch (InterruptedException e) { + e.printStackTrace(); + break; + } + } + } +} diff --git a/src/enginuity/logger/ui/ParameterRegistrationBroker.java b/src/enginuity/logger/ui/ParameterRegistrationBroker.java index 71392924..bde2c526 100644 --- a/src/enginuity/logger/ui/ParameterRegistrationBroker.java +++ b/src/enginuity/logger/ui/ParameterRegistrationBroker.java @@ -2,16 +2,12 @@ package enginuity.logger.ui; import enginuity.logger.definition.EcuData; -import java.util.List; - public interface ParameterRegistrationBroker { void registerEcuParameterForLogging(EcuData ecuData); void deregisterEcuParameterFromLogging(EcuData ecuData); - List listSerialPorts(); - void start(); void stop(); diff --git a/src/enginuity/logger/ui/ParameterRegistrationBrokerImpl.java b/src/enginuity/logger/ui/ParameterRegistrationBrokerImpl.java index 9d73078b..80e592e0 100644 --- a/src/enginuity/logger/ui/ParameterRegistrationBrokerImpl.java +++ b/src/enginuity/logger/ui/ParameterRegistrationBrokerImpl.java @@ -54,11 +54,6 @@ public final class ParameterRegistrationBrokerImpl implements ParameterRegistrat } - public List listSerialPorts() { - return controller.listSerialPorts(); - } - - public synchronized void start() { loggerStartTime = System.currentTimeMillis(); controller.start(); diff --git a/src/enginuity/logger/ui/SerialPortComboBox.java b/src/enginuity/logger/ui/SerialPortComboBox.java new file mode 100644 index 00000000..d98ce3c3 --- /dev/null +++ b/src/enginuity/logger/ui/SerialPortComboBox.java @@ -0,0 +1,62 @@ +package enginuity.logger.ui; + +import enginuity.Settings; +import enginuity.logger.io.serial.SerialPortRefreshListener; +import static enginuity.util.ParamChecker.checkNotNull; + +import javax.swing.*; +import java.util.Set; +import java.util.TreeSet; + +public final class SerialPortComboBox extends JComboBox implements SerialPortRefreshListener { + private final Settings settings; + + public SerialPortComboBox(Settings settings) { + checkNotNull(settings); + this.settings = settings; + } + + public void refreshPortList(Set ports) { + checkNotNull(ports); + boolean changeDetected = ports.isEmpty() || ports.size() != getItemCount(); + if (!changeDetected) { + for (int i = 0; i < getItemCount(); i++) { + String port = (String) getItemAt(i); + if (!ports.contains(port)) { + changeDetected = true; + break; + } + } + if (!changeDetected) { + Set comboPorts = new TreeSet(); + for (int i = 0; i < getItemCount(); i++) { + comboPorts.add((String) getItemAt(i)); + } + for (String port : ports) { + if (!comboPorts.contains(port)) { + changeDetected = true; + break; + } + } + } + } + if (changeDetected) { + String selectedPort = (String) getSelectedItem(); + removeAllItems(); + if (!ports.isEmpty()) { + for (String port : ports) { + addItem(port); + } + if (selectedPort != null) { + if (ports.contains(selectedPort)) { + setSelectedItem(selectedPort); + } + settings.setLoggerPort(selectedPort); + } else { + setSelectedIndex(0); + settings.setLoggerPort((String) getItemAt(0)); + } + } + } + } +}