#ifndef BLESCANNER_H #define BLESCANNER_H // Qt #include #include #include #include #include #include #include // Project #include "main.h" #include "VBluetoothDeviceInfo.h" // define #define _BLEScanner BLEScanner::I() using namespace View; class BLEScanner : public QObject { Q_OBJECT QThread *_thread = nullptr; bool _init = false; // Singleton SINGLETON(BLEScanner) public: // 19 total 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 }; private: QList devices; QBluetoothDeviceInfo selectedDeviceInfo; QString macAddress = ""; QBluetoothDeviceDiscoveryAgent *discoveryAgent; QLowEnergyController *lowEnergyController; QList services; QLowEnergyService *omronUnknownService = nullptr; QLowEnergyService *omronCurrentTimeService = nullptr; QLowEnergyService *omronBatteryLevelService = nullptr; QLowEnergyService *omronBloodPressureService = nullptr; QLowEnergyService *omronDeviceInformationService = nullptr; QLowEnergyDescriptor notificationDesc; QLowEnergyDescriptor readDesc; QTimer *timer; 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 onInitConnections(); void onQuitThread(); void onConnectToDevice(const QBluetoothDeviceInfo& deviceInfo); void onSetMacAddress(const QString &mac); void updateBLECuffCheckinType(bool retryConnection); signals: 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 doInit(); void doSelectDevice(const QString &addr); void doScanForDevices(); void doParseMeasurement(const QByteArray &byteArray); void doRequestBPMeasurement(); private slots: // discovery agent void onDeviceDiscovered(const QBluetoothDeviceInfo& deviceInfo); void onDiscoveryAgentError(QBluetoothDeviceDiscoveryAgent::Error error); void onScanFinished(); // low energy controller void onServiceDiscovered(const QBluetoothUuid &uuid); void onServiceScanDone(); void onControllerError(const QLowEnergyController::Error &error); void onDeviceConnected(); void onDeviceDisconnected(); // service slots void onServiceStateChanged(const QLowEnergyService::ServiceState &serviceState); void onCharacteristicChanged(const QLowEnergyCharacteristic &c, const QByteArray &byteArray); void onConfirmedDescriptorWrite(const QLowEnergyDescriptor &desc, const QByteArray &byteArray); void onServiceCharacteristicsRead(const QLowEnergyCharacteristic &c,const QByteArray &byteArray); void onQuit(); // device monitoring void onRequestDeviceInformation(); void onRequestDeviceSerialNumber(); void onRetryConnectToDevice(); }; typedef BLEScanner::BLEMeasurementData BLEMeasurementData; #endif // BLESCANNER_H