Merge PR #45: Fix a crash when ZDO responses come in after the ZDO request timed out
This commit is contained in:
commit
6de3c8318d
@ -653,9 +653,15 @@ ZigbeeNetworkRequest ZigbeeDeviceObject::buildZdoRequest(quint16 zdoRequest)
|
|||||||
ZigbeeDeviceObjectReply *ZigbeeDeviceObject::createZigbeeDeviceObjectReply(const ZigbeeNetworkRequest &request, quint8 transactionSequenceNumber)
|
ZigbeeDeviceObjectReply *ZigbeeDeviceObject::createZigbeeDeviceObjectReply(const ZigbeeNetworkRequest &request, quint8 transactionSequenceNumber)
|
||||||
{
|
{
|
||||||
ZigbeeDeviceObjectReply *zdoReply = new ZigbeeDeviceObjectReply(request, this);
|
ZigbeeDeviceObjectReply *zdoReply = new ZigbeeDeviceObjectReply(request, this);
|
||||||
connect(zdoReply, &ZigbeeDeviceObjectReply::finished, zdoReply, &ZigbeeDeviceObjectReply::deleteLater, Qt::QueuedConnection);
|
|
||||||
zdoReply->m_expectedResponse = static_cast<ZigbeeDeviceProfile::ZdoCommand>(request.clusterId() | 0x8000);
|
zdoReply->m_expectedResponse = static_cast<ZigbeeDeviceProfile::ZdoCommand>(request.clusterId() | 0x8000);
|
||||||
zdoReply->m_transactionSequenceNumber = transactionSequenceNumber;
|
zdoReply->m_transactionSequenceNumber = transactionSequenceNumber;
|
||||||
|
connect(zdoReply, &ZigbeeDeviceObjectReply::finished, this, [=](){
|
||||||
|
zdoReply->deleteLater();
|
||||||
|
m_pendingReplies.remove(transactionSequenceNumber);
|
||||||
|
if (zdoReply->error() != ZigbeeDeviceObjectReply::ErrorNoError) {
|
||||||
|
qCWarning(dcZigbeeDeviceObject()) << "ZDO request error for TSN:" << transactionSequenceNumber;
|
||||||
|
}
|
||||||
|
}, Qt::QueuedConnection);
|
||||||
m_pendingReplies.insert(transactionSequenceNumber, zdoReply);
|
m_pendingReplies.insert(transactionSequenceNumber, zdoReply);
|
||||||
return zdoReply;
|
return zdoReply;
|
||||||
}
|
}
|
||||||
@ -721,7 +727,6 @@ void ZigbeeDeviceObject::finishZdoReply(ZigbeeDeviceObjectReply *zdoReply)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_pendingReplies.remove(zdoReply->transactionSequenceNumber());
|
|
||||||
zdoReply->m_timeoutTimer.stop();
|
zdoReply->m_timeoutTimer.stop();
|
||||||
zdoReply->finished();
|
zdoReply->finished();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -33,7 +33,7 @@ ZigbeeDeviceObjectReply::ZigbeeDeviceObjectReply(const ZigbeeNetworkRequest &req
|
|||||||
QObject(parent),
|
QObject(parent),
|
||||||
m_request(request)
|
m_request(request)
|
||||||
{
|
{
|
||||||
m_timeoutTimer.setInterval(5000);
|
m_timeoutTimer.setInterval(10000);
|
||||||
connect(&m_timeoutTimer, &QTimer::timeout, this, [this](){
|
connect(&m_timeoutTimer, &QTimer::timeout, this, [this](){
|
||||||
m_error = ErrorTimeout;
|
m_error = ErrorTimeout;
|
||||||
emit finished();
|
emit finished();
|
||||||
|
|||||||
Reference in New Issue
Block a user