Index: AlarmMapping.csv =================================================================== diff -u -rdaad774fa7aece882a72d6e579a7cb87988fd6a5 -raa8f2c87c14c68d1fda6da2540d47144990a596c --- AlarmMapping.csv (.../AlarmMapping.csv) (revision daad774fa7aece882a72d6e579a7cb87988fd6a5) +++ AlarmMapping.csv (.../AlarmMapping.csv) (revision aa8f2c87c14c68d1fda6da2540d47144990a596c) @@ -123,7 +123,7 @@ 122,"DG small primary heater voltage out of range." 123,"DG trimmer heater voltage out of range." 124,"HD end of treatment alarm (high priority - user still not acting to end treatment)." - 125,"Blood sitting too long after treatment stopped by user alarm (>10 min)." + 125,"Blood sitting too long after treatment stopped by user alarm (>5 min)." 126,"HD blood leak detected alarm." 127,"Venous pressure too low during treatment." 128,"HD venous air bubble detected alarm." @@ -283,4 +283,7 @@ 282,"Bicarbonate concentration bottle low volume alarm." 283,"DG load cells weight out of range." 284,"DG load cells primary/back up drift out of range." - 285,"Total number of alarms." + 285,"HD treatment recirculate timeout warning." + 286,"HD treatment rinseback complete timeout warning." + 287,"HD processor clock speed checks against FPGA clock failure." + 288,"Total number of alarms." Index: denali.pro =================================================================== diff -u -r2dd767833cf0cf706c457951c2d78e7e20aff768 -raa8f2c87c14c68d1fda6da2540d47144990a596c --- denali.pro (.../denali.pro) (revision 2dd767833cf0cf706c457951c2d78e7e20aff768) +++ denali.pro (.../denali.pro) (revision aa8f2c87c14c68d1fda6da2540d47144990a596c) @@ -54,6 +54,7 @@ sources/abstract \ sources/model \ sources/model/settings \ + sources/model/ui/data \ sources/model/hd/adjustment \ sources/model/hd/adjustment/disinfect \ sources/model/hd/adjustment/settings \ @@ -76,6 +77,7 @@ sources/view \ sources/view/settings \ sources/view/pretreatment \ + sources/view/ui/data \ sources/view/hd/adjustment/common \ sources/view/hd/adjustment \ sources/view/hd/adjustment/pretreatment \ @@ -111,6 +113,7 @@ \ # Controllers sources/ApplicationController.h \ sources/device/DeviceController.h \ + sources/model/ui/data/MUIBloodPressureData.h \ sources/storage/Settings.h \ sources/storage/TreatmentLog.h \ sources/view/hd/data/post/VHDPOSTData.h \ @@ -358,6 +361,7 @@ \ # Controllers sources/ApplicationController.cpp \ sources/device/DeviceController.cpp \ + sources/model/ui/data/MUIBloodPressureData.cpp \ sources/storage/Settings.cpp \ sources/storage/TreatmentLog.cpp \ sources/view/hd/data/post/VHDPOSTData.cpp \ Index: denali.pro.user =================================================================== diff -u -re4a0e2fc4c7ae0cbce0d670772276bf7f5ff3845 -raa8f2c87c14c68d1fda6da2540d47144990a596c --- denali.pro.user (.../denali.pro.user) (revision e4a0e2fc4c7ae0cbce0d670772276bf7f5ff3845) +++ denali.pro.user (.../denali.pro.user) (revision aa8f2c87c14c68d1fda6da2540d47144990a596c) @@ -1,6 +1,6 @@ - + EnvironmentId Index: en_US.udic =================================================================== diff -u -r93cb2e56782aa64aafb2b69ec526a5e49ffdf1c7 -raa8f2c87c14c68d1fda6da2540d47144990a596c --- en_US.udic (.../en_US.udic) (revision 93cb2e56782aa64aafb2b69ec526a5e49ffdf1c7) +++ en_US.udic (.../en_US.udic) (revision aa8f2c87c14c68d1fda6da2540d47144990a596c) @@ -173,3 +173,5 @@ BLE uuid Addr +BCuff +Mesur Index: sources/ApplicationController.cpp =================================================================== diff -u -re4a0e2fc4c7ae0cbce0d670772276bf7f5ff3845 -raa8f2c87c14c68d1fda6da2540d47144990a596c --- sources/ApplicationController.cpp (.../ApplicationController.cpp) (revision e4a0e2fc4c7ae0cbce0d670772276bf7f5ff3845) +++ sources/ApplicationController.cpp (.../ApplicationController.cpp) (revision aa8f2c87c14c68d1fda6da2540d47144990a596c) @@ -90,10 +90,10 @@ void ApplicationController::initConnections() { - connect(&_post , SIGNAL(didWiFi ()), - &_WifiInterface , SLOT( doStart ())); - connect(&_post , SIGNAL( didBluetooth()), - this , SLOT(onPOSTBluetooth())); + connect(&_post , SIGNAL( didWiFi (bool)), + this , SLOT(onPOSTWiFi (bool))); + connect(&_post , SIGNAL( didBluetooth(bool)), + this , SLOT(onPOSTBluetooth(bool))); connect(&_post , SIGNAL( didFail (Gui::GuiAlarmID )), this , SLOT(onPOSTFail (Gui::GuiAlarmID ))); @@ -503,13 +503,29 @@ onActionReceive(SettingsData()); } + /*! + * \brief ApplicationController::onPOSTWiFi + * \details Starts the WiFi Interface + */ +void ApplicationController::onPOSTWiFi(bool vPass) { + if (vPass) { + _WifiInterface.doStart(); + } +} + +/*! * \brief ApplicationController::onPOSTBluetooth * \details Starts the Bluetooth Interface */ -void ApplicationController::onPOSTBluetooth() { - _BluetoothInterface.valid(true); - _BluetoothInterface.doStart(); +void ApplicationController::onPOSTBluetooth(bool vPass) { + if (vPass) { + _BluetoothInterface.valid(true); + _BluetoothInterface.doStart(); + } + else { + _BluetoothInterface.doNotifyStatePOSTError(); + } } @@ -530,9 +546,7 @@ AdjustUIPostFinalResultRequestData data; data.mResult = vPass; emit didAdjustment(data); - QString message = "ApplicationPost Done :" + QTime::currentTime().toString("HH:mm:ss.zzz"); - qDebug() << message; - LOG_DEBUG(message); + LOG_DEBUG("ApplicationPost Done :" + QTime::currentTime().toString("HH:mm:ss.zzz")); } /*! Index: sources/ApplicationController.h =================================================================== diff -u -re4a0e2fc4c7ae0cbce0d670772276bf7f5ff3845 -raa8f2c87c14c68d1fda6da2540d47144990a596c --- sources/ApplicationController.h (.../ApplicationController.h) (revision e4a0e2fc4c7ae0cbce0d670772276bf7f5ff3845) +++ sources/ApplicationController.h (.../ApplicationController.h) (revision aa8f2c87c14c68d1fda6da2540d47144990a596c) @@ -103,7 +103,8 @@ void onSettingsInit(); void onSettingsUpdate(); - void onPOSTBluetooth (); + void onPOSTWiFi (bool vPass); + void onPOSTBluetooth (bool vPass); void onPOSTFail (Gui::GuiAlarmID vAlarmID); void onPOSTDone (bool vPass); Index: sources/ApplicationPost.cpp =================================================================== diff -u -re4a0e2fc4c7ae0cbce0d670772276bf7f5ff3845 -raa8f2c87c14c68d1fda6da2540d47144990a596c --- sources/ApplicationPost.cpp (.../ApplicationPost.cpp) (revision e4a0e2fc4c7ae0cbce0d670772276bf7f5ff3845) +++ sources/ApplicationPost.cpp (.../ApplicationPost.cpp) (revision aa8f2c87c14c68d1fda6da2540d47144990a596c) @@ -76,8 +76,8 @@ { bool ok = true; //TODO: it will be done after consulting as part of CyberSecurity - if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_UI_POST_FAILURE_FILESYSTEM); - else emit didFileSystem(); + if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_UI_POST_FAILURE_FILESYSTEM); + emit didFileSystem(ok); return ok; } @@ -89,8 +89,8 @@ bool ApplicationPost::checkCANBus() { bool ok = _content.contains(_postmsg_canbus); - if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_UI_POST_FAILURE_CANBUS); - else emit didCANBus(); + if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_UI_POST_FAILURE_CANBUS); + emit didCANBus(ok); return ok; } @@ -103,8 +103,8 @@ { bool ok = true; //TODO: do the test : not a good test has been found yet. - if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_UI_POST_FAILURE_DISPLAY); - else emit didDisplay(); + if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_UI_POST_FAILURE_DISPLAY); + emit didDisplay(ok); return ok; } @@ -116,8 +116,8 @@ bool ApplicationPost::checkTouch() { bool ok = _content.contains(_postmsg_touch); - if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_UI_POST_FAILURE_TOUCH); - else emit didTouch(); + if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_UI_POST_FAILURE_TOUCH); + emit didTouch(ok); return ok; } @@ -129,8 +129,8 @@ bool ApplicationPost::checkSDCard() { bool ok = _content.contains(_postmsg_sdcard); - if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_UI_POST_FAILURE_SDCARD); - else emit didSDCard(); + if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_UI_POST_FAILURE_SDCARD); + emit didSDCard(ok); return ok; } @@ -142,8 +142,8 @@ bool ApplicationPost::checkRtc() { bool ok = _content.contains(_postmsg_rtc); - if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_UI_POST_FAILURE_RTC); - else emit didRtc(); + if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_UI_POST_FAILURE_RTC); + emit didRtc(ok); return ok; } @@ -155,8 +155,8 @@ bool ApplicationPost::checkWiFi() { bool ok = true; //TODO: _content.contains(_postmsg_wifi); - if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_UI_POST_FAILURE_WIFI); - else emit didWiFi(); + if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_UI_POST_FAILURE_WIFI); + emit didWiFi(ok); return ok; } @@ -168,8 +168,8 @@ bool ApplicationPost::checkBluetooth() { bool ok = _content.contains(_postmsg_bluetooth); - if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_UI_POST_FAILURE_BLUETOOTH); - else emit didBluetooth(); + if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_UI_POST_FAILURE_BLUETOOTH); + emit didBluetooth(ok); return ok; } @@ -182,8 +182,8 @@ { bool ok = true; // do the test : we are not using this for now since it has been removed from the PRS. - if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_UI_POST_FAILURE_ETHERNET); - else emit didEthernet(); + if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_UI_POST_FAILURE_ETHERNET); + emit didEthernet(ok); return ok; } @@ -196,8 +196,8 @@ { bool ok = true; // do the test - if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_UI_POST_FAILURE_SOUND); - else emit didSound(); + if (! ok) emit didFail(Gui::GuiAlarmID::ALARM_ID_UI_POST_FAILURE_SOUND); + emit didSound(ok); return ok; } Index: sources/ApplicationPost.h =================================================================== diff -u -re4a0e2fc4c7ae0cbce0d670772276bf7f5ff3845 -raa8f2c87c14c68d1fda6da2540d47144990a596c --- sources/ApplicationPost.h (.../ApplicationPost.h) (revision e4a0e2fc4c7ae0cbce0d670772276bf7f5ff3845) +++ sources/ApplicationPost.h (.../ApplicationPost.h) (revision aa8f2c87c14c68d1fda6da2540d47144990a596c) @@ -76,16 +76,16 @@ void start(); signals: - void didFileSystem (); - void didCANBus (); - void didDisplay (); - void didTouch (); - void didSDCard (); - void didRtc (); - void didWiFi (); - void didBluetooth (); - void didEthernet (); - void didSound (); + void didFileSystem (bool vPass); + void didCANBus (bool vPass); + void didDisplay (bool vPass); + void didTouch (bool vPass); + void didSDCard (bool vPass); + void didRtc (bool vPass); + void didWiFi (bool vPass); + void didBluetooth (bool vPass); + void didEthernet (bool vPass); + void didSound (bool vPass); void didFail(Gui::GuiAlarmID vAlarmID); void didDone(bool vPass); Index: sources/bluetooth/BluetoothInterface.cpp =================================================================== diff -u -re4a0e2fc4c7ae0cbce0d670772276bf7f5ff3845 -raa8f2c87c14c68d1fda6da2540d47144990a596c --- sources/bluetooth/BluetoothInterface.cpp (.../BluetoothInterface.cpp) (revision e4a0e2fc4c7ae0cbce0d670772276bf7f5ff3845) +++ sources/bluetooth/BluetoothInterface.cpp (.../BluetoothInterface.cpp) (revision aa8f2c87c14c68d1fda6da2540d47144990a596c) @@ -1,4 +1,4 @@ - /*! +/*! * \copyright * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN @@ -43,12 +43,12 @@ */ bool BluetoothInterface::init() { - if ( ! _isValid ) return false; if ( _init ) return false; _init = true; // runs in BluetoothInterface thread - initConnections(); + // REMINDER:initConnections(); has been removed from here to the ondoStart, + // since the _local, _agent objects are created there. LOG_DEBUG("UI," + tr("%1 Initialized").arg(metaObject()->className())); return true; @@ -150,10 +150,13 @@ } // coco end +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // +// ~~~~~~~~~~ THREAD SAFE state change notifications.~~~~~~~~~~ // +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // #define NOTIFY_IDLE notifyStateChange(MBluetooth(MBluetooth::eIS_Idle )); #define NOTIFY_CLOSE notifyStateChange(MBluetooth(MBluetooth::eIS_Close )); -// ~~~~~~~~~~~ Local +// ~~~~~~~~~~ Local #define NOTIFY_LOCAL_INIT notifyStateChange(MBluetooth(MBluetooth::eIS_Local_Init , \ _local->address().toString() , \ _local->name(),0,1 )); @@ -165,7 +168,7 @@ #define NOTIFY_LOCAL_ERROR_OFF notifyStateChange(MBluetooth(MBluetooth::eIS_Local_Error_Off )); #define NOTIFY_LOCAL_ERROR_INVALID notifyStateChange(MBluetooth(MBluetooth::eIS_Local_Error_Invalid )); #define NOTIFY_LOCAL_DISCONNECT notifyStateChange(MBluetooth(MBluetooth::eIS_Local_Disconnect , vAddress.toString()) ); -// ~~~~~~~~~~~ Scan +// ~~~~~~~~~~ Scan #define NOTIFY_SCAN_DISCOVER notifyStateChange(MBluetooth(MBluetooth::eIS_Scan_Discover , \ vInfo.address().toString() , \ vInfo.name(), "" , \ @@ -185,7 +188,7 @@ #define NOTIFY_SCAN_NOTFOUND notifyStateChange(MBluetooth(MBluetooth::eIS_Scan_NotFound ,"", "" )); #define NOTIFY_SCAN_STOP notifyStateChange(MBluetooth(MBluetooth::eIS_Scan_Stop )); #define NOTIFY_SCAN_DONE notifyStateChange(MBluetooth(MBluetooth::eIS_Scan_Done )); -// ~~~~~~~~~ Device +// ~~~~~~~~~~ Device #define NOTIFY_DEVICE_INIT_ERROR notifyStateChange(MBluetooth(MBluetooth::eIS_Device_Error_Init )); #define NOTIFY_DEVICE_INIT notifyStateChange(MBluetooth(MBluetooth::eIS_Device_Init , \ _device->remoteAddress().toString() , \ @@ -206,7 +209,7 @@ #define NOTIFY_DEVICE_DISCONNECT notifyStateChange(MBluetooth(MBluetooth::eIS_Device_Disconnect , \ _device->remoteAddress().toString() , \ _device->remoteName() )); - +// ~~~~~~~~~~ Service #define NOTIFY_SERVICE_START notifyStateChange(MBluetooth(MBluetooth::eIS_Service_Start )); #define NOTIFY_SERVICE_DISCOVER notifyStateChange(MBluetooth(MBluetooth::eIS_Service_Discover )); #define NOTIFY_SERVICE_DETAILS(vS) notifyStateChange(MBluetooth(MBluetooth::eIS_Service_Detail , \ @@ -222,7 +225,7 @@ service->serviceUuid().toString() , \ service->serviceName() )); #define NOTIFY_SERVICE_DONE notifyStateChange(MBluetooth(MBluetooth::eIS_Service_Done )); - +// ~~~~~~~~~~ Details/Characteristics #define NOTIFY_DETAILS_ERROR notifyStateChange(MBluetooth(MBluetooth::eIS_Service_Detail_Error , \ _device->remoteAddress().toString() , \ _device->remoteName(), "" , \ @@ -282,17 +285,21 @@ service->serviceUuid().toString() , \ service->serviceName() )); - -/* -#define NOTIFY_SERVICE_DISCOVER notifyStateChange(MBluetooth(MBluetooth::eIS_Service_Discover , \ - _service->serviceUuid().toString() , \ - _service->serviceName() )); -*/ - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~ Public interface to initialize and start the scan // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /*! + * \brief BluetoothInterface::doNotifyStatePOSTError + * \details The public slot for public notification on POST error, + * since the POST is done by ApplicationPOST class, + * and it needs to notify the BluetoothInterface about the failure. + */ +void BluetoothInterface::doNotifyStatePOSTError() +{ + NOTIFY_LOCAL_ERROR_POST +} + +/*! * \brief BluetoothInterface::ondoStart * \details the thread safe slot to be called when the public function start is called. * initializes the local Bluetooth device _local and setups up the interface. @@ -313,10 +320,11 @@ return; } - _agent = new QBluetoothDeviceDiscoveryAgent (this); _local->powerOn(); + _agent = new QBluetoothDeviceDiscoveryAgent (this); quitDevice(); _agent->setLowEnergyDiscoveryTimeout(5000); + initConnections(); NOTIFY_LOCAL_INIT NOTIFY_IDLE } @@ -565,6 +573,12 @@ void BluetoothInterface::onServiceCharacteristicRead (const QLowEnergyCharacteristic &vCharacteristic, const QByteArray &vValue) { QLowEnergyService *service = reinterpret_cast(sender()); NOTIFY_DETAILS_READ + // By document reading shall occur here (onServiceCharacteristicRead) but seems it only happens onServiceCharacteristicChanged. + // Did not seem to cause any issue having one read here in case the value has been passed in here. + if (vCharacteristic.uuid() == QBluetoothUuid(QBluetoothUuid::BloodPressureMeasurement)) + { + interpretBloodPressure(vValue); + } } void BluetoothInterface::onServiceCharacteristicWritten (const QLowEnergyCharacteristic &vCharacteristic, const QByteArray &vValue) { QLowEnergyService *service = reinterpret_cast(sender()); @@ -573,45 +587,20 @@ void BluetoothInterface::onServiceCharacteristicChanged (const QLowEnergyCharacteristic &vCharacteristic, const QByteArray &vValue) { QLowEnergyService *service = reinterpret_cast(sender()); NOTIFY_DETAILS_CHANGE + // ManufacturerNameString : OMRONHEALTHCARE + // ModelNumberString : BP7000 if (vCharacteristic.uuid() == QBluetoothUuid(QBluetoothUuid::BloodPressureMeasurement)) { - parseMeasurement(vValue); + interpretBloodPressure(vValue); } } -void BluetoothInterface::parseMeasurement(const QByteArray &byteArray) +void BluetoothInterface::interpretBloodPressure(const QByteArray &vData) { - MeasurementData measurement; - const uchar *d = reinterpret_cast(byteArray.constData()); - - measurement.flags = *d; - measurement.systolic = d[1]; - measurement.diastolic = d[3]; - measurement.mean_arterial_pressure_value= d[5]; - measurement.year = d[7]; - measurement.month = d[9]; - measurement.day = d[10]; - measurement.hour = d[11]; - measurement.minute = d[12]; - measurement.second = d[13]; - measurement.pulse_rate = d[14]; - measurement.user_id = d[16]; - measurement.measurement_status = d[17]; - - qDebug() << measurement.flags - << measurement.systolic - << measurement.diastolic - << measurement.mean_arterial_pressure_value - << measurement.year - << measurement.month - << measurement.day - << measurement.hour - << measurement.minute - << measurement.second - << measurement.pulse_rate - << measurement.user_id - << measurement.measurement_status ; - // emit didReceiveBPMeasurement(measurement); + MUIBloodPressure model; + model.fromByteArray(vData); + emit didActionReceive(model.data()); + LOG_EVENT(model.toString()); } /*! Index: sources/bluetooth/BluetoothInterface.h =================================================================== diff -u -re4a0e2fc4c7ae0cbce0d670772276bf7f5ff3845 -raa8f2c87c14c68d1fda6da2540d47144990a596c --- sources/bluetooth/BluetoothInterface.h (.../BluetoothInterface.h) (revision e4a0e2fc4c7ae0cbce0d670772276bf7f5ff3845) +++ sources/bluetooth/BluetoothInterface.h (.../BluetoothInterface.h) (revision aa8f2c87c14c68d1fda6da2540d47144990a596c) @@ -22,6 +22,7 @@ // Project #include "main.h" // Doxygen : do not remove #include "MBluetooth.h" +#include "MUIBloodPressureData.h" // Define #define _BluetoothInterface Bluetooth::BluetoothInterface::I() @@ -73,23 +74,6 @@ const quint16 _interval = 1000 ; // the interface timer base interval in mSec public: - // 19 total bytes - struct MeasurementData { - 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 - }; - bool isValid( ) const { return _isValid ; } void valid(bool vValid) { _isValid = vValid; } @@ -100,6 +84,8 @@ bool init(); bool init(QThread &vThread); + void doNotifyStatePOSTError(); + private slots: void quit(); @@ -152,7 +138,7 @@ bool isDeviceValid (); // bool isServiceValid (QLowEnergyService *vService); bool isDetailValid (const QLowEnergyCharacteristic &vDetail); - bool isDeviceSupported ( const QString &vName ); + bool isDeviceSupported (const QString &vName ); bool connectToDevice (); bool reconnectToDevice (); @@ -163,11 +149,12 @@ void readInformation (); void printCharacteristics (QLowEnergyService *vService); - void notifyStateChange(const BluetoothData &vData); + void notifyStateChange (const BluetoothData &vData); + void interpretBloodPressure (const QByteArray &vData); - void parseMeasurement (const QByteArray &byteArray); signals: - void didStateChange(const BluetoothData &vData); + void didStateChange (const BluetoothData &vData); + void didActionReceive (const UIBloodPressureData &vData); SAFE_CALL(doStart ) SAFE_CALL(doScan ) Index: sources/model/MModel.h =================================================================== diff -u -r2dd767833cf0cf706c457951c2d78e7e20aff768 -raa8f2c87c14c68d1fda6da2540d47144990a596c --- sources/model/MModel.h (.../MModel.h) (revision 2dd767833cf0cf706c457951c2d78e7e20aff768) +++ sources/model/MModel.h (.../MModel.h) (revision aa8f2c87c14c68d1fda6da2540d47144990a596c) @@ -260,6 +260,7 @@ /* Devices */ \ REGISTER_METATYPE( DeviceBrightnessRequestData ) \ REGISTER_METATYPE( DeviceBrightnessResponseData ) \ + REGISTER_METATYPE( UIBloodPressureData ) \ /* Settings */ \ REGISTER_METATYPE( SettingsData ) \ REGISTER_METATYPE( WifiNetworkData ) \ Index: sources/model/hd/alarm/MAlarmMapping.cpp =================================================================== diff -u -rdaad774fa7aece882a72d6e579a7cb87988fd6a5 -raa8f2c87c14c68d1fda6da2540d47144990a596c --- sources/model/hd/alarm/MAlarmMapping.cpp (.../MAlarmMapping.cpp) (revision daad774fa7aece882a72d6e579a7cb87988fd6a5) +++ sources/model/hd/alarm/MAlarmMapping.cpp (.../MAlarmMapping.cpp) (revision aa8f2c87c14c68d1fda6da2540d47144990a596c) @@ -7,7 +7,7 @@ * * \file MAlarmMapping.cpp * \author (last) Behrouz NematiPour - * \date (last) 16-Aug-2021 + * \date (last) 07-Sep-2021 * \author (original) Behrouz NematiPour * \date (original) 03-May-2021 * @@ -152,7 +152,7 @@ /*0122*/case GuiAlarmID::ALARM_ID_DG_SMALL_PRIMARY_HEATER_VOLTAGE_OUT_OF_RANGE : { result = QObject::tr("DG small primary heater voltage out of range." ); break; } /* 122*/ /*0123*/case GuiAlarmID::ALARM_ID_DG_TRIMMER_HEATER_VOLTAGE_OUT_OF_RANGE : { result = QObject::tr("DG trimmer heater voltage out of range." ); break; } /* 123*/ /*0124*/case GuiAlarmID::ALARM_ID_END_OF_TREATMENT_HIGH : { result = QObject::tr("HD end of treatment alarm (high priority - user still not acting to end treatment)." ); break; } /* 124*/ -/*0125*/case GuiAlarmID::ALARM_ID_TREATMENT_STOPPED_NO_RINSEBACK : { result = QObject::tr("Blood sitting too long after treatment stopped by user alarm (>10 min)." ); break; } /* 125*/ +/*0125*/case GuiAlarmID::ALARM_ID_TREATMENT_STOPPED_NO_RINSEBACK : { result = QObject::tr("Blood sitting too long after treatment stopped by user alarm (>5 min)." ); break; } /* 125*/ /*0126*/case GuiAlarmID::ALARM_ID_HD_BLOOD_LEAK_DETECTED : { result = QObject::tr("HD blood leak detected alarm." ); break; } /* 126*/ /*0127*/case GuiAlarmID::ALARM_ID_VENOUS_PRESSURE_LOW : { result = QObject::tr("Venous pressure too low during treatment." ); break; } /* 127*/ /*0128*/case GuiAlarmID::ALARM_ID_HD_VENOUS_BUBBLE_DETECTED : { result = QObject::tr("HD venous air bubble detected alarm." ); break; } /* 128*/ @@ -312,7 +312,10 @@ /*0282*/case GuiAlarmID::ALARM_ID_DG_BICARB_BOTTLE_LOW_VOLUME : { result = QObject::tr("Bicarbonate concentration bottle low volume alarm." ); break; } /* 282*/ /*0283*/case GuiAlarmID::ALARM_ID_DG_LOAD_CELL_WEIGHT_OUT_OF_RANGE : { result = QObject::tr("DG load cells weight out of range." ); break; } /* 283*/ /*0284*/case GuiAlarmID::ALARM_ID_DG_LOAD_CELL_PRIMARY_BACKUP_DRIFT_OUT_OF_RANGE : { result = QObject::tr("DG load cells primary/back up drift out of range." ); break; } /* 284*/ -/*0285*/case GuiAlarmID::NUM_OF_ALARM_IDS : { result = QObject::tr("Total number of alarms." ); break; } /* 285*/ +/*0285*/case GuiAlarmID::ALARM_ID_HD_TREATMENT_RECIRC_TIMEOUT_WARNING : { result = QObject::tr("HD treatment recirculate timeout warning." ); break; } /* 285*/ +/*0286*/case GuiAlarmID::ALARM_ID_HD_TREATMENT_RINSEBACK_TIMEOUT_WARNING : { result = QObject::tr("HD treatment rinseback complete timeout warning." ); break; } /* 286*/ +/*0287*/case GuiAlarmID::ALARM_ID_HD_FPGA_CLOCK_SPEED_CHECK_FAILURE : { result = QObject::tr("HD processor clock speed checks against FPGA clock failure." ); break; } /* 287*/ +/*0288*/case GuiAlarmID::NUM_OF_ALARM_IDS : { result = QObject::tr("Total number of alarms." ); break; } /* 288*/ default: result = QObject::tr("ALARM_ID_UNDEFINED [%1]").arg(int(vAlarmID)); Index: sources/model/hd/data/treatmentlog/MTreatmentLogAvrgeData.h =================================================================== diff -u -rab7ffd27ecea1277d8645a8b62ff48c0cb3f6ff4 -raa8f2c87c14c68d1fda6da2540d47144990a596c --- sources/model/hd/data/treatmentlog/MTreatmentLogAvrgeData.h (.../MTreatmentLogAvrgeData.h) (revision ab7ffd27ecea1277d8645a8b62ff48c0cb3f6ff4) +++ sources/model/hd/data/treatmentlog/MTreatmentLogAvrgeData.h (.../MTreatmentLogAvrgeData.h) (revision aa8f2c87c14c68d1fda6da2540d47144990a596c) @@ -82,9 +82,9 @@ float mUFRate = 0; ///< Ultrafiltration Rate (mmHg) float mArterialPressure = 0; ///< Arterial Pressure (mmHg) float mVenousPressure = 0; ///< Venous Pressure (mmHg) - quint32 mSystolic = 0; ///< Systolic Blood Pressure - This value is not coming from FW and will be get from UI and User. - quint32 mDiastolic = 0; ///< Diastolic Blood Pressure - This value is not coming from FW and will be get from UI and User. - quint32 mHeartRate = 0; ///< Heart Rate - This value is not coming from FW and will be get from UI and User. + quint16 mSystolic = 0; ///< Systolic Blood Pressure - This value is not coming from FW and will be get from UI and User. + quint16 mDiastolic = 0; ///< Diastolic Blood Pressure - This value is not coming from FW and will be get from UI and User. + quint16 mHeartRate = 0; ///< Heart Rate - This value is not coming from FW and will be get from UI and User. }; MTreatmentLogAvrgeData() { } Index: sources/model/ui/data/MUIBloodPressureData.cpp =================================================================== diff -u --- sources/model/ui/data/MUIBloodPressureData.cpp (revision 0) +++ sources/model/ui/data/MUIBloodPressureData.cpp (revision aa8f2c87c14c68d1fda6da2540d47144990a596c) @@ -0,0 +1,86 @@ +/*! + * + * Copyright (c) 2020-2020 Diality Inc. - All Rights Reserved. + * \copyright + * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN + * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. + * + * \file MUIBloodPressure.cpp + * \author (last) Behrouz NematiPour + * \date (last) 7-Sep-2021 + * \author (original) Behrouz NematiPour + * \date (original) 7-Sep-2021 + * + */ +#include "MUIBloodPressureData.h" + +using namespace Model; + +QVariantList MUIBloodPressure::parameters() const { + return { + _data.mFlags .value, + _data.mSystolic .value, + _data.mDiastolic .value, + _data.mMeanArterial.value, + _data.mYear .value, + _data.mMonth .value, + _data.mDay .value, + _data.mHour .value, + _data.mMinute .value, + _data.mSecond .value, + _data.mPulseRate .value, + _data.mUserId .value, + _data.mStatus .value, + }; +} + +bool MUIBloodPressure::fromByteArray(const QByteArray &vByteArray, int *vIndex) { + int index = 0; // message data start position + if (GetValue(vByteArray, index, _data.mFlags )) + if (GetValue(vByteArray, index, _data.mSystolic )) + if (GetValue(vByteArray, index, _data.mDiastolic )) + if (GetValue(vByteArray, index, _data.mMeanArterial)) + if (GetValue(vByteArray, index, _data.mYear )) + if (GetValue(vByteArray, index, _data.mMonth )) + if (GetValue(vByteArray, index, _data.mDay )) + if (GetValue(vByteArray, index, _data.mHour )) + if (GetValue(vByteArray, index, _data.mMinute )) + if (GetValue(vByteArray, index, _data.mSecond )) + if (GetValue(vByteArray, index, _data.mPulseRate )) + if (GetValue(vByteArray, index, _data.mUserId )) + if (GetValue(vByteArray, index, _data.mStatus )) + return true ; + else { if(vIndex) *vIndex = index; return false; } + else { if(vIndex) *vIndex = index; return false; } + else { if(vIndex) *vIndex = index; return false; } + else { if(vIndex) *vIndex = index; return false; } + else { if(vIndex) *vIndex = index; return false; } + else { if(vIndex) *vIndex = index; return false; } + else { if(vIndex) *vIndex = index; return false; } + else { if(vIndex) *vIndex = index; return false; } + else { if(vIndex) *vIndex = index; return false; } + else { if(vIndex) *vIndex = index; return false; } + else { if(vIndex) *vIndex = index; return false; } + else { if(vIndex) *vIndex = index; return false; } + else { if(vIndex) *vIndex = index; return false; } +} + +MUIBloodPressure::Data MUIBloodPressure::data() const { + Data data; + data.mSystolic = _data.mSystolic .value; + data.mDiastolic = _data.mDiastolic .value; + data.mPulseRate = _data.mPulseRate .value; + /* NOT USED + data.mFlags = _data.mFlags .value; + data.mMeanArterial = _data.mMeanArterial .value; + data.mYear = _data.mYear .value; + data.mMonth = _data.mMonth .value; + data.mDay = _data.mDay .value; + data.mHour = _data.mHour .value; + data.mMinute = _data.mMinute .value; + data.mSecond = _data.mSecond .value; + data.mUserId = _data.mUserId .value; + data.mStatus = _data.mStatus .value; + */ + return data; +} Index: sources/model/ui/data/MUIBloodPressureData.h =================================================================== diff -u --- sources/model/ui/data/MUIBloodPressureData.h (revision 0) +++ sources/model/ui/data/MUIBloodPressureData.h (revision aa8f2c87c14c68d1fda6da2540d47144990a596c) @@ -0,0 +1,107 @@ +/*! + * + * Copyright (c) 2020-2020 Diality Inc. - All Rights Reserved. + * \copyright + * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN + * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. + * + * \file MUIBloodPressure.h + * \author (last) Behrouz NematiPour + * \date (last) 7-Sep-2021 + * \author (original) Behrouz NematiPour + * \date (original) 7-Sep-2021 + * + */ +#pragma once + + +// Qt +#include + +// Project +#include "MAbstract.h" +#include "types.h" + +// forward declarations +class tst_models; + +namespace Model { + +/*! + * \brief The MUIBloodPressure class + * \details The Bluetooth Cuff Blood Pressure data model + * + * + * | MSG | CAN ID | Type | Ack | Src | Dest | Description | + * |:------:|:------:|:----:|:---:|:---:|:----:|:-----------:| + * | 0x2a35 | N/A |Mesur | N |BCuff| UI | Bluetooth Cuff Blood PressureData data | + * + * | Payload || + * | || + * | # 1:(U08) | \ref Data::mFlags | + * | # 2:(U16) | \ref Data::mSystolic | + * | # 3:(U16) | \ref Data::mDiastolic | + * | # 4:(U16) | \ref Data::mMeanArterial | + * | # 5:(U16) | \ref Data::mYear | + * | # 6:(U08) | \ref Data::mMonth | + * | # 7:(U08) | \ref Data::mDay | + * | # 8:(U08) | \ref Data::mHour | + * | # 9:(U08) | \ref Data::mMinute | + * | #10:(U08) | \ref Data::mSecond | + * | #11:(U16) | \ref Data::mPulseRate | + * | #12:(U08) | \ref Data::mUserId | + * | #13:(U16) | \ref Data::mStatus | + * + * \sa Data + * + *

