Moved find device to its own utility method, and added a specific equals method and reworked some test.

This commit is contained in:
Ziver Koc 2021-03-23 01:57:12 +01:00
parent 7e8938c38c
commit c7e286f51e
166 changed files with 618 additions and 374 deletions

View file

@ -1,12 +1,13 @@
package se.hal.plugin.tellstick;
import se.hal.intf.HalDeviceConfig;
/**
* This interface represents a device configuration and links it to a protocol.
*
* Created by Ziver on 2016-08-18.
*/
public interface TellstickDevice {
public interface TellstickDevice extends HalDeviceConfig {
String getProtocolName(); // TODO: could be implemented in a better way
String getModelName(); // TODO: could be implemented in a better way

View file

@ -37,21 +37,25 @@ public abstract class TellstickProtocol {
private final String model;
public TellstickProtocol(String protocol, String model){
public TellstickProtocol(String protocol, String model) {
this.protocol = protocol;
this.model = model;
}
public String getProtocolName(){
public String getProtocolName() {
return protocol;
}
public String getModelName(){
public String getModelName() {
return model;
}
public TellstickCmd encode(HalEventConfig deviceConfig, HalEventData deviceData){ return null; }
public TellstickCmd encode(HalEventConfig deviceConfig, HalEventData deviceData) {
return null;
}
public abstract List<TellstickDecodedEntry> decode(byte[] data);
@ -59,15 +63,16 @@ public abstract class TellstickProtocol {
private TellstickDevice device;
private HalDeviceData data;
public TellstickDecodedEntry(TellstickDevice device, HalDeviceData data){
public TellstickDecodedEntry(TellstickDevice device, HalDeviceData data) {
this.device = device;
this.data = data;
}
public TellstickDevice getDevice(){
public TellstickDevice getDevice() {
return device;
}
public HalDeviceData getData(){
public HalDeviceData getData() {
return data;
}
}

View file

@ -57,19 +57,15 @@ public class TellstickSerialComm implements Runnable,
private SerialPort serial;
private InputStream in;
private OutputStream out;
private TimedHashSet<String> set; // To check for duplicate transmissions
private TimedHashSet<String> receivedTransmissionSet = new TimedHashSet<>(TRANSMISSION_UNIQUENESS_TTL); // To check for duplicate transmissions
protected TellstickParser parser;
protected TellstickParser parser = new TellstickParser();
private HalDeviceReportListener deviceListener;
private List<TellstickDevice> registeredDevices;
private List<HalDeviceConfig> registeredDevices = Collections.synchronizedList(new ArrayList<HalDeviceConfig>());
public TellstickSerialComm() {
set = new TimedHashSet<>(TRANSMISSION_UNIQUENESS_TTL);
parser = new TellstickParser();
registeredDevices = Collections.synchronizedList(new ArrayList<TellstickDevice>());
}
public TellstickSerialComm() {}
// --------------------------
// Lifecycle methods
@ -79,6 +75,7 @@ public class TellstickSerialComm implements Runnable,
public boolean isAvailable() {
return HalContext.containsProperty(CONFIG_TELLSTICK_COM_PORT);
}
@Override
public void initialize() throws Exception {
initialize(HalContext.getStringProperty(CONFIG_TELLSTICK_COM_PORT));
@ -163,14 +160,16 @@ public class TellstickSerialComm implements Runnable,
entry.getData().setTimestamp(System.currentTimeMillis());
boolean registered = registeredDevices.contains(entry.getDevice());
if (registered && !set.contains(data) || // check for duplicates transmissions of registered devices
!registered && set.contains(data)) { // required duplicate transmissions before reporting unregistered devices
if (registered && !receivedTransmissionSet.contains(data) || // check for duplicates transmissions of registered devices
!registered && receivedTransmissionSet.contains(data)) { // required duplicate transmissions before reporting unregistered devices
//Check for registered device that are in the same group
// Check for registered device that are in the same group
if (entry.getDevice() instanceof TellstickDeviceGroup) {
TellstickDeviceGroup groupProtocol = (TellstickDeviceGroup) entry.getDevice();
for (int i = 0; i < registeredDevices.size(); ++i) { // Don't use foreach for concurrency reasons
TellstickDevice childDevice = registeredDevices.get(i);
HalDeviceConfig childDevice = registeredDevices.get(i);
if (childDevice instanceof TellstickDeviceGroup &&
groupProtocol.equalsGroup((TellstickDeviceGroup)childDevice) &&
!entry.getDevice().equals(childDevice)) {
@ -182,11 +181,12 @@ public class TellstickSerialComm implements Runnable,
reportEvent(entry.getDevice(), entry.getData());
}
}
set.add(data);
receivedTransmissionSet.add(data);
}
private void reportEvent(TellstickDevice tellstickDevice, HalDeviceData deviceData){
private void reportEvent(HalDeviceConfig tellstickDevice, HalDeviceData deviceData) {
if (deviceListener != null)
deviceListener.reportReceived((HalDeviceConfig) tellstickDevice, deviceData);
deviceListener.reportReceived(tellstickDevice, deviceData);
}
@Override
@ -224,14 +224,14 @@ public class TellstickSerialComm implements Runnable,
@Override
public void register(HalDeviceConfig deviceConfig) {
if(deviceConfig instanceof TellstickDevice)
registeredDevices.add((TellstickDevice) deviceConfig);
registeredDevices.add(deviceConfig);
else throw new IllegalArgumentException(
"Device config is not an instance of " + TellstickDevice.class + ": " + deviceConfig.getClass());
}
public <T> List<T> getRegisteredDevices(Class<T> clazz){
ArrayList<T> list = new ArrayList<>();
for (TellstickDevice device : registeredDevices){
for (HalDeviceConfig device : registeredDevices){
if (clazz.isAssignableFrom(device.getClass()))
list.add((T) device);
}

View file

@ -22,6 +22,7 @@
package se.hal.plugin.tellstick.device;
import se.hal.intf.HalDeviceConfig;
import se.hal.intf.HalEventConfig;
import se.hal.intf.HalEventController;
import se.hal.intf.HalEventData;
@ -35,7 +36,7 @@ import zutil.ui.Configurator;
/**
* Created by Ziver on 2015-02-18.
*/
public class NexaSelfLearning implements HalEventConfig,TellstickDevice,TellstickDeviceGroup {
public class NexaSelfLearning implements TellstickDevice, HalEventConfig, TellstickDeviceGroup {
@Configurator.Configurable("House code")
private int house = 0;
@ -55,7 +56,6 @@ public class NexaSelfLearning implements HalEventConfig,TellstickDevice,Tellstic
}
public int getHouse() {
return house;
}
@ -76,11 +76,18 @@ public class NexaSelfLearning implements HalEventConfig,TellstickDevice,Tellstic
}
@Override
public String getProtocolName() { return NexaSelfLearningProtocol.PROTOCOL; }
@Override
public String getModelName() { return NexaSelfLearningProtocol.MODEL; }
public String toString(){
return "house:"+house+
", group:"+group+
", unit:"+unit;
@Override
public Class<? extends HalEventController> getDeviceControllerClass() {
return TellstickSerialComm.class;
}
@Override
public Class<? extends HalEventData> getDeviceDataClass() {
return OnOffEventData.class;
}
@Override
@ -98,19 +105,10 @@ public class NexaSelfLearning implements HalEventConfig,TellstickDevice,Tellstic
(((NexaSelfLearning) obj).group || group );
return false;
}
@Override
public Class<? extends HalEventController> getDeviceControllerClass() {
return TellstickSerialComm.class;
public String toString(){
return "house:" + house +
", group:" + group +
", unit:" + unit;
}
@Override
public Class<? extends HalEventData> getDeviceDataClass() {
return OnOffEventData.class;
}
@Override
public String getProtocolName() { return NexaSelfLearningProtocol.PROTOCOL; }
@Override
public String getModelName() { return NexaSelfLearningProtocol.MODEL; }
}

View file

@ -22,6 +22,7 @@
package se.hal.plugin.tellstick.device;
import se.hal.intf.HalDeviceConfig;
import se.hal.intf.HalEventConfig;
import se.hal.intf.HalEventController;
import se.hal.intf.HalEventData;
@ -34,7 +35,7 @@ import zutil.ui.Configurator;
/**
* Created by Ziver on 2015-02-18.
*/
public class NexaSelfLearningDimmer implements HalEventConfig,TellstickDevice {
public class NexaSelfLearningDimmer implements TellstickDevice, HalEventConfig {
@Configurator.Configurable("House code")
private int house = 0;
@ -50,7 +51,6 @@ public class NexaSelfLearningDimmer implements HalEventConfig,TellstickDevice {
}
public int getHouse() {
return house;
}
@ -65,19 +65,10 @@ public class NexaSelfLearningDimmer implements HalEventConfig,TellstickDevice {
}
public String toString(){
return "house:"+house+
", unit:"+unit;
}
@Override
public boolean equals(Object obj){
if(obj instanceof NexaSelfLearningDimmer)
return ((NexaSelfLearningDimmer) obj).house == house &&
((NexaSelfLearningDimmer)obj).unit == unit;
return false;
}
public String getProtocolName() { return NexaSelfLearningProtocol.PROTOCOL; }
@Override
public String getModelName() { return NexaSelfLearningProtocol.MODEL; }
@Override
@ -90,7 +81,15 @@ public class NexaSelfLearningDimmer implements HalEventConfig,TellstickDevice {
}
@Override
public String getProtocolName() { return NexaSelfLearningProtocol.PROTOCOL; }
public boolean equals(Object obj){
if(obj instanceof NexaSelfLearningDimmer)
return ((NexaSelfLearningDimmer) obj).house == house &&
((NexaSelfLearningDimmer)obj).unit == unit;
return false;
}
@Override
public String getModelName() { return NexaSelfLearningProtocol.MODEL; }
public String toString(){
return "house:" + house +
", unit:" + unit;
}
}

View file

@ -1,5 +1,6 @@
package se.hal.plugin.tellstick.device;
import se.hal.intf.HalDeviceConfig;
import se.hal.intf.HalSensorConfig;
import se.hal.intf.HalSensorController;
import se.hal.intf.HalSensorData;
@ -18,7 +19,7 @@ import java.util.logging.Logger;
/**
* Created by Ziver on 2015-11-19.
*/
public class Oregon0x1A2D implements HalSensorConfig,TellstickDevice {
public class Oregon0x1A2D implements TellstickDevice, HalSensorConfig {
private static final Logger logger = LogUtil.getLogger();
public enum OregonSensorType{
@ -52,17 +53,11 @@ public class Oregon0x1A2D implements HalSensorConfig,TellstickDevice {
return sensorType;
}
@Override
public boolean equals(Object obj){
if(! (obj instanceof Oregon0x1A2D))
return false;
return ((Oregon0x1A2D)obj).address == this.address &&
((Oregon0x1A2D)obj).sensorType == this.sensorType;
}
public String toString(){
return "address:"+address+",sensorType:"+ sensorType;
}
@Override
public String getProtocolName() { return Oregon0x1A2DProtocol.PROTOCOL; }
@Override
public String getModelName() { return Oregon0x1A2DProtocol.MODEL; }
@Override
@ -95,7 +90,15 @@ public class Oregon0x1A2D implements HalSensorConfig,TellstickDevice {
}
@Override
public String getProtocolName() { return Oregon0x1A2DProtocol.PROTOCOL; }
public boolean equals(Object obj){
if(obj instanceof Oregon0x1A2D)
return ((Oregon0x1A2D)obj).address == this.address &&
((Oregon0x1A2D)obj).sensorType == this.sensorType;
return false;
}
@Override
public String getModelName() { return Oregon0x1A2DProtocol.MODEL; }
public String toString(){
return "address:" + address + ",sensorType:" + sensorType;
}
}