Rename to reachable and set state on messages received and prepare lqi request
parent
4eafe285b0
commit
008fd0c55b
|
|
@ -332,6 +332,63 @@ ZigbeeDeviceObjectReply *ZigbeeDeviceObject::requestMgmtLeaveNetwork(bool rejoin
|
||||||
return zdoReply;
|
return zdoReply;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ZigbeeDeviceObjectReply *ZigbeeDeviceObject::requestMgmtLqi(quint8 startIndex)
|
||||||
|
{
|
||||||
|
qCDebug(dcZigbeeDeviceObject()) << "Request lqi table from" << m_node << "start index" << startIndex;
|
||||||
|
|
||||||
|
// Build APS request
|
||||||
|
ZigbeeNetworkRequest request = buildZdoRequest(ZigbeeDeviceProfile::MgmtLqiRequest);
|
||||||
|
|
||||||
|
// Generate a new transaction sequence number for this device object
|
||||||
|
quint8 transactionSequenceNumber = m_transactionSequenceNumber++;
|
||||||
|
|
||||||
|
QByteArray asdu;
|
||||||
|
QDataStream stream(&asdu, QIODevice::WriteOnly);
|
||||||
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
stream << startIndex;
|
||||||
|
|
||||||
|
// Set the ZDO frame as APS request payload
|
||||||
|
request.setAsdu(asdu);
|
||||||
|
|
||||||
|
// Create the device object reply and wait for the response indication
|
||||||
|
ZigbeeDeviceObjectReply *zdoReply = createZigbeeDeviceObjectReply(request, transactionSequenceNumber);
|
||||||
|
|
||||||
|
// Send the request, on finished read the confirm information
|
||||||
|
ZigbeeNetworkReply *networkReply = m_network->sendRequest(request);
|
||||||
|
connect(networkReply, &ZigbeeNetworkReply::finished, this, [this, networkReply, zdoReply](){
|
||||||
|
if (!verifyNetworkError(zdoReply, networkReply)) {
|
||||||
|
qCWarning(dcZigbeeDeviceObject()) << "Failed to send request"
|
||||||
|
<< static_cast<ZigbeeDeviceProfile::ZdoCommand>(networkReply->request().clusterId())
|
||||||
|
<< m_node << networkReply->error()
|
||||||
|
<< networkReply->zigbeeApsStatus();
|
||||||
|
finishZdoReply(zdoReply);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The request was successfully sent to the device
|
||||||
|
// Now check if the expected indication response received already
|
||||||
|
if (zdoReply->isComplete()) {
|
||||||
|
qCDebug(dcZigbeeDeviceObject()) << "Successfully received response for" << static_cast<ZigbeeDeviceProfile::ZdoCommand>(networkReply->request().clusterId());
|
||||||
|
// TODO: pars child table
|
||||||
|
// QByteArray response = zdoReply->responseAdpu().payload;
|
||||||
|
// QDataStream stream(&response, QIODevice::ReadOnly);
|
||||||
|
// stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
// quint8 statusValue; quint8 tableEntries; quint8 startIndex;
|
||||||
|
|
||||||
|
// ZigbeeDeviceProfile::Status status;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
finishZdoReply(zdoReply);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// We received the confirmation but not yet the indication
|
||||||
|
});
|
||||||
|
|
||||||
|
return zdoReply;
|
||||||
|
}
|
||||||
|
|
||||||
ZigbeeNetworkRequest ZigbeeDeviceObject::buildZdoRequest(quint16 zdoRequest)
|
ZigbeeNetworkRequest ZigbeeDeviceObject::buildZdoRequest(quint16 zdoRequest)
|
||||||
{
|
{
|
||||||
ZigbeeNetworkRequest request;
|
ZigbeeNetworkRequest request;
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,8 @@ public:
|
||||||
|
|
||||||
// Management request
|
// Management request
|
||||||
ZigbeeDeviceObjectReply *requestMgmtLeaveNetwork(bool rejoin = false, bool removeChildren = false);
|
ZigbeeDeviceObjectReply *requestMgmtLeaveNetwork(bool rejoin = false, bool removeChildren = false);
|
||||||
|
ZigbeeDeviceObjectReply *requestMgmtLqi(quint8 startIndex = 0x00);
|
||||||
|
|
||||||
|
|
||||||
// TODO: write all requests
|
// TODO: write all requests
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,16 @@ ZigbeeNetwork::ZigbeeNetwork(const QUuid &networkUuid, QObject *parent) :
|
||||||
setPermitJoiningRemaining(m_permitJoiningRemaining);
|
setPermitJoiningRemaining(m_permitJoiningRemaining);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
connect(this, &ZigbeeNetwork::stateChanged, this, [this](ZigbeeNetwork::State state){
|
||||||
|
if (state != ZigbeeNetwork::StateRunning) {
|
||||||
|
foreach (ZigbeeNode *node, m_nodes) {
|
||||||
|
node->setReachable(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
QUuid ZigbeeNetwork::networkUuid() const
|
QUuid ZigbeeNetwork::networkUuid() const
|
||||||
|
|
|
||||||
|
|
@ -46,9 +46,9 @@ ZigbeeNode::State ZigbeeNode::state() const
|
||||||
return m_state;
|
return m_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ZigbeeNode::connected() const
|
bool ZigbeeNode::reachable() const
|
||||||
{
|
{
|
||||||
return m_connected;
|
return m_reachable;
|
||||||
}
|
}
|
||||||
|
|
||||||
QUuid ZigbeeNode::networkUuid() const
|
QUuid ZigbeeNode::networkUuid() const
|
||||||
|
|
@ -127,14 +127,14 @@ void ZigbeeNode::setState(ZigbeeNode::State state)
|
||||||
emit stateChanged(m_state);
|
emit stateChanged(m_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ZigbeeNode::setConnected(bool connected)
|
void ZigbeeNode::setReachable(bool reachable)
|
||||||
{
|
{
|
||||||
if (m_connected == connected)
|
if (m_reachable == reachable)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
qCDebug(dcZigbeeNode()) << "Connected changed" << this << connected;
|
qCDebug(dcZigbeeNode()) << "Reachable changed" << this << reachable;
|
||||||
m_connected = connected;
|
m_reachable = reachable;
|
||||||
emit connectedChanged(m_connected);
|
emit reachableChanged(m_reachable);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ZigbeeNode::startInitialization()
|
void ZigbeeNode::startInitialization()
|
||||||
|
|
@ -590,6 +590,9 @@ void ZigbeeNode::handleDataIndication(const Zigbee::ApsdeDataIndication &indicat
|
||||||
emit lqiChanged(m_lqi);
|
emit lqiChanged(m_lqi);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Data received from this node, it is reachable for sure
|
||||||
|
setReachable(true);
|
||||||
|
|
||||||
// Update the UTC timestamp of last seen for reachable verification
|
// Update the UTC timestamp of last seen for reachable verification
|
||||||
if (m_lastSeen != QDateTime::currentDateTimeUtc()) {
|
if (m_lastSeen != QDateTime::currentDateTimeUtc()) {
|
||||||
m_lastSeen = QDateTime::currentDateTimeUtc();
|
m_lastSeen = QDateTime::currentDateTimeUtc();
|
||||||
|
|
@ -602,7 +605,7 @@ void ZigbeeNode::handleDataIndication(const Zigbee::ApsdeDataIndication &indicat
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Else let the node handle this indication
|
// Let the clusters handle this indication
|
||||||
handleZigbeeClusterLibraryIndication(indication);
|
handleZigbeeClusterLibraryIndication(indication);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,7 @@ public:
|
||||||
Q_ENUM(State)
|
Q_ENUM(State)
|
||||||
|
|
||||||
State state() const;
|
State state() const;
|
||||||
bool connected() const;
|
bool reachable() const;
|
||||||
|
|
||||||
QUuid networkUuid() const;
|
QUuid networkUuid() const;
|
||||||
|
|
||||||
|
|
@ -94,7 +94,7 @@ private:
|
||||||
|
|
||||||
ZigbeeDeviceObject *m_deviceObject = nullptr;
|
ZigbeeDeviceObject *m_deviceObject = nullptr;
|
||||||
QList<ZigbeeNodeEndpoint *> m_endpoints;
|
QList<ZigbeeNodeEndpoint *> m_endpoints;
|
||||||
bool m_connected = false;
|
bool m_reachable = false;
|
||||||
State m_state = StateUninitialized;
|
State m_state = StateUninitialized;
|
||||||
quint8 m_lqi = 0;
|
quint8 m_lqi = 0;
|
||||||
QDateTime m_lastSeen;
|
QDateTime m_lastSeen;
|
||||||
|
|
@ -105,7 +105,7 @@ private:
|
||||||
ZigbeeDeviceProfile::PowerDescriptor m_powerDescriptor;
|
ZigbeeDeviceProfile::PowerDescriptor m_powerDescriptor;
|
||||||
|
|
||||||
void setState(State state);
|
void setState(State state);
|
||||||
void setConnected(bool connected);
|
void setReachable(bool reachable);
|
||||||
|
|
||||||
// Init methods
|
// Init methods
|
||||||
int m_requestRetry = 0;
|
int m_requestRetry = 0;
|
||||||
|
|
@ -128,7 +128,7 @@ signals:
|
||||||
void stateChanged(State state);
|
void stateChanged(State state);
|
||||||
void lqiChanged(quint8 lqi);
|
void lqiChanged(quint8 lqi);
|
||||||
void lastSeenChanged(const QDateTime &lastSeen);
|
void lastSeenChanged(const QDateTime &lastSeen);
|
||||||
void connectedChanged(bool connected);
|
void reachableChanged(bool reachable);
|
||||||
void clusterAdded(ZigbeeCluster *cluster);
|
void clusterAdded(ZigbeeCluster *cluster);
|
||||||
void clusterAttributeChanged(ZigbeeCluster *cluster, const ZigbeeClusterAttribute &attribute);
|
void clusterAttributeChanged(ZigbeeCluster *cluster, const ZigbeeClusterAttribute &attribute);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue