From 1ac88020356a5a2b752835cc6ed8398ff1d0db40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20St=C3=BCrz?= Date: Wed, 1 Feb 2023 23:43:59 +0100 Subject: [PATCH] NetworkDeviceMonitor: Fix initial reachable state using internal caches --- .../network/networkdevicediscoveryimpl.cpp | 14 +++++++++++--- .../hardware/network/networkdevicemonitorimpl.cpp | 1 - libnymea/network/networkdevicemonitor.cpp | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/libnymea-core/hardware/network/networkdevicediscoveryimpl.cpp b/libnymea-core/hardware/network/networkdevicediscoveryimpl.cpp index e5a7e3ba..4371d39b 100644 --- a/libnymea-core/hardware/network/networkdevicediscoveryimpl.cpp +++ b/libnymea-core/hardware/network/networkdevicediscoveryimpl.cpp @@ -241,6 +241,7 @@ NetworkDeviceMonitor *NetworkDeviceDiscoveryImpl::registerMonitor(const MacAddre NetworkDeviceMonitorImpl *monitor = new NetworkDeviceMonitorImpl(macAddress, this); monitor->setNetworkDeviceInfo(info); + monitor->setLastSeen(m_lastSeen.value(macAddress, QDateTime())); m_monitors.insert(macAddress, monitor); m_monitorsReferenceCount[macAddress] = 1; @@ -256,10 +257,11 @@ NetworkDeviceMonitor *NetworkDeviceDiscoveryImpl::registerMonitor(const MacAddre qCDebug(dcNetworkDeviceDiscovery()) << "Adding network device monitor for unresolved mac address. Starting a discovery..."; NetworkDeviceDiscoveryReply *reply = discover(); connect(reply, &NetworkDeviceDiscoveryReply::finished, reply, &NetworkDeviceDiscoveryReply::deleteLater); + } else { + evaluateMonitor(monitor); } - evaluateMonitor(monitor); - + qCDebug(dcNetworkDeviceDiscovery()) << "Registered successfully" << monitor; return monitor; } @@ -580,7 +582,7 @@ void NetworkDeviceDiscoveryImpl::updateCache(const NetworkDeviceInfo &deviceInfo void NetworkDeviceDiscoveryImpl::evaluateMonitor(NetworkDeviceMonitorImpl *monitor) { - if (monitor->networkDeviceInfo().address().isNull()) + if (!monitor->networkDeviceInfo().isValid()) return; if (monitor->currentPingReply()) @@ -600,6 +602,12 @@ void NetworkDeviceDiscoveryImpl::evaluateMonitor(NetworkDeviceMonitorImpl *monit requiresRefresh = true; } + if (!requiresRefresh && currentDateTime <= monitor->lastSeen().addSecs(m_monitorInterval)) { + // We have seen this device within the last minute, make sure the monitor is reachable + monitor->setReachable(true); + return; + } + if (!requiresRefresh) return; diff --git a/libnymea-core/hardware/network/networkdevicemonitorimpl.cpp b/libnymea-core/hardware/network/networkdevicemonitorimpl.cpp index c0191ff2..2bc0b19a 100644 --- a/libnymea-core/hardware/network/networkdevicemonitorimpl.cpp +++ b/libnymea-core/hardware/network/networkdevicemonitorimpl.cpp @@ -94,7 +94,6 @@ void NetworkDeviceMonitorImpl::setLastSeen(const QDateTime &lastSeen) return; m_lastSeen = lastSeen; - emit lastSeenChanged(m_lastSeen); } diff --git a/libnymea/network/networkdevicemonitor.cpp b/libnymea/network/networkdevicemonitor.cpp index 41090e94..775922b6 100644 --- a/libnymea/network/networkdevicemonitor.cpp +++ b/libnymea/network/networkdevicemonitor.cpp @@ -46,7 +46,7 @@ QDebug operator<<(QDebug dbg, NetworkDeviceMonitor *networkDeviceMonitor) dbg.nospace() << " - " << networkDeviceMonitor->networkDeviceInfo().macAddressManufacturer(); dbg.nospace() << ", " << networkDeviceMonitor->networkDeviceInfo().address().toString(); - + dbg.nospace() << ", " << (networkDeviceMonitor->reachable() ? "reachable" : "not reachable"); dbg.nospace() << ")"; return dbg; }