diff --git a/native/org.eclipse.cdt.native.serial/src/org/eclipse/cdt/serial/SerialPort.java b/native/org.eclipse.cdt.native.serial/src/org/eclipse/cdt/serial/SerialPort.java index 24c9002cfb7..e6b6c89aac6 100644 --- a/native/org.eclipse.cdt.native.serial/src/org/eclipse/cdt/serial/SerialPort.java +++ b/native/org.eclipse.cdt.native.serial/src/org/eclipse/cdt/serial/SerialPort.java @@ -365,7 +365,8 @@ public class SerialPort { public void resume() throws IOException { synchronized (pauseMutex) { isPaused = false; - open(); + handle = open0(portName, baudRate.getRate(), byteSize.getSize(), parity.ordinal(), stopBits.ordinal()); + isOpen = true; pauseMutex.notifyAll(); } } diff --git a/releng/org.eclipse.cdt.target/cdt.target b/releng/org.eclipse.cdt.target/cdt.target index 1c9b94fb27b..f5d0362b8cd 100644 --- a/releng/org.eclipse.cdt.target/cdt.target +++ b/releng/org.eclipse.cdt.target/cdt.target @@ -65,6 +65,11 @@ + + + + + diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/META-INF/MANIFEST.MF b/toolchains/arduino/org.eclipse.cdt.arduino.core/META-INF/MANIFEST.MF index 2f617f1dded..24300bcbdb5 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/META-INF/MANIFEST.MF +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.cdt.arduino.core;singleton:=true -Bundle-Version: 2.0.0.qualifier +Bundle-Version: 2.1.0.qualifier Bundle-Activator: org.eclipse.cdt.arduino.core.internal.Activator Bundle-Vendor: %providerName Require-Bundle: org.eclipse.core.runtime, diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/launch/ArduinoLaunch.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/launch/ArduinoLaunch.java index 51d64d38b0b..7efb7c06bf5 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/launch/ArduinoLaunch.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/launch/ArduinoLaunch.java @@ -7,7 +7,11 @@ *******************************************************************************/ package org.eclipse.cdt.arduino.core.internal.launch; +import java.io.IOException; + +import org.eclipse.cdt.arduino.core.internal.Activator; import org.eclipse.cdt.arduino.core.internal.remote.ArduinoRemoteConnection; +import org.eclipse.cdt.serial.SerialPort; import org.eclipse.debug.core.DebugEvent; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunchConfiguration; @@ -33,7 +37,14 @@ public class ArduinoLaunch extends TargetedLaunch { public void start() { this.wasOpen = remote.getRemoteConnection().isOpen(); if (wasOpen) { - remote.pause(); + SerialPort port = SerialPort.get(remote.getPortName()); + if (port != null) { + try { + port.pause(); + } catch (IOException e) { + Activator.log(e); + } + } } } @@ -41,7 +52,14 @@ public class ArduinoLaunch extends TargetedLaunch { public void handleDebugEvents(DebugEvent[] events) { super.handleDebugEvents(events); if (isTerminated() && wasOpen) { - remote.resume(); + SerialPort port = SerialPort.get(remote.getPortName()); + if (port != null) { + try { + port.resume(); + } catch (IOException e) { + Activator.log(e); + } + } wasOpen = false; } } diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.ui/META-INF/MANIFEST.MF b/toolchains/arduino/org.eclipse.cdt.arduino.ui/META-INF/MANIFEST.MF index 329d73319a3..36c0e079c58 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.ui/META-INF/MANIFEST.MF +++ b/toolchains/arduino/org.eclipse.cdt.arduino.ui/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.cdt.arduino.ui;singleton:=true -Bundle-Version: 2.0.0.qualifier +Bundle-Version: 2.1.0.qualifier Bundle-Activator: org.eclipse.cdt.arduino.ui.internal.Activator Require-Bundle: org.eclipse.core.runtime, org.eclipse.core.expressions, @@ -17,7 +17,11 @@ Require-Bundle: org.eclipse.core.runtime, org.eclipse.remote.ui;bundle-version="2.0.0", org.eclipse.cdt.native.serial;bundle-version="1.0.0", org.eclipse.tools.templates.ui;bundle-version="1.0.0", - org.eclipse.launchbar.remote.ui;bundle-version="1.0.0" + org.eclipse.launchbar.remote.ui;bundle-version="1.0.0", + org.eclipse.tm.terminal.connector.cdtserial;bundle-version="4.3.0", + org.eclipse.tm.terminal.view.ui;bundle-version="4.2.100", + org.eclipse.tm.terminal.view.core;bundle-version="4.2.0", + org.eclipse.tm.terminal.control;bundle-version="4.2.0" Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Bundle-Vendor: %providerName diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.ui/plugin.properties b/toolchains/arduino/org.eclipse.cdt.arduino.ui/plugin.properties index 6bc840fb93f..d4bb6971b90 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.ui/plugin.properties +++ b/toolchains/arduino/org.eclipse.cdt.arduino.ui/plugin.properties @@ -12,4 +12,6 @@ pluginName=Arduino C++ UI providerName=Eclipse CDT preferencePage.name=Arduino -arduinoDownloadsManager=Arduino Downloads Manager \ No newline at end of file +arduinoDownloadsManager=Arduino Downloads Manager +arduinoTerminalConnector=Arduino Serial Monitor +arduinoTerminalLauncher=Arduino Serial Monitor diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.ui/plugin.xml b/toolchains/arduino/org.eclipse.cdt.arduino.ui/plugin.xml index b42d003a32f..3386862fc9a 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.ui/plugin.xml +++ b/toolchains/arduino/org.eclipse.cdt.arduino.ui/plugin.xml @@ -174,4 +174,11 @@ name="%arduinoDownloadsManager"> + + + + diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/Messages.java b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/Messages.java index cbf5f0e2d42..f73a8ed7e09 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/Messages.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/Messages.java @@ -30,6 +30,13 @@ public class Messages extends NLS { public static String ArduinoPreferencePage_desc; public static String PlatformDetailsDialog_0; public static String PlatformDetailsDialog_1; + public static String ArduinoTerminalSettingsPage_BoardName; + public static String ArduinoTerminalSettingsPage_SerialPort; + public static String ArduinoTerminalSettingsPage_BaudRate; + public static String ArduinoTerminalSettingsPage_DataSize; + public static String ArduinoTerminalSettingsPage_Parity; + public static String ArduinoTerminalSettingsPage_StopBits; + public static String ArduinoTerminalSettingsPage_UnknownPort; static { // initialize resource bundle diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/messages.properties b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/messages.properties index eb1d9049e7a..f4428e74523 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/messages.properties +++ b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/messages.properties @@ -26,3 +26,10 @@ libraries. For more information, see http://arduino.cc ArduinoPreferencePage_desc=Enter URLs for package_index.json files one per line. PlatformDetailsDialog_0=Platform: PlatformDetailsDialog_1=Supports boards:\n +ArduinoTerminalSettingsPage_BoardName=Board Name: +ArduinoTerminalSettingsPage_SerialPort=Serial Port: +ArduinoTerminalSettingsPage_BaudRate=Baud Rate: +ArduinoTerminalSettingsPage_DataSize=Data Size: +ArduinoTerminalSettingsPage_Parity=Parity: +ArduinoTerminalSettingsPage_StopBits=Stop Bits: +ArduinoTerminalSettingsPage_UnknownPort=Unknown port diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/terminal/ArduinoTerminalConfigPanel.java b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/terminal/ArduinoTerminalConfigPanel.java new file mode 100644 index 00000000000..cf2ef58b7cd --- /dev/null +++ b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/terminal/ArduinoTerminalConfigPanel.java @@ -0,0 +1,104 @@ +/******************************************************************************* + * Copyright (c) 2015 QNX Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ +package org.eclipse.cdt.arduino.ui.internal.terminal; + +import java.util.Map; + +import org.eclipse.cdt.serial.BaudRate; +import org.eclipse.cdt.serial.ByteSize; +import org.eclipse.cdt.serial.Parity; +import org.eclipse.cdt.serial.StopBits; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.tm.terminal.connector.cdtserial.connector.SerialSettings; +import org.eclipse.tm.terminal.view.core.interfaces.constants.ITerminalsConnectorConstants; +import org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanelContainer; +import org.eclipse.tm.terminal.view.ui.panels.AbstractExtendedConfigurationPanel; + +public class ArduinoTerminalConfigPanel extends AbstractExtendedConfigurationPanel { + + private ArduinoTerminalSettings settings; + private ArduinoTerminalSettingsPage page; + + public ArduinoTerminalConfigPanel(IConfigurationPanelContainer container) { + super(container); + } + + @Override + public void setupPanel(Composite parent) { + Composite panel = new Composite(parent, SWT.NONE); + panel.setLayout(new GridLayout()); + GridData data = new GridData(SWT.FILL, SWT.FILL, true, true); + panel.setLayoutData(data); + + settings = new ArduinoTerminalSettings(); + page = new ArduinoTerminalSettingsPage(settings, this); + page.createControl(panel); + + createEncodingUI(panel, true); + + setControl(panel); + } + + @Override + public void extractData(Map data) { + if (data == null) { + return; + } + + page.saveSettings(); + data.put(ArduinoTerminalSettings.BOARD_ATTR, settings.getBoardName()); + data.put(SerialSettings.PORT_NAME_ATTR, settings.getPortName()); + data.put(SerialSettings.BAUD_RATE_ATTR, settings.getBaudRate()); + data.put(SerialSettings.BYTE_SIZE_ATTR, settings.getByteSize()); + data.put(SerialSettings.PARITY_ATTR, settings.getParity()); + data.put(SerialSettings.STOP_BITS_ATTR, settings.getStopBits()); + + if (getEncoding() != null) { + data.put(ITerminalsConnectorConstants.PROP_ENCODING, getEncoding()); + } + } + + @Override + public void setupData(Map data) { + if (data == null) { + return; + } + + settings.setBoardName((String) data.get(ArduinoTerminalSettings.BOARD_ATTR)); + settings.setPortName((String) data.get(SerialSettings.PORT_NAME_ATTR)); + settings.setBaudRate((BaudRate) data.get(SerialSettings.BAUD_RATE_ATTR)); + settings.setByteSize((ByteSize) data.get(SerialSettings.BYTE_SIZE_ATTR)); + settings.setParity((Parity) data.get(SerialSettings.PARITY_ATTR)); + settings.setStopBits((StopBits) data.get(SerialSettings.STOP_BITS_ATTR)); + + String encoding = (String) data.get(ITerminalsConnectorConstants.PROP_ENCODING); + if (encoding != null) { + setEncoding(encoding); + } + } + + @Override + protected void saveSettingsForHost(boolean add) { + } + + @Override + protected void fillSettingsForHost(String host) { + } + + @Override + protected String getHostFromSettings() { + if (page != null) { + page.saveSettings(); + return settings.getPortName(); + } + return null; + } +} diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/terminal/ArduinoTerminalLauncher.java b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/terminal/ArduinoTerminalLauncher.java new file mode 100644 index 00000000000..dab8efac810 --- /dev/null +++ b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/terminal/ArduinoTerminalLauncher.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * Copyright (c) 2015 QNX Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ +package org.eclipse.cdt.arduino.ui.internal.terminal; + +import org.eclipse.tm.terminal.connector.cdtserial.launcher.SerialLauncherDelegate; +import org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanel; +import org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanelContainer; +import org.eclipse.tm.terminal.view.ui.interfaces.ILauncherDelegate; + +public class ArduinoTerminalLauncher extends SerialLauncherDelegate implements ILauncherDelegate { + + @Override + public IConfigurationPanel getPanel(IConfigurationPanelContainer container) { + return new ArduinoTerminalConfigPanel(container); + } + +} diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/terminal/ArduinoTerminalSettings.java b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/terminal/ArduinoTerminalSettings.java new file mode 100644 index 00000000000..556016f2d58 --- /dev/null +++ b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/terminal/ArduinoTerminalSettings.java @@ -0,0 +1,34 @@ +package org.eclipse.cdt.arduino.ui.internal.terminal; + +import org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore; +import org.eclipse.tm.terminal.connector.cdtserial.connector.SerialSettings; + +public class ArduinoTerminalSettings extends SerialSettings { + + public static final String BOARD_ATTR = "arduino.board"; //$NON-NLS-1$ + + private String boardName; + + @Override + public void load(ISettingsStore store) { + super.load(store); + + boardName = store.get(BOARD_ATTR); + } + + @Override + public void save(ISettingsStore store) { + super.save(store); + + store.put(BOARD_ATTR, boardName); + } + + public String getBoardName() { + return boardName; + } + + public void setBoardName(String boardName) { + this.boardName = boardName; + } + +} diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/terminal/ArduinoTerminalSettingsPage.java b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/terminal/ArduinoTerminalSettingsPage.java new file mode 100644 index 00000000000..7251c25cc34 --- /dev/null +++ b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/terminal/ArduinoTerminalSettingsPage.java @@ -0,0 +1,288 @@ +package org.eclipse.cdt.arduino.ui.internal.terminal; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.eclipse.cdt.arduino.core.internal.remote.ArduinoRemoteConnection; +import org.eclipse.cdt.arduino.ui.internal.Activator; +import org.eclipse.cdt.arduino.ui.internal.Messages; +import org.eclipse.cdt.serial.BaudRate; +import org.eclipse.cdt.serial.ByteSize; +import org.eclipse.cdt.serial.Parity; +import org.eclipse.cdt.serial.StopBits; +import org.eclipse.jface.dialogs.DialogSettings; +import org.eclipse.jface.dialogs.IDialogSettings; +import org.eclipse.remote.core.IRemoteConnection; +import org.eclipse.remote.core.IRemoteConnectionType; +import org.eclipse.remote.core.IRemoteServicesManager; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.tm.internal.terminal.provisional.api.AbstractSettingsPage; +import org.eclipse.tm.terminal.connector.cdtserial.connector.SerialSettings; +import org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanel; +import org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanelContainer; + +public class ArduinoTerminalSettingsPage extends AbstractSettingsPage { + + private final ArduinoTerminalSettings settings; + private final IConfigurationPanel panel; + private final IDialogSettings dialogSettings; + + private Combo boardCombo; + private Label portNameLabel; + private Combo baudRateCombo; + private Combo byteSizeCombo; + private Combo parityCombo; + private Combo stopBitsCombo; + + private String boardName; + private String portName; + private BaudRate baudRate; + private ByteSize byteSize; + private Parity parity; + private StopBits stopBits; + + private IRemoteConnectionType arduinoType; + + public ArduinoTerminalSettingsPage(ArduinoTerminalSettings settings, IConfigurationPanel panel) { + this.settings = settings; + this.panel = panel; + setHasControlDecoration(true); + + dialogSettings = DialogSettings.getOrCreateSection(Activator.getDefault().getDialogSettings(), + this.getClass().getSimpleName()); + + boardName = dialogSettings.get(ArduinoTerminalSettings.BOARD_ATTR); + portName = dialogSettings.get(SerialSettings.PORT_NAME_ATTR); + + String baudRateStr = dialogSettings.get(SerialSettings.BAUD_RATE_ATTR); + if (baudRateStr == null || baudRateStr.isEmpty()) { + baudRate = BaudRate.getDefault(); + } else { + String[] rates = BaudRate.getStrings(); + for (int i = 0; i < rates.length; ++i) { + if (baudRateStr.equals(rates[i])) { + baudRate = BaudRate.fromStringIndex(i); + break; + } + } + } + + String byteSizeStr = dialogSettings.get(SerialSettings.BYTE_SIZE_ATTR); + if (byteSizeStr == null || byteSizeStr.isEmpty()) { + byteSize = ByteSize.getDefault(); + } else { + String[] sizes = ByteSize.getStrings(); + for (int i = 0; i < sizes.length; ++i) { + if (byteSizeStr.equals(sizes[i])) { + byteSize = ByteSize.fromStringIndex(i); + break; + } + } + } + + String parityStr = dialogSettings.get(SerialSettings.PARITY_ATTR); + if (parityStr == null || parityStr.isEmpty()) { + parity = Parity.getDefault(); + } else { + String[] parities = Parity.getStrings(); + for (int i = 0; i < parities.length; ++i) { + if (parityStr.equals(parities[i])) { + parity = Parity.fromStringIndex(i); + break; + } + } + } + + String stopBitsStr = dialogSettings.get(SerialSettings.STOP_BITS_ATTR); + if (stopBitsStr == null || stopBitsStr.isEmpty()) { + stopBits = StopBits.getDefault(); + } else { + String[] bits = StopBits.getStrings(); + for (int i = 0; i < bits.length; ++i) { + if (stopBitsStr.equals(bits[i])) { + stopBits = StopBits.fromStringIndex(i); + break; + } + } + } + + } + + @Override + public void createControl(Composite parent) { + Composite comp = new Composite(parent, SWT.NONE); + GridLayout gridLayout = new GridLayout(2, false); + gridLayout.marginWidth = gridLayout.marginHeight = 0; + GridData gridData = new GridData(GridData.FILL_HORIZONTAL); + comp.setLayout(gridLayout); + comp.setLayoutData(gridData); + + Label boardLabel = new Label(comp, SWT.NONE); + boardLabel.setText(Messages.ArduinoTerminalSettingsPage_BoardName); + + boardCombo = new Combo(comp, SWT.READ_ONLY); + boardCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + IRemoteServicesManager manager = Activator.getService(IRemoteServicesManager.class); + arduinoType = manager.getConnectionType(ArduinoRemoteConnection.TYPE_ID); + List connections = new ArrayList<>(arduinoType.getConnections()); + Collections.sort(connections, (o1, o2) -> { + return o1.getName().compareToIgnoreCase(o2.getName()); + }); + for (IRemoteConnection connection : connections) { + boardCombo.add(connection.getName()); + } + boardCombo.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + validate(); + updatePortLabel(); + } + }); + + Label portLabel = new Label(comp, SWT.NONE); + portLabel.setText(Messages.ArduinoTerminalSettingsPage_SerialPort); + + portNameLabel = new Label(comp, SWT.NONE); + portNameLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + Label baudRateLabel = new Label(comp, SWT.NONE); + baudRateLabel.setText(Messages.ArduinoTerminalSettingsPage_BaudRate); + + baudRateCombo = new Combo(comp, SWT.READ_ONLY); + baudRateCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + for (String baudRateStr : BaudRate.getStrings()) { + baudRateCombo.add(baudRateStr); + } + + Label byteSizeLabel = new Label(comp, SWT.NONE); + byteSizeLabel.setText(Messages.ArduinoTerminalSettingsPage_DataSize); + + byteSizeCombo = new Combo(comp, SWT.READ_ONLY); + byteSizeCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + for (String byteSizeStr : ByteSize.getStrings()) { + byteSizeCombo.add(byteSizeStr); + } + + Label parityLabel = new Label(comp, SWT.NONE); + parityLabel.setText(Messages.ArduinoTerminalSettingsPage_Parity); + + parityCombo = new Combo(comp, SWT.READ_ONLY); + parityCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + for (String parityStr : Parity.getStrings()) { + parityCombo.add(parityStr); + } + + Label stopBitsLabel = new Label(comp, SWT.NONE); + stopBitsLabel.setText(Messages.ArduinoTerminalSettingsPage_StopBits); + + stopBitsCombo = new Combo(comp, SWT.READ_ONLY); + stopBitsCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + for (String stopBitsStr : StopBits.getStrings()) { + stopBitsCombo.add(stopBitsStr); + } + + loadSettings(); + } + + void validate() { + IConfigurationPanelContainer container = panel.getContainer(); + container.validate(); + } + + void updatePortLabel() { + String boardName = boardCombo.getItem(boardCombo.getSelectionIndex()); + IRemoteConnection connection = arduinoType.getConnection(boardName); + if (connection != null) { + ArduinoRemoteConnection board = connection.getService(ArduinoRemoteConnection.class); + portName = board.getPortName(); + portNameLabel.setText(portName); + } else { + portName = null; + portNameLabel.setText(Messages.ArduinoTerminalSettingsPage_UnknownPort); + } + } + + @Override + public void loadSettings() { + String boardName = settings.getBoardName(); + if (boardName == null || boardName.isEmpty()) { + boardName = this.boardName; + } + if (boardName != null && !boardName.isEmpty()) { + int i = 0; + for (String name : boardCombo.getItems()) { + if (boardName.equals(name)) { + boardCombo.select(i); + break; + } + i++; + } + } else if (boardCombo.getItemCount() > 0) { + boardCombo.select(0); + } + + updatePortLabel(); + + BaudRate baudRate = settings.getBaudRate(); + if (baudRate == null) { + baudRate = this.baudRate; + } + baudRateCombo.select(BaudRate.getStringIndex(baudRate)); + + ByteSize byteSize = settings.getByteSize(); + if (byteSize == null) { + byteSize = this.byteSize; + } + byteSizeCombo.select(ByteSize.getStringIndex(byteSize)); + + Parity parity = settings.getParity(); + if (parity == null) { + parity = this.parity; + } + parityCombo.select(Parity.getStringIndex(parity)); + + StopBits stopBits = settings.getStopBits(); + if (stopBits == null) { + stopBits = this.stopBits; + } + stopBitsCombo.select(StopBits.getStringIndex(stopBits)); + } + + @Override + public void saveSettings() { + settings.setBoardName(boardCombo.getItem(boardCombo.getSelectionIndex())); + settings.setPortName(portNameLabel.getText()); + settings.setBaudRate(BaudRate.fromStringIndex(baudRateCombo.getSelectionIndex())); + settings.setByteSize(ByteSize.fromStringIndex(byteSizeCombo.getSelectionIndex())); + settings.setParity(Parity.fromStringIndex(parityCombo.getSelectionIndex())); + settings.setStopBits(StopBits.fromStringIndex(stopBitsCombo.getSelectionIndex())); + + dialogSettings.put(ArduinoTerminalSettings.BOARD_ATTR, boardCombo.getItem(boardCombo.getSelectionIndex())); + dialogSettings.put(SerialSettings.PORT_NAME_ATTR, portNameLabel.getText()); + dialogSettings.put(SerialSettings.BAUD_RATE_ATTR, + BaudRate.getStrings()[baudRateCombo.getSelectionIndex()]); + dialogSettings.put(SerialSettings.BYTE_SIZE_ATTR, + ByteSize.getStrings()[byteSizeCombo.getSelectionIndex()]); + dialogSettings.put(SerialSettings.PARITY_ATTR, Parity.getStrings()[parityCombo.getSelectionIndex()]); + dialogSettings.put(SerialSettings.STOP_BITS_ATTR, + StopBits.getStrings()[stopBitsCombo.getSelectionIndex()]); + } + + @Override + public boolean validateSettings() { + if (boardCombo.getSelectionIndex() < 0 && boardCombo.getText().isEmpty()) { + return false; + } + return true; + } + +}