Initial Contribution

Signed-off-by: Karel Goderis <karel.goderis@me.com>
pull/3632/head
Karel Goderis 2023-05-23 20:48:03 +02:00
parent a12d64d4a3
commit 14b89c2762
12 changed files with 639 additions and 0 deletions

View File

@ -262,6 +262,12 @@
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.openhab.core.bundles</groupId>
<artifactId>org.openhab.core.io.transport.serial.purejavacomm</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.openhab.core.bundles</groupId>
<artifactId>org.openhab.core.io.transport.serial.rxtx</artifactId>

View File

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
<attribute name="optional" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
<attribute name="test" value="true"/>
<attribute name="optional" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/classes" path="src/main/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" path="target/generated-sources/annotations">
<attributes>
<attribute name="optional" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="target/generated-test-sources/test-annotations">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/classes"/>
</classpath>

View File

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>org.openhab.core.io.transport.serial.javacomm</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
</natures>
<filteredResources>
<filter>
<id>1684860371393</id>
<name></name>
<type>30</type>
<matcher>
<id>org.eclipse.core.resources.regexFilterMatcher</id>
<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription>

View File

@ -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

View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.openhab.core.bundles</groupId>
<artifactId>org.openhab.core.reactor.bundles</artifactId>
<version>4.0.0-SNAPSHOT</version>
</parent>
<artifactId>org.openhab.core.io.transport.serial.purejavacomm</artifactId>
<name>openHAB Core :: Bundles :: Serial Transport for Pure Java Communications API</name>
<dependencies>
<dependency>
<groupId>org.openhab.core.bundles</groupId>
<artifactId>org.openhab.core.io.transport.serial</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.opensmarthouse</groupId>
<artifactId>purejavacomm</artifactId>
<version>1.0.5</version>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,99 @@
/**
* Copyright (c) 2010-2023 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.Enumeration;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.function.Consumer;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
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 purejavacomm.CommPortIdentifier;
import purejavacomm.NoSuchPortException;
/**
*
* @author Łukasz Dywicki - Initial contribution
* @author Karel Goderis - added further methods
*/
@NonNullByDefault
@Component(service = SerialPortProvider.class)
public class PureJavaCommPortProvider implements SerialPortProvider {
private final Logger logger = LoggerFactory.getLogger(PureJavaCommPortProvider.class);
@Override
public @Nullable SerialPortIdentifier getPortIdentifier(URI port) {
CommPortIdentifier ident = null;
try {
ident = CommPortIdentifier.getPortIdentifier(port.getPath());
} catch (NoSuchPortException e) {
logger.debug("No SerialPortIdentifier found for: {}", port.getPath());
return null;
}
return new SerialPortIdentifierImpl(ident);
}
@Override
public Stream<ProtocolType> getAcceptedProtocols() {
return Stream.of(new ProtocolType(PathType.LOCAL, "purejavacomm"));
}
@Override
public Stream<SerialPortIdentifier> getSerialPortIdentifiers() {
@SuppressWarnings("unchecked")
final Enumeration<CommPortIdentifier> ids = CommPortIdentifier.getPortIdentifiers();
return StreamSupport.stream(new SplitIteratorForEnumeration<>(ids), false)
.filter(id -> id.getPortType() == CommPortIdentifier.PORT_SERIAL)
.map(sid -> new SerialPortIdentifierImpl(sid));
}
private static class SplitIteratorForEnumeration<T> extends Spliterators.AbstractSpliterator<T> {
private final Enumeration<T> e;
public SplitIteratorForEnumeration(final Enumeration<T> e) {
super(Long.MAX_VALUE, Spliterator.ORDERED);
this.e = e;
}
@Override
@NonNullByDefault({})
public boolean tryAdvance(Consumer<? super T> action) {
if (e.hasMoreElements()) {
action.accept(e.nextElement());
return true;
}
return false;
}
@Override
@NonNullByDefault({})
public void forEachRemaining(Consumer<? super T> action) {
while (e.hasMoreElements()) {
action.accept(e.nextElement());
}
}
}
}

View File

@ -0,0 +1,47 @@
/**
* Copyright (c) 2010-2023 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 event implementation.
*
* @author Łukasz Dywicki - Initial contribution
* @author Karel Goderis - added further methods
*/
@NonNullByDefault
public class SerialPortEventImpl implements SerialPortEvent {
private final purejavacomm.SerialPortEvent event;
/**
* Constructor.
*
* @param event the underlying event implementation
*/
public SerialPortEventImpl(final purejavacomm.SerialPortEvent event) {
this.event = event;
}
@Override
public int getEventType() {
return event.getEventType();
}
@Override
public boolean getNewValue() {
return event.getNewValue();
}
}

