From e16e04d79e5bcbf34d60a4da8c8b7e45ad491b05 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Sun, 2 Oct 2022 23:27:19 +0200 Subject: [PATCH] queue requests that are sent before the stack is ready --- .../backends/deconz/zigbeenetworkdeconz.cpp | 30 +++++++++++++++++++ .../backends/deconz/zigbeenetworkdeconz.h | 3 ++ 2 files changed, 33 insertions(+) diff --git a/libnymea-zigbee/backends/deconz/zigbeenetworkdeconz.cpp b/libnymea-zigbee/backends/deconz/zigbeenetworkdeconz.cpp index b3f511a..d480d81 100644 --- a/libnymea-zigbee/backends/deconz/zigbeenetworkdeconz.cpp +++ b/libnymea-zigbee/backends/deconz/zigbeenetworkdeconz.cpp @@ -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) { diff --git a/libnymea-zigbee/backends/deconz/zigbeenetworkdeconz.h b/libnymea-zigbee/backends/deconz/zigbeenetworkdeconz.h index 6a5b271..eb36fcc 100644 --- a/libnymea-zigbee/backends/deconz/zigbeenetworkdeconz.h +++ b/libnymea-zigbee/backends/deconz/zigbeenetworkdeconz.h @@ -68,6 +68,7 @@ private: QString m_protocolVersion; QString m_firmwareVersion; + QList m_requestQueue; QHash 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();