/*! * * 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 TreatmentLog.h * \author (last) Behrouz NematiPour * \date (last) 13-Mar-2024 * \author (original) Behrouz NematiPour * \date (original) 04-May-2021 * */ #pragma once // Qt #include #include #include // Project #include "main.h" // Doxygen : do not remove #include "MPostTreatmentAdjustTreatmentLogResponse.h" #include "MTreatmentLogAvrgeData.h" #include "MTreatmentLogAlarmData.h" #include "MTreatmentLogEventData.h" // define #define _TreatmentLog Storage::TreatmentLog::I() namespace Storage { /*! * \brief The TreatmentLog class * This class is the controller which converts/saves/exports model to be used in the UI/TreatmentLog */ class TreatmentLog : public QObject { Q_OBJECT const int _interval = 1000; // 1s const int _pendingInterval= 60 ; // 1m int _pendingCounter = 0 ; // const QString _sep = ","; QString _treatmentLogPath; const char* _treatmentLogExtUploaded = "txr"; const char* _treatmentLogExtPending = "txr.p"; const char* _txCodeKey = "Tx Code"; QFutureWatcher _saveWatcher; QFutureWatcher _exportWatcher; QString _dateFormat = "yyyy/MM/dd" ; QString _timeFormat = "HH:mm" ; QString _datetimeFormat = _dateFormat + " " + _timeFormat; // TODO : A Unit class needs to be created to have all the unit string and all the required conversions. QString _unitTextFlowRate = tr("mL/min" ); QString _unitTextDurationHour = tr("hour" ); QString _unitTextDurationMin = tr("min" ); QString _unitTextConcentration = tr("mEq/L" ); QString _unitTextTemperature = tr("C" ); QString _unitTextVolume = tr("L" ); QString _unitTextFluid = tr("mL" ); QString _unitTextHeparinConcentration = tr("IU/mL" ); QString _unitTextDispensingRate = tr("mL/hr" ); QString _unitTextBloodPressure = tr("mmHg" ); struct TxInfo { void clear() { mStatus = false; mDateTime = ""; mDeviceID = ""; mPatientID = ""; mFileName = ""; } bool mStatus = false; QString mDateTime = ""; QString mDeviceID = ""; QString mPatientID = ""; QString mFileName = ""; } _lastTxInfo; QString _deviceID = "unknown"; QString _pendingTxr = ""; QString _emptyPatinetID = "NoPatientIDEntered"; // No translation MEMBER( QString , gTxCode, ""); // content of this value is generated by VPreTreatment. MEMBER( QString , rTxCode, ""); // content of this value be received from CloudSync App. enum Role { eTitle, eValue, eUnit , eCount }; enum TreatmentLogIndex { ePatientID , eBloodFlowRate , eDialysateFlowRate , eTreatmentDuration , eActualTreatmentDuration , eAcidConcentrateType , eBicarbonateConcentrateType , ePotassiumConcentration , eCalciumConcentration , eBicarbonateConcentration , eSodiumConcentration , eDialysateTemperature , eDialyzerType , eHeparinType , eHeparinConcentration , eHeparinBolusVolume , eHeparinDispenseRate , eHeparinStop , eHeparinDeliveredVolume , eTreatmentStartDateTime , eTreatmentEndDateTime , eWaterSampleTestResult , eDialysateVolumeUsed , eOriginUFVolume , eTargetUFVolume , eActualUFVolume , eOriginUFRate , eTargetUFRate , eActualUFRate , eSalineBolusVolume , eTreatmentLogIndexCount , }; const QStringList _titles { tr("Patient ID" ), // ePatientID tr("Blood Flow Rate" ), // eBloodFlowRate tr("Dialysate Flow Rate" ), // eDialysateFlowRate tr("Treatment Duration" ), // eTreatmentDuration tr("Actual Treatment Duration" ), // eActualTreatmentDuration tr("Acid ConcentrateType" ), // eAcidConcentrateType tr("Bicarbonate Concentrate Type" ), // eBicarbonateConcentrateType tr("Potassium Concentration" ), // ePotassiumConcentration tr("Calcium Concentration" ), // eCalciumConcentration tr("Bicarbonate Concentration" ), // eBicarbonateConcentration tr("Sodium Concentration" ), // eSodiumConcentration tr("Dialysate Temperature" ), // eDialysateTemperature tr("Dialyzer Type" ), // eDialyzerType tr("Heparin Type" ), // eHeparinType tr("Heparin Concentration" ), // eHeparinConcentration tr("Heparin Bolus Volume" ), // eHeparinBolusVolume tr("Heparin Dispense Rate" ), // eHeparinDispenseRate tr("Heparin Stop" ), // eHeparinStop tr("Heparin Delivered Volume" ), // eHeparinDeliveredVolume tr("Treatment Start DateTime" ), // eTreatmentStartDateTime tr("Treatment End DateTime" ), // eTreatmentEndDateTime tr("Water Sample Test Result" ), // eWaterSampleTestResult tr("Dialysate Volume Used" ), // eDialysateVolumeUsed tr("Prescribed UF Volume" ), // eOriginUFVolume tr("Target UF Volume" ), // eTargetUFVolume tr("Actual UF Volume" ), // eActualUFVolume tr("Prescribed UF Rate" ), // eOriginUFRate tr("Target UF Rate" ), // eTargetUFRate tr("Actual UF Rate" ), // eActualUFRate tr("Saline Bolus Volume" ), // eSalineBolusVolume }; const QStringList _units { "" , // ePatientID _unitTextFlowRate , // eBloodFlowRate _unitTextFlowRate , // eDialysateFlowRate _unitTextDurationMin , // eTreatmentDuration _unitTextDurationMin , // eActualTreatmentDuration "" , // eAcidConcentrateType "" , // eBicarbonateConcentrateType _unitTextConcentration , // ePotassiumConcentration _unitTextConcentration , // eCalciumConcentration _unitTextConcentration , // eBicarbonateConcentration _unitTextConcentration , // eSodiumConcentration _unitTextTemperature , // eDialysateTemperature "" , // eDialyzerType "" , // eHeparinType _unitTextHeparinConcentration , // eHeparinConcentration _unitTextFluid , // eHeparinBolusVolume _unitTextDispensingRate , // eHeparinDispenseRate _unitTextDurationMin , // eHeparinStop _unitTextFluid , // eHeparinDeliveredVolume "" , // eTreatmentStartDateTime "" , // eTreatmentEndDateTime "" , // eWaterSampleTestResult _unitTextVolume , // eDialysateVolumeUsed _unitTextVolume , // eOriginUFVolume _unitTextVolume , // eTargetUFVolume _unitTextVolume , // eActualUFVolume _unitTextFlowRate , // eOriginUFRate _unitTextFlowRate , // eTargetUFRate _unitTextFlowRate , // eActualUFRate _unitTextFluid , // eSalineBolusVolume }; QString string(quint8 vIndex , const QStringList &vStringList) const { QString str = ""; if (vIndex < vStringList.count()) { str = vStringList[vIndex]; str.remove(_sep); } return str; } QString title(quint8 vIndex) const { return string(vIndex, _titles );} QString value(quint8 vIndex) const { return string(vIndex, _values );} QString unit (quint8 vIndex) const { return string(vIndex, _units );} // Lists QStringList _values; QList _treatmentLogAvrgeData; QList _treatmentLogAlarmData; QList _treatmentLogEventData; QMap _treatmentLogAlarmTitles; QMap _treatmentLogEventTitles; void readAlarmTitles ( ); void readEventTitles ( ); QString alarmTitle (quint32 vID); QString eventTitle (quint32 vID); void initConnections(); void logPath (Logger::LogType vLogType, QString vLogPath); bool saveLog (); void saveLogConcurrent (); bool exportLog (); void exportLogConcurrent(); bool checkTxCode(); bool findTxCode (); void sendPending(); // Pending Tx Report void testPendingTxReports (); // eMessageID_TxReport NOTIFIER(isIdle) SINGLETON(TreatmentLog) protected: void timerEvent(QTimerEvent *) override; public: void initModel(const AdjustTreatmentLogResponseData &vData, const QString &vPatientID, bool vHeparinBolusVolumeOff, bool vHeparinDispensingRateOff); void clearModel() { _values.clear(); for (int i = 0; i < eTreatmentLogIndexCount; i++) _values << ""; } const QStringList titles () const { return _titles ; } const QStringList units () const { return _units ; } const QStringList values () const { return _values ; } void append(const TreatmentLogAvrgeData &vData); void append(const TreatmentLogAlarmData &vData); void append(const TreatmentLogEventData &vData); QString logPath () const { return _treatmentLogPath; } private slots: void onLogPathSet(Logger::LogType vLogType, const QString &vLogPath); void onSave (); void onExport (); void onTxCodeReceive (const QString &vTxCode); void onCloudSyncStatus ( bool vReady ); public slots: void doSave (); void doExport (); signals: void didPendingTxr ( const QString &vFileName ); void didTxCodeReceive ( const QString &vTxCode ); void didNotification ( const QString &vNotification ); }; }