Logging info

+ * | || + * | || + * | typeText | Datum | + * | unitText | UI | + * | infoText | UIBPData | + * + */ +class MUIBloodPressure : public MAbstract { + + // friends + friend class ::tst_models; + + QVariantList parameters() const override; + + struct { + Types::U08 mFlags ; + Types::U16 mSystolic ; + Types::U16 mDiastolic ; + Types::U16 mMeanArterial; + Types::U16 mYear ; + Types::U08 mMonth ; + Types::U08 mDay ; + Types::U08 mHour ; + Types::U08 mMinute ; + Types::U08 mSecond ; + Types::U16 mPulseRate ; + Types::U08 mUserId ; + Types::U16 mStatus ; + } _data; + +public: + Type_Enum typeText() const override { return Type_Enum::eDatum ; } + Unit_Enum unitText() const override { return Unit_Enum::eUI ; } + QString infoText() const override { return QString("UIBPData") ; } + + struct Data { + quint16 mSystolic ; + quint16 mDiastolic ; + quint16 mPulseRate ; + }; + +public: + MUIBloodPressure () { } + + bool fromByteArray (const QByteArray &vByteArray , int *vIndex = nullptr) override; + Data data ( ) const ; +}; +} + +typedef Model::MUIBloodPressure::Data UIBloodPressureData; Index: sources/view/hd/adjustment/common/VCommonAdjustmentVitals.cpp =================================================================== diff -u -rab7ffd27ecea1277d8645a8b62ff48c0cb3f6ff4 -raa8f2c87c14c68d1fda6da2540d47144990a596c --- sources/view/hd/adjustment/common/VCommonAdjustmentVitals.cpp (.../VCommonAdjustmentVitals.cpp) (revision ab7ffd27ecea1277d8645a8b62ff48c0cb3f6ff4) +++ sources/view/hd/adjustment/common/VCommonAdjustmentVitals.cpp (.../VCommonAdjustmentVitals.cpp) (revision aa8f2c87c14c68d1fda6da2540d47144990a596c) @@ -20,6 +20,7 @@ // Project #include "GuiController.h" #include "TreatmentLog.h" +#include "BluetoothInterface.h" VIEW_DEF_CLASS_ADJUSTMENT(VTreatmentVitals) @@ -28,14 +29,12 @@ * \details All the class signal/slot connections are defined here. */ void View::VTreatmentVitals::initConnections() { - // TODO : Later we need to receive the data from BtCuff and update the data in the same way we update if user enters it. - // ACTION_VIEW_CONNECTION(AdjustVitalsResposeData); + ACTION_RECEIVE_BRIDGE_CONNECTION(_BluetoothInterface, UIBloodPressureData); connect(this, SIGNAL( enabledChanged(const bool &)), this, SLOT(onTimerChanged ( ))); connect(this, SIGNAL( intervalChanged(const quint8 &)), this, SLOT(onTimerChanged ( ))); - } /*! @@ -45,24 +44,21 @@ * \note the accepted and reason in this case should be the BtCuff status which may not necessarily comes front BtCuff itself, * and the intermediate controller like the GuiController or the BtCuffController can report from BtCuff behalf if it is connected or not responsive. */ -void View::VTreatmentVitals::onActionReceive(const AdjustVitalsResposeData &vData) +void View::VTreatmentVitals::onActionReceive(const UIBloodPressureData &vData) { if ( ! _enabled ) { // if the vitals is disabled it means Gui is probably in an incorrect state and is unable to handle the vital information. - LOG_EVENT(tr("Measured vital values ignored due to incorrect state")); + LOG_EVENT("UI," + tr("Measured vital values ignored due to incorrect state")); return; } - adjustment_Accepted ( vData.mAccepted ); - adjustment_Reason ( vData.mReason ); + // Not used yet. + // adjustment_Accepted ( vData.mAccepted ); + // adjustment_Reason ( vData.mReason ); - update(vData.mSystolic, vData.mDiastolic, vData.mHeartRate); + update(vData.mSystolic, vData.mDiastolic, vData.mPulseRate); treatmentLog(); - LOG_EVENT(tr("Cuff Vital Measurement,%1,%2,%3") - .arg(_systolic ) - .arg(_diastolic) - .arg(_heartRate) - ); + timerReset(); } /*! @@ -72,17 +68,18 @@ * \param vDiastolic - Blood Pressure Diastolic * \param vHeartRate - Heart Rate */ -void View::VTreatmentVitals::doConfirm(quint32 vSystolic, quint32 vDiastolic, quint32 vHeartRate){ +void View::VTreatmentVitals::doConfirm(quint16 vSystolic, quint16 vDiastolic, quint16 vHeartRate) { adjustment_Accepted ( true ); adjustment_Reason ( 0 ); update(vSystolic, vDiastolic, vHeartRate); treatmentLog(); - LOG_EVENT(tr("User Vital Confirmation,%1,%2,%3") + LOG_EVENT("UI," + tr("User Vital Confirmation,%1,%2,%3") .arg(_systolic ) .arg(_diastolic) .arg(_heartRate) ); + timerReset(); } /*! @@ -91,7 +88,7 @@ */ void View::VTreatmentVitals::doSkip() { - LOG_EVENT(tr("User Skipped Vital Entry")); + LOG_EVENT("UI," + tr("User Skipped Vital Entry")); } /*! @@ -100,7 +97,7 @@ */ void View::VTreatmentVitals::doTimeout() { - LOG_EVENT(tr("User Vital Entry Timed out")); + LOG_EVENT("UI," + tr("User Vital Entry Timed out")); } /*! @@ -130,7 +127,7 @@ * \param vDiastolic - Blood Pressure Diastolic * \param vHeartRate - Heart Rate */ -void View::VTreatmentVitals::update(quint32 vSystolic, quint32 vDiastolic, quint32 vHeartRate) +void View::VTreatmentVitals::update(quint16 vSystolic, quint16 vDiastolic, quint16 vHeartRate) { QDateTime currentDateTime = QDateTime::currentDateTime(); epoch (currentDateTime.toSecsSinceEpoch()); @@ -165,39 +162,44 @@ */ void View::VTreatmentVitals::timerEvent(QTimerEvent *) { + // TODO: Change the logic of the timer to count down instead of count up and reset to interval on 0. qDebug() << __FUNCTION__ << _timerCounter; if ( _interval == _timerCounter ) { - _timerCounter = 0; + timerReset(); emit didTrigger(); } _timerCounter++; } void View::VTreatmentVitals::onTimerChanged() { - if ( _interval && _enabled ) - start(); - else - stop(); + if ( _interval && _enabled ) timerStart(); + else timerStop (); } /*! * \brief View::VTreatmentVitals::start * \details Starts the timer by 1 min interval * \note the vital times are all minutes. */ -void View::VTreatmentVitals::start() +void View::VTreatmentVitals::timerStart() { _timerId = startTimer(60000); // 1 min interval } + +void View::VTreatmentVitals::timerReset() +{ + _timerCounter = 1; +} + /*! * \brief View::VTreatmentVitals::stop * \details stops the timer */ -void View::VTreatmentVitals::stop() +void View::VTreatmentVitals::timerStop() { killTimer(_timerId); _timerId = 0; - _timerCounter = 0; + timerReset(); } Index: sources/view/hd/adjustment/common/VCommonAdjustmentVitals.h =================================================================== diff -u -rfc329c788fe9453983072bee937ccbc95b4ed6e4 -raa8f2c87c14c68d1fda6da2540d47144990a596c --- sources/view/hd/adjustment/common/VCommonAdjustmentVitals.h (.../VCommonAdjustmentVitals.h) (revision fc329c788fe9453983072bee937ccbc95b4ed6e4) +++ sources/view/hd/adjustment/common/VCommonAdjustmentVitals.h (.../VCommonAdjustmentVitals.h) (revision aa8f2c87c14c68d1fda6da2540d47144990a596c) @@ -19,6 +19,7 @@ // Project #include "main.h" // Doxygen : do not remove #include "VAdjustmentResponseBase.h" +#include "MUIBloodPressureData.h" namespace View { @@ -36,7 +37,7 @@ friend class ::tst_views; int _timerId = 0; - int _timerCounter = 0; + int _timerCounter = 1; // coco begin validated: // The property adjustment_Triggered has to be always true @@ -68,29 +69,19 @@ PROPERTY( QString , lastRead , "") // vitals - PROPERTY( quint32 , systolic , 0) - PROPERTY( quint32 , diastolic , 0) - PROPERTY( quint32 , heartRate , 0) + PROPERTY( quint16 , systolic , 0) + PROPERTY( quint16 , diastolic , 0) + PROPERTY( quint16 , heartRate , 0) - // placeholder for later connection and receiving data from BtCuff [Not used Yet] - struct VitalsData_PlaceHolder { - quint32 mAccepted = 0; - quint32 mReason = 0; + VIEW_DEC_CLASS_ADJUSTMENT(VTreatmentVitals, UIBloodPressureData) - quint32 mSystolic = 0; - quint32 mDiastolic = 0; - quint32 mHeartRate = 0; - }; - typedef VitalsData_PlaceHolder AdjustVitalsResposeData; - - VIEW_DEC_CLASS_ADJUSTMENT(VTreatmentVitals, AdjustVitalsResposeData) - - void update (quint32 vSystolic, quint32 vDiastolic, quint32 vHeartRate); + void update (quint16 vSystolic, quint16 vDiastolic, quint16 vHeartRate); void treatmentLog(); // timer - void start(); - void stop (); + void timerStart(); + void timerReset(); + void timerStop (); void timerEvent(QTimerEvent *) override; @@ -99,7 +90,7 @@ public slots: // vitals - void doConfirm (quint32 vSystolic, quint32 vDiastolic, quint32 vHeartRate); + void doConfirm (quint16 vSystolic, quint16 vDiastolic, quint16 vHeartRate); void doSkip (); void doTimeout (); void doReset (); Index: sources/view/settings/VBluetooth.cpp =================================================================== diff -u -re4a0e2fc4c7ae0cbce0d670772276bf7f5ff3845 -raa8f2c87c14c68d1fda6da2540d47144990a596c --- sources/view/settings/VBluetooth.cpp (.../VBluetooth.cpp) (revision e4a0e2fc4c7ae0cbce0d670772276bf7f5ff3845) +++ sources/view/settings/VBluetooth.cpp (.../VBluetooth.cpp) (revision aa8f2c87c14c68d1fda6da2540d47144990a596c) @@ -32,8 +32,8 @@ */ void View::VBluetooth::initConnections() { - connect(&_BluetoothInterface, &BluetoothInterface::didStateChange, - this , &VBluetooth::onStateChange ); + connect(&_BluetoothInterface, SIGNAL(didStateChange (BluetoothData )), + this , SLOT( onStateChange (Model::MBluetooth ))); } void View::VBluetooth::onStateChange(const Model::MBluetooth &vData) @@ -146,12 +146,14 @@ notification(message); // Console Log - message = _deviceAddr + " " + message + " " + _detailName + " " + _detailValue; - message = message.trimmed().simplified(); - qDebug().noquote().nospace() << message; + // DEBUG: message = _deviceAddr + " " + message + " " + _detailName + " " + _detailValue; + // message = message.trimmed().simplified(); + // qDebug().noquote().nospace() << message; // Service Log - LOG_DEBUG(message); + if ( vState != MBluetooth::eIS_Device_Start ) { // this is the "Device Connecting ..." state and has the interval of 1s and will fill up the service log fast, so removed from log. + LOG_DEBUG(message); + } } void View::VBluetooth::doScan () { _BluetoothInterface.doScan (); } Index: sources/view/settings/VBluetooth.h =================================================================== diff -u -re4a0e2fc4c7ae0cbce0d670772276bf7f5ff3845 -raa8f2c87c14c68d1fda6da2540d47144990a596c --- sources/view/settings/VBluetooth.h (.../VBluetooth.h) (revision e4a0e2fc4c7ae0cbce0d670772276bf7f5ff3845) +++ sources/view/settings/VBluetooth.h (.../VBluetooth.h) (revision aa8f2c87c14c68d1fda6da2540d47144990a596c) @@ -22,6 +22,7 @@ #include "VView.h" #include "MAdjustHDSerialNumberResponse.h" #include "MBluetooth.h" +#include "MUIBloodPressureData.h" // forward declarations class tst_views; @@ -62,7 +63,8 @@ signals: private slots: - void onStateChange (const Model::MBluetooth &vData); + void onStateChange (const Model::MBluetooth &vData); + QString toText ( Model::MBluetooth::InterfaceStates vState) const; void notify (Model::MBluetooth::InterfaceStates vState);