Index: sources/bluetooth/BLEScanner.h =================================================================== diff -u -r0470ff6f209ff0c5089f8f0849b6da04f60f8f41 -r5abcb402907533b367aaaf0ad2fee5e8f8993af3 --- sources/bluetooth/BLEScanner.h (.../BLEScanner.h) (revision 0470ff6f209ff0c5089f8f0849b6da04f60f8f41) +++ sources/bluetooth/BLEScanner.h (.../BLEScanner.h) (revision 5abcb402907533b367aaaf0ad2fee5e8f8993af3) @@ -19,77 +19,106 @@ using namespace View; + +/*! + * \brief The BLEScanner class + * Communicates with Bluetooth Low Energy Devices + * \details + * - Scans for BLE devices + * - Pairs with BLE devices + * - Monitors BLE device connection while connected + * - Detects BLE disconnect events and can continuously try to reconnect with offline devices + * - Retrieves blood pressure and heart rate data. Emits bp/hr data measurements to other classes + * - Filters discovered BLE devices by name prefixes to ensure only specific BP cuffs are found + * + */ class BLEScanner : public QObject { Q_OBJECT QThread *_thread = nullptr; bool _init = false; + const int _timerInterval = 1000; // SRSUI 6 + bool _timerIsActive = false; + bool _retryConnection = false; // Singleton SINGLETON(BLEScanner) public: // 19 total bytes - struct bp_measurement { - uint8_t flags; // 1 byte - uint16_t systolic; // 2 bytes - uint16_t diastolic; // 2 bytes - uint16_t mean_arterial_pressure_value; // 2 bytes - uint16_t year; // 2 bytes - uint8_t month; // 1 byte - uint8_t day; // 1 byte - uint8_t hour; // 1 byte - uint8_t minute; // 1 byte - uint8_t second; // 1 byte - uint16_t pulse_rate; // 2 bytes - uint8_t user_id; // 1 byte - uint16_t measurement_status; // 2 bytes - + struct BLEMeasurementData { + uint8_t flags; // 1 byte + uint16_t systolic; // 2 bytes + uint16_t diastolic; // 2 bytes + uint16_t mean_arterial_pressure_value; // 2 bytes + uint16_t year; // 2 bytes + uint8_t month; // 1 byte + uint8_t day; // 1 byte + uint8_t hour; // 1 byte + uint8_t minute; // 1 byte + uint8_t second; // 1 byte + uint16_t pulse_rate; // 2 bytes + uint8_t user_id; // 1 byte + uint16_t measurement_status; // 2 bytes }; - typedef bp_measurement bp_measurement_t; - void scanForDevices(); - void parseMeasurement(const QByteArray &byteArray); - void requestBPMeasurement(); - private: QList devices; - QString macAddress = ""; - QBluetoothDeviceDiscoveryAgent *discoveryAgent; - QLowEnergyController *lowEnergyController; + QBluetoothDeviceInfo selectedDeviceInfo; + QBluetoothDeviceDiscoveryAgent *discoveryAgent = nullptr; + QLowEnergyController *lowEnergyController = nullptr; QList services; - QLowEnergyService* omronUnknownService = nullptr; - QLowEnergyService* omronCurrentTimeService = nullptr; - QLowEnergyService* omronBatteryLevelService = nullptr; - QLowEnergyService* omronBloodPressureService = nullptr; + QLowEnergyService *omronUnknownService = nullptr; + QLowEnergyService *omronCurrentTimeService = nullptr; + QLowEnergyService *omronBatteryLevelService = nullptr; + QLowEnergyService *omronBloodPressureService = nullptr; + QLowEnergyService *omronDeviceInformationService = nullptr; + QLowEnergyDescriptor notificationDesc; QLowEnergyDescriptor readDesc; - const QString omronCurrentTimeServiceName = QString("{00002a2b-0000-1000-8000-00805f9b34fb}"); - const QString omronBatteryLevelServiceName = QString("{0000180f-0000-1000-8000-00805f9b34fb}"); - const QString omronUnknownServiceName = QString("{ecbe3980-c9a2-11e1-b1bd-0002a5d5c51b}"); - const QString omronBloodPressureServiceName = QString("{00001810-0000-1000-8000-00805f9b34fb}"); + const QString omronCurrentTimeServiceName = QString("{00002a2b-0000-1000-8000-00805f9b34fb}"); + const QString omronBatteryLevelServiceName = QString("{0000180f-0000-1000-8000-00805f9b34fb}"); + const QString omronUnknownServiceName = QString("{ecbe3980-c9a2-11e1-b1bd-0002a5d5c51b}"); + const QString omronBloodPressureServiceName = QString("{00001810-0000-1000-8000-00805f9b34fb}"); + const QString omronDeviceInformationServiceName = QString("{0000180a-0000-1000-8000-00805f9b34fb}"); + const QStringList omronDeviceNamesPrefixes = {"BP7000", "BLEsmart", "Blood Pressure"}; QStringList characteristicsToAcquireNotify; - void initConnections(); - void quitThread(); - void connectToDevice(const QBluetoothDeviceInfo& deviceInfo); - void setMacAddress(const QString &mac); + void onInitConnections(); + void onQuitThread(); + void onConnectToDevice(const QBluetoothDeviceInfo& deviceInfo); + void updateBLECuffCheckinType(bool retryConnection); + void makeServiceConnections(QLowEnergyService *service); + QLowEnergyService* setupService(const QBluetoothUuid &uuid); + void timerEvent(QTimerEvent* event); + // timer + void toggleBLETimer(const bool &active); + signals: - void receivedBPMeasurement(bp_measurement_t); - void connectedToBloodPressureService(); - void scanForDevicesError(QBluetoothDeviceDiscoveryAgent::Error error); - void scanFinished(); - void deviceDiscovered(const QBluetoothDeviceInfo &device); + void didReceiveBPMeasurement(BLEMeasurementData); + void didReceiveScanForDevicesError(QBluetoothDeviceDiscoveryAgent::Error error); + void didFinishScan(); + void didDiscoverDevice(const QBluetoothDeviceInfo &device); + void didStartConnectingToDevice(); + void didReceiveControllerError(const QLowEnergyController::Error &error); + void didConnectToDevice(const QBluetoothDeviceInfo &deviceInfo); + void didDisconnectFromDevice(const QBluetoothDeviceInfo &deviceInfo); + public slots: - bool init(); + bool doInit(); + void doSelectDevice(const QString &addr, const QString &name); + void doScanForDevices(); + void doParseMeasurement(const QByteArray &byteArray); + void doRequestBPMeasurement(); + void doReselectDevice(const QBluetoothDeviceInfo &deviceInfo); private slots: @@ -106,13 +135,19 @@ void onDeviceDisconnected(); // service slots - void serviceStateChanged(const QLowEnergyService::ServiceState &serviceState); + void onServiceStateChanged(const QLowEnergyService::ServiceState &serviceState); void onCharacteristicChanged(const QLowEnergyCharacteristic &c, const QByteArray &byteArray); - void confirmedDescriptorWrite(const QLowEnergyDescriptor &desc, const QByteArray &byteArray); - void serviceCharacteristicsRead(const QLowEnergyCharacteristic &c,const QByteArray &byteArray); + void onConfirmedDescriptorWrite(const QLowEnergyDescriptor &desc, const QByteArray &byteArray); + void onServiceCharacteristicsRead(const QLowEnergyCharacteristic &c,const QByteArray &byteArray); - void quit(); - void onSelectedDevice(const QString &addr); + void onQuit(); + + // device monitoring + void onRequestDeviceInformation(); + void onRequestDeviceSerialNumber(); + void onRetryConnectToDevice(); }; +typedef BLEScanner::BLEMeasurementData BLEMeasurementData; + #endif // BLESCANNER_H