View File

@ -0,0 +1,77 @@
/**
* Copyright (c) 2010-2023 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 purejavacomm.CommPortIdentifier;
/**
* Specific serial port identifier implementation.
*
* @author Łukasz Dywicki - Initial contribution
* @author Karel Goderis - added further methods
*/
@NonNullByDefault
public class SerialPortIdentifierImpl implements SerialPortIdentifier {
final CommPortIdentifier id;
/**
* Constructor.
*
* @param id the underlying comm port identifier implementation
*/
public SerialPortIdentifierImpl(final CommPortIdentifier id) {
this.id = id;
}
@Override
public String getName() {
final String name = id.getName();
return name != null ? name : "";
}
@Override
public SerialPort open(String owner, int timeout) throws PortInUseException {
try {
return new SerialPortImpl((purejavacomm.SerialPort) id.open(owner, timeout));
} catch (purejavacomm.PortInUseException e) {
String message = e.getMessage();
if (message != null) {
throw new PortInUseException(message, e);
} else {
throw new PortInUseException(e);
}
}
}
@Override
public boolean isCurrentlyOwned() {
return id.isCurrentlyOwned();
}
@Override
public @Nullable String getCurrentOwner() {
return id.getCurrentOwner();
}
public String toString() {
return getName() + " (pure java comm)";
}
}

View File

@ -0,0 +1,260 @@
/**
* Copyright (c) 2010-2023 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.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 purejavacomm.SerialPortEvent;
/**
* Specific serial port implementation.
*
* @author Łukasz Dywicki - Initial contribution
* @author Karel Goderis - added further methods
*/
@NonNullByDefault
public class SerialPortImpl implements SerialPort {
private final purejavacomm.SerialPort sp;
/**
* Constructor.
*
* @param sp the underlying serial port implementation
*/
public SerialPortImpl(final purejavacomm.SerialPort sp) {
this.sp = sp;
}
@Override
public void close() {
sp.close();
}
@Override
public void setSerialPortParams(int baudrate, int dataBits, int stopBits, int parity)
throws UnsupportedCommOperationException {
try {
sp.setSerialPortParams(baudrate, dataBits, stopBits, parity);
} catch (purejavacomm.UnsupportedCommOperationException ex) {
throw new UnsupportedCommOperationException(ex);
}
}
@Override
public @Nullable InputStream getInputStream() throws IOException {
return sp.getInputStream();
}
@Override
public @Nullable OutputStream getOutputStream() throws IOException {
return sp.getOutputStream();
}
@Override
public void addEventListener(SerialPortEventListener listener) throws TooManyListenersException {
sp.addEventListener(new purejavacomm.SerialPortEventListener() {
@Override
public void serialEvent(final @Nullable SerialPortEvent event) {
if (event == null) {
return;
}
listener.serialEvent(new org.openhab.core.io.transport.serial.SerialPortEvent() {
@Override
public int getEventType() {
return event.getEventType();
}
@Override
public boolean getNewValue() {
return event.getNewValue();
}
});
}
});
}
@Override
public void removeEventListener() {
sp.removeEventListener();
}
@Override
public void notifyOnDataAvailable(boolean enable) {
sp.notifyOnDataAvailable(enable);
}
@Override
public void notifyOnBreakInterrupt(boolean enable) {
sp.notifyOnBreakInterrupt(enable);
}
@Override
public void notifyOnFramingError(boolean enable) {
sp.notifyOnFramingError(enable);
}
@Override
public void notifyOnOverrunError(boolean enable) {
sp.notifyOnOverrunError(enable);
}
@Override
public void notifyOnParityError(boolean enable) {
sp.notifyOnParityError(enable);
}
@Override
public void enableReceiveTimeout(int timeout) throws UnsupportedCommOperationException {
if (timeout < 0) {
throw new IllegalArgumentException(String.format("timeout must be non negative (is: %d)", timeout));
}
try {
sp.enableReceiveTimeout(timeout);
} catch (purejavacomm.UnsupportedCommOperationException ex) {
throw new UnsupportedCommOperationException(ex);
}
}
@Override
public void disableReceiveTimeout() {
sp.disableReceiveTimeout();
}
@Override
public String getName() {
return sp.getName();
}
@Override
public void setFlowControlMode(int flowcontrolRtsctsOut) throws UnsupportedCommOperationException {
try {
sp.setFlowControlMode(flowcontrolRtsctsOut);
} catch (purejavacomm.UnsupportedCommOperationException e) {
throw new UnsupportedCommOperationException(e);
}
}
@Override
public void enableReceiveThreshold(int i) throws UnsupportedCommOperationException {
try {
sp.enableReceiveThreshold(i);
} catch (purejavacomm.UnsupportedCommOperationException e) {
throw new UnsupportedCommOperationException(e);
}
}
@Override
public int getBaudRate() {
return sp.getBaudRate();
}
@Override
public int getDataBits() {
return sp.getDataBits();
}
@Override
public int getStopBits() {
return sp.getStopBits();
}
@Override
public int getParity() {
return sp.getParity();
}
@Override
public void notifyOnOutputEmpty(boolean enable) {
sp.notifyOnOutputEmpty(enable);
}
@Override
public void notifyOnCTS(boolean enable) {
sp.notifyOnCTS(enable);
}
@Override
public void notifyOnDSR(boolean enable) {
sp.notifyOnDSR(enable);
}
@Override
public void notifyOnRingIndicator(boolean enable) {
sp.notifyOnRingIndicator(enable);
}
@Override
public void notifyOnCarrierDetect(boolean enable) {
sp.notifyOnCarrierDetect(enable);
}
@Override
public int getFlowControlMode() {
return getFlowControlMode();
}
@Override
public void setRTS(boolean enable) {
sp.setRTS(enable);
}
@Override
public boolean isRTS() {
return sp.isRTS();
}
@Override
public void setDTR(boolean state) {
sp.setDTR(state);
}
@Override
public boolean isDTR() {
return sp.isDTR();
}
@Override
public boolean isCTS() {
return sp.isCTS();
}
@Override
public boolean isDSR() {
return sp.isDSR();
}
@Override
public boolean isCD() {
return sp.isCD();
}
@Override
public boolean isRI() {
return sp.isRI();
}
@Override
public void sendBreak(int duration) {
sp.sendBreak(duration);
}
}

