Changed device listener to be a list instead of single listener

This commit is contained in:
Ziver Koc 2021-06-25 22:26:02 +02:00
parent 8d9896f8b4
commit 53d471c0aa
24 changed files with 120 additions and 97 deletions

View file

@ -59,9 +59,9 @@ public interface HalAbstractController {
int size(); 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. * Close any resources associated with this controller.

View file

@ -19,7 +19,7 @@ public abstract class HalAbstractControllerManager<T extends HalAbstractControll
private static final Logger logger = LogUtil.getLogger(); private static final Logger logger = LogUtil.getLogger();
/** A map of all instantiated controllers **/ /** A map of all instantiated controllers **/
protected static Map<Class, HalAbstractController> controllerMap; protected static Map<Class, HalAbstractController> controllerMap = new ConcurrentHashMap<>();;
/** All available sensor plugins **/ /** All available sensor plugins **/
protected List<Class<? extends C>> availableDeviceConfigs = new ArrayList<>(); protected List<Class<? extends C>> availableDeviceConfigs = new ArrayList<>();
@ -43,8 +43,6 @@ public abstract class HalAbstractControllerManager<T extends HalAbstractControll
synchronized (this) { synchronized (this) {
if (controllerMap == null) { if (controllerMap == null) {
controllerMap = new ConcurrentHashMap<>();
for (Iterator<Class<? extends HalAutostartController>> it = pluginManager.getClassIterator(HalAutostartController.class); it.hasNext(); ) { for (Iterator<Class<? extends HalAutostartController>> it = pluginManager.getClassIterator(HalAutostartController.class); it.hasNext(); ) {
Class controller = it.next(); Class controller = it.next();
getControllerInstance(controller); // Instantiate controller getControllerInstance(controller); // Instantiate controller
@ -152,7 +150,7 @@ public abstract class HalAbstractControllerManager<T extends HalAbstractControll
// Assign the manager as a listener // Assign the manager as a listener
if (this instanceof HalDeviceReportListener) if (this instanceof HalDeviceReportListener)
controller.setListener((HalDeviceReportListener) this); controller.addListener((HalDeviceReportListener) this);
return controller; return controller;
} }

View file

@ -144,7 +144,7 @@ public class EventControllerManagerTest {
} }
@Override @Override
public void setListener(HalDeviceReportListener listener) { } public void addListener(HalDeviceReportListener listener) { }
@Override @Override
public void close() { } public void close() { }

View file

@ -160,7 +160,7 @@ public class SensorControllerManagerTest {
} }
@Override @Override
public void setListener(HalDeviceReportListener listener) { } public void addListener(HalDeviceReportListener listener) { }
@Override @Override
public void close() { } public void close() { }

View file

@ -7,14 +7,14 @@ import se.hal.intf.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
public class DummyController implements HalSensorController, HalEventController, Runnable, HalDaemon { public class DummyController implements HalSensorController, HalEventController, Runnable, HalDaemon {
private List<DummyDevice> registeredDevices = new ArrayList(); private List<DummyDevice> registeredDevices = new ArrayList();
private HalDeviceReportListener sensorListener; private List<HalDeviceReportListener> deviceListeners = new CopyOnWriteArrayList<>();
private HalDeviceReportListener eventListener;
public DummyController() {} public DummyController() {}
@ -36,10 +36,8 @@ public class DummyController implements HalSensorController, HalEventController,
for (DummyDevice device : registeredDevices) { for (DummyDevice device : registeredDevices) {
HalDeviceData data = device.generateData(); HalDeviceData data = device.generateData();
if (sensorListener != null && data instanceof HalSensorData) { for (HalDeviceReportListener deviceListener : deviceListeners) {
sensorListener.reportReceived((HalSensorConfig) device, (HalSensorData) data); deviceListener.reportReceived(device, data);
} else if (eventListener != null && data instanceof HalEventData) {
eventListener.reportReceived((HalEventConfig) device, (HalEventData) data);
} }
} }
} catch (Exception e) { } catch (Exception e) {
@ -60,7 +58,7 @@ public class DummyController implements HalSensorController, HalEventController,
@Override @Override
public synchronized void send(HalEventConfig eventConfig, HalEventData eventData) { 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 @Override
@ -69,11 +67,8 @@ public class DummyController implements HalSensorController, HalEventController,
} }
@Override @Override
public void setListener(HalDeviceReportListener listener) { public void addListener(HalDeviceReportListener listener) {
if (listener instanceof SensorControllerManager) deviceListeners.add(listener);
sensorListener = listener;
else if (listener instanceof EventControllerManager)
eventListener = listener;
} }
@Override @Override

View file

@ -24,9 +24,10 @@
package se.hal.plugin.dummy; package se.hal.plugin.dummy;
import se.hal.intf.HalDeviceConfig;
import se.hal.intf.HalDeviceData; import se.hal.intf.HalDeviceData;
public interface DummyDevice { public interface DummyDevice extends HalDeviceConfig {
public HalDeviceData generateData(); HalDeviceData generateData();
} }

View file

@ -1,9 +1,11 @@
package se.hal.plugin.dummy; package se.hal.plugin.dummy.device;
import se.hal.intf.HalDeviceData; import se.hal.intf.HalDeviceData;
import se.hal.intf.HalSensorConfig; import se.hal.intf.HalSensorConfig;
import se.hal.intf.HalSensorController; import se.hal.intf.HalSensorController;
import se.hal.intf.HalSensorData; import se.hal.intf.HalSensorData;
import se.hal.plugin.dummy.DummyController;
import se.hal.plugin.dummy.DummyDevice;
import se.hal.struct.devicedata.HumiditySensorData; import se.hal.struct.devicedata.HumiditySensorData;

View file

@ -1,9 +1,11 @@
package se.hal.plugin.dummy; package se.hal.plugin.dummy.device;
import se.hal.intf.HalDeviceData; import se.hal.intf.HalDeviceData;
import se.hal.intf.HalEventConfig; import se.hal.intf.HalEventConfig;
import se.hal.intf.HalEventController; import se.hal.intf.HalEventController;
import se.hal.intf.HalEventData; import se.hal.intf.HalEventData;
import se.hal.plugin.dummy.DummyController;
import se.hal.plugin.dummy.DummyDevice;
import se.hal.struct.devicedata.OnOffEventData; import se.hal.struct.devicedata.OnOffEventData;
public class DummySwitchEvent implements DummyDevice, HalEventConfig { public class DummySwitchEvent implements DummyDevice, HalEventConfig {

View file

@ -1,9 +1,11 @@
package se.hal.plugin.dummy; package se.hal.plugin.dummy.device;
import se.hal.intf.HalDeviceData; import se.hal.intf.HalDeviceData;
import se.hal.intf.HalSensorConfig; import se.hal.intf.HalSensorConfig;
import se.hal.intf.HalSensorController; import se.hal.intf.HalSensorController;
import se.hal.intf.HalSensorData; import se.hal.intf.HalSensorData;
import se.hal.plugin.dummy.DummyController;
import se.hal.plugin.dummy.DummyDevice;
import se.hal.struct.devicedata.TemperatureSensorData; import se.hal.struct.devicedata.TemperatureSensorData;

View file

@ -3,8 +3,8 @@
"name": "Hal-Dummy Devices", "name": "Hal-Dummy Devices",
"description": "Dummy devices with simulated data, can be used for demo or testing purposes.", "description": "Dummy devices with simulated data, can be used for demo or testing purposes.",
"interfaces": [ "interfaces": [
{"se.hal.intf.HalSensorConfig": "se.hal.plugin.dummy.DummyHumiditySensor"}, {"se.hal.intf.HalEventConfig": "se.hal.plugin.dummy.device.DummySwitchEvent"},
{"se.hal.intf.HalEventConfig": "se.hal.plugin.dummy.DummySwitchEvent"}, {"se.hal.intf.HalSensorConfig": "se.hal.plugin.dummy.device.DummyHumiditySensor"},
{"se.hal.intf.HalSensorConfig": "se.hal.plugin.dummy.DummyTemperatureSensor"} {"se.hal.intf.HalSensorConfig": "se.hal.plugin.dummy.device.DummyTemperatureSensor"}
] ]
} }

View file

@ -36,6 +36,8 @@ import zutil.net.mqtt.MqttSubscriptionListener;
import java.io.IOException; import java.io.IOException;
import java.net.InetAddress; import java.net.InetAddress;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@ -46,7 +48,7 @@ public class HalMqttController implements HalAutostartController, MqttSubscripti
private MqttBroker mqttBroker; private MqttBroker mqttBroker;
private HashMap<String, HalMqttDeviceConfig> topics = new HashMap<>(); private HashMap<String, HalMqttDeviceConfig> topics = new HashMap<>();
private HalDeviceReportListener eventListener; private List<HalDeviceReportListener> deviceListeners = new CopyOnWriteArrayList<>();
// -------------------------- // --------------------------
// Lifecycle methods // Lifecycle methods
@ -105,8 +107,10 @@ public class HalMqttController implements HalAutostartController, MqttSubscripti
if (eventConfig != null && data.length > 0) { if (eventConfig != null && data.length > 0) {
HalMqttDeviceData eventData = new HalMqttDeviceData(data); HalMqttDeviceData eventData = new HalMqttDeviceData(data);
if (eventListener != null) { if (deviceListeners != null) {
eventListener.reportReceived(eventConfig, eventData); for (HalDeviceReportListener deviceListener : deviceListeners) {
deviceListener.reportReceived(eventConfig, eventData);
}
} }
} }
} }
@ -120,8 +124,10 @@ public class HalMqttController implements HalAutostartController, MqttSubscripti
if (deviceConfig instanceof HalMqttDeviceConfig) { if (deviceConfig instanceof HalMqttDeviceConfig) {
HalMqttDeviceConfig mqttEvent = (HalMqttDeviceConfig) deviceConfig; HalMqttDeviceConfig mqttEvent = (HalMqttDeviceConfig) deviceConfig;
topics.put(mqttEvent.getTopic(), mqttEvent); topics.put(mqttEvent.getTopic(), mqttEvent);
} else throw new IllegalArgumentException( } else {
"Device config is not an instance of " + HalMqttDeviceConfig.class + ": " + deviceConfig.getClass()); throw new IllegalArgumentException(
"Device config is not an instance of " + HalMqttDeviceConfig.class + ": " + deviceConfig.getClass());
}
} }
@Override @Override
@ -147,7 +153,7 @@ public class HalMqttController implements HalAutostartController, MqttSubscripti
} }
@Override @Override
public void setListener(HalDeviceReportListener listener) { public void addListener(HalDeviceReportListener listener) {
eventListener = listener; deviceListeners.add(listener);
} }
} }

