queue requests that are sent before the stack is ready
parent
a70afb965d
commit
e16e04d79e
|
|
@ -76,6 +76,14 @@ ZigbeeNetworkReply *ZigbeeNetworkDeconz::sendRequest(const ZigbeeNetworkRequest
|
|||
return reply;
|
||||
}
|
||||
|
||||
if (state() == ZigbeeNetwork::StateStarting) {
|
||||
m_requestQueue.append(reply);
|
||||
connect(reply, &ZigbeeNetworkReply::finished, this, [this, reply](){
|
||||
m_requestQueue.removeAll(reply);
|
||||
});
|
||||
return reply;
|
||||
}
|
||||
|
||||
ZigbeeInterfaceDeconzReply *interfaceReply = m_controller->requestSendRequest(request);
|
||||
connect(interfaceReply, &ZigbeeInterfaceDeconzReply::finished, reply, [this, reply, interfaceReply](){
|
||||
if (interfaceReply->statusCode() != Deconz::StatusCodeSuccess) {
|
||||
|
|
@ -157,6 +165,25 @@ ZigbeeNetworkReply *ZigbeeNetworkDeconz::requestSetPermitJoin(quint16 shortAddre
|
|||
return sendRequest(request);
|
||||
}
|
||||
|
||||
void ZigbeeNetworkDeconz::sendPendingRequests()
|
||||
{
|
||||
while (!m_requestQueue.isEmpty()) {
|
||||
ZigbeeNetworkReply *reply = m_requestQueue.takeFirst();
|
||||
|
||||
ZigbeeInterfaceDeconzReply *interfaceReply = m_controller->requestSendRequest(reply->request());
|
||||
connect(interfaceReply, &ZigbeeInterfaceDeconzReply::finished, reply, [this, reply, interfaceReply](){
|
||||
if (interfaceReply->statusCode() != Deconz::StatusCodeSuccess) {
|
||||
qCWarning(dcZigbeeController()) << "Could not send request to controller. SQN:" << interfaceReply->sequenceNumber() << interfaceReply->statusCode();
|
||||
finishNetworkReply(reply, ZigbeeNetworkReply::ErrorInterfaceError);
|
||||
return;
|
||||
}
|
||||
|
||||
// The request has been sent successfully to the device, start the timeout timer now
|
||||
startWaitingReply(reply);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void ZigbeeNetworkDeconz::setCreateNetworkState(ZigbeeNetworkDeconz::CreateNetworkState state)
|
||||
{
|
||||
if (m_createState == state)
|
||||
|
|
@ -379,6 +406,7 @@ void ZigbeeNetworkDeconz::setCreateNetworkState(ZigbeeNetworkDeconz::CreateNetwo
|
|||
|
||||
setState(StateRunning);
|
||||
setPermitJoining(0);
|
||||
sendPendingRequests();
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -392,6 +420,7 @@ void ZigbeeNetworkDeconz::setCreateNetworkState(ZigbeeNetworkDeconz::CreateNetwo
|
|||
m_initializing = false;
|
||||
setState(StateRunning);
|
||||
setPermitJoining(0);
|
||||
sendPendingRequests();
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
|
@ -534,6 +563,7 @@ void ZigbeeNetworkDeconz::runNetworkInitProcess()
|
|||
|
||||
qCDebug(dcZigbeeNetwork()) << "Set permit join configuration request finished" << reply->statusCode();
|
||||
setState(StateRunning);
|
||||
sendPendingRequests();
|
||||
});
|
||||
|
||||
} else if (m_controller->networkState() == Deconz::NetworkStateOffline) {
|
||||
|
|
|
|||
|
|
@ -68,6 +68,7 @@ private:
|
|||
QString m_protocolVersion;
|
||||
QString m_firmwareVersion;
|
||||
|
||||
QList<ZigbeeNetworkReply*> m_requestQueue;
|
||||
QHash<quint8, ZigbeeNetworkReply *> m_pendingReplies;
|
||||
|
||||
QTimer *m_pollNetworkStateTimer = nullptr;
|
||||
|
|
@ -79,6 +80,8 @@ private:
|
|||
|
||||
ZigbeeNetworkReply *requestSetPermitJoin(quint16 shortAddress = Zigbee::BroadcastAddressAllRouters, quint8 duration = 0xfe);
|
||||
|
||||
void sendPendingRequests();
|
||||
|
||||
protected:
|
||||
void startNetworkInternally();
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue