/**
* Copyright (c) 2010-2016 by the respective copyright holders.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.openhab.binding.maxcube.internal.message;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.commons.codec.binary.Base64;
import org.openhab.binding.maxcube.internal.MaxTokenizer;
import org.openhab.binding.maxcube.internal.Utils;
import org.slf4j.Logger;
/**
* The L message contains real time information about all MAX! devices.
*
* @author Andreas Heil (info@aheil.de)
* @since 1.4.0
*/
public final class L_Message extends Message {
public L_Message(String raw) {
super(raw);
}
public Collection<? extends Device> getDevices(List<Configuration> configurations) {
List<Device> devices = new ArrayList<Device>();
byte[] decodedRawMessage = Base64.decodeBase64(getPayload().getBytes());
MaxTokenizer tokenizer = new MaxTokenizer(decodedRawMessage);
while (tokenizer.hasMoreElements()) {
byte[] token = tokenizer.nextElement();
Device tempDevice = Device.create(token, configurations);
if (tempDevice != null) {
devices.add(tempDevice);
}
}
return devices;
}
public Collection<? extends Device> updateDevices(List<Device> devices, List<Configuration> configurations) {
byte[] decodedRawMessage = Base64.decodeBase64(getPayload().getBytes());
MaxTokenizer tokenizer = new MaxTokenizer(decodedRawMessage);
while (tokenizer.hasMoreElements()) {
byte[] token = tokenizer.nextElement();
String rfAddress = Utils.toHex(token[0] & 0xFF, token[1] & 0xFF, token[2] & 0xFF);
// logger.debug("token: "+token+" rfaddress: "+rfAddress);
Device foundDevice = null;
for (Device device : devices) {
// logger.debug(device.getRFAddress().toUpperCase()+ " vs "+rfAddress);
if (device.getRFAddress().toUpperCase().equals(rfAddress)) {
// logger.debug("Updating device..."+rfAddress);
foundDevice = device;
}
}
if (foundDevice != null) {
foundDevice = Device.update(token, configurations, foundDevice);
// devices.remove(token);
// devices.add(foundDevice);
} else {
Device tempDevice = Device.create(token, configurations);
if (tempDevice != null) {
devices.add(tempDevice);
}
}
}
return devices;
}
@Override
public void debug(Logger logger) {
logger.debug("=== L_Message === ");
logger.trace("\tRAW:" + this.getPayload());
}
@Override
public MessageType getType() {
return MessageType.L;
}
}