From 6422ba122309e6aea14ced77727970f4b9420336 Mon Sep 17 00:00:00 2001 From: MV Date: Fri, 2 Feb 2024 02:08:38 +0100 Subject: [PATCH 1/7] [jserialcomm-transport] First version of new serial transport based on jSerialComm Signed-off-by: MV --- bom/compile/pom.xml | 6 + bom/openhab-core/pom.xml | 6 + .../.classpath | 30 ++ .../.project | 23 ++ .../NOTICE | 14 + .../bnd.bnd | 4 + .../pom.xml | 31 ++ .../internal/JSerialCommPortProvider.java | 69 ++++ .../serial/internal/SerialPortEventImpl.java | 49 +++ .../internal/SerialPortIdentifierImpl.java | 76 ++++ .../jserialcomm/JSerialCommSerialPort.java | 365 ++++++++++++++++++ bundles/pom.xml | 1 + 12 files changed, 674 insertions(+) create mode 100644 bundles/org.openhab.core.io.transport.serial.jserialcomm/.classpath create mode 100644 bundles/org.openhab.core.io.transport.serial.jserialcomm/.project create mode 100644 bundles/org.openhab.core.io.transport.serial.jserialcomm/NOTICE create mode 100644 bundles/org.openhab.core.io.transport.serial.jserialcomm/bnd.bnd create mode 100644 bundles/org.openhab.core.io.transport.serial.jserialcomm/pom.xml create mode 100644 bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/internal/JSerialCommPortProvider.java create mode 100644 bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/internal/SerialPortEventImpl.java create mode 100644 bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/internal/SerialPortIdentifierImpl.java create mode 100644 bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPort.java diff --git a/bom/compile/pom.xml b/bom/compile/pom.xml index bea2b608278..b1bfe99d77d 100644 --- a/bom/compile/pom.xml +++ b/bom/compile/pom.xml @@ -295,6 +295,12 @@ + com.fazecast + jSerialComm + 2.10.4 + compile + + com.neuronrobotics nrjavaserial 3.14.0 diff --git a/bom/openhab-core/pom.xml b/bom/openhab-core/pom.xml index 905bfb7e0fd..da02d827f4a 100644 --- a/bom/openhab-core/pom.xml +++ b/bom/openhab-core/pom.xml @@ -264,6 +264,12 @@ org.openhab.core.bundles + org.openhab.core.io.transport.serial.jserialcomm + ${project.version} + compile + + + org.openhab.core.bundles org.openhab.core.io.transport.serial.rxtx ${project.version} compile diff --git a/bundles/org.openhab.core.io.transport.serial.jserialcomm/.classpath b/bundles/org.openhab.core.io.transport.serial.jserialcomm/.classpath new file mode 100644 index 00000000000..8631a3aebc7 --- /dev/null +++ b/bundles/org.openhab.core.io.transport.serial.jserialcomm/.classpath @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bundles/org.openhab.core.io.transport.serial.jserialcomm/.project b/bundles/org.openhab.core.io.transport.serial.jserialcomm/.project new file mode 100644 index 00000000000..2d76f85d947 --- /dev/null +++ b/bundles/org.openhab.core.io.transport.serial.jserialcomm/.project @@ -0,0 +1,23 @@ + + + org.openhab.core.io.transport.serial.rxtx + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/bundles/org.openhab.core.io.transport.serial.jserialcomm/NOTICE b/bundles/org.openhab.core.io.transport.serial.jserialcomm/NOTICE new file mode 100644 index 00000000000..6c17d0d8a45 --- /dev/null +++ b/bundles/org.openhab.core.io.transport.serial.jserialcomm/NOTICE @@ -0,0 +1,14 @@ +This content is produced and maintained by the openHAB project. + +* Project home: https://www.openhab.org + +== Declared Project Licenses + +This program and the accompanying materials are made available under the terms +of the Eclipse Public License 2.0 which is available at +https://www.eclipse.org/legal/epl-2.0/. + +== Source Code + +https://github.com/openhab/openhab-core + diff --git a/bundles/org.openhab.core.io.transport.serial.jserialcomm/bnd.bnd b/bundles/org.openhab.core.io.transport.serial.jserialcomm/bnd.bnd new file mode 100644 index 00000000000..24cbaf60a68 --- /dev/null +++ b/bundles/org.openhab.core.io.transport.serial.jserialcomm/bnd.bnd @@ -0,0 +1,4 @@ +Bundle-SymbolicName: ${project.artifactId} +Import-Package: \ + com.fazecast.jSerialComm;version="[2.10,3)",\ + * diff --git a/bundles/org.openhab.core.io.transport.serial.jserialcomm/pom.xml b/bundles/org.openhab.core.io.transport.serial.jserialcomm/pom.xml new file mode 100644 index 00000000000..09983c1289b --- /dev/null +++ b/bundles/org.openhab.core.io.transport.serial.jserialcomm/pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + + + org.openhab.core.bundles + org.openhab.core.reactor.bundles + 4.2.0-SNAPSHOT + + + org.openhab.core.io.transport.serial.jserialcomm + + openHAB Core :: Bundles :: Serial Transport for jSerialComm + + + + org.openhab.core.bundles + org.openhab.core.io.transport.serial + ${project.version} + + + + com.fazecast + jSerialComm + [2.0.0,3.0.0) + + + + + diff --git a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/internal/JSerialCommPortProvider.java b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/internal/JSerialCommPortProvider.java new file mode 100644 index 00000000000..63c34eee4cd --- /dev/null +++ b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/internal/JSerialCommPortProvider.java @@ -0,0 +1,69 @@ +/** + * Copyright (c) 2010-2024 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.core.io.transport.serial.internal; + +import java.net.URI; +import java.util.Arrays; +import java.util.stream.Stream; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.openhab.core.io.transport.serial.ProtocolType; +import org.openhab.core.io.transport.serial.ProtocolType.PathType; +import org.openhab.core.io.transport.serial.SerialPortIdentifier; +import org.openhab.core.io.transport.serial.SerialPortProvider; +import org.osgi.service.component.annotations.Component; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fazecast.jSerialComm.SerialPort; +import com.fazecast.jSerialComm.SerialPortInvalidPortException; + +/** + * + * @author Massimo Valla - Initial contribution + * + */ +@NonNullByDefault +@Component(service = SerialPortProvider.class) +public class JSerialCommPortProvider implements SerialPortProvider { + + private final Logger logger = LoggerFactory.getLogger(JSerialCommPortProvider.class); + + @Override + public @Nullable SerialPortIdentifier getPortIdentifier(URI port) { + String portPathAsString = port.getPath(); + try { + SerialPort spFound = SerialPort.getCommPort(portPathAsString); + return new SerialPortIdentifierImpl(spFound); + } catch (SerialPortInvalidPortException e) { + logger.debug("jSerialComm --- No SerialPortr found for: {}", portPathAsString, e); + return null; + } + } + + @Override + public Stream getAcceptedProtocols() { + return Stream.of(new ProtocolType(PathType.LOCAL, "jserialcomm")); + } + + @Override + public Stream getSerialPortIdentifiers() { + com.fazecast.jSerialComm.SerialPort[] portsArray = com.fazecast.jSerialComm.SerialPort.getCommPorts(); + logger.debug("jSerialComm --- Found ports: " + portsArray); + + Stream ports = Arrays.stream(portsArray); + + return ports.map(sid -> new SerialPortIdentifierImpl(sid)); + } +} diff --git a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/internal/SerialPortEventImpl.java b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/internal/SerialPortEventImpl.java new file mode 100644 index 00000000000..fb2a4b44f23 --- /dev/null +++ b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/internal/SerialPortEventImpl.java @@ -0,0 +1,49 @@ +/** + * Copyright (c) 2010-2024 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.core.io.transport.serial.internal; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.openhab.core.io.transport.serial.SerialPortEvent; + +/** + * Specific serial port implementation using com.fazecast.jSerialComm.SerialPortEvent. + * + * @author Massimo Valla - Initial contribution + */ +@NonNullByDefault +public class SerialPortEventImpl implements SerialPortEvent { + + private final com.fazecast.jSerialComm.SerialPortEvent event; + + /** + * Constructor. + * + * @param event the underlying event implementation + */ + public SerialPortEventImpl(final com.fazecast.jSerialComm.SerialPortEvent event) { + this.event = event; + } + + @Override + public int getEventType() { + // FIXME check event id mapping + return event.getEventType(); + } + + @Override + public boolean getNewValue() { + // FIXME placeholder implementation + return false; + // return event.getNewValue(); + } +} diff --git a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/internal/SerialPortIdentifierImpl.java b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/internal/SerialPortIdentifierImpl.java new file mode 100644 index 00000000000..ab1fc1e5356 --- /dev/null +++ b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/internal/SerialPortIdentifierImpl.java @@ -0,0 +1,76 @@ +/** + * Copyright (c) 2010-2024 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.core.io.transport.serial.internal; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.openhab.core.io.transport.serial.PortInUseException; +import org.openhab.core.io.transport.serial.SerialPort; +import org.openhab.core.io.transport.serial.SerialPortIdentifier; +import org.openhab.core.io.transport.serial.jserialcomm.JSerialCommSerialPort; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Specific serial port identifier implementation. + * + * @author Massimo Valla - Initial contribution + */ +@NonNullByDefault +public class SerialPortIdentifierImpl implements SerialPortIdentifier { + + private final Logger logger = LoggerFactory.getLogger(SerialPortIdentifierImpl.class); + + final com.fazecast.jSerialComm.SerialPort sp; + + /** + * Constructor. + * + * @param sp + */ + public SerialPortIdentifierImpl(final com.fazecast.jSerialComm.SerialPort sp) { + this.sp = sp; + } + + @Override + public String getName() { + final String name = sp.getSystemPortName(); + return name != null ? name : ""; + } + + @Override + public SerialPort open(String owner, int timeout) throws PortInUseException { + + logger.debug("jSerialComm --- SerialPort.getReadTimeout() = " + sp.getReadTimeout()); + logger.debug("jSerialComm --- SerialPort.getPortDescription() = " + sp.getPortDescription()); + + boolean success = sp.openPort(); + if (success) { + return new JSerialCommSerialPort(sp); + } else { + logger.error("jSerialComm --- Could not open port: " + sp.getSystemPortName()); + + throw new PortInUseException(new Exception("Could not open port: " + sp.getSystemPortName())); + } + } + + @Override + public boolean isCurrentlyOwned() { + return false; + } + + @Override + public @Nullable String getCurrentOwner() { + return "jserialcomm owner"; + } +} diff --git a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPort.java b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPort.java new file mode 100644 index 00000000000..16cf2307a8f --- /dev/null +++ b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPort.java @@ -0,0 +1,365 @@ +/** + * Copyright (c) 2010-2024 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.core.io.transport.serial.jserialcomm; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.TooManyListenersException; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.openhab.core.io.transport.serial.SerialPort; +import org.openhab.core.io.transport.serial.SerialPortEventListener; +import org.openhab.core.io.transport.serial.UnsupportedCommOperationException; +import org.openhab.core.io.transport.serial.internal.SerialPortEventImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Specific serial port implementation using com.fazecast.jSerialComm.SerialPort. + * + * @author Massimo Valla - Initial contribution + */ +@NonNullByDefault +public class JSerialCommSerialPort implements SerialPort { + + private final Logger logger = LoggerFactory.getLogger(JSerialCommSerialPort.class); + + private final com.fazecast.jSerialComm.SerialPort sp; + + private boolean notifyOnDataAvailable = false; + private boolean notifyOnBreakInterrupt = false; + private boolean notifyOnFramingError = false; + private boolean notifyOnOverrunError = false; + private boolean notifyOnParityError = false; + private boolean notifyOnOutputEmpty = false; + private boolean notifyOnCTS = false; + private boolean notifyOnDSR = false; + private boolean notifyOnRingIndicator = false; + private boolean notifyOnCarrierDetect = false; + + /** + * Constructor. + * + * @param sp the underlying serial port implementation + */ + public JSerialCommSerialPort(final com.fazecast.jSerialComm.SerialPort sp) { + this.sp = sp; + } + + @Override + public void close() { + sp.closePort(); + } + + @Override + public void setSerialPortParams(int baudrate, int dataBits, int stopBits, int parity) + throws UnsupportedCommOperationException { + if (!sp.setComPortParameters(baudrate, dataBits, stopBits, parity)) { + throw new UnsupportedCommOperationException(); + } + } + + @Override + public @Nullable InputStream getInputStream() throws IOException { + return sp.getInputStream(); + } + + @Override + public @Nullable OutputStream getOutputStream() throws IOException { + return sp.getOutputStream(); + } + + private int combineListeningEvents() { + // FIXME just use compact version below + int combined = 0; + if (notifyOnDataAvailable) { + combined = combined | com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_DATA_AVAILABLE; + logger.debug("JSerialComm --- subscribed notifyOnDataAvailable({}) - combined now is: {}", + com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_DATA_AVAILABLE, combined); + } + if (notifyOnBreakInterrupt) { + combined = combined | com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_BREAK_INTERRUPT; + logger.debug("JSerialComm --- subscribed notifyOnBreakInterrupt({}) - combined now is: {}", + com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_BREAK_INTERRUPT, combined); + } + if (notifyOnFramingError) { + combined = combined | com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_FRAMING_ERROR; + logger.debug("JSerialComm --- subscribed notifyOnFramingError({}) - combined now is: {}", + com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_FRAMING_ERROR, combined); + } + if (notifyOnOverrunError) { + combined = combined | com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_FIRMWARE_OVERRUN_ERROR; + logger.debug("JSerialComm --- subscribed notifyOnOverrunError({}) - combined now is: {}", + com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_FIRMWARE_OVERRUN_ERROR, combined); + } + if (notifyOnParityError) { + combined = combined | com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_PARITY_ERROR; + logger.debug("JSerialComm --- subscribed notifyOnParityError({}) - combined now is: {}", + com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_PARITY_ERROR, combined); + } + if (notifyOnOutputEmpty) { + combined = combined | com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_DATA_WRITTEN; + logger.debug("JSerialComm --- subscribed notifyOnOutputEmpty({}) - combined now is: {}", + com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_DATA_WRITTEN, combined); + } + if (notifyOnCTS) { + combined = combined | com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_CTS; + logger.debug("JSerialComm --- subscribed notifyOnCTS({}) - combined now is: {}", + com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_CTS, combined); + } + if (notifyOnDSR) { + combined = combined | com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_DSR; + logger.debug("JSerialComm --- subscribed notifyOnDSR({}) - combined now is: {}", + com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_DSR, combined); + } + if (notifyOnRingIndicator) { + combined = combined | com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_RING_INDICATOR; + logger.debug("JSerialComm --- subscribed notifyOnRingIndicator({}) - combined now is: {}", + com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_RING_INDICATOR, combined); + } + if (notifyOnCarrierDetect) { + combined = combined | com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_CARRIER_DETECT; + logger.debug("JSerialComm --- subscribed notifyOnCarrierDetect({}) - combined now is: {}", + com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_CARRIER_DETECT, combined); + } + + combined = combined | com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_PORT_DISCONNECTED; + logger.debug("JSerialComm --- subscribed LISTENING_EVENT_PORT_DISCONNECTED({}) - combined now is: {}", + com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_PORT_DISCONNECTED, combined); + + logger.debug("JSerialComm --- FINAL combined is: {}", combined); + + return combined; + + /* + * return (notifyOnDataAvailable ? com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_DATA_AVAILABLE : 0) + * | (notifyOnBreakInterrupt ? com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_BREAK_INTERRUPT : 0) + * | (notifyOnFramingError ? com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_FRAMING_ERROR : 0) + * | (notifyOnOverrunError ? com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_FIRMWARE_OVERRUN_ERROR + * : 0) + * | (notifyOnParityError ? com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_PARITY_ERROR : 0) + * | (notifyOnOutputEmpty ? com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_DATA_WRITTEN : 0) + * | (notifyOnCTS ? com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_CTS : 0) + * | (notifyOnDSR ? com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_DSR : 0) + * | (notifyOnRingIndicator ? com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_RING_INDICATOR : 0) + * | (notifyOnCarrierDetect ? com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_CARRIER_DETECT : 0); + */ + } + + @Override + public void addEventListener(SerialPortEventListener listener) throws TooManyListenersException { + boolean success = sp.addDataListener(new com.fazecast.jSerialComm.SerialPortDataListener() { + @Override + public void serialEvent(final com.fazecast.jSerialComm.@Nullable SerialPortEvent event) { + if (event == null) { + return; + } + listener.serialEvent(new SerialPortEventImpl(event)); + } + + @Override + public int getListeningEvents() { + int subscribedEvents = combineListeningEvents(); + logger.debug("JSerialComm --- {} is subscribed to events: {}", this.toString(), subscribedEvents); + return subscribedEvents; + } + }); + if (!success) { + logger.error("JSerialComm --- Could not add SerialPortDataListener to SerialPort {}", + sp.getSystemPortName()); + throw new TooManyListenersException( + ("Could not add SerialPortDataListener to SerialPort " + sp.getSystemPortName())); + } + } + + @Override + public void removeEventListener() { + sp.removeDataListener(); + } + + @Override + public void notifyOnDataAvailable(boolean enable) { + this.notifyOnDataAvailable = enable; + } + + @Override + public void notifyOnBreakInterrupt(boolean enable) { + this.notifyOnBreakInterrupt = enable; + } + + @Override + public void notifyOnFramingError(boolean enable) { + this.notifyOnFramingError = enable; + } + + @Override + public void notifyOnOverrunError(boolean enable) { + this.notifyOnOverrunError = enable; + } + + @Override + public void notifyOnParityError(boolean enable) { + this.notifyOnParityError = enable; + } + + @Override + public void setRTS(boolean enable) { + if (enable) { + sp.setRTS(); + } else { + sp.clearRTS(); + } + } + + @Override + public void enableReceiveTimeout(int timeout) throws UnsupportedCommOperationException { + if (timeout < 0) { + throw new IllegalArgumentException(String.format("timeout must be non negative (is: %d)", timeout)); + } + // FIXME placeholder implementation + boolean success = sp.setComPortTimeouts(com.fazecast.jSerialComm.SerialPort.TIMEOUT_READ_BLOCKING, timeout, 0); + if (!success) { + throw new UnsupportedCommOperationException(); + } + } + + @Override + public void disableReceiveTimeout() { + // FIXME placeholder implementation + sp.setComPortTimeouts(com.fazecast.jSerialComm.SerialPort.TIMEOUT_NONBLOCKING, 0, 0); + } + + @Override + public String getName() { + return sp.getSystemPortName(); + } + + @Override + public void setFlowControlMode(int flowcontrolRtsctsOut) throws UnsupportedCommOperationException { + // TODO check mapping + if (!sp.setFlowControl(flowcontrolRtsctsOut)) { + throw new UnsupportedCommOperationException(); + } + } + + @Override + public void enableReceiveThreshold(int i) throws UnsupportedCommOperationException { + // FIXME placeholder implementation + /* + * try { + * sp.enableReceiveThreshold(i); + * } catch (gnu.io.UnsupportedCommOperationException e) { + * throw new UnsupportedCommOperationException(e); + * } + */ + } + + @Override + public int getBaudRate() { + return sp.getBaudRate(); + } + + @Override + public int getDataBits() { + return sp.getNumDataBits(); + } + + @Override + public int getStopBits() { + return sp.getNumStopBits(); + } + + @Override + public int getParity() { + return sp.getParity(); + } + + @Override + public void notifyOnOutputEmpty(boolean enable) { + this.notifyOnOutputEmpty = enable; + } + + @Override + public void notifyOnCTS(boolean enable) { + this.notifyOnCTS = enable; + } + + @Override + public void notifyOnDSR(boolean enable) { + this.notifyOnDSR = enable; + } + + @Override + public void notifyOnRingIndicator(boolean enable) { + this.notifyOnRingIndicator = enable; + } + + @Override + public void notifyOnCarrierDetect(boolean enable) { + this.notifyOnCarrierDetect = enable; + } + + @Override + public int getFlowControlMode() { + // FIXME check mapping + return sp.getFlowControlSettings(); + } + + @Override + public boolean isRTS() { + return sp.getRTS(); + } + + @Override + public void setDTR(boolean state) { + if (state) { + sp.setDTR(); + } else { + sp.clearDTR(); + } + } + + @Override + public boolean isDTR() { + return sp.getDTR(); + } + + @Override + public boolean isCTS() { + return sp.getCTS(); + } + + @Override + public boolean isDSR() { + return sp.getDSR(); + } + + @Override + public boolean isCD() { + return sp.getDCD(); + } + + @Override + public boolean isRI() { + return sp.getRI(); + } + + @Override + public void sendBreak(int duration) { + // FIXME placeholder implementation + sp.setBreak(); + // sp.sendBreak(duration); + } +} diff --git a/bundles/pom.xml b/bundles/pom.xml index 59da5879650..fa91d3aeb50 100644 --- a/bundles/pom.xml +++ b/bundles/pom.xml @@ -81,6 +81,7 @@ org.openhab.core.io.transport.mqtt org.openhab.core.io.transport.serial org.openhab.core.io.transport.serial.javacomm + org.openhab.core.io.transport.serial.jserialcomm org.openhab.core.io.transport.serial.rxtx org.openhab.core.io.transport.serial.rxtx.rfc2217 org.openhab.core.io.transport.upnp From 041ccd21e9d9f83d4383aacaf4112b874f5154af Mon Sep 17 00:00:00 2001 From: MV Date: Fri, 2 Feb 2024 10:34:38 +0100 Subject: [PATCH 2/7] [jserialcomm-transport] Package and class renaming Signed-off-by: MV --- .../JSerialCommPortProvider.java | 12 ++--- .../jserialcomm/JSerialCommSerialPort.java | 46 ++++++++++--------- .../JSerialCommSerialPortEvent.java} | 15 ++++-- .../JSerialCommSerialPortIdentifier.java} | 21 ++++----- 4 files changed, 49 insertions(+), 45 deletions(-) rename bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/{internal => jserialcomm}/JSerialCommPortProvider.java (80%) rename bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/{internal/SerialPortEventImpl.java => jserialcomm/JSerialCommSerialPortEvent.java} (61%) rename bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/{internal/SerialPortIdentifierImpl.java => jserialcomm/JSerialCommSerialPortIdentifier.java} (66%) diff --git a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/internal/JSerialCommPortProvider.java b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommPortProvider.java similarity index 80% rename from bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/internal/JSerialCommPortProvider.java rename to bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommPortProvider.java index 63c34eee4cd..d881b4fc3b3 100644 --- a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/internal/JSerialCommPortProvider.java +++ b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommPortProvider.java @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.openhab.core.io.transport.serial.internal; +package org.openhab.core.io.transport.serial.jserialcomm; import java.net.URI; import java.util.Arrays; @@ -30,9 +30,9 @@ import com.fazecast.jSerialComm.SerialPortInvalidPortException; /** + * Specific OH serial transport SerialPortProvider implementation using com.fazecast.jSerialComm.SerialPort * * @author Massimo Valla - Initial contribution - * */ @NonNullByDefault @Component(service = SerialPortProvider.class) @@ -45,9 +45,9 @@ public class JSerialCommPortProvider implements SerialPortProvider { String portPathAsString = port.getPath(); try { SerialPort spFound = SerialPort.getCommPort(portPathAsString); - return new SerialPortIdentifierImpl(spFound); + return new JSerialCommSerialPortIdentifier(spFound); } catch (SerialPortInvalidPortException e) { - logger.debug("jSerialComm --- No SerialPortr found for: {}", portPathAsString, e); + logger.debug("--------TRANSPORT-jSerialComm--- No SerialPort found for: {}", portPathAsString, e); return null; } } @@ -60,10 +60,10 @@ public Stream getAcceptedProtocols() { @Override public Stream getSerialPortIdentifiers() { com.fazecast.jSerialComm.SerialPort[] portsArray = com.fazecast.jSerialComm.SerialPort.getCommPorts(); - logger.debug("jSerialComm --- Found ports: " + portsArray); + logger.debug("--------TRANSPORT-jSerialComm--- Found ports: {}", portsArray); Stream ports = Arrays.stream(portsArray); - return ports.map(sid -> new SerialPortIdentifierImpl(sid)); + return ports.map(sid -> new JSerialCommSerialPortIdentifier(sid)); } } diff --git a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPort.java b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPort.java index 16cf2307a8f..3b5e8d18cbb 100644 --- a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPort.java +++ b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPort.java @@ -22,12 +22,11 @@ import org.openhab.core.io.transport.serial.SerialPort; import org.openhab.core.io.transport.serial.SerialPortEventListener; import org.openhab.core.io.transport.serial.UnsupportedCommOperationException; -import org.openhab.core.io.transport.serial.internal.SerialPortEventImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * Specific serial port implementation using com.fazecast.jSerialComm.SerialPort. + * Specific OH serial transport SerialPort implementation using com.fazecast.jSerialComm.SerialPort. * * @author Massimo Valla - Initial contribution */ @@ -86,65 +85,67 @@ private int combineListeningEvents() { int combined = 0; if (notifyOnDataAvailable) { combined = combined | com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_DATA_AVAILABLE; - logger.debug("JSerialComm --- subscribed notifyOnDataAvailable({}) - combined now is: {}", + logger.debug("--------TRANSPORT-jSerialComm--- subscribed notifyOnDataAvailable({}) - combined now is: {}", com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_DATA_AVAILABLE, combined); } if (notifyOnBreakInterrupt) { combined = combined | com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_BREAK_INTERRUPT; - logger.debug("JSerialComm --- subscribed notifyOnBreakInterrupt({}) - combined now is: {}", + logger.debug("--------TRANSPORT-jSerialComm--- subscribed notifyOnBreakInterrupt({}) - combined now is: {}", com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_BREAK_INTERRUPT, combined); } if (notifyOnFramingError) { combined = combined | com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_FRAMING_ERROR; - logger.debug("JSerialComm --- subscribed notifyOnFramingError({}) - combined now is: {}", + logger.debug("--------TRANSPORT-jSerialComm--- subscribed notifyOnFramingError({}) - combined now is: {}", com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_FRAMING_ERROR, combined); } if (notifyOnOverrunError) { combined = combined | com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_FIRMWARE_OVERRUN_ERROR; - logger.debug("JSerialComm --- subscribed notifyOnOverrunError({}) - combined now is: {}", + logger.debug("--------TRANSPORT-jSerialComm--- subscribed notifyOnOverrunError({}) - combined now is: {}", com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_FIRMWARE_OVERRUN_ERROR, combined); } if (notifyOnParityError) { combined = combined | com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_PARITY_ERROR; - logger.debug("JSerialComm --- subscribed notifyOnParityError({}) - combined now is: {}", + logger.debug("--------TRANSPORT-jSerialComm--- subscribed notifyOnParityError({}) - combined now is: {}", com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_PARITY_ERROR, combined); } if (notifyOnOutputEmpty) { combined = combined | com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_DATA_WRITTEN; - logger.debug("JSerialComm --- subscribed notifyOnOutputEmpty({}) - combined now is: {}", + logger.debug("--------TRANSPORT-jSerialComm--- subscribed notifyOnOutputEmpty({}) - combined now is: {}", com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_DATA_WRITTEN, combined); } if (notifyOnCTS) { combined = combined | com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_CTS; - logger.debug("JSerialComm --- subscribed notifyOnCTS({}) - combined now is: {}", + logger.debug("--------TRANSPORT-jSerialComm--- subscribed notifyOnCTS({}) - combined now is: {}", com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_CTS, combined); } if (notifyOnDSR) { combined = combined | com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_DSR; - logger.debug("JSerialComm --- subscribed notifyOnDSR({}) - combined now is: {}", + logger.debug("--------TRANSPORT-jSerialComm--- subscribed notifyOnDSR({}) - combined now is: {}", com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_DSR, combined); } if (notifyOnRingIndicator) { combined = combined | com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_RING_INDICATOR; - logger.debug("JSerialComm --- subscribed notifyOnRingIndicator({}) - combined now is: {}", + logger.debug("--------TRANSPORT-jSerialComm--- subscribed notifyOnRingIndicator({}) - combined now is: {}", com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_RING_INDICATOR, combined); } if (notifyOnCarrierDetect) { combined = combined | com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_CARRIER_DETECT; - logger.debug("JSerialComm --- subscribed notifyOnCarrierDetect({}) - combined now is: {}", + logger.debug("--------TRANSPORT-jSerialComm--- subscribed notifyOnCarrierDetect({}) - combined now is: {}", com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_CARRIER_DETECT, combined); } combined = combined | com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_PORT_DISCONNECTED; - logger.debug("JSerialComm --- subscribed LISTENING_EVENT_PORT_DISCONNECTED({}) - combined now is: {}", + logger.debug( + "--------TRANSPORT-jSerialComm--- subscribed LISTENING_EVENT_PORT_DISCONNECTED({}) - combined now is: {}", com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_PORT_DISCONNECTED, combined); - logger.debug("JSerialComm --- FINAL combined is: {}", combined); + logger.debug("--------TRANSPORT-jSerialComm--- FINAL combined is: {}", combined); return combined; /* - * return (notifyOnDataAvailable ? com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_DATA_AVAILABLE : 0) + * return com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_PORT_DISCONNECTED + * | (notifyOnDataAvailable ? com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_DATA_AVAILABLE : 0) * | (notifyOnBreakInterrupt ? com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_BREAK_INTERRUPT : 0) * | (notifyOnFramingError ? com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_FRAMING_ERROR : 0) * | (notifyOnOverrunError ? com.fazecast.jSerialComm.SerialPort.LISTENING_EVENT_FIRMWARE_OVERRUN_ERROR @@ -166,18 +167,19 @@ public void serialEvent(final com.fazecast.jSerialComm.@Nullable SerialPortEvent if (event == null) { return; } - listener.serialEvent(new SerialPortEventImpl(event)); + listener.serialEvent(new JSerialCommSerialPortEvent(event)); } @Override public int getListeningEvents() { int subscribedEvents = combineListeningEvents(); - logger.debug("JSerialComm --- {} is subscribed to events: {}", this.toString(), subscribedEvents); + logger.debug("--------TRANSPORT-jSerialComm--- {} is subscribed to events: {}", this.toString(), + subscribedEvents); return subscribedEvents; } }); if (!success) { - logger.error("JSerialComm --- Could not add SerialPortDataListener to SerialPort {}", + logger.error("--------TRANSPORT-jSerialComm--- Could not add SerialPortDataListener to SerialPort {}", sp.getSystemPortName()); throw new TooManyListenersException( ("Could not add SerialPortDataListener to SerialPort " + sp.getSystemPortName())); @@ -228,7 +230,7 @@ public void enableReceiveTimeout(int timeout) throws UnsupportedCommOperationExc if (timeout < 0) { throw new IllegalArgumentException(String.format("timeout must be non negative (is: %d)", timeout)); } - // FIXME placeholder implementation + // FIXME !!!!! placeholder implementation boolean success = sp.setComPortTimeouts(com.fazecast.jSerialComm.SerialPort.TIMEOUT_READ_BLOCKING, timeout, 0); if (!success) { throw new UnsupportedCommOperationException(); @@ -237,7 +239,7 @@ public void enableReceiveTimeout(int timeout) throws UnsupportedCommOperationExc @Override public void disableReceiveTimeout() { - // FIXME placeholder implementation + // FIXME !!!!! placeholder implementation sp.setComPortTimeouts(com.fazecast.jSerialComm.SerialPort.TIMEOUT_NONBLOCKING, 0, 0); } @@ -256,7 +258,7 @@ public void setFlowControlMode(int flowcontrolRtsctsOut) throws UnsupportedCommO @Override public void enableReceiveThreshold(int i) throws UnsupportedCommOperationException { - // FIXME placeholder implementation + // FIXME !!!!! placeholder implementation /* * try { * sp.enableReceiveThreshold(i); @@ -358,7 +360,7 @@ public boolean isRI() { @Override public void sendBreak(int duration) { - // FIXME placeholder implementation + // FIXME !!!!! placeholder implementation sp.setBreak(); // sp.sendBreak(duration); } diff --git a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/internal/SerialPortEventImpl.java b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPortEvent.java similarity index 61% rename from bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/internal/SerialPortEventImpl.java rename to bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPortEvent.java index fb2a4b44f23..fb9ec1434ba 100644 --- a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/internal/SerialPortEventImpl.java +++ b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPortEvent.java @@ -10,18 +10,22 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.openhab.core.io.transport.serial.internal; +package org.openhab.core.io.transport.serial.jserialcomm; import org.eclipse.jdt.annotation.NonNullByDefault; import org.openhab.core.io.transport.serial.SerialPortEvent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** - * Specific serial port implementation using com.fazecast.jSerialComm.SerialPortEvent. + * Specific OH serial transport SerialPortEvent implementation using com.fazecast.jSerialComm.SerialPortEvent * * @author Massimo Valla - Initial contribution */ @NonNullByDefault -public class SerialPortEventImpl implements SerialPortEvent { +public class JSerialCommSerialPortEvent implements SerialPortEvent { + + private final Logger logger = LoggerFactory.getLogger(JSerialCommSerialPortEvent.class); private final com.fazecast.jSerialComm.SerialPortEvent event; @@ -30,7 +34,8 @@ public class SerialPortEventImpl implements SerialPortEvent { * * @param event the underlying event implementation */ - public SerialPortEventImpl(final com.fazecast.jSerialComm.SerialPortEvent event) { + public JSerialCommSerialPortEvent(final com.fazecast.jSerialComm.SerialPortEvent event) { + logger.debug("--------TRANSPORT-jSerialComm--- New event of type: {}", event.getEventType()); this.event = event; } @@ -42,7 +47,7 @@ public int getEventType() { @Override public boolean getNewValue() { - // FIXME placeholder implementation + // FIXME !!!!! placeholder implementation return false; // return event.getNewValue(); } diff --git a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/internal/SerialPortIdentifierImpl.java b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPortIdentifier.java similarity index 66% rename from bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/internal/SerialPortIdentifierImpl.java rename to bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPortIdentifier.java index ab1fc1e5356..a5bd6b5df50 100644 --- a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/internal/SerialPortIdentifierImpl.java +++ b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPortIdentifier.java @@ -10,26 +10,25 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.openhab.core.io.transport.serial.internal; +package org.openhab.core.io.transport.serial.jserialcomm; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.openhab.core.io.transport.serial.PortInUseException; import org.openhab.core.io.transport.serial.SerialPort; import org.openhab.core.io.transport.serial.SerialPortIdentifier; -import org.openhab.core.io.transport.serial.jserialcomm.JSerialCommSerialPort; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * Specific serial port identifier implementation. + * Specific OH serial transport SerialPortIdentifier implementation using com.fazecast.jSerialComm.SerialPort * * @author Massimo Valla - Initial contribution */ @NonNullByDefault -public class SerialPortIdentifierImpl implements SerialPortIdentifier { +public class JSerialCommSerialPortIdentifier implements SerialPortIdentifier { - private final Logger logger = LoggerFactory.getLogger(SerialPortIdentifierImpl.class); + private final Logger logger = LoggerFactory.getLogger(JSerialCommSerialPortIdentifier.class); final com.fazecast.jSerialComm.SerialPort sp; @@ -38,7 +37,7 @@ public class SerialPortIdentifierImpl implements SerialPortIdentifier { * * @param sp */ - public SerialPortIdentifierImpl(final com.fazecast.jSerialComm.SerialPort sp) { + public JSerialCommSerialPortIdentifier(final com.fazecast.jSerialComm.SerialPort sp) { this.sp = sp; } @@ -50,16 +49,13 @@ public String getName() { @Override public SerialPort open(String owner, int timeout) throws PortInUseException { - - logger.debug("jSerialComm --- SerialPort.getReadTimeout() = " + sp.getReadTimeout()); - logger.debug("jSerialComm --- SerialPort.getPortDescription() = " + sp.getPortDescription()); - + logger.debug("--------TRANSPORT-jSerialComm--- SerialPort.getReadTimeout() = {}", sp.getReadTimeout()); + logger.debug("--------TRANSPORT-jSerialComm--- SerialPort.getPortDescription() = {}", sp.getPortDescription()); boolean success = sp.openPort(); if (success) { return new JSerialCommSerialPort(sp); } else { - logger.error("jSerialComm --- Could not open port: " + sp.getSystemPortName()); - + logger.error("--------TRANSPORT-jSerialComm--- Could not open port: {}", sp.getSystemPortName()); throw new PortInUseException(new Exception("Could not open port: " + sp.getSystemPortName())); } } @@ -71,6 +67,7 @@ public boolean isCurrentlyOwned() { @Override public @Nullable String getCurrentOwner() { + // FIXME !!!!! placeholder implementation return "jserialcomm owner"; } } From 77943b4e0baf59fcd0868cceebf4f1048f142011 Mon Sep 17 00:00:00 2001 From: MV Date: Fri, 2 Feb 2024 13:16:42 +0100 Subject: [PATCH 3/7] [jserialcomm-transport] Class rename and refresh listener when subscriptions change Signed-off-by: MV --- .../.classpath | 5 ++- .../jserialcomm/JSerialCommSerialPort.java | 31 ++++++++++++++++++- ...ava => JSerialCommSerialPortProvider.java} | 4 +-- 3 files changed, 34 insertions(+), 6 deletions(-) rename bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/{JSerialCommPortProvider.java => JSerialCommSerialPortProvider.java} (95%) diff --git a/bundles/org.openhab.core.io.transport.serial.jserialcomm/.classpath b/bundles/org.openhab.core.io.transport.serial.jserialcomm/.classpath index 8631a3aebc7..e9d63b05acb 100644 --- a/bundles/org.openhab.core.io.transport.serial.jserialcomm/.classpath +++ b/bundles/org.openhab.core.io.transport.serial.jserialcomm/.classpath @@ -8,15 +8,14 @@ - - + - + diff --git a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPort.java b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPort.java index 3b5e8d18cbb..cde39c38380 100644 --- a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPort.java +++ b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPort.java @@ -48,6 +48,8 @@ public class JSerialCommSerialPort implements SerialPort { private boolean notifyOnRingIndicator = false; private boolean notifyOnCarrierDetect = false; + private @Nullable SerialPortEventListener eventListener; + /** * Constructor. * @@ -184,6 +186,23 @@ public int getListeningEvents() { throw new TooManyListenersException( ("Could not add SerialPortDataListener to SerialPort " + sp.getSystemPortName())); } + eventListener = listener; + } + + // private method to refresh listener (if exists) in order to refresh subscriptions to lib + private synchronized void refreshListener() { + SerialPortEventListener eL = eventListener; + if (eL != null) { + sp.removeDataListener(); + try { + this.addEventListener(eL); + logger.debug("--------TRANSPORT-jSerialComm--- LISTENER REFRESHED!"); + + } catch (TooManyListenersException e) { + logger.error("--------TRANSPORT-jSerialComm--- Could not add SerialPortDataListener to SerialPort {}", + sp.getSystemPortName()); + } + } } @Override @@ -194,26 +213,31 @@ public void removeEventListener() { @Override public void notifyOnDataAvailable(boolean enable) { this.notifyOnDataAvailable = enable; + refreshListener(); } @Override public void notifyOnBreakInterrupt(boolean enable) { this.notifyOnBreakInterrupt = enable; + refreshListener(); } @Override public void notifyOnFramingError(boolean enable) { this.notifyOnFramingError = enable; + refreshListener(); } @Override public void notifyOnOverrunError(boolean enable) { this.notifyOnOverrunError = enable; + refreshListener(); } @Override public void notifyOnParityError(boolean enable) { this.notifyOnParityError = enable; + refreshListener(); } @Override @@ -291,16 +315,19 @@ public int getParity() { @Override public void notifyOnOutputEmpty(boolean enable) { this.notifyOnOutputEmpty = enable; + refreshListener(); } @Override public void notifyOnCTS(boolean enable) { this.notifyOnCTS = enable; + refreshListener(); } @Override public void notifyOnDSR(boolean enable) { this.notifyOnDSR = enable; + refreshListener(); } @Override @@ -311,6 +338,7 @@ public void notifyOnRingIndicator(boolean enable) { @Override public void notifyOnCarrierDetect(boolean enable) { this.notifyOnCarrierDetect = enable; + refreshListener(); } @Override @@ -360,7 +388,8 @@ public boolean isRI() { @Override public void sendBreak(int duration) { - // FIXME !!!!! placeholder implementation + // FIXME !!!!! placeholder implementation - or remove from serial transport interface if it's not used by any + // binding sp.setBreak(); // sp.sendBreak(duration); } diff --git a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommPortProvider.java b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPortProvider.java similarity index 95% rename from bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommPortProvider.java rename to bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPortProvider.java index d881b4fc3b3..aae2fbba011 100644 --- a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommPortProvider.java +++ b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPortProvider.java @@ -36,9 +36,9 @@ */ @NonNullByDefault @Component(service = SerialPortProvider.class) -public class JSerialCommPortProvider implements SerialPortProvider { +public class JSerialCommSerialPortProvider implements SerialPortProvider { - private final Logger logger = LoggerFactory.getLogger(JSerialCommPortProvider.class); + private final Logger logger = LoggerFactory.getLogger(JSerialCommSerialPortProvider.class); @Override public @Nullable SerialPortIdentifier getPortIdentifier(URI port) { From 75b392a6b3c58431207ad496bfcb96a96cfeecf4 Mon Sep 17 00:00:00 2001 From: MV Date: Fri, 2 Feb 2024 23:32:20 +0100 Subject: [PATCH 4/7] [jserialcomm-transport] getName -> getSystemPortPath() Signed-off-by: MV --- .../transport/serial/jserialcomm/JSerialCommSerialPort.java | 2 +- .../serial/jserialcomm/JSerialCommSerialPortIdentifier.java | 6 +++--- .../serial/jserialcomm/JSerialCommSerialPortProvider.java | 6 +++++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPort.java b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPort.java index cde39c38380..b1dab6e7c3a 100644 --- a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPort.java +++ b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPort.java @@ -269,7 +269,7 @@ public void disableReceiveTimeout() { @Override public String getName() { - return sp.getSystemPortName(); + return sp.getSystemPortPath(); } @Override diff --git a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPortIdentifier.java b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPortIdentifier.java index a5bd6b5df50..b0a3e07d10e 100644 --- a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPortIdentifier.java +++ b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPortIdentifier.java @@ -43,7 +43,7 @@ public JSerialCommSerialPortIdentifier(final com.fazecast.jSerialComm.SerialPort @Override public String getName() { - final String name = sp.getSystemPortName(); + final String name = sp.getSystemPortPath(); return name != null ? name : ""; } @@ -55,8 +55,8 @@ public SerialPort open(String owner, int timeout) throws PortInUseException { if (success) { return new JSerialCommSerialPort(sp); } else { - logger.error("--------TRANSPORT-jSerialComm--- Could not open port: {}", sp.getSystemPortName()); - throw new PortInUseException(new Exception("Could not open port: " + sp.getSystemPortName())); + logger.error("--------TRANSPORT-jSerialComm--- Could not open port: {}", getName()); + throw new PortInUseException(new Exception("Could not open port: " + getName())); } } diff --git a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPortProvider.java b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPortProvider.java index aae2fbba011..720ad2952be 100644 --- a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPortProvider.java +++ b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPortProvider.java @@ -60,7 +60,11 @@ public Stream getAcceptedProtocols() { @Override public Stream getSerialPortIdentifiers() { com.fazecast.jSerialComm.SerialPort[] portsArray = com.fazecast.jSerialComm.SerialPort.getCommPorts(); - logger.debug("--------TRANSPORT-jSerialComm--- Found ports: {}", portsArray); + logger.debug("--------TRANSPORT-jSerialComm--- getSerialPortIdentifiers() - Listing Found ports:"); + for (com.fazecast.jSerialComm.SerialPort port : portsArray) { + logger.debug("--------TRANSPORT-jSerialComm--- port: {} ({} - {})", port.getSystemPortName(), + port.getSystemPortPath(), port.getPortDescription()); + } Stream ports = Arrays.stream(portsArray); From 2d50adfd13f7f9681cbd6d5d9239e5875a8ec9a9 Mon Sep 17 00:00:00 2001 From: MV Date: Mon, 5 Feb 2024 16:25:19 +0100 Subject: [PATCH 5/7] [jserialcomm-transport] Use getSystemPortName() in case of Win serial ports, use getSystemPortPath() otherwise. Fixed getCurrentOwner. Signed-off-by: MV --- .../jserialcomm/JSerialCommSerialPort.java | 12 ++++++++---- .../JSerialCommSerialPortIdentifier.java | 17 ++++++++++++----- .../JSerialCommSerialPortProvider.java | 7 +++++-- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPort.java b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPort.java index b1dab6e7c3a..5247bd7cb58 100644 --- a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPort.java +++ b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPort.java @@ -269,12 +269,17 @@ public void disableReceiveTimeout() { @Override public String getName() { - return sp.getSystemPortPath(); + String sysPortName = sp.getSystemPortName(); + if (sysPortName != null && sysPortName.startsWith("COM")) { + return sysPortName; + } else { + return sp.getSystemPortPath(); + } } @Override public void setFlowControlMode(int flowcontrolRtsctsOut) throws UnsupportedCommOperationException { - // TODO check mapping + // FIXME check mapping if (!sp.setFlowControl(flowcontrolRtsctsOut)) { throw new UnsupportedCommOperationException(); } @@ -388,8 +393,7 @@ public boolean isRI() { @Override public void sendBreak(int duration) { - // FIXME !!!!! placeholder implementation - or remove from serial transport interface if it's not used by any - // binding + // FIXME !!!!! placeholder implementation. Remove from OH serial transport since it's not used by any binding?? sp.setBreak(); // sp.sendBreak(duration); } diff --git a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPortIdentifier.java b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPortIdentifier.java index b0a3e07d10e..3178ebbaaff 100644 --- a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPortIdentifier.java +++ b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPortIdentifier.java @@ -32,6 +32,8 @@ public class JSerialCommSerialPortIdentifier implements SerialPortIdentifier { final com.fazecast.jSerialComm.SerialPort sp; + private @Nullable String owner; + /** * Constructor. * @@ -43,8 +45,13 @@ public JSerialCommSerialPortIdentifier(final com.fazecast.jSerialComm.SerialPort @Override public String getName() { - final String name = sp.getSystemPortPath(); - return name != null ? name : ""; + final String sysPortName = sp.getSystemPortName(); + if (sysPortName != null && sysPortName.startsWith("COM")) { + return sysPortName; + } else { + return sp.getSystemPortPath(); + } + // return name != null ? name : ""; } @Override @@ -53,6 +60,7 @@ public SerialPort open(String owner, int timeout) throws PortInUseException { logger.debug("--------TRANSPORT-jSerialComm--- SerialPort.getPortDescription() = {}", sp.getPortDescription()); boolean success = sp.openPort(); if (success) { + this.owner = owner; return new JSerialCommSerialPort(sp); } else { logger.error("--------TRANSPORT-jSerialComm--- Could not open port: {}", getName()); @@ -62,12 +70,11 @@ public SerialPort open(String owner, int timeout) throws PortInUseException { @Override public boolean isCurrentlyOwned() { - return false; + return (owner != null); } @Override public @Nullable String getCurrentOwner() { - // FIXME !!!!! placeholder implementation - return "jserialcomm owner"; + return owner; } } diff --git a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPortProvider.java b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPortProvider.java index 720ad2952be..e50f06444fe 100644 --- a/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPortProvider.java +++ b/bundles/org.openhab.core.io.transport.serial.jserialcomm/src/main/java/org/openhab/core/io/transport/serial/jserialcomm/JSerialCommSerialPortProvider.java @@ -47,7 +47,9 @@ public class JSerialCommSerialPortProvider implements SerialPortProvider { SerialPort spFound = SerialPort.getCommPort(portPathAsString); return new JSerialCommSerialPortIdentifier(spFound); } catch (SerialPortInvalidPortException e) { - logger.debug("--------TRANSPORT-jSerialComm--- No SerialPort found for: {}", portPathAsString, e); + logger.debug( + "--------TRANSPORT-jSerialComm--- No SerialPort found for: {} (SerialPortInvalidPortException: {})", + portPathAsString, e.getMessage()); return null; } } @@ -60,11 +62,12 @@ public Stream getAcceptedProtocols() { @Override public Stream getSerialPortIdentifiers() { com.fazecast.jSerialComm.SerialPort[] portsArray = com.fazecast.jSerialComm.SerialPort.getCommPorts(); - logger.debug("--------TRANSPORT-jSerialComm--- getSerialPortIdentifiers() - Listing Found ports:"); + logger.debug("--------TRANSPORT-jSerialComm--- getSerialPortIdentifiers() :: Listing found ports:"); for (com.fazecast.jSerialComm.SerialPort port : portsArray) { logger.debug("--------TRANSPORT-jSerialComm--- port: {} ({} - {})", port.getSystemPortName(), port.getSystemPortPath(), port.getPortDescription()); } + logger.debug("--------TRANSPORT-jSerialComm--- ...finished listing found ports."); Stream ports = Arrays.stream(portsArray); From 0b47a5da130ac984605a054c9f7dcbe131616347 Mon Sep 17 00:00:00 2001 From: MV Date: Mon, 5 Feb 2024 17:13:04 +0100 Subject: [PATCH 6/7] [jserialcomm-transport] codestyle checks Signed-off-by: MV --- bom/compile/pom.xml | 2 +- bom/openhab-core/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bom/compile/pom.xml b/bom/compile/pom.xml index b1bfe99d77d..9a1554bc90b 100644 --- a/bom/compile/pom.xml +++ b/bom/compile/pom.xml @@ -300,7 +300,7 @@ 2.10.4 compile - + com.neuronrobotics nrjavaserial 3.14.0 diff --git a/bom/openhab-core/pom.xml b/bom/openhab-core/pom.xml index da02d827f4a..ffaed9e53b3 100644 --- a/bom/openhab-core/pom.xml +++ b/bom/openhab-core/pom.xml @@ -268,7 +268,7 @@ ${project.version} compile - + org.openhab.core.bundles org.openhab.core.io.transport.serial.rxtx ${project.version} From 3b047c536ab1d3ba4d9da247c8f5a312b2c955b0 Mon Sep 17 00:00:00 2001 From: MV Date: Thu, 18 Apr 2024 23:53:51 +0200 Subject: [PATCH 7/7] [jserialcomm-transport] Bump jSerialComm to 2.11.0 Signed-off-by: MV --- .../org.openhab.core.io.transport.serial.jserialcomm/bnd.bnd | 2 +- .../org.openhab.core.io.transport.serial.jserialcomm/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bundles/org.openhab.core.io.transport.serial.jserialcomm/bnd.bnd b/bundles/org.openhab.core.io.transport.serial.jserialcomm/bnd.bnd index 24cbaf60a68..4fc04c311a5 100644 --- a/bundles/org.openhab.core.io.transport.serial.jserialcomm/bnd.bnd +++ b/bundles/org.openhab.core.io.transport.serial.jserialcomm/bnd.bnd @@ -1,4 +1,4 @@ Bundle-SymbolicName: ${project.artifactId} Import-Package: \ - com.fazecast.jSerialComm;version="[2.10,3)",\ + com.fazecast.jSerialComm;version="[2.11,3)",\ * diff --git a/bundles/org.openhab.core.io.transport.serial.jserialcomm/pom.xml b/bundles/org.openhab.core.io.transport.serial.jserialcomm/pom.xml index 09983c1289b..0caab1f56bb 100644 --- a/bundles/org.openhab.core.io.transport.serial.jserialcomm/pom.xml +++ b/bundles/org.openhab.core.io.transport.serial.jserialcomm/pom.xml @@ -23,7 +23,7 @@ com.fazecast jSerialComm - [2.0.0,3.0.0) + [2.11.0,3.0.0)