From 53d471c0aa59a5df9384616ba9c6c51a539b613e Mon Sep 17 00:00:00 2001 From: Ziver Koc Date: Fri, 25 Jun 2021 22:26:02 +0200 Subject: [PATCH] Changed device listener to be a list instead of single listener --- .../se/hal/intf/HalAbstractController.java | 4 +-- .../intf/HalAbstractControllerManager.java | 6 ++-- .../se/hal/EventControllerManagerTest.java | 2 +- .../se/hal/SensorControllerManagerTest.java | 2 +- .../se/hal/plugin/dummy/DummyController.java | 19 ++++------ .../src/se/hal/plugin/dummy/DummyDevice.java | 5 +-- .../{ => device}/DummyHumiditySensor.java | 4 ++- .../dummy/{ => device}/DummySwitchEvent.java | 4 ++- .../{ => device}/DummyTemperatureSensor.java | 4 ++- .../src/se/hal/plugin/dummy/plugin.json | 6 ++-- .../se/hal/plugin/mqtt/HalMqttController.java | 20 +++++++---- .../hal/plugin/netscan/NetScanController.java | 27 ++++++++------ .../hal/plugin/nutups/NutUpsController.java | 23 +++++++----- .../hal/plugin/nvr/rtsp/RTSPController.java | 7 ++-- .../hal/plugin/raspberry/RPiController.java | 35 +++++++++---------- .../RPiPowerConsumptionSensor.java | 3 +- .../{ => device}/RPiTemperatureSensor.java | 3 +- .../plugin/raspberry/hardware/RPiDS18B20.java | 5 ++- .../RPiInteruptPulseFlankCounter.java | 2 +- .../src/se/hal/plugin/raspberry/plugin.json | 4 +-- .../plugin/tellstick/TellstickSerialComm.java | 10 +++--- .../deconz/zigbee/DeConzZigbeeController.java | 2 +- .../plugin/zigbee/HalZigbeeController.java | 12 ++++--- .../hal/plugin/zwave/HalZWaveController.java | 8 ++--- 24 files changed, 120 insertions(+), 97 deletions(-) rename plugins/hal-dummy/src/se/hal/plugin/dummy/{ => device}/DummyHumiditySensor.java (89%) rename plugins/hal-dummy/src/se/hal/plugin/dummy/{ => device}/DummySwitchEvent.java (87%) rename plugins/hal-dummy/src/se/hal/plugin/dummy/{ => device}/DummyTemperatureSensor.java (89%) rename plugins/hal-raspberry/src/se/hal/plugin/raspberry/{ => device}/RPiPowerConsumptionSensor.java (94%) rename plugins/hal-raspberry/src/se/hal/plugin/raspberry/{ => device}/RPiTemperatureSensor.java (93%) diff --git a/hal-core/src/se/hal/intf/HalAbstractController.java b/hal-core/src/se/hal/intf/HalAbstractController.java index aea8acaf..2457d751 100644 --- a/hal-core/src/se/hal/intf/HalAbstractController.java +++ b/hal-core/src/se/hal/intf/HalAbstractController.java @@ -59,9 +59,9 @@ public interface HalAbstractController { int size(); /** - * Set a listener that will receive all reports from the the registered devices. + * Add a listener to the controller that will receive all device reports from registered devices. */ - void setListener(HalDeviceReportListener listener); + void addListener(HalDeviceReportListener listener); /** * Close any resources associated with this controller. diff --git a/hal-core/src/se/hal/intf/HalAbstractControllerManager.java b/hal-core/src/se/hal/intf/HalAbstractControllerManager.java index f6f44467..dadb98d1 100644 --- a/hal-core/src/se/hal/intf/HalAbstractControllerManager.java +++ b/hal-core/src/se/hal/intf/HalAbstractControllerManager.java @@ -19,7 +19,7 @@ public abstract class HalAbstractControllerManager controllerMap; + protected static Map controllerMap = new ConcurrentHashMap<>();; /** All available sensor plugins **/ protected List> availableDeviceConfigs = new ArrayList<>(); @@ -43,8 +43,6 @@ public abstract class HalAbstractControllerManager(); - for (Iterator> it = pluginManager.getClassIterator(HalAutostartController.class); it.hasNext(); ) { Class controller = it.next(); getControllerInstance(controller); // Instantiate controller @@ -152,7 +150,7 @@ public abstract class HalAbstractControllerManager registeredDevices = new ArrayList(); - private HalDeviceReportListener sensorListener; - private HalDeviceReportListener eventListener; + private List deviceListeners = new CopyOnWriteArrayList<>(); public DummyController() {} @@ -36,10 +36,8 @@ public class DummyController implements HalSensorController, HalEventController, for (DummyDevice device : registeredDevices) { HalDeviceData data = device.generateData(); - if (sensorListener != null && data instanceof HalSensorData) { - sensorListener.reportReceived((HalSensorConfig) device, (HalSensorData) data); - } else if (eventListener != null && data instanceof HalEventData) { - eventListener.reportReceived((HalEventConfig) device, (HalEventData) data); + for (HalDeviceReportListener deviceListener : deviceListeners) { + deviceListener.reportReceived(device, data); } } } catch (Exception e) { @@ -60,7 +58,7 @@ public class DummyController implements HalSensorController, HalEventController, @Override public synchronized void send(HalEventConfig eventConfig, HalEventData eventData) { - // Nothing to do as this is a dummy + // Nothing to do as this is a dummy controller } @Override @@ -69,11 +67,8 @@ public class DummyController implements HalSensorController, HalEventController, } @Override - public void setListener(HalDeviceReportListener listener) { - if (listener instanceof SensorControllerManager) - sensorListener = listener; - else if (listener instanceof EventControllerManager) - eventListener = listener; + public void addListener(HalDeviceReportListener listener) { + deviceListeners.add(listener); } @Override diff --git a/plugins/hal-dummy/src/se/hal/plugin/dummy/DummyDevice.java b/plugins/hal-dummy/src/se/hal/plugin/dummy/DummyDevice.java index 7f6fe9cc..cb09e504 100644 --- a/plugins/hal-dummy/src/se/hal/plugin/dummy/DummyDevice.java +++ b/plugins/hal-dummy/src/se/hal/plugin/dummy/DummyDevice.java @@ -24,9 +24,10 @@ package se.hal.plugin.dummy; +import se.hal.intf.HalDeviceConfig; import se.hal.intf.HalDeviceData; -public interface DummyDevice { +public interface DummyDevice extends HalDeviceConfig { - public HalDeviceData generateData(); + HalDeviceData generateData(); } diff --git a/plugins/hal-dummy/src/se/hal/plugin/dummy/DummyHumiditySensor.java b/plugins/hal-dummy/src/se/hal/plugin/dummy/device/DummyHumiditySensor.java similarity index 89% rename from plugins/hal-dummy/src/se/hal/plugin/dummy/DummyHumiditySensor.java rename to plugins/hal-dummy/src/se/hal/plugin/dummy/device/DummyHumiditySensor.java index b41e2eb8..9757584e 100644 --- a/plugins/hal-dummy/src/se/hal/plugin/dummy/DummyHumiditySensor.java +++ b/plugins/hal-dummy/src/se/hal/plugin/dummy/device/DummyHumiditySensor.java @@ -1,9 +1,11 @@ -package se.hal.plugin.dummy; +package se.hal.plugin.dummy.device; import se.hal.intf.HalDeviceData; import se.hal.intf.HalSensorConfig; import se.hal.intf.HalSensorController; import se.hal.intf.HalSensorData; +import se.hal.plugin.dummy.DummyController; +import se.hal.plugin.dummy.DummyDevice; import se.hal.struct.devicedata.HumiditySensorData; diff --git a/plugins/hal-dummy/src/se/hal/plugin/dummy/DummySwitchEvent.java b/plugins/hal-dummy/src/se/hal/plugin/dummy/device/DummySwitchEvent.java similarity index 87% rename from plugins/hal-dummy/src/se/hal/plugin/dummy/DummySwitchEvent.java rename to plugins/hal-dummy/src/se/hal/plugin/dummy/device/DummySwitchEvent.java index 18c0ec9d..48109116 100644 --- a/plugins/hal-dummy/src/se/hal/plugin/dummy/DummySwitchEvent.java +++ b/plugins/hal-dummy/src/se/hal/plugin/dummy/device/DummySwitchEvent.java @@ -1,9 +1,11 @@ -package se.hal.plugin.dummy; +package se.hal.plugin.dummy.device; import se.hal.intf.HalDeviceData; import se.hal.intf.HalEventConfig; import se.hal.intf.HalEventController; import se.hal.intf.HalEventData; +import se.hal.plugin.dummy.DummyController; +import se.hal.plugin.dummy.DummyDevice; import se.hal.struct.devicedata.OnOffEventData; public class DummySwitchEvent implements DummyDevice, HalEventConfig { diff --git a/plugins/hal-dummy/src/se/hal/plugin/dummy/DummyTemperatureSensor.java b/plugins/hal-dummy/src/se/hal/plugin/dummy/device/DummyTemperatureSensor.java similarity index 89% rename from plugins/hal-dummy/src/se/hal/plugin/dummy/DummyTemperatureSensor.java rename to plugins/hal-dummy/src/se/hal/plugin/dummy/device/DummyTemperatureSensor.java index 54b3b516..cf5d8262 100644 --- a/plugins/hal-dummy/src/se/hal/plugin/dummy/DummyTemperatureSensor.java +++ b/plugins/hal-dummy/src/se/hal/plugin/dummy/device/DummyTemperatureSensor.java @@ -1,9 +1,11 @@ -package se.hal.plugin.dummy; +package se.hal.plugin.dummy.device; import se.hal.intf.HalDeviceData; import se.hal.intf.HalSensorConfig; import se.hal.intf.HalSensorController; import se.hal.intf.HalSensorData; +import se.hal.plugin.dummy.DummyController; +import se.hal.plugin.dummy.DummyDevice; import se.hal.struct.devicedata.TemperatureSensorData; diff --git a/plugins/hal-dummy/src/se/hal/plugin/dummy/plugin.json b/plugins/hal-dummy/src/se/hal/plugin/dummy/plugin.json index 1c771142..b8cbf758 100644 --- a/plugins/hal-dummy/src/se/hal/plugin/dummy/plugin.json +++ b/plugins/hal-dummy/src/se/hal/plugin/dummy/plugin.json @@ -3,8 +3,8 @@ "name": "Hal-Dummy Devices", "description": "Dummy devices with simulated data, can be used for demo or testing purposes.", "interfaces": [ - {"se.hal.intf.HalSensorConfig": "se.hal.plugin.dummy.DummyHumiditySensor"}, - {"se.hal.intf.HalEventConfig": "se.hal.plugin.dummy.DummySwitchEvent"}, - {"se.hal.intf.HalSensorConfig": "se.hal.plugin.dummy.DummyTemperatureSensor"} + {"se.hal.intf.HalEventConfig": "se.hal.plugin.dummy.device.DummySwitchEvent"}, + {"se.hal.intf.HalSensorConfig": "se.hal.plugin.dummy.device.DummyHumiditySensor"}, + {"se.hal.intf.HalSensorConfig": "se.hal.plugin.dummy.device.DummyTemperatureSensor"} ] } \ No newline at end of file diff --git a/plugins/hal-mqtt/src/se/hal/plugin/mqtt/HalMqttController.java b/plugins/hal-mqtt/src/se/hal/plugin/mqtt/HalMqttController.java index 0dc64195..dabdae2c 100644 --- a/plugins/hal-mqtt/src/se/hal/plugin/mqtt/HalMqttController.java +++ b/plugins/hal-mqtt/src/se/hal/plugin/mqtt/HalMqttController.java @@ -36,6 +36,8 @@ import zutil.net.mqtt.MqttSubscriptionListener; import java.io.IOException; import java.net.InetAddress; import java.util.HashMap; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.logging.Level; import java.util.logging.Logger; @@ -46,7 +48,7 @@ public class HalMqttController implements HalAutostartController, MqttSubscripti private MqttBroker mqttBroker; private HashMap topics = new HashMap<>(); - private HalDeviceReportListener eventListener; + private List deviceListeners = new CopyOnWriteArrayList<>(); // -------------------------- // Lifecycle methods @@ -105,8 +107,10 @@ public class HalMqttController implements HalAutostartController, MqttSubscripti if (eventConfig != null && data.length > 0) { HalMqttDeviceData eventData = new HalMqttDeviceData(data); - if (eventListener != null) { - eventListener.reportReceived(eventConfig, eventData); + if (deviceListeners != null) { + for (HalDeviceReportListener deviceListener : deviceListeners) { + deviceListener.reportReceived(eventConfig, eventData); + } } } } @@ -120,8 +124,10 @@ public class HalMqttController implements HalAutostartController, MqttSubscripti if (deviceConfig instanceof HalMqttDeviceConfig) { HalMqttDeviceConfig mqttEvent = (HalMqttDeviceConfig) deviceConfig; topics.put(mqttEvent.getTopic(), mqttEvent); - } else throw new IllegalArgumentException( - "Device config is not an instance of " + HalMqttDeviceConfig.class + ": " + deviceConfig.getClass()); + } else { + throw new IllegalArgumentException( + "Device config is not an instance of " + HalMqttDeviceConfig.class + ": " + deviceConfig.getClass()); + } } @Override @@ -147,7 +153,7 @@ public class HalMqttController implements HalAutostartController, MqttSubscripti } @Override - public void setListener(HalDeviceReportListener listener) { - eventListener = listener; + public void addListener(HalDeviceReportListener listener) { + deviceListeners.add(listener); } } diff --git a/plugins/hal-netscan/src/se/hal/plugin/netscan/NetScanController.java b/plugins/hal-netscan/src/se/hal/plugin/netscan/NetScanController.java index 973dc690..a59410e9 100644 --- a/plugins/hal-netscan/src/se/hal/plugin/netscan/NetScanController.java +++ b/plugins/hal-netscan/src/se/hal/plugin/netscan/NetScanController.java @@ -11,7 +11,9 @@ import zutil.osal.MultiCommandExecutor; import java.net.InetAddress; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -25,19 +27,18 @@ public class NetScanController implements HalEventController, HalAutostartContro private static final String PARAM_IPSCAN = "netscan.ipscan"; private ScheduledExecutorService executor; - private HalDeviceReportListener listener; + private List deviceListeners = new CopyOnWriteArrayList<>(); /** A register and a cache of previous state **/ private HashMap devices = new HashMap<>(); - @Override public boolean isAvailable() { return ! InetUtil.getLocalInet4Address().isEmpty(); } @Override - public void initialize() throws Exception { + public void initialize() { executor = Executors.newScheduledThreadPool(2); executor.scheduleAtFixedRate(NetScanController.this, 10_000, PING_INTERVAL, TimeUnit.MILLISECONDS); if (HalContext.getBooleanProperty(PARAM_IPSCAN, true)) { @@ -64,7 +65,8 @@ public class NetScanController implements HalEventController, HalAutostartContro for (Map.Entry entry : devices.entrySet()) { NetworkDevice device = entry.getKey(); AvailabilityEventData prevData = entry.getValue(); - if (listener != null) { + + if (!deviceListeners.isEmpty()) { // We ping two times to increase reliability boolean ping = false; ping |= InetScanner.isReachable(device.getHost(), executor); @@ -76,7 +78,10 @@ public class NetScanController implements HalEventController, HalAutostartContro AvailabilityEventData newData = new AvailabilityEventData(ping, System.currentTimeMillis()); entry.setValue(newData); logger.fine("IP " + device.getHost() + " state has changed to " + newData); - listener.reportReceived(device, newData); + + for (HalDeviceReportListener deviceListener : deviceListeners) { + deviceListener.reportReceived(device, newData); + } } } } @@ -86,11 +91,13 @@ public class NetScanController implements HalEventController, HalAutostartContro } @Override public void foundInetAddress(InetAddress ip) { - logger.fine("Auto Detected ip: "+ip.getHostAddress()); - if (listener != null) - listener.reportReceived( + logger.fine("Auto Detected ip: " + ip.getHostAddress()); + + for (HalDeviceReportListener deviceListener : deviceListeners) { + deviceListener.reportReceived( new NetworkDevice(ip.getHostAddress()), new AvailabilityEventData(true, System.currentTimeMillis())); + } } @@ -117,8 +124,8 @@ public class NetScanController implements HalEventController, HalAutostartContro @Override - public void setListener(HalDeviceReportListener listener) { - this.listener = listener; + public void addListener(HalDeviceReportListener listener) { + deviceListeners.add(listener); } diff --git a/plugins/hal-nutups/src/se/hal/plugin/nutups/NutUpsController.java b/plugins/hal-nutups/src/se/hal/plugin/nutups/NutUpsController.java index d9d89f81..efbaebb3 100644 --- a/plugins/hal-nutups/src/se/hal/plugin/nutups/NutUpsController.java +++ b/plugins/hal-nutups/src/se/hal/plugin/nutups/NutUpsController.java @@ -57,6 +57,8 @@ import zutil.log.LogUtil; import zutil.osal.linux.app.NutUPSClient; import java.util.HashMap; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -74,7 +76,7 @@ public class NutUpsController implements HalSensorController, HalAutostartContro private HashMap registeredDevices = new HashMap<>(); private NutUPSClient client; private ScheduledExecutorService executor; - private HalDeviceReportListener listener; + private List deviceListeners = new CopyOnWriteArrayList<>(); @@ -98,20 +100,23 @@ public class NutUpsController implements HalSensorController, HalAutostartContro @Override - public void setListener(HalDeviceReportListener listener) { - this.listener = listener; + public void addListener(HalDeviceReportListener listener) { + deviceListeners.add(listener); } @Override public void run() { try { - if (client != null && listener != null) { - for (NutUPSClient.UPSDevice ups : client.getUPSList()) { - NutUpsDevice device = registeredDevices.get(ups.getId()); - if (device == null) - device = new NutUpsDevice(ups); - listener.reportReceived(device, device.read(ups)); + if (client != null) { + for (HalDeviceReportListener deviceListener : deviceListeners) { + for (NutUPSClient.UPSDevice ups : client.getUPSList()) { + NutUpsDevice device = registeredDevices.get(ups.getId()); + if (device == null) + device = new NutUpsDevice(ups); + + deviceListener.reportReceived(device, device.read(ups)); + } } } } catch (Exception e){ diff --git a/plugins/hal-nvr/src/se/hal/plugin/nvr/rtsp/RTSPController.java b/plugins/hal-nvr/src/se/hal/plugin/nvr/rtsp/RTSPController.java index 38b03f3b..01787a01 100644 --- a/plugins/hal-nvr/src/se/hal/plugin/nvr/rtsp/RTSPController.java +++ b/plugins/hal-nvr/src/se/hal/plugin/nvr/rtsp/RTSPController.java @@ -31,6 +31,7 @@ import zutil.log.LogUtil; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.logging.Logger; @@ -40,7 +41,7 @@ public class RTSPController implements HalCameraController { private static final String CONFIG_RECORDING_PATH = "nvr.recording_path"; private List cameras = new ArrayList<>(); - private HalDeviceReportListener listener; + private List deviceListeners = new CopyOnWriteArrayList<>(); public RTSPController() {} @@ -81,8 +82,8 @@ public class RTSPController implements HalCameraController { } @Override - public void setListener(HalDeviceReportListener listener) { - this.listener = listener; + public void addListener(HalDeviceReportListener listener) { + deviceListeners.add(listener); } } diff --git a/plugins/hal-raspberry/src/se/hal/plugin/raspberry/RPiController.java b/plugins/hal-raspberry/src/se/hal/plugin/raspberry/RPiController.java index 2e89f4f2..21771f48 100644 --- a/plugins/hal-raspberry/src/se/hal/plugin/raspberry/RPiController.java +++ b/plugins/hal-raspberry/src/se/hal/plugin/raspberry/RPiController.java @@ -1,11 +1,15 @@ package se.hal.plugin.raspberry; import se.hal.intf.*; +import se.hal.plugin.raspberry.device.RPiPowerConsumptionSensor; +import se.hal.plugin.raspberry.device.RPiTemperatureSensor; import se.hal.plugin.raspberry.hardware.RPiDS18B20; import se.hal.plugin.raspberry.hardware.RPiInteruptPulseFlankCounter; import zutil.log.LogUtil; import java.util.HashMap; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.logging.Level; import java.util.logging.Logger; @@ -13,34 +17,31 @@ public class RPiController implements HalSensorController { private static final Logger logger = LogUtil.getLogger(); private HashMap pinToSensorMap = new HashMap<>(); - private HalDeviceReportListener sensorListener; + private List deviceListeners = new CopyOnWriteArrayList<>(); - public RPiController(){ - } + public RPiController() {} @Override - public void initialize() throws Exception { - - } + public void initialize() {} @Override public void register(HalDeviceConfig deviceConfig) { if (deviceConfig instanceof RPiPowerConsumptionSensor){ RPiPowerConsumptionSensor powerConsumptionSensor = (RPiPowerConsumptionSensor) deviceConfig; int gpioPin = powerConsumptionSensor.getGpioPin(); - if (!pinToSensorMap.containsKey("GPIO_"+gpioPin)){ + if (!pinToSensorMap.containsKey("GPIO_" + gpioPin)){ RPiInteruptPulseFlankCounter impulseCounter = new RPiInteruptPulseFlankCounter(gpioPin, this); - pinToSensorMap.put("GPIO_"+gpioPin, impulseCounter); + pinToSensorMap.put("GPIO_" + gpioPin, impulseCounter); } else { logger.warning("Cannot create a RPiPowerConsumptionSensor on GPIO pin " + gpioPin + " since is already is in use by another sensor."); } } else if (deviceConfig instanceof RPiTemperatureSensor){ RPiTemperatureSensor temperatureSensor = (RPiTemperatureSensor) deviceConfig; String w1Address = temperatureSensor.get1WAddress(); - if (!pinToSensorMap.containsKey("W1_"+w1Address)){ + if (!pinToSensorMap.containsKey("W1_" + w1Address)){ RPiDS18B20 ds12b20 = new RPiDS18B20(w1Address, this); - pinToSensorMap.put("W1_"+w1Address, ds12b20); + pinToSensorMap.put("W1_" + w1Address, ds12b20); } else { logger.warning("Cannot create a RPi1WireTemperatureSensor on 1-Wire address " + w1Address + " since is already is in use by another sensor."); } @@ -53,13 +54,13 @@ public class RPiController implements HalSensorController { public void deregister(HalDeviceConfig deviceConfig) { if (deviceConfig instanceof RPiPowerConsumptionSensor){ RPiPowerConsumptionSensor powerConsumptionSensor = (RPiPowerConsumptionSensor) deviceConfig; - RPiSensor sensorToDeregister = pinToSensorMap.remove("GPIO_"+powerConsumptionSensor.getGpioPin()); + RPiSensor sensorToDeregister = pinToSensorMap.remove("GPIO_" + powerConsumptionSensor.getGpioPin()); if (sensorToDeregister != null){ sensorToDeregister.close(); } } else if (deviceConfig instanceof RPiTemperatureSensor){ RPiTemperatureSensor temperatureSensor = (RPiTemperatureSensor) deviceConfig; - RPiSensor sensorToDeregister = pinToSensorMap.remove("W1_"+temperatureSensor.get1WAddress()); + RPiSensor sensorToDeregister = pinToSensorMap.remove("W1_" + temperatureSensor.get1WAddress()); if (sensorToDeregister != null){ sensorToDeregister.close(); } @@ -75,8 +76,8 @@ public class RPiController implements HalSensorController { } @Override - public void setListener(HalDeviceReportListener listener) { - sensorListener = listener; + public void addListener(HalDeviceReportListener listener) { + deviceListeners.add(listener); } @Override @@ -88,10 +89,8 @@ public class RPiController implements HalSensorController { } public void sendDataReport(HalSensorConfig sensorConfig, HalSensorData sensorData){ - if (sensorListener != null){ - sensorListener.reportReceived(sensorConfig, sensorData); - } else { - logger.log(Level.WARNING, "Could not report data. No registered listener"); + for (HalDeviceReportListener deviceListener : deviceListeners) { + deviceListener.reportReceived(sensorConfig, sensorData); } } diff --git a/plugins/hal-raspberry/src/se/hal/plugin/raspberry/RPiPowerConsumptionSensor.java b/plugins/hal-raspberry/src/se/hal/plugin/raspberry/device/RPiPowerConsumptionSensor.java similarity index 94% rename from plugins/hal-raspberry/src/se/hal/plugin/raspberry/RPiPowerConsumptionSensor.java rename to plugins/hal-raspberry/src/se/hal/plugin/raspberry/device/RPiPowerConsumptionSensor.java index 8d9071c6..59f1082c 100644 --- a/plugins/hal-raspberry/src/se/hal/plugin/raspberry/RPiPowerConsumptionSensor.java +++ b/plugins/hal-raspberry/src/se/hal/plugin/raspberry/device/RPiPowerConsumptionSensor.java @@ -1,8 +1,9 @@ -package se.hal.plugin.raspberry; +package se.hal.plugin.raspberry.device; import se.hal.intf.HalSensorConfig; import se.hal.intf.HalSensorController; import se.hal.intf.HalSensorData; +import se.hal.plugin.raspberry.RPiController; import se.hal.struct.devicedata.PowerConsumptionSensorData; import zutil.ui.conf.Configurator; diff --git a/plugins/hal-raspberry/src/se/hal/plugin/raspberry/RPiTemperatureSensor.java b/plugins/hal-raspberry/src/se/hal/plugin/raspberry/device/RPiTemperatureSensor.java similarity index 93% rename from plugins/hal-raspberry/src/se/hal/plugin/raspberry/RPiTemperatureSensor.java rename to plugins/hal-raspberry/src/se/hal/plugin/raspberry/device/RPiTemperatureSensor.java index 7c93a230..c9d61997 100644 --- a/plugins/hal-raspberry/src/se/hal/plugin/raspberry/RPiTemperatureSensor.java +++ b/plugins/hal-raspberry/src/se/hal/plugin/raspberry/device/RPiTemperatureSensor.java @@ -1,8 +1,9 @@ -package se.hal.plugin.raspberry; +package se.hal.plugin.raspberry.device; import se.hal.intf.HalSensorConfig; import se.hal.intf.HalSensorController; import se.hal.intf.HalSensorData; +import se.hal.plugin.raspberry.RPiController; import se.hal.struct.devicedata.TemperatureSensorData; import zutil.ui.conf.Configurator; diff --git a/plugins/hal-raspberry/src/se/hal/plugin/raspberry/hardware/RPiDS18B20.java b/plugins/hal-raspberry/src/se/hal/plugin/raspberry/hardware/RPiDS18B20.java index 56dc0999..703ccddb 100644 --- a/plugins/hal-raspberry/src/se/hal/plugin/raspberry/hardware/RPiDS18B20.java +++ b/plugins/hal-raspberry/src/se/hal/plugin/raspberry/hardware/RPiDS18B20.java @@ -5,7 +5,7 @@ import com.pi4j.io.w1.W1Master; import com.pi4j.temperature.TemperatureScale; import se.hal.plugin.raspberry.RPiController; import se.hal.plugin.raspberry.RPiSensor; -import se.hal.plugin.raspberry.RPiTemperatureSensor; +import se.hal.plugin.raspberry.device.RPiTemperatureSensor; import se.hal.struct.devicedata.TemperatureSensorData; import zutil.log.LogUtil; @@ -33,12 +33,11 @@ public class RPiDS18B20 implements RPiSensor, Runnable { //print out all sensors found for (TemperatureSensor device : w1Mater.getDevices(TemperatureSensor.class)) { - logger.info(String.format("1-Wire temperature sensor divice found: %-20s: %3.1f"+DEGREE_SIGN+"C\n", device.getName(), device.getTemperature(TemperatureScale.CELSIUS))); + logger.info(String.format("1-Wire temperature sensor device found: %-20s: %3.1f"+DEGREE_SIGN+"C\n", device.getName(), device.getTemperature(TemperatureScale.CELSIUS))); } //schedule job scheduler.scheduleAtFixedRate(this, 10, 60, TimeUnit.SECONDS); //wait 10s and run every 60s - } public void close() { diff --git a/plugins/hal-raspberry/src/se/hal/plugin/raspberry/hardware/RPiInteruptPulseFlankCounter.java b/plugins/hal-raspberry/src/se/hal/plugin/raspberry/hardware/RPiInteruptPulseFlankCounter.java index 83c38690..f21760e7 100644 --- a/plugins/hal-raspberry/src/se/hal/plugin/raspberry/hardware/RPiInteruptPulseFlankCounter.java +++ b/plugins/hal-raspberry/src/se/hal/plugin/raspberry/hardware/RPiInteruptPulseFlankCounter.java @@ -5,7 +5,7 @@ import com.pi4j.io.gpio.event.GpioPinDigitalStateChangeEvent; import com.pi4j.io.gpio.event.GpioPinListenerDigital; import com.pi4j.wiringpi.GpioUtil; import se.hal.plugin.raspberry.RPiController; -import se.hal.plugin.raspberry.RPiPowerConsumptionSensor; +import se.hal.plugin.raspberry.device.RPiPowerConsumptionSensor; import se.hal.plugin.raspberry.RPiSensor; import se.hal.plugin.raspberry.RPiUtility; import se.hal.struct.devicedata.PowerConsumptionSensorData; diff --git a/plugins/hal-raspberry/src/se/hal/plugin/raspberry/plugin.json b/plugins/hal-raspberry/src/se/hal/plugin/raspberry/plugin.json index 8a0359ed..9c30bed0 100644 --- a/plugins/hal-raspberry/src/se/hal/plugin/raspberry/plugin.json +++ b/plugins/hal-raspberry/src/se/hal/plugin/raspberry/plugin.json @@ -2,7 +2,7 @@ "version": 1.0, "name": "Hal-RaspberryPi Sensors", "interfaces": [ - {"se.hal.intf.HalSensorConfig": "se.hal.plugin.raspberry.RPiPowerConsumptionSensor"}, - {"se.hal.intf.HalSensorConfig": "se.hal.plugin.raspberry.RPiTemperatureSensor"} + {"se.hal.intf.HalSensorConfig": "se.hal.plugin.raspberry.device.RPiPowerConsumptionSensor"}, + {"se.hal.intf.HalSensorConfig": "se.hal.plugin.raspberry.device.RPiTemperatureSensor"} ] } \ No newline at end of file diff --git a/plugins/hal-tellstick/src/se/hal/plugin/tellstick/TellstickSerialComm.java b/plugins/hal-tellstick/src/se/hal/plugin/tellstick/TellstickSerialComm.java index d7377386..028eb072 100644 --- a/plugins/hal-tellstick/src/se/hal/plugin/tellstick/TellstickSerialComm.java +++ b/plugins/hal-tellstick/src/se/hal/plugin/tellstick/TellstickSerialComm.java @@ -36,6 +36,7 @@ import java.io.OutputStream; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.Executors; import java.util.logging.Level; import java.util.logging.Logger; @@ -61,7 +62,7 @@ public class TellstickSerialComm implements Runnable, protected TellstickParser parser = new TellstickParser(); - private HalDeviceReportListener deviceListener; + private List deviceListeners = new CopyOnWriteArrayList<>(); private List registeredDevices = Collections.synchronizedList(new ArrayList()); @@ -185,8 +186,9 @@ public class TellstickSerialComm implements Runnable, receivedTransmissionSet.add(data); } private void reportEvent(HalDeviceConfig tellstickDevice, HalDeviceData deviceData) { - if (deviceListener != null) + for (HalDeviceReportListener deviceListener : deviceListeners) { deviceListener.reportReceived(tellstickDevice, deviceData); + } } @Override @@ -249,8 +251,8 @@ public class TellstickSerialComm implements Runnable, } @Override - public void setListener(HalDeviceReportListener listener) { - deviceListener = listener; + public void addListener(HalDeviceReportListener listener) { + deviceListeners.add(listener); } diff --git a/plugins/hal-zigbee-deconz/src/se/hal/plugin/zigbee/deconz/zigbee/DeConzZigbeeController.java b/plugins/hal-zigbee-deconz/src/se/hal/plugin/zigbee/deconz/zigbee/DeConzZigbeeController.java index 3647d33f..95133da5 100644 --- a/plugins/hal-zigbee-deconz/src/se/hal/plugin/zigbee/deconz/zigbee/DeConzZigbeeController.java +++ b/plugins/hal-zigbee-deconz/src/se/hal/plugin/zigbee/deconz/zigbee/DeConzZigbeeController.java @@ -77,7 +77,7 @@ public class DeConzZigbeeController implements HalSensorController, HalEventCont } @Override - public void setListener(HalDeviceReportListener listener) { + public void addListener(HalDeviceReportListener listener) { } diff --git a/plugins/hal-zigbee/src/se/hal/plugin/zigbee/HalZigbeeController.java b/plugins/hal-zigbee/src/se/hal/plugin/zigbee/HalZigbeeController.java index f0a9ca03..8559aea4 100644 --- a/plugins/hal-zigbee/src/se/hal/plugin/zigbee/HalZigbeeController.java +++ b/plugins/hal-zigbee/src/se/hal/plugin/zigbee/HalZigbeeController.java @@ -30,6 +30,7 @@ import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.logging.Level; import java.util.logging.Logger; @@ -58,7 +59,7 @@ public class HalZigbeeController implements HalSensorController, protected ZigBeeNetworkManager networkManager; private Timer permitJoinTimer; - private HalDeviceReportListener deviceListener; + private List deviceListeners = new CopyOnWriteArrayList<>(); private List registeredDevices = new ArrayList<>(); @@ -277,7 +278,7 @@ public class HalZigbeeController implements HalSensorController, cluster.addAttributeListener(new ZclAttributeListener() { @Override public void attributeUpdated(ZclAttribute attribute, Object value) { - if (deviceListener != null) { + for (HalDeviceReportListener deviceListener : deviceListeners) { logger.finer("[Node: " + endpoint.getIeeeAddress() + ", Endpoint: " + endpoint.getEndpointId() + ", Cluster: " + attribute.getCluster().getId() + "] Attribute updated: attribute_name=" + attribute.getName() + ", value=" + attribute.getLastValue()); deviceListener.reportReceived(config, config.getDeviceData(attribute)); } @@ -285,8 +286,9 @@ public class HalZigbeeController implements HalSensorController, }); // // TODO: Notify listener that a device is online - if (deviceListener != null) + for (HalDeviceReportListener deviceListener : deviceListeners) { deviceListener.reportReceived(config, null); + } } } @@ -325,8 +327,8 @@ public class HalZigbeeController implements HalSensorController, } @Override - public void setListener(HalDeviceReportListener listener) { - deviceListener = listener; + public void addListener(HalDeviceReportListener listener) { + deviceListeners.add(listener); } @Override diff --git a/plugins/hal-zwave/src/se/hal/plugin/zwave/HalZWaveController.java b/plugins/hal-zwave/src/se/hal/plugin/zwave/HalZWaveController.java index aff33944..ca3319df 100644 --- a/plugins/hal-zwave/src/se/hal/plugin/zwave/HalZWaveController.java +++ b/plugins/hal-zwave/src/se/hal/plugin/zwave/HalZWaveController.java @@ -6,6 +6,7 @@ import se.hal.intf.*; import zutil.log.LogUtil; import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.AtomicReference; import java.util.logging.Logger; @@ -27,8 +28,7 @@ public class HalZWaveController implements HalSensorController, HalEventControll private Options options; private Manager manager; - private HalDeviceReportListener sensorListener; - private HalDeviceReportListener deviceListener; + private List deviceListeners = new CopyOnWriteArrayList<>(); private List registeredDevices; @@ -320,8 +320,8 @@ public class HalZWaveController implements HalSensorController, HalEventControll } @Override - public void setListener(HalDeviceReportListener listener) { - deviceListener = listener; + public void addListener(HalDeviceReportListener listener) { + deviceListeners.add(listener); } }