Remove old devices

This commit is contained in:
Tim Gromeyer
2025-03-15 11:46:50 +01:00
parent 9e40e6e3fd
commit cb625d0889
4 changed files with 42 additions and 25 deletions

View File

@@ -1,5 +1,6 @@
#include "blemanager.h"
#include <QDebug>
#include <QTimer>
BleManager::BleManager(QObject *parent) : QObject(parent)
{
@@ -12,11 +13,17 @@ BleManager::BleManager(QObject *parent) : QObject(parent)
this, &BleManager::onScanFinished);
connect(discoveryAgent, &QBluetoothDeviceDiscoveryAgent::errorOccurred,
this, &BleManager::onErrorOccurred);
// Set up pruning timer
pruneTimer = new QTimer(this);
connect(pruneTimer, &QTimer::timeout, this, &BleManager::pruneOldDevices);
pruneTimer->start(PRUNE_INTERVAL_MS); // Start timer (runs every 5 seconds)
}
BleManager::~BleManager()
{
delete discoveryAgent;
delete pruneTimer;
}
void BleManager::startScan()
@@ -24,6 +31,7 @@ void BleManager::startScan()
qDebug() << "Starting BLE scan...";
devices.clear();
discoveryAgent->start(QBluetoothDeviceDiscoveryAgent::LowEnergyMethod);
pruneTimer->start(PRUNE_INTERVAL_MS); // Ensure timer is running
}
void BleManager::stopScan()
@@ -111,6 +119,9 @@ void BleManager::onDeviceDiscovered(const QBluetoothDeviceInfo &info)
else
deviceInfo.lidState = DeviceInfo::LidState::UNKNOWN;
// Update timestamp
deviceInfo.lastSeen = QDateTime::currentDateTime();
// Store device info in the map
devices[address] = deviceInfo;
@@ -136,4 +147,22 @@ void BleManager::onErrorOccurred(QBluetoothDeviceDiscoveryAgent::Error error)
{
qDebug() << "Error occurred:" << error;
stopScan();
}
void BleManager::pruneOldDevices()
{
QDateTime now = QDateTime::currentDateTime();
auto it = devices.begin();
while (it != devices.end())
{
if (it.value().lastSeen.msecsTo(now) > DEVICE_TIMEOUT_MS)
{
qDebug() << "Removing old device:" << it.value().name << "at" << it.key();
it = devices.erase(it); // Remove device if not seen recently
}
else
{
++it;
}
}
}

View File

@@ -5,6 +5,9 @@
#include <QBluetoothDeviceDiscoveryAgent>
#include <QMap>
#include <QString>
#include <QDateTime>
class QTimer;
class DeviceInfo
{
@@ -41,6 +44,8 @@ public:
UNKNOWN
};
LidState lidState = LidState::UNKNOWN;
QDateTime lastSeen; // Timestamp of last detection
};
class BleManager : public QObject
@@ -58,10 +63,15 @@ private slots:
void onDeviceDiscovered(const QBluetoothDeviceInfo &info);
void onScanFinished();
void onErrorOccurred(QBluetoothDeviceDiscoveryAgent::Error error);
void pruneOldDevices();
private:
QBluetoothDeviceDiscoveryAgent *discoveryAgent;
QMap<QString, DeviceInfo> devices;
QTimer *pruneTimer; // Timer for periodic pruning
static const int PRUNE_INTERVAL_MS = 5000; // Check every 5 seconds
static const int DEVICE_TIMEOUT_MS = 10000; // Remove after 10 seconds
};
#endif // BLEMANAGER_H

View File

@@ -131,15 +131,6 @@ BleScanner::BleScanner(QWidget *parent) : QMainWindow(parent)
mainLayout->addWidget(detailsGroup);
detailsGroup->setVisible(false);
trayIcon = new QSystemTrayIcon(QIcon::fromTheme("bluetooth"), this);
QMenu *trayMenu = new QMenu(this);
QAction *showAction = trayMenu->addAction("Show");
trayMenu->addSeparator();
QAction *exitAction = trayMenu->addAction("Exit");
trayIcon->setContextMenu(trayMenu);
trayIcon->setToolTip("AirPods Battery Monitor");
trayIcon->show();
bleManager = new BleManager(this);
refreshTimer = new QTimer(this);
@@ -147,8 +138,6 @@ BleScanner::BleScanner(QWidget *parent) : QMainWindow(parent)
connect(stopButton, &QPushButton::clicked, this, &BleScanner::stopScan);
connect(deviceTable, &QTableWidget::itemSelectionChanged, this, &BleScanner::onDeviceSelected);
connect(refreshTimer, &QTimer::timeout, this, &BleScanner::updateDeviceList);
connect(showAction, &QAction::triggered, this, &BleScanner::show);
connect(exitAction, &QAction::triggered, qApp, &QApplication::quit);
}
void BleScanner::startScan()
@@ -158,7 +147,7 @@ void BleScanner::startScan()
deviceTable->setRowCount(0);
detailsGroup->setVisible(false);
bleManager->startScan();
refreshTimer->start(2000);
refreshTimer->start(500);
}
void BleScanner::stopScan()
@@ -202,18 +191,8 @@ void BleScanner::updateDeviceList()
}
}
if (!devices.isEmpty())
{
auto it = devices.begin();
QString leftBat = (it.value().leftPodBattery >= 0 ? QString::number(it.value().leftPodBattery) + "%" : "N/A");
QString rightBat = (it.value().rightPodBattery >= 0 ? QString::number(it.value().rightPodBattery) + "%" : "N/A");
QString caseBat = (it.value().caseBattery >= 0 ? QString::number(it.value().caseBattery) + "%" : "N/A");
QString tooltip = QString("%1\nLeft: %2 | Right: %3 | Case: %4")
.arg(it.value().name)
.arg(leftBat)
.arg(rightBat)
.arg(caseBat);
trayIcon->setToolTip(tooltip);
if (deviceTable->selectedItems().isEmpty()) {
deviceTable->selectRow(0);
}
}

View File

@@ -45,7 +45,6 @@ private:
QLabel *lidStateLabel; // Renamed from lidOpenLabel
QLabel *colorLabel;
QLabel *rawDataLabel;
QSystemTrayIcon *trayIcon;
// New labels for additional DeviceInfo fields
QLabel *leftInEarLabel;