From ea73d28213e54e8365f7214180a715dd91487d10 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Fri, 26 Aug 2022 22:24:32 +0200 Subject: [PATCH] Fix node type parsing Parsing of NodeTypeEndDevice and NodeTypeRouter were swapped. --- libnymea-zigbee/zdo/zigbeedeviceobject.cpp | 2 +- libnymea-zigbee/zdo/zigbeedeviceprofile.cpp | 34 ++++++++------------- libnymea-zigbee/zigbeenode.cpp | 4 +-- 3 files changed, 16 insertions(+), 24 deletions(-) diff --git a/libnymea-zigbee/zdo/zigbeedeviceobject.cpp b/libnymea-zigbee/zdo/zigbeedeviceobject.cpp index 91918fd..a454cac 100644 --- a/libnymea-zigbee/zdo/zigbeedeviceobject.cpp +++ b/libnymea-zigbee/zdo/zigbeedeviceobject.cpp @@ -142,7 +142,7 @@ ZigbeeDeviceObjectReply *ZigbeeDeviceObject::requestIeeeAddress() ZigbeeDeviceObjectReply *ZigbeeDeviceObject::requestNodeDescriptor() { - qCDebug(dcZigbeeDeviceObject()) << "Request node descriptor from" << m_node; + qCDebug(dcZigbeeDeviceObject()) << "Requesting node descriptor from" << m_node; // Build APS request ZigbeeNetworkRequest request = buildZdoRequest(ZigbeeDeviceProfile::NodeDescriptorRequest); diff --git a/libnymea-zigbee/zdo/zigbeedeviceprofile.cpp b/libnymea-zigbee/zdo/zigbeedeviceprofile.cpp index dda88dc..81b0e1f 100644 --- a/libnymea-zigbee/zdo/zigbeedeviceprofile.cpp +++ b/libnymea-zigbee/zdo/zigbeedeviceprofile.cpp @@ -38,36 +38,28 @@ ZigbeeDeviceProfile::NodeDescriptor ZigbeeDeviceProfile::parseNodeDescriptor(con // Parse and set the node descriptor QDataStream stream(payload); stream.setByteOrder(QDataStream::LittleEndian); - quint8 typeDescriptorFlag = 0; quint8 frequencyFlag = 0; quint8 macCapabilitiesFlag = 0; - quint16 serverMaskFlag = 0; quint8 descriptorCapabilitiesFlag = 0; + quint8 typeAndDescriptorFlags = 0, frequencyAndApsFlags = 0, macCapabilitiesFlags = 0, descriptorCapabilities = 0; + quint16 serverMask = 0; - stream >> typeDescriptorFlag >> frequencyFlag >> macCapabilitiesFlag >> nodeDescriptor.manufacturerCode >> nodeDescriptor.maximumBufferSize; - stream >> nodeDescriptor.maximumRxSize >> serverMaskFlag >> nodeDescriptor.maximumTxSize >> descriptorCapabilitiesFlag; + stream >> typeAndDescriptorFlags >> frequencyAndApsFlags >> macCapabilitiesFlags >> nodeDescriptor.manufacturerCode >> nodeDescriptor.maximumBufferSize; + stream >> nodeDescriptor.maximumRxSize >> serverMask >> nodeDescriptor.maximumTxSize >> descriptorCapabilities; - // 0-2 Bit = logical type, 0 = coordinator, 1 = router, 2 = end device - if (!ZigbeeUtils::checkBitUint8(typeDescriptorFlag, 0) && !ZigbeeUtils::checkBitUint8(typeDescriptorFlag, 1)) { - nodeDescriptor.nodeType = NodeTypeCoordinator; - } else if (!ZigbeeUtils::checkBitUint8(typeDescriptorFlag, 0) && ZigbeeUtils::checkBitUint8(typeDescriptorFlag, 1)) { - nodeDescriptor.nodeType = NodeTypeRouter; - } else if (ZigbeeUtils::checkBitUint8(typeDescriptorFlag, 0) && !ZigbeeUtils::checkBitUint8(typeDescriptorFlag, 1)) { - nodeDescriptor.nodeType = NodeTypeEndDevice; - } - - nodeDescriptor.complexDescriptorAvailable = (typeDescriptorFlag >> 3) & 0x0001; - nodeDescriptor.userDescriptorAvailable = (typeDescriptorFlag >> 4) & 0x0001; + nodeDescriptor.nodeType = static_cast(typeAndDescriptorFlags & 0x07); + nodeDescriptor.complexDescriptorAvailable = typeAndDescriptorFlags & 0x08; + nodeDescriptor.userDescriptorAvailable = typeAndDescriptorFlags & 0x10; // Frequency band, 5 bits - if (ZigbeeUtils::checkBitUint8(frequencyFlag, 3)) { + if (ZigbeeUtils::checkBitUint8(frequencyAndApsFlags, 3)) { nodeDescriptor.frequencyBand = FrequencyBand868Mhz; - } else if (ZigbeeUtils::checkBitUint8(frequencyFlag, 5)) { + } else if (ZigbeeUtils::checkBitUint8(frequencyAndApsFlags, 5)) { nodeDescriptor.frequencyBand = FrequencyBand902Mhz; - } else if (ZigbeeUtils::checkBitUint8(frequencyFlag, 6)) { + } else if (ZigbeeUtils::checkBitUint8(frequencyAndApsFlags, 6)) { nodeDescriptor.frequencyBand = FrequencyBand2400Mhz; } - nodeDescriptor.macCapabilities = parseMacCapabilities(macCapabilitiesFlag); - nodeDescriptor.serverMask = parseServerMask(serverMaskFlag); - nodeDescriptor.descriptorCapabilities = parseDescriptorCapabilities(descriptorCapabilitiesFlag); + nodeDescriptor.macCapabilities = parseMacCapabilities(macCapabilitiesFlags); + nodeDescriptor.serverMask = parseServerMask(serverMask); + nodeDescriptor.descriptorCapabilities = parseDescriptorCapabilities(descriptorCapabilities); return nodeDescriptor; } diff --git a/libnymea-zigbee/zigbeenode.cpp b/libnymea-zigbee/zigbeenode.cpp index aaeb00b..86be65f 100644 --- a/libnymea-zigbee/zigbeenode.cpp +++ b/libnymea-zigbee/zigbeenode.cpp @@ -266,14 +266,14 @@ ZigbeeReply *ZigbeeNode::readBindingTableEntries() void ZigbeeNode::initNodeDescriptor() { - qCDebug(dcZigbeeNode()) << "Request node descriptor from" << this; + qCDebug(dcZigbeeNode()) << "Requesting node descriptor from" << this; ZigbeeDeviceObjectReply *reply = deviceObject()->requestNodeDescriptor(); connect(reply, &ZigbeeDeviceObjectReply::finished, this, [this, reply](){ if (reply->error() != ZigbeeDeviceObjectReply::ErrorNoError) { qCWarning(dcZigbeeNode()) << "Error occured during initialization of" << this << "Failed to read node descriptor" << reply->error(); m_requestRetry++; if (m_requestRetry < m_requestRetriesMax) { - qCDebug(dcZigbeeNode()) << "Retry to request node descriptor" << m_requestRetry << "/" << m_requestRetriesMax; + qCDebug(dcZigbeeNode()) << "Retrying to request node descriptor" << m_requestRetry << "/" << m_requestRetriesMax; QTimer::singleShot(500, this, [=](){ initNodeDescriptor(); }); } else { qCWarning(dcZigbeeNode()) << "Failed to read node descriptor from" << this << "after" << m_requestRetriesMax << "attempts.";