Index: sources/view/hd/adjustment/common/VCommonAdjustmentVitals.cpp =================================================================== diff -u -rab7ffd27ecea1277d8645a8b62ff48c0cb3f6ff4 -r2ef03b2ce51b4dc507f66e9671953a8e0824bde9 --- sources/view/hd/adjustment/common/VCommonAdjustmentVitals.cpp (.../VCommonAdjustmentVitals.cpp) (revision ab7ffd27ecea1277d8645a8b62ff48c0cb3f6ff4) +++ sources/view/hd/adjustment/common/VCommonAdjustmentVitals.cpp (.../VCommonAdjustmentVitals.cpp) (revision 2ef03b2ce51b4dc507f66e9671953a8e0824bde9) @@ -1,15 +1,15 @@ /*! * - * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. + * Copyright (c) 2021-2024 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 VAdjustmentAlarmVolume.h + * \file VCommonAdjustmentVitals.cpp * \author (last) Behrouz NematiPour - * \date (last) 06-Jun-2021 + * \date (last) 10-Jan-2024 * \author (original) Behrouz NematiPour - * \date (original) 06-Jun-2021 + * \date (original) 23-Jun-2021 * */ #include "VCommonAdjustmentVitals.h" @@ -20,6 +20,7 @@ // Project #include "GuiController.h" #include "TreatmentLog.h" +#include "BluetoothInterface.h" VIEW_DEF_CLASS_ADJUSTMENT(VTreatmentVitals) @@ -28,14 +29,10 @@ * \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 ( ))); - + connect(this, SIGNAL( intervalChanged (const quint8 &)), + this, SLOT(onIntervalChanged ( ))); } /*! @@ -45,44 +42,42 @@ * \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")); - return; - } + // Not used yet. + // adjustment_Accepted ( vData.mAccepted ); + // adjustment_Reason ( vData.mReason ); - adjustment_Accepted ( vData.mAccepted ); - adjustment_Reason ( vData.mReason ); - - update(vData.mSystolic, vData.mDiastolic, vData.mHeartRate); - treatmentLog(); - LOG_EVENT(tr("Cuff Vital Measurement,%1,%2,%3") - .arg(_systolic ) - .arg(_diastolic) - .arg(_heartRate) - ); + update_rt (vData.mSystolic, vData.mDiastolic, vData.mPulseRate); + emit didTrigger(vData.mSystolic, vData.mDiastolic, vData.mPulseRate); + // if the vitals is disabled it means Gui is probably in an incorrect state and is unable to handle the vital information. + LOG_APPED_UI(tr("Vital received,%1,%2,%3") + .arg(vData.mSystolic ) + .arg(vData.mDiastolic) + .arg(vData.mPulseRate)); } /*! - * \brief View::VPostTreatmentAdjustmentTreatmentLog::doVitalReceive + * \brief View::VTreatmentVitals::doConfirm * \details Append the user measured BP/HR in to the list of the Treatment Log Average data * \param vSystolic - Blood Pressure Systolic * \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_APPED_UI(tr("Vital Confirmed,%1,%2,%3") .arg(_systolic ) .arg(_diastolic) .arg(_heartRate) ); + timerReset(); } /*! @@ -91,30 +86,26 @@ */ void View::VTreatmentVitals::doSkip() { - LOG_EVENT(tr("User Skipped Vital Entry")); + LOG_APPED_UI(tr("Vital Skipped")); + timerReset(); } /*! - * \brief View::VTreatmentVitals::doTimeout - * \details logs the vital entry timeout - */ -void View::VTreatmentVitals::doTimeout() -{ - LOG_EVENT(tr("User Vital Entry Timed out")); -} - -/*! * \brief View::VTreatmentVitals::doReset * \details reset the previously read vital values + * \param vEnabled - Disable or enable the vitals. + * \note it's still unknown that how to stop in case of the treatment ended by alarm or system fault. */ void View::VTreatmentVitals::doReset() { - epoch ( 0 ); - lastRead ( ""); - systolic ( 0 ); - diastolic ( 0 ); - heartRate ( 0 ); + epoch ( 0 ); + lastRead ( ""); + systolic ( 0 ); + diastolic ( 0 ); + heartRate ( 0 ); + enableDialog ( 0 ); + // force notify the Gui emit epochChanged ( 0 ); emit lastReadChanged ( ""); @@ -130,11 +121,11 @@ * \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(); + QDateTime currentDateTime = QDateTime::currentDateTime(); epoch (currentDateTime.toSecsSinceEpoch()); - lastRead (currentDateTime.toString(_datetimeFormat)); + lastRead (currentDateTime.toString(_Settings.getDatetimeFormat())); systolic ( vSystolic ); diastolic ( vDiastolic ); heartRate ( vHeartRate ); @@ -145,6 +136,21 @@ } /*! + * \brief View::VTreatmentVitals::update_rt + * \details The vital properties will only be updated if the user confirms the read values. + * But this ones are for debugging purposes and will be updated all the time in Real Time when the vitals received. + * \param vSystolic - Blood Pressure Systolic + * \param vDiastolic - Blood Pressure Diastolic + * \param vHeartRate - Heart Rate + */ +void View::VTreatmentVitals::update_rt(quint16 vSystolic, quint16 vDiastolic, quint16 vHeartRate) +{ + systolic__rt ( vSystolic ); + diastolic_rt ( vDiastolic ); + heartRate_rt ( vHeartRate ); +} + +/*! * \brief View::VTreatmentVitals::treatmentLog * \details Appends the vitals values to the treatment log list (for later store in the TxLog at the end of Tx) * \note the method update has to be called before calling this method to update the property values used in this method. @@ -165,39 +171,73 @@ */ void View::VTreatmentVitals::timerEvent(QTimerEvent *) { - qDebug() << __FUNCTION__ << _timerCounter; - if ( _interval == _timerCounter ) { - _timerCounter = 0; + if ( ! _timerId ) return; // No timer started or failed starting + if ( ! _interval ) return; // if interval is 0/OFF return + + // DEBUG: qDebug() << __FUNCTION__ << _counter_sec << _counter_min << _interval << _timerId; + _counter_sec++; + + min_left(_counter_min ); + sec_left(60 - _counter_sec); + + countdown(QString("%1:%2").arg(_min_left,2,10,QChar('0')).arg(_sec_left,2,10,QChar('0'))); + + if ( _counter_sec % 60 ) return; // only check every minute + + if ( ! _counter_min ) { + timerStop(); emit didTrigger(); } - _timerCounter++; + else { + _counter_min--; + _counter_sec = 0; + } } -void View::VTreatmentVitals::onTimerChanged() +void View::VTreatmentVitals::onIntervalChanged() { - if ( _interval && _enabled ) - start(); - else - stop(); + // DEBUG: qDebug() << __FUNCTION__ << _counter_sec << _counter_min << _interval << _timerId; + if ( _interval ) timerReset(); + else timerStop (); // Timer stop is resetting timer too. } /*! * \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 + if ( _timerId ) killTimer(_timerId); // this typically should not happen. + if ( ! _interval ) return; // if interval is 0/OFF return + // DEBUG: qDebug() << __FUNCTION__ << _counter_sec << _counter_min << _interval << _timerId; + timerReset(); + _timerId = startTimer(1000); // 1 sec interval which will used as 1 min in timerEvent (easier to debug) } + +void View::VTreatmentVitals::timerReset() +{ + if ( _interval ) { + // ( -1 ) :the interval is 0 based but if as an example we set the counter to 5 then 5 itself gets a minute to pass which makes it 6 min. + _counter_min = _interval - 1; + } + else { // if _interval == 0, counter should set to 0 too not to -1 + _counter_min = 0; + } + _counter_sec = 0; + // DEBUG: qDebug() << __FUNCTION__ << _counter_sec << _counter_min << _interval << _timerId; +} + /*! * \brief View::VTreatmentVitals::stop - * \details stops the timer + * \details stops the timer and resets the interval */ -void View::VTreatmentVitals::stop() +void View::VTreatmentVitals::timerStop() { + if ( ! _timerId ) return; // No timer started or failed starting + // DEBUG: qDebug() << __FUNCTION__ << _counter_sec << _counter_min << _interval << _timerId; killTimer(_timerId); _timerId = 0; - _timerCounter = 0; + timerReset(); }