Fix node type parsing
Parsing of NodeTypeEndDevice and NodeTypeRouter were swapped.pull/61/head
parent
2707836543
commit
ea73d28213
|
|
@ -142,7 +142,7 @@ ZigbeeDeviceObjectReply *ZigbeeDeviceObject::requestIeeeAddress()
|
||||||
|
|
||||||
ZigbeeDeviceObjectReply *ZigbeeDeviceObject::requestNodeDescriptor()
|
ZigbeeDeviceObjectReply *ZigbeeDeviceObject::requestNodeDescriptor()
|
||||||
{
|
{
|
||||||
qCDebug(dcZigbeeDeviceObject()) << "Request node descriptor from" << m_node;
|
qCDebug(dcZigbeeDeviceObject()) << "Requesting node descriptor from" << m_node;
|
||||||
|
|
||||||
// Build APS request
|
// Build APS request
|
||||||
ZigbeeNetworkRequest request = buildZdoRequest(ZigbeeDeviceProfile::NodeDescriptorRequest);
|
ZigbeeNetworkRequest request = buildZdoRequest(ZigbeeDeviceProfile::NodeDescriptorRequest);
|
||||||
|
|
|
||||||
|
|
@ -38,36 +38,28 @@ ZigbeeDeviceProfile::NodeDescriptor ZigbeeDeviceProfile::parseNodeDescriptor(con
|
||||||
// Parse and set the node descriptor
|
// Parse and set the node descriptor
|
||||||
QDataStream stream(payload);
|
QDataStream stream(payload);
|
||||||
stream.setByteOrder(QDataStream::LittleEndian);
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
quint8 typeDescriptorFlag = 0; quint8 frequencyFlag = 0; quint8 macCapabilitiesFlag = 0;
|
quint8 typeAndDescriptorFlags = 0, frequencyAndApsFlags = 0, macCapabilitiesFlags = 0, descriptorCapabilities = 0;
|
||||||
quint16 serverMaskFlag = 0; quint8 descriptorCapabilitiesFlag = 0;
|
quint16 serverMask = 0;
|
||||||
|
|
||||||
stream >> typeDescriptorFlag >> frequencyFlag >> macCapabilitiesFlag >> nodeDescriptor.manufacturerCode >> nodeDescriptor.maximumBufferSize;
|
stream >> typeAndDescriptorFlags >> frequencyAndApsFlags >> macCapabilitiesFlags >> nodeDescriptor.manufacturerCode >> nodeDescriptor.maximumBufferSize;
|
||||||
stream >> nodeDescriptor.maximumRxSize >> serverMaskFlag >> nodeDescriptor.maximumTxSize >> descriptorCapabilitiesFlag;
|
stream >> nodeDescriptor.maximumRxSize >> serverMask >> nodeDescriptor.maximumTxSize >> descriptorCapabilities;
|
||||||
|
|
||||||
// 0-2 Bit = logical type, 0 = coordinator, 1 = router, 2 = end device
|
nodeDescriptor.nodeType = static_cast<NodeType>(typeAndDescriptorFlags & 0x07);
|
||||||
if (!ZigbeeUtils::checkBitUint8(typeDescriptorFlag, 0) && !ZigbeeUtils::checkBitUint8(typeDescriptorFlag, 1)) {
|
nodeDescriptor.complexDescriptorAvailable = typeAndDescriptorFlags & 0x08;
|
||||||
nodeDescriptor.nodeType = NodeTypeCoordinator;
|
nodeDescriptor.userDescriptorAvailable = typeAndDescriptorFlags & 0x10;
|
||||||
} 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;
|
|
||||||
|
|
||||||
// Frequency band, 5 bits
|
// Frequency band, 5 bits
|
||||||
if (ZigbeeUtils::checkBitUint8(frequencyFlag, 3)) {
|
if (ZigbeeUtils::checkBitUint8(frequencyAndApsFlags, 3)) {
|
||||||
nodeDescriptor.frequencyBand = FrequencyBand868Mhz;
|
nodeDescriptor.frequencyBand = FrequencyBand868Mhz;
|
||||||
} else if (ZigbeeUtils::checkBitUint8(frequencyFlag, 5)) {
|
} else if (ZigbeeUtils::checkBitUint8(frequencyAndApsFlags, 5)) {
|
||||||
nodeDescriptor.frequencyBand = FrequencyBand902Mhz;
|
nodeDescriptor.frequencyBand = FrequencyBand902Mhz;
|
||||||
} else if (ZigbeeUtils::checkBitUint8(frequencyFlag, 6)) {
|
} else if (ZigbeeUtils::checkBitUint8(frequencyAndApsFlags, 6)) {
|
||||||
nodeDescriptor.frequencyBand = FrequencyBand2400Mhz;
|
nodeDescriptor.frequencyBand = FrequencyBand2400Mhz;
|
||||||
}
|
}
|
||||||
|
|
||||||
nodeDescriptor.macCapabilities = parseMacCapabilities(macCapabilitiesFlag);
|
nodeDescriptor.macCapabilities = parseMacCapabilities(macCapabilitiesFlags);
|
||||||
nodeDescriptor.serverMask = parseServerMask(serverMaskFlag);
|
nodeDescriptor.serverMask = parseServerMask(serverMask);
|
||||||
nodeDescriptor.descriptorCapabilities = parseDescriptorCapabilities(descriptorCapabilitiesFlag);
|
nodeDescriptor.descriptorCapabilities = parseDescriptorCapabilities(descriptorCapabilities);
|
||||||
|
|
||||||
return nodeDescriptor;
|
return nodeDescriptor;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -266,14 +266,14 @@ ZigbeeReply *ZigbeeNode::readBindingTableEntries()
|
||||||
|
|
||||||
void ZigbeeNode::initNodeDescriptor()
|
void ZigbeeNode::initNodeDescriptor()
|
||||||
{
|
{
|
||||||
qCDebug(dcZigbeeNode()) << "Request node descriptor from" << this;
|
qCDebug(dcZigbeeNode()) << "Requesting node descriptor from" << this;
|
||||||
ZigbeeDeviceObjectReply *reply = deviceObject()->requestNodeDescriptor();
|
ZigbeeDeviceObjectReply *reply = deviceObject()->requestNodeDescriptor();
|
||||||
connect(reply, &ZigbeeDeviceObjectReply::finished, this, [this, reply](){
|
connect(reply, &ZigbeeDeviceObjectReply::finished, this, [this, reply](){
|
||||||
if (reply->error() != ZigbeeDeviceObjectReply::ErrorNoError) {
|
if (reply->error() != ZigbeeDeviceObjectReply::ErrorNoError) {
|
||||||
qCWarning(dcZigbeeNode()) << "Error occured during initialization of" << this << "Failed to read node descriptor" << reply->error();
|
qCWarning(dcZigbeeNode()) << "Error occured during initialization of" << this << "Failed to read node descriptor" << reply->error();
|
||||||
m_requestRetry++;
|
m_requestRetry++;
|
||||||
if (m_requestRetry < m_requestRetriesMax) {
|
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(); });
|
QTimer::singleShot(500, this, [=](){ initNodeDescriptor(); });
|
||||||
} else {
|
} else {
|
||||||
qCWarning(dcZigbeeNode()) << "Failed to read node descriptor from" << this << "after" << m_requestRetriesMax << "attempts.";
|
qCWarning(dcZigbeeNode()) << "Failed to read node descriptor from" << this << "after" << m_requestRetriesMax << "attempts.";
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue