/*! * * Copyright (c) 2021-2025 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 VTreatmentTrends.cpp * \author (last) Stephen Quong * \date (last) 01-Oct-2025 * \author (original) Stephen Quong * \date (original) 01-Oct-2025 * */ #include "VTreatmentTrends.h" #include #include // Project #include "GuiController.h" using namespace View; /*! * \brief Function called during startup to register this class with the QMetaObject system */ static void qRegister() { qmlRegisterType ("VTreatmentTrends", 0, 1, "VTreatmentTrends"); } Q_COREAPP_STARTUP_FUNCTION(qRegister) /*! * \brief View::VTreatmentTrends * \details Constructor * \param parent - parent of this object */ VTreatmentTrends::VTreatmentTrends(QObject *parent) : QObject(parent), _data(this), _history(this) { QQmlEngine::setObjectOwnership(&_data, QQmlEngine::CppOwnership); _data.setRoleNames({ { eDataRole_Timestamp, "timestamp" }, { eDataRole_Systolic, "systolic" }, { eDataRole_Diastolic, "diastolic" }, { eDataRole_PulseRate, "pulseRate" }, { eDataRole_UFVolumeRemoved, "ufVolumeRemoved" }, { eDataRole_UFRate, "ufRate" }, { eDataRole_ArterialPressure, "arterialPressure" }, { eDataRole_VenousPressure, "venousPressure" }, { eDataRole_TMP, "tmp" }, { eDataRole_BolusCumulativeDelivered, "bolusCumulativeDelivered" }, { eDataRole_BloodFlowRate, "bloodFlowRate" }, { eDataRole_DialysateFlowRate, "dialysateFlowRate" }, { eDataRole_DialysateTemperature, "dialysateTemperature" }, { eDataRole_Conductivity, "conductivity" }, }); QQmlEngine::setObjectOwnership(&_history, QQmlEngine::CppOwnership); _history.setRoleNames({ { eHistoryRole_Timestamp, "timestamp" }, { eHistoryRole_EntryID, "entryID" }, { eHistoryRole_Priority, "priority" }, { eHistoryRole_Message, "message" }, }); initConnections(); } /*! * \brief View::VTreatmentTrends::initConnections * \details Initializes the signal/slot connections for this object */ void VTreatmentTrends::initConnections() { ACTION_VIEW_CONNECTION(DDConductivityData ) ACTION_VIEW_CONNECTION(PressureOcclusionData ) ACTION_VIEW_CONNECTION(TreatmentLogAlarmData ) ACTION_VIEW_CONNECTION(TreatmentLogEventData ) ACTION_VIEW_CONNECTION(TreatmentParametersSetPointData ) ACTION_VIEW_CONNECTION(TreatmentSalineData ) ACTION_VIEW_CONNECTION(TreatmentStatesData ) ACTION_VIEW_CONNECTION(TreatmentTimeData ) ACTION_VIEW_CONNECTION(TreatmentUltrafiltrationData ) ACTION_VIEW_CONNECTION(TreatmentVitalsData ) } /*! * \brief View::VTreatmentTrends::doClearData * \details Clears all information in the data and history list models. */ void VTreatmentTrends::doClearData() { _data.clear(); _history.clear(); } /*! * \brief View::VTreatmentTrends::onActionReceive * \details The data handler that gets DD conductivity data * \param vData - DD conductivity data */ void VTreatmentTrends::onActionReceive(const DDConductivityData &vData) { _latestData[eDataRole_Conductivity] = vData.mAcidBicarbCondutivity2; } /*! * \brief View::VTreatmentTrends::onActionReceive * \details The data handler that gets TD pressure occlusion data * \param vData - TD pressure occlusion data */ void VTreatmentTrends::onActionReceive(const PressureOcclusionData &vData) { _latestData[eDataRole_ArterialPressure ] = vData.mArterialPressure; _latestData[eDataRole_VenousPressure ] = vData.mVenousPressure; _latestData[eDataRole_TMP ] = vData.mTmpPressure; } /*! * \brief View::VTreatmentTrends::onActionReceive * \details The data handler that gets TD treatment log alarm data * \param vData - TD treatment log alarm data */ void View::VTreatmentTrends::onActionReceive(const TreatmentLogAlarmData &vData) { TrendEntry entry; entry[eHistoryRole_Timestamp] = QDateTime::currentDateTime(); entry[eHistoryRole_EntryID] = vData.mAlarmID; entry[eHistoryRole_Priority] = 0; entry[eHistoryRole_Message] = _TreatmentLog.alarmTitle(vData.mAlarmID, false); _history.insertRow(0, entry); } /*! * \brief View::VTreatmentTrends::onActionReceive * \details The data handler that gets TD treatment log event data * \param vData - TD treatment log event data */ void View::VTreatmentTrends::onActionReceive(const TreatmentLogEventData &vData) { TrendEntry entry; entry[eHistoryRole_Timestamp] = QDateTime::currentDateTime(); entry[eHistoryRole_EntryID] = vData.mEventID; entry[eHistoryRole_Priority] = 0; entry[eHistoryRole_Message] = _TreatmentLog.eventTitle(vData.mEventID, false); _history.insertRow(0, entry); } /*! * \brief View::VTreatmentTrends::onActionReceive * \details The data handler that gets TD treatment parameters set point data * \param vData - TD treatment parameters set point data */ void VTreatmentTrends::onActionReceive(const TreatmentParametersSetPointData &vData) { _latestData[eDataRole_BloodFlowRate ] = vData.mBloodFlow; _latestData[eDataRole_DialysateFlowRate ] = vData.mDialysateFlow; _latestData[eDataRole_DialysateTemperature ] = vData.mDialysateTemp; } /*! * \brief View::VTreatmentTrends::onActionReceive * \details The data handler that gets TD treatment saline data * \param vData - TD treatment saline data */ void VTreatmentTrends::onActionReceive(const TreatmentSalineData &vData) { _latestData[eDataRole_BolusCumulativeDelivered] = vData.mCumulative; } /*! * \brief View::VTreatmentTrends::onActionReceive * \details The data handler that gets TD treatment states data * \param vData - TD treatment states data */ void VTreatmentTrends::onActionReceive(const TreatmentStatesData &vData) { static GuiTreatmentStates currentSubMode = GuiActions::NUM_OF_TREATMENT_STATES; if (vData.mSubMode != currentSubMode) { TrendEntry entry; entry[eHistoryRole_Timestamp] = QDateTime::currentDateTime(); entry[eHistoryRole_EntryID] = QVariant(); entry[eHistoryRole_Priority] = 0; switch (vData.mSubMode) { case GuiActions::TREATMENT_START_STATE: time_Start(QTime::currentTime()); entry[eHistoryRole_Message] = tr("Start Treatment"); _history.insertRow(0, entry); break; case GuiActions::TREATMENT_PAUSED_STATE: entry[eHistoryRole_Message] = tr("Treatment Paused"); _history.insertRow(0, entry); break; case GuiActions::TREATMENT_END_STATE: { entry[eHistoryRole_Message] = tr("End Treatment"); _history.insertRow(0, entry); break; } } currentSubMode = GuiTreatmentStates(vData.mSubMode); } } /*! * \brief View::VTreatmentTrends::onActionReceive * \details The data handler that gets TD treatment time data * \param vData - TD treatment time data */ void VTreatmentTrends::onActionReceive(const TreatmentTimeData &vData) { time_Elapsed(vData.mElapsed); } /*! * \brief View::VTreatmentTrends::onActionReceive * \details The data handler that gets TD treatment ultrafiltration data * \param vData - TD treatment ultrafiltration data */ void VTreatmentTrends::onActionReceive(const TreatmentUltrafiltrationData &vData) { _latestData[eDataRole_UFVolumeRemoved ] = vData.mVolumeRemoved; _latestData[eDataRole_UFRate ] = vData.mTargetRate; } /*! * \brief View::VTreatmentTrends::onActionReceive * \details The data handler that gets TD treatment vitals data * \param vData - TD treatment vitals data */ void VTreatmentTrends::onActionReceive(const TreatmentVitalsData &vData) { _latestData[eDataRole_Timestamp ] = QDateTime::currentDateTime(); _latestData[eDataRole_Systolic ] = vData.mSystolic; _latestData[eDataRole_Diastolic ] = vData.mDiastolic; _latestData[eDataRole_PulseRate ] = vData.mHeartRate; _data.insertRow(0, _latestData); _latestData.clear(); } /*! * \brief View::VTreatmentTrends::onIntervalRequestVitals * \details Slot to handle when vitals is requested when the vitals interval has timed out */ void VTreatmentTrends::onIntervalRequestVitals() { _savedData = _latestData; _savedData[eDataRole_Timestamp] = QDateTime::currentDateTime(); _savedData[eDataRole_Systolic ] = QVariant(); _savedData[eDataRole_Diastolic ] = QVariant(); _savedData[eDataRole_PulseRate ] = QVariant(); } /*! * \brief View::VTreatmentTrends::onIntervalTimeoutVitals * \details Slot to handle when vitals is not received within the timeout window */ void VTreatmentTrends::onIntervalTimeoutVitals() { _data.insertRow(0, _savedData); _latestData.clear(); } /*! * \brief View::VTreatmentTrends::onIntervalTimeoutVitals * \details Slot to handle when vitals is manually inputted * \param vSystolic - vitals systolic value * \param vDiastolic - vitals diastolic value * \param vHeartRate - vitals heart rate value */ void VTreatmentTrends::onManualVitals(const quint16 vSystolic, const quint16 vDiastolic, const quint16 vHeartRate) { _latestData[eDataRole_Timestamp ] = QDateTime::currentDateTime(); _latestData[eDataRole_Systolic ] = vSystolic; _latestData[eDataRole_Diastolic ] = vDiastolic; _latestData[eDataRole_PulseRate ] = vHeartRate; _data.insertRow(0, _latestData); _latestData.clear(); } /*! * \brief View::VTreatmentTrends::onIntervalTimeoutVitals * \details Slot to handle when a treatment data entry is recorded with no vitals data */ void VTreatmentTrends::onNoVitalsRecord() { _latestData[eDataRole_Timestamp ] = QDateTime::currentDateTime(); _latestData[eDataRole_Systolic ] = QVariant(); _latestData[eDataRole_Diastolic ] = QVariant(); _latestData[eDataRole_PulseRate ] = QVariant(); _data.insertRow(0, _latestData); _latestData.clear(); } /*! * \brief View::VTreatmentTrends::data * \details Getter for the data list model * \note This is needed so the list model can be accessed as a property in QML. * \return pointer to the data list model */ MListModel* VTreatmentTrends::data() { return &_data; } /*! * \brief View::VTreatmentTrends::history * \details Getter for the history list model * \note This is needed so the list model can be accessed as a property in QML. * \return pointer to the history list model */ MListModel* VTreatmentTrends::history() { return &_history; }