Skip to content

Commit 9c90b70

Browse files
committed
Separate CAN and CANopen bindings, introduce CAN network api.
The CAN Network API is fairly close to IP network. Currently there is a fixed assumpton that each detected CAN interface can host RAW and CANopen traffic. Depending on further evollution/evaluation it might be ammended to some more fine grained detection. Signed-off-by: Łukasz Dywicki <luke@code-house.org>
1 parent ad3e60f commit 9c90b70

File tree

67 files changed

+2320
-598
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+2320
-598
lines changed

bundles/org.connectorio.addons.binding.can/pom.xml

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -35,43 +35,53 @@
3535
<dependencies>
3636
<dependency>
3737
<groupId>org.connectorio.addons</groupId>
38-
<artifactId>org.connectorio.units</artifactId>
38+
<artifactId>org.connectorio.addons.network.can</artifactId>
3939
</dependency>
4040
<dependency>
41-
<groupId>com.github.hypfvieh</groupId>
42-
<artifactId>dbus-java</artifactId>
43-
<version>3.2.3</version>
41+
<groupId>org.connectorio.addons</groupId>
42+
<artifactId>org.connectorio.addons.binding.plc4x</artifactId>
4443
</dependency>
4544
<dependency>
46-
<groupId>com.github.hypfvieh</groupId>
47-
<artifactId>java-utils</artifactId>
48-
<version>1.0.6</version>
45+
<groupId>org.connectorio.addons</groupId>
46+
<artifactId>org.connectorio.units</artifactId>
4947
</dependency>
50-
5148
<dependency>
52-
<groupId>com.github.jnr</groupId>
53-
<artifactId>jnr-unixsocket</artifactId>
54-
<version>0.33</version>
49+
<groupId>org.apache.plc4x</groupId>
50+
<artifactId>plc4j-driver-can</artifactId>
5551
</dependency>
52+
5653
<dependency>
57-
<groupId>com.github.jnr</groupId>
58-
<artifactId>jnr-ffi</artifactId>
59-
<version>2.1.15</version>
54+
<groupId>org.openhab.core.bundles</groupId>
55+
<artifactId>org.openhab.core.config.discovery</artifactId>
6056
</dependency>
61-
6257
<dependency>
6358
<groupId>org.osgi</groupId>
6459
<artifactId>org.osgi.service.component.annotations</artifactId>
6560
</dependency>
61+
6662
<dependency>
67-
<groupId>org.openhab.core.bundles</groupId>
68-
<artifactId>org.openhab.core.config.discovery</artifactId>
63+
<groupId>org.connectorio.addons</groupId>
64+
<artifactId>org.connectorio.addons.feature.plc4x</artifactId>
65+
<classifier>features</classifier>
66+
<type>xml</type>
6967
</dependency>
7068

7169
<dependency>
7270
<groupId>org.connectorio.addons</groupId>
7371
<artifactId>org.connectorio.addons.binding.test</artifactId>
7472
</dependency>
73+
<dependency>
74+
<groupId>org.junit.jupiter</groupId>
75+
<artifactId>junit-jupiter-api</artifactId>
76+
</dependency>
77+
<dependency>
78+
<groupId>org.mockito</groupId>
79+
<artifactId>mockito-junit-jupiter</artifactId>
80+
</dependency>
81+
<dependency>
82+
<groupId>org.assertj</groupId>
83+
<artifactId>assertj-core</artifactId>
84+
</dependency>
7585
</dependencies>
7686

7787
</project>

bundles/org.connectorio.addons.binding.can/src/main/java/org/connectorio/addons/binding/can/internal/discovery/DBusCANInterfaceDiscoveryService.java

Lines changed: 0 additions & 126 deletions
This file was deleted.

