001/** 002 * Copyright (c) 2014 Digi International Inc., 003 * All rights not expressly granted are reserved. 004 * 005 * This Source Code Form is subject to the terms of the Mozilla Public 006 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 007 * You can obtain one at http://mozilla.org/MPL/2.0/. 008 * 009 * Digi International Inc. 11001 Bren Road East, Minnetonka, MN 55343 010 * ======================================================================= 011 */ 012package com.digi.xbee.api.models; 013 014import java.util.HashMap; 015 016/** 017 * Enumerates the available XBee protocols. The XBee protocol is determined 018 * by the combination of hardware and firmware of an XBee device. 019 */ 020public enum XBeeProtocol { 021 022 // Enumeration entries 023 ZIGBEE(0, "ZigBee"), 024 RAW_802_15_4(1, "802.15.4"), 025 XBEE_WIFI(2, "Wi-Fi"), 026 DIGI_MESH(3, "DigiMesh"), 027 XCITE(4, "XCite"), 028 XTEND(5, "XTend (Legacy)"), 029 XTEND_DM(6, "XTend (DigiMesh)"), 030 SMART_ENERGY(7, "Smart Energy"), 031 DIGI_POINT(8, "Point-to-multipoint"), 032 ZNET(9, "ZNet 2.5"), 033 XC(10, "XSC"), 034 XLR(11, "XLR"), 035 XLR_DM(12, "XLR"), // TODO [XLR_DM] XLR device with DigiMesh support. 036 UNKNOWN(99, "Unknown"); 037 038 // Variables 039 private static final HashMap<Integer, XBeeProtocol> lookupTable = new HashMap<Integer, XBeeProtocol>(); 040 041 private final int id; 042 043 private final String description; 044 045 static { 046 for (XBeeProtocol xbeeProtocol:values()) 047 lookupTable.put(xbeeProtocol.getID(), xbeeProtocol); 048 } 049 050 /** 051 * Class constructor. Instantiates a new {@code XBeeProtocol} enumeration 052 * entry with the given parameters. 053 * 054 * @param id XBee protocol ID. 055 * @param description XBee protocol description. 056 */ 057 private XBeeProtocol(int id, String description) { 058 this.id = id; 059 this.description = description; 060 } 061 062 /** 063 * Returns the XBee protocol ID. 064 * 065 * @return XBee protocol ID. 066 */ 067 public int getID() { 068 return id; 069 } 070 071 /** 072 * Returns the XBee protocol description. 073 * 074 * @return XBee protocol description. 075 */ 076 public String getDescription() { 077 return description; 078 } 079 080 /** 081 * Returns the {@code XBeeProtocol} associated to the given ID. 082 * 083 * @param id The ID of the {@code XBeeProtocol} to retrieve. 084 * 085 * @return The {@code XBeeProtocol} associated to the given ID. 086 */ 087 public static XBeeProtocol get(int id) { 088 if (!lookupTable.containsKey(id)) 089 return UNKNOWN; 090 return lookupTable.get(id); 091 } 092 093 /** 094 * Determines the XBee protocol based on the given Hardware and firmware 095 * versions. 096 * 097 * @param hardwareVersion The hardware version of the protocol to 098 * determine. 099 * @param firmwareVersion The firmware version of the protocol to 100 * determine. 101 * 102 * @return The XBee protocol corresponding to the given hardware and 103 * firmware versions. 104 * 105 * @see HardwareVersion 106 */ 107 public static XBeeProtocol determineProtocol(HardwareVersion hardwareVersion, String firmwareVersion) { 108 if (hardwareVersion == null || firmwareVersion == null || hardwareVersion.getValue() < 0x09) 109 return UNKNOWN; 110 else if (hardwareVersion.getValue() == HardwareVersionEnum.XC09_009.getValue() 111 || hardwareVersion.getValue() == HardwareVersionEnum.XC09_038.getValue()) 112 return XCITE; 113 else if (hardwareVersion.getValue() == HardwareVersionEnum.XT09_XXX.getValue()) { 114 if ((firmwareVersion.length() == 4 && firmwareVersion.startsWith("8")) 115 || (firmwareVersion.length() == 5 && firmwareVersion.charAt(1) == '8')) 116 return XTEND_DM; 117 return XTEND; 118 } 119 else if (hardwareVersion.getValue() == HardwareVersionEnum.XB24_AXX_XX.getValue() 120 || hardwareVersion.getValue() == HardwareVersionEnum.XBP24_AXX_XX.getValue()) { 121 if ((firmwareVersion.length() == 4 && firmwareVersion.startsWith("8"))) 122 return DIGI_MESH; 123 return RAW_802_15_4; 124 } 125 else if (hardwareVersion.getValue() == HardwareVersionEnum.XB24_BXIX_XXX.getValue() 126 || hardwareVersion.getValue() == HardwareVersionEnum.XBP24_BXIX_XXX.getValue()) { 127 if ((firmwareVersion.length() == 4 && firmwareVersion.startsWith("1") && firmwareVersion.endsWith("20")) 128 || (firmwareVersion.length() == 4 && firmwareVersion.startsWith("2"))) 129 return ZIGBEE; 130 else if (firmwareVersion.length() == 4 && firmwareVersion.startsWith("3")) 131 return SMART_ENERGY; 132 return ZNET; 133 } 134 else if (hardwareVersion.getValue() == HardwareVersionEnum.XBP09_DXIX_XXX.getValue()) { 135 if ((firmwareVersion.length() == 4 && firmwareVersion.startsWith("8") 136 || (firmwareVersion.length() == 4 && firmwareVersion.charAt(1) == '8')) 137 || (firmwareVersion.length() == 5 && firmwareVersion.charAt(1) == '8')) 138 return DIGI_MESH; 139 return DIGI_POINT; 140 } 141 else if (hardwareVersion.getValue() == HardwareVersionEnum.XBP09_XCXX_XXX.getValue()) 142 return XC; 143 else if (hardwareVersion.getValue() == HardwareVersionEnum.XBP08_DXXX_XXX.getValue()) 144 return DIGI_POINT; 145 else if (hardwareVersion.getValue() == HardwareVersionEnum.XBP24B.getValue()) { 146 if (firmwareVersion.length() == 4 && firmwareVersion.startsWith("3")) 147 return SMART_ENERGY; 148 return ZIGBEE; 149 } 150 else if (hardwareVersion.getValue() == HardwareVersionEnum.XB24_WF.getValue() 151 || hardwareVersion.getValue() == HardwareVersionEnum.WIFI_ATHEROS.getValue() 152 || hardwareVersion.getValue() == HardwareVersionEnum.SMT_WIFI_ATHEROS.getValue()) 153 return XBEE_WIFI; 154 else if (hardwareVersion.getValue() == HardwareVersionEnum.XBP24C.getValue() 155 || hardwareVersion.getValue() == HardwareVersionEnum.XB24C.getValue()) { 156 if (firmwareVersion.length() == 4 && firmwareVersion.startsWith("5")) 157 return SMART_ENERGY; 158 return ZIGBEE; 159 } 160 else if (hardwareVersion.getValue() == HardwareVersionEnum.XSC_GEN3.getValue() 161 || hardwareVersion.getValue() == HardwareVersionEnum.SRD_868_GEN3.getValue()) { 162 if (firmwareVersion.length() == 4 && firmwareVersion.startsWith("8")) 163 return DIGI_MESH; 164 else if (firmwareVersion.length() == 4 && firmwareVersion.startsWith("1")) 165 return DIGI_POINT; 166 return XC; 167 } 168 else if (hardwareVersion.getValue() == HardwareVersionEnum.XBEE_CELL_TH.getValue()) { 169 return UNKNOWN; 170 } 171 else if (hardwareVersion.getValue() == HardwareVersionEnum.XLR_MODULE.getValue()) { 172 // This is for the old version of the XLR we have (K60), and it is 173 // reporting the firmware of the module (8001), this will change in 174 // future (after K64 integration) reporting the hardware and firmware 175 // version of the baseboard (see the case HardwareVersionEnum.XLR_BASEBOARD). 176 // TODO maybe this should be removed in future, since this case will never be released. 177 return XLR; 178 } 179 else if (hardwareVersion.getValue() == HardwareVersionEnum.XLR_BASEBOARD.getValue()) { 180 // XLR devices with K64 will report the baseboard hardware version, 181 // and also firmware version (the one we have here is 1002, but this value 182 // is not being reported since is an old K60 version, the module fw version 183 // is reported instead). 184 185 // TODO [XLR_DM] The next version of the XLR will add DigiMesh support should be added. 186 // Probably this XLR_DM and XLR will depend on the firmware version. 187 188 return XLR; 189 } 190 else if (hardwareVersion.getValue() == HardwareVersionEnum.XB900HP_NZ.getValue()) { 191 return DIGI_POINT; 192 } 193 // If the hardware is not in the list, lets return Generic, at least 194 // the configuration can be done and the console open. 195 else if (HardwareVersionEnum.get(hardwareVersion.getValue()) == null) { 196 return UNKNOWN; 197 } 198 199 // TODO: Logic protocol goes here. 200 return ZIGBEE; 201 } 202 203 /* 204 * (non-Javadoc) 205 * @see java.lang.Enum#toString() 206 */ 207 @Override 208 public String toString() { 209 return description; 210 } 211}