View file

@ -11,7 +11,9 @@ import zutil.osal.MultiCommandExecutor;
import java.net.InetAddress; import java.net.InetAddress;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -25,19 +27,18 @@ public class NetScanController implements HalEventController, HalAutostartContro
private static final String PARAM_IPSCAN = "netscan.ipscan"; private static final String PARAM_IPSCAN = "netscan.ipscan";
private ScheduledExecutorService executor; private ScheduledExecutorService executor;
private HalDeviceReportListener listener; private List<HalDeviceReportListener> deviceListeners = new CopyOnWriteArrayList<>();
/** A register and a cache of previous state **/ /** A register and a cache of previous state **/
private HashMap<NetworkDevice, AvailabilityEventData> devices = new HashMap<>(); private HashMap<NetworkDevice, AvailabilityEventData> devices = new HashMap<>();
@Override @Override
public boolean isAvailable() { public boolean isAvailable() {
return ! InetUtil.getLocalInet4Address().isEmpty(); return ! InetUtil.getLocalInet4Address().isEmpty();
} }
@Override @Override
public void initialize() throws Exception { public void initialize() {
executor = Executors.newScheduledThreadPool(2); executor = Executors.newScheduledThreadPool(2);
executor.scheduleAtFixedRate(NetScanController.this, 10_000, PING_INTERVAL, TimeUnit.MILLISECONDS); executor.scheduleAtFixedRate(NetScanController.this, 10_000, PING_INTERVAL, TimeUnit.MILLISECONDS);
if (HalContext.getBooleanProperty(PARAM_IPSCAN, true)) { if (HalContext.getBooleanProperty(PARAM_IPSCAN, true)) {
@ -64,7 +65,8 @@ public class NetScanController implements HalEventController, HalAutostartContro
for (Map.Entry<NetworkDevice, AvailabilityEventData> entry : devices.entrySet()) { for (Map.Entry<NetworkDevice, AvailabilityEventData> entry : devices.entrySet()) {
NetworkDevice device = entry.getKey(); NetworkDevice device = entry.getKey();
AvailabilityEventData prevData = entry.getValue(); AvailabilityEventData prevData = entry.getValue();
if (listener != null) {
if (!deviceListeners.isEmpty()) {
// We ping two times to increase reliability // We ping two times to increase reliability
boolean ping = false; boolean ping = false;
ping |= InetScanner.isReachable(device.getHost(), executor); ping |= InetScanner.isReachable(device.getHost(), executor);
@ -76,7 +78,10 @@ public class NetScanController implements HalEventController, HalAutostartContro
AvailabilityEventData newData = new AvailabilityEventData(ping, System.currentTimeMillis()); AvailabilityEventData newData = new AvailabilityEventData(ping, System.currentTimeMillis());
entry.setValue(newData); entry.setValue(newData);
logger.fine("IP " + device.getHost() + " state has changed to " + 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 @Override
public void foundInetAddress(InetAddress ip) { public void foundInetAddress(InetAddress ip) {
logger.fine("Auto Detected ip: "+ip.getHostAddress()); logger.fine("Auto Detected ip: " + ip.getHostAddress());
if (listener != null)
listener.reportReceived( for (HalDeviceReportListener deviceListener : deviceListeners) {
deviceListener.reportReceived(
new NetworkDevice(ip.getHostAddress()), new NetworkDevice(ip.getHostAddress()),
new AvailabilityEventData(true, System.currentTimeMillis())); new AvailabilityEventData(true, System.currentTimeMillis()));
}
} }
@ -117,8 +124,8 @@ public class NetScanController implements HalEventController, HalAutostartContro
@Override @Override
public void setListener(HalDeviceReportListener listener) { public void addListener(HalDeviceReportListener listener) {
this.listener = listener; deviceListeners.add(listener);
} }

View file

@ -57,6 +57,8 @@ import zutil.log.LogUtil;
import zutil.osal.linux.app.NutUPSClient; import zutil.osal.linux.app.NutUPSClient;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -74,7 +76,7 @@ public class NutUpsController implements HalSensorController, HalAutostartContro
private HashMap<String, NutUpsDevice> registeredDevices = new HashMap<>(); private HashMap<String, NutUpsDevice> registeredDevices = new HashMap<>();
private NutUPSClient client; private NutUPSClient client;
private ScheduledExecutorService executor; private ScheduledExecutorService executor;
private HalDeviceReportListener listener; private List<HalDeviceReportListener> deviceListeners = new CopyOnWriteArrayList<>();
@ -98,20 +100,23 @@ public class NutUpsController implements HalSensorController, HalAutostartContro
@Override @Override
public void setListener(HalDeviceReportListener listener) { public void addListener(HalDeviceReportListener listener) {
this.listener = listener; deviceListeners.add(listener);
} }
@Override @Override
public void run() { public void run() {
try { try {
if (client != null && listener != null) { if (client != null) {
for (NutUPSClient.UPSDevice ups : client.getUPSList()) { for (HalDeviceReportListener deviceListener : deviceListeners) {
NutUpsDevice device = registeredDevices.get(ups.getId()); for (NutUPSClient.UPSDevice ups : client.getUPSList()) {
if (device == null) NutUpsDevice device = registeredDevices.get(ups.getId());
device = new NutUpsDevice(ups); if (device == null)
listener.reportReceived(device, device.read(ups)); device = new NutUpsDevice(ups);
deviceListener.reportReceived(device, device.read(ups));
}
} }
} }
} catch (Exception e){ } catch (Exception e){

View file

@ -31,6 +31,7 @@ import zutil.log.LogUtil;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Logger; 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 static final String CONFIG_RECORDING_PATH = "nvr.recording_path";
private List<RTSPCameraConfig> cameras = new ArrayList<>(); private List<RTSPCameraConfig> cameras = new ArrayList<>();
private HalDeviceReportListener listener; private List<HalDeviceReportListener> deviceListeners = new CopyOnWriteArrayList<>();
public RTSPController() {} public RTSPController() {}
@ -81,8 +82,8 @@ public class RTSPController implements HalCameraController {
} }
@Override @Override
public void setListener(HalDeviceReportListener listener) { public void addListener(HalDeviceReportListener listener) {
this.listener = listener; deviceListeners.add(listener);
} }
} }

View file

@ -1,11 +1,15 @@
package se.hal.plugin.raspberry; package se.hal.plugin.raspberry;
import se.hal.intf.*; 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.RPiDS18B20;
import se.hal.plugin.raspberry.hardware.RPiInteruptPulseFlankCounter; import se.hal.plugin.raspberry.hardware.RPiInteruptPulseFlankCounter;
import zutil.log.LogUtil; import zutil.log.LogUtil;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@ -13,34 +17,31 @@ public class RPiController implements HalSensorController {
private static final Logger logger = LogUtil.getLogger(); private static final Logger logger = LogUtil.getLogger();
private HashMap<String, RPiSensor> pinToSensorMap = new HashMap<>(); private HashMap<String, RPiSensor> pinToSensorMap = new HashMap<>();
private HalDeviceReportListener sensorListener; private List<HalDeviceReportListener> deviceListeners = new CopyOnWriteArrayList<>();
public RPiController(){
} public RPiController() {}
@Override @Override
public void initialize() throws Exception { public void initialize() {}
}
@Override @Override
public void register(HalDeviceConfig deviceConfig) { public void register(HalDeviceConfig deviceConfig) {
if (deviceConfig instanceof RPiPowerConsumptionSensor){ if (deviceConfig instanceof RPiPowerConsumptionSensor){
RPiPowerConsumptionSensor powerConsumptionSensor = (RPiPowerConsumptionSensor) deviceConfig; RPiPowerConsumptionSensor powerConsumptionSensor = (RPiPowerConsumptionSensor) deviceConfig;
int gpioPin = powerConsumptionSensor.getGpioPin(); int gpioPin = powerConsumptionSensor.getGpioPin();
if (!pinToSensorMap.containsKey("GPIO_"+gpioPin)){ if (!pinToSensorMap.containsKey("GPIO_" + gpioPin)){
RPiInteruptPulseFlankCounter impulseCounter = new RPiInteruptPulseFlankCounter(gpioPin, this); RPiInteruptPulseFlankCounter impulseCounter = new RPiInteruptPulseFlankCounter(gpioPin, this);
pinToSensorMap.put("GPIO_"+gpioPin, impulseCounter); pinToSensorMap.put("GPIO_" + gpioPin, impulseCounter);
} else { } else {
logger.warning("Cannot create a RPiPowerConsumptionSensor on GPIO pin " + gpioPin + " since is already is in use by another sensor."); logger.warning("Cannot create a RPiPowerConsumptionSensor on GPIO pin " + gpioPin + " since is already is in use by another sensor.");
} }
} else if (deviceConfig instanceof RPiTemperatureSensor){ } else if (deviceConfig instanceof RPiTemperatureSensor){
RPiTemperatureSensor temperatureSensor = (RPiTemperatureSensor) deviceConfig; RPiTemperatureSensor temperatureSensor = (RPiTemperatureSensor) deviceConfig;
String w1Address = temperatureSensor.get1WAddress(); String w1Address = temperatureSensor.get1WAddress();
if (!pinToSensorMap.containsKey("W1_"+w1Address)){ if (!pinToSensorMap.containsKey("W1_" + w1Address)){
RPiDS18B20 ds12b20 = new RPiDS18B20(w1Address, this); RPiDS18B20 ds12b20 = new RPiDS18B20(w1Address, this);
pinToSensorMap.put("W1_"+w1Address, ds12b20); pinToSensorMap.put("W1_" + w1Address, ds12b20);
} else { } else {
logger.warning("Cannot create a RPi1WireTemperatureSensor on 1-Wire address " + w1Address + " since is already is in use by another sensor."); 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) { public void deregister(HalDeviceConfig deviceConfig) {
if (deviceConfig instanceof RPiPowerConsumptionSensor){ if (deviceConfig instanceof RPiPowerConsumptionSensor){
RPiPowerConsumptionSensor powerConsumptionSensor = (RPiPowerConsumptionSensor) deviceConfig; RPiPowerConsumptionSensor powerConsumptionSensor = (RPiPowerConsumptionSensor) deviceConfig;
RPiSensor sensorToDeregister = pinToSensorMap.remove("GPIO_"+powerConsumptionSensor.getGpioPin()); RPiSensor sensorToDeregister = pinToSensorMap.remove("GPIO_" + powerConsumptionSensor.getGpioPin());
if (sensorToDeregister != null){ if (sensorToDeregister != null){
sensorToDeregister.close(); sensorToDeregister.close();
} }
} else if (deviceConfig instanceof RPiTemperatureSensor){ } else if (deviceConfig instanceof RPiTemperatureSensor){
RPiTemperatureSensor temperatureSensor = (RPiTemperatureSensor) deviceConfig; RPiTemperatureSensor temperatureSensor = (RPiTemperatureSensor) deviceConfig;
RPiSensor sensorToDeregister = pinToSensorMap.remove("W1_"+temperatureSensor.get1WAddress()); RPiSensor sensorToDeregister = pinToSensorMap.remove("W1_" + temperatureSensor.get1WAddress());
if (sensorToDeregister != null){ if (sensorToDeregister != null){
sensorToDeregister.close(); sensorToDeregister.close();
} }
@ -75,8 +76,8 @@ public class RPiController implements HalSensorController {
} }
@Override @Override
public void setListener(HalDeviceReportListener listener) { public void addListener(HalDeviceReportListener listener) {
sensorListener = listener; deviceListeners.add(listener);
} }
@Override @Override
@ -88,10 +89,8 @@ public class RPiController implements HalSensorController {
} }
public void sendDataReport(HalSensorConfig sensorConfig, HalSensorData sensorData){ public void sendDataReport(HalSensorConfig sensorConfig, HalSensorData sensorData){
if (sensorListener != null){ for (HalDeviceReportListener deviceListener : deviceListeners) {
sensorListener.reportReceived(sensorConfig, sensorData); deviceListener.reportReceived(sensorConfig, sensorData);
} else {
logger.log(Level.WARNING, "Could not report data. No registered listener");
} }
} }

View file

@ -1,8 +1,9 @@
package se.hal.plugin.raspberry; package se.hal.plugin.raspberry.device;
import se.hal.intf.HalSensorConfig; import se.hal.intf.HalSensorConfig;
import se.hal.intf.HalSensorController; import se.hal.intf.HalSensorController;
import se.hal.intf.HalSensorData; import se.hal.intf.HalSensorData;
import se.hal.plugin.raspberry.RPiController;
import se.hal.struct.devicedata.PowerConsumptionSensorData; import se.hal.struct.devicedata.PowerConsumptionSensorData;
import zutil.ui.conf.Configurator; import zutil.ui.conf.Configurator;

View file

@ -1,8 +1,9 @@
package se.hal.plugin.raspberry; package se.hal.plugin.raspberry.device;
import se.hal.intf.HalSensorConfig; import se.hal.intf.HalSensorConfig;
import se.hal.intf.HalSensorController; import se.hal.intf.HalSensorController;
import se.hal.intf.HalSensorData; import se.hal.intf.HalSensorData;
import se.hal.plugin.raspberry.RPiController;
import se.hal.struct.devicedata.TemperatureSensorData; import se.hal.struct.devicedata.TemperatureSensorData;
import zutil.ui.conf.Configurator; import zutil.ui.conf.Configurator;

View file

@ -5,7 +5,7 @@ import com.pi4j.io.w1.W1Master;
import com.pi4j.temperature.TemperatureScale; import com.pi4j.temperature.TemperatureScale;
import se.hal.plugin.raspberry.RPiController; import se.hal.plugin.raspberry.RPiController;
import se.hal.plugin.raspberry.RPiSensor; 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 se.hal.struct.devicedata.TemperatureSensorData;
import zutil.log.LogUtil; import zutil.log.LogUtil;
@ -33,12 +33,11 @@ public class RPiDS18B20 implements RPiSensor, Runnable {
//print out all sensors found //print out all sensors found
for (TemperatureSensor device : w1Mater.getDevices(TemperatureSensor.class)) { 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 //schedule job
scheduler.scheduleAtFixedRate(this, 10, 60, TimeUnit.SECONDS); //wait 10s and run every 60s scheduler.scheduleAtFixedRate(this, 10, 60, TimeUnit.SECONDS); //wait 10s and run every 60s
} }
public void close() { public void close() {

View file

@ -5,7 +5,7 @@ import com.pi4j.io.gpio.event.GpioPinDigitalStateChangeEvent;
import com.pi4j.io.gpio.event.GpioPinListenerDigital; import com.pi4j.io.gpio.event.GpioPinListenerDigital;
import com.pi4j.wiringpi.GpioUtil; import com.pi4j.wiringpi.GpioUtil;
import se.hal.plugin.raspberry.RPiController; 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.RPiSensor;
import se.hal.plugin.raspberry.RPiUtility; import se.hal.plugin.raspberry.RPiUtility;
import se.hal.struct.devicedata.PowerConsumptionSensorData; import se.hal.struct.devicedata.PowerConsumptionSensorData;

View file

@ -2,7 +2,7 @@
"version": 1.0, "version": 1.0,
"name": "Hal-RaspberryPi Sensors", "name": "Hal-RaspberryPi Sensors",
"interfaces": [ "interfaces": [
{"se.hal.intf.HalSensorConfig": "se.hal.plugin.raspberry.RPiPowerConsumptionSensor"}, {"se.hal.intf.HalSensorConfig": "se.hal.plugin.raspberry.device.RPiPowerConsumptionSensor"},
{"se.hal.intf.HalSensorConfig": "se.hal.plugin.raspberry.RPiTemperatureSensor"} {"se.hal.intf.HalSensorConfig": "se.hal.plugin.raspberry.device.RPiTemperatureSensor"}
] ]
} }

View file

@ -36,6 +36,7 @@ import java.io.OutputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@ -61,7 +62,7 @@ public class TellstickSerialComm implements Runnable,
protected TellstickParser parser = new TellstickParser(); protected TellstickParser parser = new TellstickParser();
private HalDeviceReportListener deviceListener; private List<HalDeviceReportListener> deviceListeners = new CopyOnWriteArrayList<>();
private List<HalDeviceConfig> registeredDevices = Collections.synchronizedList(new ArrayList<HalDeviceConfig>()); private List<HalDeviceConfig> registeredDevices = Collections.synchronizedList(new ArrayList<HalDeviceConfig>());
@ -185,8 +186,9 @@ public class TellstickSerialComm implements Runnable,
receivedTransmissionSet.add(data); receivedTransmissionSet.add(data);
} }
private void reportEvent(HalDeviceConfig tellstickDevice, HalDeviceData deviceData) { private void reportEvent(HalDeviceConfig tellstickDevice, HalDeviceData deviceData) {
if (deviceListener != null) for (HalDeviceReportListener deviceListener : deviceListeners) {
deviceListener.reportReceived(tellstickDevice, deviceData); deviceListener.reportReceived(tellstickDevice, deviceData);
}
} }
@Override @Override
@ -249,8 +251,8 @@ public class TellstickSerialComm implements Runnable,
} }
@Override @Override
public void setListener(HalDeviceReportListener listener) { public void addListener(HalDeviceReportListener listener) {
deviceListener = listener; deviceListeners.add(listener);
} }

View file

@ -77,7 +77,7 @@ public class DeConzZigbeeController implements HalSensorController, HalEventCont
} }
@Override @Override
public void setListener(HalDeviceReportListener listener) { public void addListener(HalDeviceReportListener listener) {
} }

View file

@ -30,6 +30,7 @@ import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@ -58,7 +59,7 @@ public class HalZigbeeController implements HalSensorController,
protected ZigBeeNetworkManager networkManager; protected ZigBeeNetworkManager networkManager;
private Timer permitJoinTimer; private Timer permitJoinTimer;
private HalDeviceReportListener deviceListener; private List<HalDeviceReportListener> deviceListeners = new CopyOnWriteArrayList<>();
private List<ZigbeeHalDeviceConfig> registeredDevices = new ArrayList<>(); private List<ZigbeeHalDeviceConfig> registeredDevices = new ArrayList<>();
@ -277,7 +278,7 @@ public class HalZigbeeController implements HalSensorController,
cluster.addAttributeListener(new ZclAttributeListener() { cluster.addAttributeListener(new ZclAttributeListener() {
@Override @Override
public void attributeUpdated(ZclAttribute attribute, Object value) { 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()); 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)); deviceListener.reportReceived(config, config.getDeviceData(attribute));
} }
@ -285,8 +286,9 @@ public class HalZigbeeController implements HalSensorController,
}); });
// // TODO: Notify listener that a device is online // // TODO: Notify listener that a device is online
if (deviceListener != null) for (HalDeviceReportListener deviceListener : deviceListeners) {
deviceListener.reportReceived(config, null); deviceListener.reportReceived(config, null);
}
} }
} }
@ -325,8 +327,8 @@ public class HalZigbeeController implements HalSensorController,
} }
@Override @Override
public void setListener(HalDeviceReportListener listener) { public void addListener(HalDeviceReportListener listener) {
deviceListener = listener; deviceListeners.add(listener);
} }
@Override @Override

View file

@ -6,6 +6,7 @@ import se.hal.intf.*;
import zutil.log.LogUtil; import zutil.log.LogUtil;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import java.util.logging.Logger; import java.util.logging.Logger;
@ -27,8 +28,7 @@ public class HalZWaveController implements HalSensorController, HalEventControll
private Options options; private Options options;
private Manager manager; private Manager manager;
private HalDeviceReportListener sensorListener; private List<HalDeviceReportListener> deviceListeners = new CopyOnWriteArrayList<>();
private HalDeviceReportListener deviceListener;
private List<HalAbstractDevice> registeredDevices; private List<HalAbstractDevice> registeredDevices;
@ -320,8 +320,8 @@ public class HalZWaveController implements HalSensorController, HalEventControll
} }
@Override @Override
public void setListener(HalDeviceReportListener listener) { public void addListener(HalDeviceReportListener listener) {
deviceListener = listener; deviceListeners.add(listener);
} }
} }