/*! * * Copyright (c) 2020-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 VTreatmentCreate.cpp * \author (last) Behrouz NematiPour * \date (last) 21-Nov-2023 * \author (original) Peter Lucia * \date (original) 22-Sep-2020 * */ // Qt // Project #include "ApplicationController.h" #include "VTreatmentCreate.h" #include "FileHandler.h" #include "MsgDefs.h" #include "TreatmentLog.h" using namespace Gui; using namespace View; using namespace Storage; VTreatmentCreate::VTreatmentCreate(QObject *parent) : QObject(parent) { ADJUST_VIEW_CONNECTION(AdjustParametersValidationRequestData ) ACTION_VIEW_CONNECTION(AdjustParametersValidationResponseData ) ADJUST_VIEW_CONNECTION(AdjustParametersConfirmRequestData ) ACTION_VIEW_CONNECTION(AdjustSerialNumberTDResponseData ) } /** * \brief VCreateTreatment::doValidation * Validates the treatment profile locally, then requests validation of it with FW */ void VTreatmentCreate::doValidation() { AdjustParametersValidationRequestData data; data.mBloodFlowRate = _bloodFlowRate ; data.mDialysateFlowRate = _dialysateFlowRate ; data.mTreatmentDuration = _treatmentDuration ; data.mSalineBolusVolume = _salineBolusVolume ; data.mHeparinStopTime = _heparinStopTime ; data.mHeparinType = _heparinType ; data.mAcidConcentrate = _acidConcentrate ; data.mBicarbonateConcentrate = _bicarbonateConcentrate ; data.mDialyzerType = _dialyzerType ; data.mBloodPressureMeasureInterval = _bloodPressureMeasureInterval ; data.mRinsebackFlowRate = _rinsebackFlowRate ; data.mRinsebackVolume = _rinsebackVolume ; data.mArterialPressureLimitWindow = _arterialPressureLimitWindow ; data.mVenousPressureLimitWindow = _venousPressureLimitWindow ; data.mVenousPressureLimitAsymtrc = _venousPressureLimitAsymtrc ; data.mTransmembranePressureLimitWindow = _transmembranePressureLimitWindow; data.mDialysateTemp = _dialysateTemp ; data.mHeparinDispensingRate = _heparinDispensingRate ; data.mHeparinBolusVolume = _heparinBolusVolume ; parametersConfirmed(false); parametersValidated(false); emit didAdjustment(data); } /** * \brief VCreateTreatment::doConfirm * \details Emits treatment data to GUI controller, * who emits to application controller * \note Finished create treatment confirm... */ void VTreatmentCreate::doConfirm() { AdjustParametersConfirmRequestData confirmTreatmentRequest; confirmTreatmentRequest.requestedState = AdjustParametersConfirmRequestData::eConfirm; parametersConfirmed(true); emit didAdjustment(confirmTreatmentRequest); } /** * \brief VCreateTreatment::doCancel * \details Notifies FW the user has canceled confirming the treatment parameters * \note Telling FW user is canceling confirm treatment parameters... */ void VTreatmentCreate::doCancel() { AdjustParametersConfirmRequestData confirmTreatmentRequest; confirmTreatmentRequest.requestedState = AdjustParametersConfirmRequestData::eCancel; parametersValidated(false); parametersConfirmed(false); emit didAdjustment(confirmTreatmentRequest); } /** * \brief VCreateTreatment::enumToString * Convenience function to convert an enum to a string * \param vEnum - the enum value * \return QString - the enum name */ QString VTreatmentCreate::enumToString(GuiRequestReasons vEnum) { return Gui::enumString(vEnum, "[%1] Unknown Rejection Reason"); } /** * \brief VCreateTreatment::onFWValidationResponse * Slot to handle a validation response from FW * \param actionType The action type must be a create treatment response * \param messageData The message data must contain the reject reason codes for all parameters * \returns True if FW OK's treatment parameters, false otherwise */ void VTreatmentCreate::onActionReceive(const AdjustParametersValidationResponseData &data) { if (! data.mAccepted) { bloodFlowRateRejectReason (data.mBloodFlowRateRejectReason ); dialysateFlowRateRejectReason (data.mDialysateFlowRateRejectReason ); treatmentDurationRejectReason (data.mTreatmentDurationRejectReason ); heparinDispensingRateRejectReason (data.mHeparinDispensingRateRejectReason ); heparinBolusVolumeRejectReason (data.mHeparinBolusVolumeRejectReason ); heparinStopTimeRejectReason (data.mHeparinStopTimeRejectReason ); salineBolusVolumeRejectReason (data.mSalineBolusVolumeRejectReason ); heparinTypeRejectReason (data.mHeparinTypeRejectReason ); acidConcentrateRejectReason (data.mAcidConcentrateRejectReason ); bicarbonateConcentrateRejectReason (data.mBicarbonateConcentrateRejectReason ); dialyzerTypeRejectReason (data.mDialyzerTypeRejectReason ); dialysateTempRejectReason (data.mDialysateTempRejectReason ); arterialPressureLimitWindowRejectReason (data.mArterialPressureLimitWindowRejectReason ); venousPressureLimitWindowRejectReason (data.mVenousPressureLimitWindowRejectReason ); venousPressureLimitAsymtrcRejectReason (data.mVenousPressureLimitAsymtrcRejectReason ); bloodPressureMeasureIntervalRejectReason (data.mBloodPressureMeasureIntervalRejectReason ); rinsebackFlowRateRejectReason (data.mRinsebackFlowRateRejectReason ); rinsebackVolumeRejectReason (data.mRinsebackVolumeRejectReason ); transmembranePressureLimitWindowRejectReason(data.mTransmembranePressureLimitWindowRejectReason ); parametersValidated(false); } else { if ( _txCode.isEmpty()) { generateTxCode(); } parametersValidated(true); emit didValidationPass(); } } /*! * \brief VTreatmentCreate::onActionReceive * \details This message is received from the HD in POST through the applicationController and GuiController. * This class keeps the serial for any treatment Code (txCode) generation * \param data - the message model data */ void VTreatmentCreate::onActionReceive(const AdjustSerialNumberTDResponseData &data) { _tdSerialNumber = data.mSerialNumber; } /*! * \brief VTreatmentCreate::generateTxCode * \details Generates the txCode by combination of the HD serial number and date and time in yyyyMMddHHmmss * And updates the TreatmenLog class to be saved in the Tx Report. */ void VTreatmentCreate::generateTxCode() { QDateTime datetime = QDateTime::currentDateTime(); QString today = datetime.toString("yyyyMMddHHmmss"); txCode(_tdSerialNumber + today); _TreatmentLog.gTxCode(_txCode); LOG_APPED_UI(QString("Generated Treatment Code is %1").arg(_txCode)); } /*! * \brief VCreateTreatment::doGetPrescriptionParameterValues * \details Gets a list of the prescription parameter values * \return (QStringList) The list of parameter values with units */ QStringList VTreatmentCreate::doGetPrescriptionParameterValues() { return QStringList() << QString("%1 mL/min" ).arg(_bloodFlowRate ) << QString("%1 mL/min" ).arg(_dialysateFlowRate ) << QString("%1 min" ).arg(_treatmentDuration ) << ( _heparinDispensingRate ? QString("%1 mL/hr" ).arg(_heparinDispensingRate) : tr("OFF") ) << ( _heparinBolusVolume ? QString("%1 mL" ).arg(_heparinBolusVolume ) : tr("OFF") ) << ( _heparinDispensingRate ? QString("%1 min" ).arg(_heparinStopTime ) : tr("OFF") ) << QString("%1 mL" ).arg(_salineBolusVolume ) ; } /*! * \brief VCreateTreatment::doGetOperatingParameterValues * \details Gets the operating parameter values * \return (QStringList) The list of operating parameter values with units where applicable */ QStringList VTreatmentCreate::doGetOperatingParameterValues() { QString mHeparinType ; QString mAcidConcentrate ; QString mBicarbonateConcentrate ; QString mDialyzerType ; QStringList mHeparinTypeOptions ; QStringList mAcidConcentrateOptions ; QStringList mBicarbonateConcentrateOptions ; QStringList mDialyzerTypeOptions ; QString mCategory = Storage::Settings_Category_DataList; if ( heparinTypeSet () ) { // this is managed on UI with heparinTypeSet() // && ( _heparinDispensingRate || _heparinBolusVolume ) mHeparinTypeOptions = _Settings.keys(mCategory, "Heparin Type Options" ); if ((int) _heparinType < mHeparinTypeOptions .length()) mHeparinType = mHeparinTypeOptions .at( _heparinType ); } else { mHeparinType = tr("NONE"); } if ( acidConcentrateSet () ) { mAcidConcentrateOptions = _Settings.keys(mCategory, "Acid Concentrate Options" ); if ((int) _acidConcentrate < mAcidConcentrateOptions .length()) mAcidConcentrate = mAcidConcentrateOptions .at( _acidConcentrate ); } else { mAcidConcentrate = tr("NONE"); } if ( bicarbonateConcentrateSet () ) { mBicarbonateConcentrateOptions = _Settings.keys(mCategory, "Bicarbonate Concentrate Options" ); if ((int) _bicarbonateConcentrate < mBicarbonateConcentrateOptions .length()) mBicarbonateConcentrate = mBicarbonateConcentrateOptions .at( _bicarbonateConcentrate ); } else { mBicarbonateConcentrate = tr("NONE"); } if ( dialyzerTypeSet () ) { mDialyzerTypeOptions = _Settings.keys(mCategory, "Dialyzer Type Options" ); if ((int) _dialyzerType < mDialyzerTypeOptions .length()) mDialyzerType = mDialyzerTypeOptions .at( _dialyzerType ); } else { mDialyzerType = tr("NONE"); } return QStringList() << mHeparinType << mAcidConcentrate << mBicarbonateConcentrate << mDialyzerType << QString("%0 °C" ).arg(_dialysateTemp ) << ( _bloodPressureMeasureInterval ? QString("%0 min").arg(_bloodPressureMeasureInterval) : tr("OFF") ) ; }