View File

@ -73,6 +73,7 @@
<module>org.openhab.core.io.transport.mqtt</module>
<module>org.openhab.core.io.transport.serial</module>
<module>org.openhab.core.io.transport.serial.javacomm</module>
<module>org.openhab.core.io.transport.serial.purejavacomm</module>
<module>org.openhab.core.io.transport.serial.rxtx</module>
<module>org.openhab.core.io.transport.serial.rxtx.rfc2217</module>
<module>org.openhab.core.io.transport.upnp</module>

View File

@ -237,6 +237,19 @@
<bundle>mvn:org.openhab.core.bundles/org.openhab.core.io.transport.serial.javacomm/${project.version}</bundle>
</feature>
<conditional>
<condition>req:osgi.native;filter:="(&amp;(osgi.native.osname=MacOSX)(osgi.native.processor=AArch64))"</condition>
<feature name="openhab-core-io-transport-serial-purejavacomm" version="${project.version}">
<feature>openhab-core-base</feature>
<requirement>openhab.tp;filter:="(&amp;(feature=serial)(impl=purejavacomm))"</requirement>
<feature dependency="true">openhab.tp-serial-purejavacomm</feature>
<bundle>mvn:org.openhab.core.bundles/org.openhab.core.io.transport.serial/${project.version}</bundle>
<bundle>mvn:org.openhab.core.bundles/org.openhab.core.io.transport.serial.purejavacomm/${project.version}</bundle>
</feature>
</conditional>
<feature name="openhab-core-io-transport-upnp" version="${project.version}">
<feature>openhab-core-base</feature>

View File

@ -232,6 +232,15 @@
<bundle>mvn:org.eclipse.kura/org.eclipse.soda.dk.comm.x86_64/1.2.201</bundle>
</feature>
<conditional>
<condition>req:osgi.native;filter:="(&amp;(osgi.native.osname=MacOSX)(osgi.native.processor=AArch64))"</condition>
<feature name="openhab.tp-serial-purejavacomm" version="${project.version}">
<capability>openhab.tp;feature=serial;impl=purejavacomm</capability>
<feature dependency="true">openhab.tp-jna</feature>
<bundle>mvn:org.opensmarthouse/purejavacomm/1.0.5</bundle>
</feature>
</conditional>
<feature name="openhab.tp-serial-rxtx" version="${project.version}">
<capability>openhab.tp;feature=serial;impl=rxtx</capability>
<bundle>mvn:com.neuronrobotics/nrjavaserial/5.2.1.OH1</bundle>