From 7f977ce0ea2c5b4157d45f7433ac8e3b34f19752 Mon Sep 17 00:00:00 2001 From: David Escalona Date: Fri, 18 Mar 2016 14:31:24 +0100 Subject: [PATCH] Implemented support for the new S1B modules. - Added new devices to the protocol and hardware tables. - Modified node discovery feature for the S1B modules. --- .../java/com/digi/xbee/api/NodeDiscovery.java | 26 +++- .../xbee/api/models/HardwareVersionEnum.java | 8 +- .../digi/xbee/api/models/XBeeProtocol.java | 111 ++++++++++-------- 3 files changed, 93 insertions(+), 52 deletions(-) diff --git a/library/src/main/java/com/digi/xbee/api/NodeDiscovery.java b/library/src/main/java/com/digi/xbee/api/NodeDiscovery.java index a8cf8389..c1e42a09 100644 --- a/library/src/main/java/com/digi/xbee/api/NodeDiscovery.java +++ b/library/src/main/java/com/digi/xbee/api/NodeDiscovery.java @@ -316,12 +316,14 @@ public void packetReceived(XBeePacket receivedPacket) { // In 802.15.4 devices, the discovery finishes when the 'end' command // is received, so it's not necessary to calculate the timeout. - if (xbeeDevice.getXBeeProtocol() != XBeeProtocol.RAW_802_15_4) + // This also applies to S1B devices working in compatibility mode. + boolean is802Compatible = is802Compatible(); + if (!is802Compatible) deadLine += calculateTimeout(listeners); sendNodeDiscoverCommand(id); - if (xbeeDevice.getXBeeProtocol() != XBeeProtocol.RAW_802_15_4) { + if (!is802Compatible) { // Wait for scan timeout. while (discovering) { if (System.currentTimeMillis() < deadLine) @@ -625,4 +627,24 @@ public String toString() { return getClass().getName() + " [" + xbeeDevice.toString() + "] @" + Integer.toHexString(hashCode()); } + + /** + * Checks whether the device performing the node discovery is a legacy + * 802.15.4 device or a S1B device working compatibility mode. + * + * @return {@code true} if the device performing the node discovery is a + * legacy 802.15.4 device or S1B in compatibility mode, {@code false} + * otherwise. + */ + private boolean is802Compatible() { + if (xbeeDevice.getXBeeProtocol() != XBeeProtocol.RAW_802_15_4) + return false; + byte[] param = null; + try { + param = xbeeDevice.getParameter("C8"); + } catch (Exception e) { } + if (param == null || ((param[0] & 0x2) == 2 )) + return true; + return false; + } } \ No newline at end of file diff --git a/library/src/main/java/com/digi/xbee/api/models/HardwareVersionEnum.java b/library/src/main/java/com/digi/xbee/api/models/HardwareVersionEnum.java index a27bfe11..86cbd492 100644 --- a/library/src/main/java/com/digi/xbee/api/models/HardwareVersionEnum.java +++ b/library/src/main/java/com/digi/xbee/api/models/HardwareVersionEnum.java @@ -67,7 +67,13 @@ public enum HardwareVersionEnum { XB24C_TH_DIP(0x2E, "XB24C (TH-DIP): XBee DIP"), XLR_BASEBOARD(0x2F, "XLR Baseboard"), XBP24C_S2C_SMT(0x30, "XBee PRO SMT"), - XTEND_GEN3(0x31, "XTend Gen 3"); + SX_PRO(0x31, "SX Pro"), + S2D_SMT_PRO(0x32, "XBP24D: S2D SMT PRO"), + S2D_SMT_REG(0x33, "XB24D: S2D SMT Reg"), + S2D_TH_PRO(0x34, "XBP24D: S2D TH PRO"), + S2D_TH_REG(0x35, "XB24D: S2D TH Reg"), + SX(0x3E, "SX"), + XTR(0x3F, "XTR"); // Variables private final int value; diff --git a/library/src/main/java/com/digi/xbee/api/models/XBeeProtocol.java b/library/src/main/java/com/digi/xbee/api/models/XBeeProtocol.java index efbcaa1d..44e0dd93 100644 --- a/library/src/main/java/com/digi/xbee/api/models/XBeeProtocol.java +++ b/library/src/main/java/com/digi/xbee/api/models/XBeeProtocol.java @@ -33,6 +33,8 @@ public enum XBeeProtocol { XC(10, "XSC"), XLR(11, "XLR"), XLR_DM(12, "XLR"), // TODO [XLR_DM] XLR device with DigiMesh support. + SX(13, "XBee SX"), + XLR_MODULE(14, "XLR Module"), UNKNOWN(99, "Unknown"); // Variables @@ -105,78 +107,77 @@ public static XBeeProtocol get(int id) { * @see HardwareVersion */ public static XBeeProtocol determineProtocol(HardwareVersion hardwareVersion, String firmwareVersion) { - if (hardwareVersion == null || firmwareVersion == null || hardwareVersion.getValue() < 0x09) + if (hardwareVersion == null || firmwareVersion == null || hardwareVersion.getValue() < 0x09 + || HardwareVersionEnum.get(hardwareVersion.getValue()) == null) return UNKNOWN; - else if (hardwareVersion.getValue() == HardwareVersionEnum.XC09_009.getValue() - || hardwareVersion.getValue() == HardwareVersionEnum.XC09_038.getValue()) + switch (HardwareVersionEnum.get(hardwareVersion.getValue())) { + case XC09_009: + case XC09_038: return XCITE; - else if (hardwareVersion.getValue() == HardwareVersionEnum.XT09_XXX.getValue()) { + case XT09_XXX: + case XT09B_XXX: if ((firmwareVersion.length() == 4 && firmwareVersion.startsWith("8")) || (firmwareVersion.length() == 5 && firmwareVersion.charAt(1) == '8')) return XTEND_DM; return XTEND; - } - else if (hardwareVersion.getValue() == HardwareVersionEnum.XB24_AXX_XX.getValue() - || hardwareVersion.getValue() == HardwareVersionEnum.XBP24_AXX_XX.getValue()) { + case XB24_AXX_XX: + case XBP24_AXX_XX: if ((firmwareVersion.length() == 4 && firmwareVersion.startsWith("8"))) - return DIGI_MESH; + return DIGI_MESH; return RAW_802_15_4; - } - else if (hardwareVersion.getValue() == HardwareVersionEnum.XB24_BXIX_XXX.getValue() - || hardwareVersion.getValue() == HardwareVersionEnum.XBP24_BXIX_XXX.getValue()) { + case XB24_BXIX_XXX: + case XBP24_BXIX_XXX: if ((firmwareVersion.length() == 4 && firmwareVersion.startsWith("1") && firmwareVersion.endsWith("20")) || (firmwareVersion.length() == 4 && firmwareVersion.startsWith("2"))) return ZIGBEE; else if (firmwareVersion.length() == 4 && firmwareVersion.startsWith("3")) return SMART_ENERGY; return ZNET; - } - else if (hardwareVersion.getValue() == HardwareVersionEnum.XBP09_DXIX_XXX.getValue()) { + case XBP09_DXIX_XXX: if ((firmwareVersion.length() == 4 && firmwareVersion.startsWith("8") || (firmwareVersion.length() == 4 && firmwareVersion.charAt(1) == '8')) || (firmwareVersion.length() == 5 && firmwareVersion.charAt(1) == '8')) return DIGI_MESH; return DIGI_POINT; - } - else if (hardwareVersion.getValue() == HardwareVersionEnum.XBP09_XCXX_XXX.getValue()) + case XBP09_XCXX_XXX: return XC; - else if (hardwareVersion.getValue() == HardwareVersionEnum.XBP08_DXXX_XXX.getValue()) + case XBP08_DXXX_XXX: return DIGI_POINT; - else if (hardwareVersion.getValue() == HardwareVersionEnum.XBP24B.getValue()) { + case XBP24B: if (firmwareVersion.length() == 4 && firmwareVersion.startsWith("3")) return SMART_ENERGY; return ZIGBEE; - } - else if (hardwareVersion.getValue() == HardwareVersionEnum.XB24_WF.getValue() - || hardwareVersion.getValue() == HardwareVersionEnum.WIFI_ATHEROS.getValue() - || hardwareVersion.getValue() == HardwareVersionEnum.SMT_WIFI_ATHEROS.getValue()) + case XB24_WF: + case WIFI_ATHEROS: + case SMT_WIFI_ATHEROS: return XBEE_WIFI; - else if (hardwareVersion.getValue() == HardwareVersionEnum.XBP24C.getValue() - || hardwareVersion.getValue() == HardwareVersionEnum.XB24C.getValue()) { - if (firmwareVersion.length() == 4 && firmwareVersion.startsWith("5")) + case XBP24C: + case XB24C: + if (firmwareVersion.length() == 4 && (firmwareVersion.startsWith("5") || firmwareVersion.startsWith("6"))) return SMART_ENERGY; + else if (firmwareVersion.startsWith("2")) + return RAW_802_15_4; return ZIGBEE; - } - else if (hardwareVersion.getValue() == HardwareVersionEnum.XSC_GEN3.getValue() - || hardwareVersion.getValue() == HardwareVersionEnum.SRD_868_GEN3.getValue()) { + case XSC_GEN3: + case SRD_868_GEN3: if (firmwareVersion.length() == 4 && firmwareVersion.startsWith("8")) return DIGI_MESH; else if (firmwareVersion.length() == 4 && firmwareVersion.startsWith("1")) return DIGI_POINT; return XC; - } - else if (hardwareVersion.getValue() == HardwareVersionEnum.XBEE_CELL_TH.getValue()) { + case XBEE_CELL_TH: return UNKNOWN; - } - else if (hardwareVersion.getValue() == HardwareVersionEnum.XLR_MODULE.getValue()) { + case XLR_MODULE: // This is for the old version of the XLR we have (K60), and it is // reporting the firmware of the module (8001), this will change in // future (after K64 integration) reporting the hardware and firmware // version of the baseboard (see the case HardwareVersionEnum.XLR_BASEBOARD). // TODO maybe this should be removed in future, since this case will never be released. - return XLR; - } - else if (hardwareVersion.getValue() == HardwareVersionEnum.XLR_BASEBOARD.getValue()) { + if (firmwareVersion.startsWith("1")) + return XLR; + else + return XLR_MODULE; + case XLR_BASEBOARD: // XLR devices with K64 will report the baseboard hardware version, // and also firmware version (the one we have here is 1002, but this value // is not being reported since is an old K60 version, the module fw version @@ -185,25 +186,37 @@ else if (hardwareVersion.getValue() == HardwareVersionEnum.XLR_BASEBOARD.getValu // TODO [XLR_DM] The next version of the XLR will add DigiMesh support should be added. // Probably this XLR_DM and XLR will depend on the firmware version. - return XLR; - } - else if (hardwareVersion.getValue() == HardwareVersionEnum.XB900HP_NZ.getValue()) { + if (firmwareVersion.startsWith("1")) + return XLR; + else + return XLR_MODULE; + case XB900HP_NZ: return DIGI_POINT; - } - else if (hardwareVersion.getValue() == HardwareVersionEnum.XBP24C_TH_DIP.getValue() - || hardwareVersion.getValue() == HardwareVersionEnum.XB24C_TH_DIP.getValue() - || hardwareVersion.getValue() == HardwareVersionEnum.XBP24C_S2C_SMT.getValue()) { - if (firmwareVersion.length() == 4 && firmwareVersion.startsWith("5")) + case XBP24C_TH_DIP: + case XB24C_TH_DIP: + case XBP24C_S2C_SMT: + if (firmwareVersion.length() == 4 && (firmwareVersion.startsWith("5") || firmwareVersion.startsWith("6"))) return SMART_ENERGY; + else if (firmwareVersion.startsWith("2")) + return RAW_802_15_4; + return ZIGBEE; + case SX_PRO: + case SX: + case XTR: + if (firmwareVersion.startsWith("2")) + return XTEND; + else if (firmwareVersion.startsWith("8")) + return XTEND_DM; + else + return SX; + case S2D_SMT_PRO: + case S2D_SMT_REG: + case S2D_TH_PRO: + case S2D_TH_REG: + return ZIGBEE; + default: return ZIGBEE; } - // If the hardware is not in the list, lets return Unknown. - else if (HardwareVersionEnum.get(hardwareVersion.getValue()) == null) { - return UNKNOWN; - } - - // TODO: Logic protocol goes here. - return ZIGBEE; } /*