bundles/org.connectorio.addons.binding.canopen/pom.xml

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
<dependencies>
3636
<dependency>
3737
<groupId>org.connectorio.addons</groupId>
38-
<artifactId>org.connectorio.addons.binding.can</artifactId>
38+
<artifactId>org.connectorio.addons.network.can</artifactId>
3939
</dependency>
4040
<dependency>
4141
<groupId>org.connectorio.addons</groupId>
@@ -45,16 +45,12 @@
4545
<groupId>org.connectorio.addons</groupId>
4646
<artifactId>org.connectorio.units.si</artifactId>
4747
</dependency>
48+
4849
<dependency>
4950
<groupId>org.apache.plc4x</groupId>
5051
<artifactId>plc4j-driver-canopen</artifactId>
5152
</dependency>
5253

53-
<dependency>
54-
<groupId>org.connectorio.addons</groupId>
55-
<artifactId>org.connectorio.addons.binding.test</artifactId>
56-
</dependency>
57-
5854
<dependency>
5955
<groupId>org.openhab.core.bundles</groupId>
6056
<artifactId>org.openhab.core.config.discovery</artifactId>
@@ -73,21 +69,17 @@
7369
<artifactId>org.connectorio.plc4x.extras.decorator.throttle</artifactId>
7470
</dependency>
7571

76-
<!--
77-
<dependency>
78-
<groupId>org.apache.karaf.features</groupId>
79-
<artifactId>framework</artifactId>
80-
<type>kar</type>
81-
</dependency>
82-
-->
83-
8472
<dependency>
8573
<groupId>org.connectorio.addons</groupId>
8674
<artifactId>org.connectorio.addons.feature.plc4x</artifactId>
8775
<classifier>features</classifier>
8876
<type>xml</type>
8977
</dependency>
9078

79+
<dependency>
80+
<groupId>org.connectorio.addons</groupId>
81+
<artifactId>org.connectorio.addons.binding.test</artifactId>
82+
</dependency>
9183
<dependency>
9284
<groupId>org.junit.jupiter</groupId>
9385
<artifactId>junit-jupiter-api</artifactId>

bundles/org.connectorio.addons.binding.canopen/src/main/java/org/connectorio/addons/binding/canopen/internal/discovery/CoInterfaceDiscoveryDelegate.java

Lines changed: 67 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,49 +19,98 @@
1919

2020
import java.util.Collections;
2121
import java.util.Set;
22-
import org.connectorio.addons.binding.can.CANInterface;
23-
import org.connectorio.addons.binding.can.CANInterfaceTypes;
24-
import org.connectorio.addons.binding.can.discovery.CANInterfaceDiscoveryDelegate;
2522
import org.connectorio.addons.binding.canopen.internal.CANopenBindingConstants;
23+
import org.connectorio.addons.network.Network;
24+
import org.connectorio.addons.network.NetworkType;
25+
import org.connectorio.addons.network.can.CanNetwork;
26+
import org.connectorio.addons.network.can.CanNetworkInterfaceTypes;
27+
import org.connectorio.addons.network.can.CanNetworkTypes;
28+
import org.connectorio.addons.network.iface.NetworkInterface;
29+
import org.connectorio.addons.network.iface.NetworkInterfaceRegistry;
30+
import org.connectorio.addons.network.iface.NetworkInterfaceStateCallback;
2631
import org.openhab.core.config.discovery.AbstractDiscoveryService;
2732
import org.openhab.core.config.discovery.DiscoveryResult;
2833
import org.openhab.core.config.discovery.DiscoveryResultBuilder;
2934
import org.openhab.core.config.discovery.DiscoveryService;
3035
import org.openhab.core.thing.ThingTypeUID;
3136
import org.openhab.core.thing.ThingUID;
37+
import org.osgi.service.component.annotations.Activate;
3238
import org.osgi.service.component.annotations.Component;
39+
import org.osgi.service.component.annotations.Reference;
3340

