/** * 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.rfxcom.internal.messages; import java.lang.reflect.Constructor; import java.util.Collections; import java.util.HashMap; import java.util.Map; import org.openhab.binding.rfxcom.internal.RFXComException; import org.openhab.binding.rfxcom.internal.messages.RFXComBaseMessage.PacketType; public class RFXComMessageFactory { final static String classUrl = "org.openhab.binding.rfxcom.internal.messages."; @SuppressWarnings("serial") private static final Map<PacketType, String> messageClasses = Collections .unmodifiableMap(new HashMap<PacketType, String>() { { put(PacketType.INTERFACE_CONTROL, "RFXComControlMessage"); put(PacketType.INTERFACE_MESSAGE, "RFXComInterfaceMessage"); put(PacketType.TRANSMITTER_MESSAGE, "RFXComTransmitterMessage"); put(PacketType.UNDECODED_RF_MESSAGE, "RFXComUndecodedRFMessage"); put(PacketType.LIGHTING1, "RFXComLighting1Message"); put(PacketType.LIGHTING2, "RFXComLighting2Message"); put(PacketType.LIGHTING3, "RFXComLighting3Message"); put(PacketType.LIGHTING4, "RFXComLighting4Message"); put(PacketType.LIGHTING5, "RFXComLighting5Message"); put(PacketType.LIGHTING6, "RFXComLighting6Message"); put(PacketType.CHIME, "RFXComChimeMessage"); put(PacketType.FAN, "RFXComFanMessage"); put(PacketType.CURTAIN1, "RFXComCurtain1Message"); put(PacketType.BLINDS1, "RFXComBlinds1Message"); put(PacketType.RFY, "RFXComRfyMessage"); put(PacketType.SECURITY1, "RFXComSecurity1Message"); put(PacketType.SECURITY2, "RFXComSecurity2Message"); put(PacketType.CAMERA1, "RFXComCamera1Message"); put(PacketType.REMOTE_CONTROL, "RFXComRemoteControlMessage"); put(PacketType.THERMOSTAT1, "RFXComThermostat1Message"); put(PacketType.THERMOSTAT2, "RFXComThermostat2Message"); put(PacketType.THERMOSTAT3, "RFXComThermostat3Message"); put(PacketType.BBQ1, "RFXComBBQMessage"); put(PacketType.TEMPERATURE_RAIN, "RFXComTemperatureRainMessage"); put(PacketType.TEMPERATURE, "RFXComTemperatureMessage"); put(PacketType.HUMIDITY, "RFXComHumidityMessage"); put(PacketType.TEMPERATURE_HUMIDITY, "RFXComTemperatureHumidityMessage"); put(PacketType.BAROMETRIC, "RFXComBarometricMessage"); put(PacketType.TEMPERATURE_HUMIDITY_BAROMETRIC, "RFXComTemperatureHumidityBarometricMessage"); put(PacketType.RAIN, "RFXComRainMessage"); put(PacketType.WIND, "RFXComWindMessage"); put(PacketType.UV, "RFXComUVMessage"); put(PacketType.DATE_TIME, "RFXComDateTimeMessage"); put(PacketType.CURRENT, "RFXComCurrentMessage"); put(PacketType.ENERGY, "RFXComEnergyMessage"); put(PacketType.CURRENT_ENERGY, "RFXComCurrentEnergyMessage"); put(PacketType.POWER, "RFXComPowerMessage"); put(PacketType.WEIGHT, "RFXComWeightMessage"); put(PacketType.GAS, "RFXComGasMessage"); put(PacketType.WATER, "RFXComWaterMessage"); put(PacketType.RFXSENSOR, "RFXComRFXSensorMessage"); put(PacketType.RFXMETER, "RFXComRFXMeterMessage"); put(PacketType.FS20, "RFXComFS20Message"); put(PacketType.IO_LINES, "RFXComIOLinesMessage"); } }); /** * Command to reset RFXCOM controller. * */ public final static byte[] CMD_RESET = new byte[] { 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; /** * Command to get RFXCOM controller status. * */ public final static byte[] CMD_STATUS = new byte[] { 0x0D, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; /** * Command to save RFXCOM controller configuration. * */ public final static byte[] CMD_SAVE = new byte[] { 0x0D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; public static RFXComMessageInterface getMessageInterface(PacketType packetType) throws RFXComException { try { String className = messageClasses.get(packetType); Class<?> cl = Class.forName(classUrl + className); return (RFXComMessageInterface) cl.newInstance(); } catch (ClassNotFoundException e) { throw new RFXComException("Message " + packetType + " not implemented", e); } catch (Exception e) { throw new RFXComException(e); } } public static RFXComMessageInterface getMessageInterface(byte[] packet) throws RFXComException { PacketType packetType = getPacketType(packet[1]); try { String className = messageClasses.get(packetType); Class<?> cl = Class.forName(classUrl + className); Constructor<?> c = cl.getConstructor(byte[].class); return (RFXComMessageInterface) c.newInstance(packet); } catch (ClassNotFoundException e) { throw new RFXComException("Message " + packetType + "(" + packet[1] + ") not implemented", e); } catch (Exception e) { throw new RFXComException(e); } } public static PacketType convertPacketType(String packetType) throws IllegalArgumentException { for (PacketType p : PacketType.values()) { if (p.toString().equals(packetType)) { return p; } } throw new IllegalArgumentException("Unknown packet type " + packetType); } private static PacketType getPacketType(byte packetType) { for (PacketType p : PacketType.values()) { if (p.toByte() == packetType) { return p; } } return PacketType.UNKNOWN; } }