3441
/**
35-
* Basic discovery service which rely on discovery of CAN interfaces.
42+
* Basic discovery service which rely on network API to discover CAN interface.
3643
*/
37-
@Component(service = {DiscoveryService.class, CANInterfaceDiscoveryDelegate.class})
44+
@Component(service = {DiscoveryService.class, NetworkInterfaceStateCallback.class})
3845
public class CoInterfaceDiscoveryDelegate extends AbstractDiscoveryService implements DiscoveryService,
39-
CANInterfaceDiscoveryDelegate {
46+
NetworkInterfaceStateCallback {
4047

4148
private static final Set<ThingTypeUID> SUPPORTED_THING_TYPES = Collections.singleton(CANopenBindingConstants.SOCKETCAN_BRIDGE_THING_TYPE);
49+
private final NetworkInterfaceRegistry networkInterfaceRegistry;
4250

43-
public CoInterfaceDiscoveryDelegate() throws IllegalArgumentException {
51+
@Activate
52+
public CoInterfaceDiscoveryDelegate(@Reference NetworkInterfaceRegistry networkInterfaceRegistry) throws IllegalArgumentException {
4453
super(SUPPORTED_THING_TYPES, 30, true);
54+
this.networkInterfaceRegistry = networkInterfaceRegistry;
4555
}
4656

4757
@Override
48-
public void interfaceAvailable(CANInterface iface) {
49-
if (CANInterfaceTypes.SOCKET_CAN.equals(iface.getType())) {
50-
final String name = iface.getName();
51-
final DiscoveryResult result = DiscoveryResultBuilder
52-
.create(new ThingUID(CANopenBindingConstants.SOCKETCAN_BRIDGE_THING_TYPE, name))
53-
.withLabel("CANopen interface " + name)
54-
.withProperty("name", name)
55-
.withRepresentationProperty("name")
56-
.build();
58+
protected void startScan() {
59+
for (NetworkInterface networkInterface : networkInterfaceRegistry.getAll()) {
60+
if (isCompatible(networkInterface)) {
61+
discover(networkInterface);
62+
}
63+
}
64+
}
5765

58-
thingDiscovered(result);
66+
@Override
67+
public void networkInterfaceUp(NetworkInterface networkInterface) {
68+
if (isCompatible(networkInterface)) {
69+
discover(networkInterface);
5970
}
6071
}
6172

6273
@Override
63-
protected void startScan() {
74+
public void networkInterfaceDown(NetworkInterface networkInterface) {
75+
for (Network network : networkInterface.getNetworks()) {
76+
if (!(network instanceof CanNetwork)) {
77+
continue;
78+
}
79+
80+
// remove all discovery results which point to networks we just lost
81+
thingRemoved(createThingUID(networkInterface));
82+
}
83+
}
84+
85+
private void discover(NetworkInterface networkInterface) {
86+
for (Network network : networkInterface.getNetworks()) {
87+
if (!(network instanceof CanNetwork)) {
88+
continue;
89+
}
90+
91+
CanNetwork canNetwork = (CanNetwork) network;
92+
NetworkType networkType = canNetwork.getType();
93+
if (CanNetworkTypes.CANOPEN.equals(networkType)) {
94+
String name = networkInterface.getUID().getName();
95+
final DiscoveryResult result = DiscoveryResultBuilder
96+
.create(createThingUID(networkInterface))
97+
.withLabel("CANopen interface " + name)
98+
.withProperty("name", name)
99+
.withRepresentationProperty("name")
100+
.build();
101+
102+
thingDiscovered(result);
103+
}
104+
}
105+
}
106+
107+
private static ThingUID createThingUID(NetworkInterface networkInterface) {
108+
return new ThingUID(CANopenBindingConstants.SOCKETCAN_BRIDGE_THING_TYPE, networkInterface.getUID().getName());
109+
}
64110

111+
private static boolean isCompatible(NetworkInterface networkInterface) {
112+
return CanNetworkInterfaceTypes.SOCKETCAN.equals(networkInterface.getInterfaceType()) ||
113+
CanNetworkInterfaceTypes.VCAN.equals(networkInterface.getInterfaceType());
65114
}
66115

67116
}

0 commit comments

Comments
 (0)