// Project #include "GuiController.h" #include "format.h" #include "VCalibrationSettings.h" #include VIEW_DEF_CLASS_ADJUSTMENT(VCalibrationSettings) void View::VCalibrationSettings::initConnections() { ADJUST_VIEW_CONNECTION(DDCalibrationPressureRequestData) ADJUST_VIEW_CONNECTION(AdjustDDCalibrationPressureRequestData) ACTION_VIEW_CONNECTION(DDCalibrationPressureResponseData) ACTION_VIEW_CONNECTION(AdjustDDCalibrationPressureResponseData) _calibrationList.setRoleNames({ { eRole_Title , "title" }, { eRole_Component , "component" }, { eRole_Payload , "payload" }, { eRole_Rejections , "rejections" }, { eRole_Received , "received" }, }); } /*! * \brief VCalibrationSettings::initList * \details Initializes the list for the payload and rejection reasons * \param vTitles - list of column titles * \return returns empty list the size of the number of columns */ QVariantList View::VCalibrationSettings::initList(const QStringList &vTitles) { columnTitle ( vTitles ) ; QVariantList mInitValues; mInitValues.reserve(vTitles.count()); for (int i = 0; i < vTitles.count(); ++i) { mInitValues.append(0.0); } return mInitValues; } /*! * \brief VCalibrationSettings::getEpochUTC * \details Gets current time as UTC epoch * \return returns epoch */ quint32 View::VCalibrationSettings::getEpochUTC() { const QDateTime currentDateTimeUTC = QDateTime::currentDateTime(); return currentDateTimeUTC.toSecsSinceEpoch(); } /*! * \brief VCalibrationSettings::clearRejectionReason * \details Slot to clear rejection reason when user is editing a rejected parameter * \param vIndex - rejection reason index * \param vSensorIndex - sensor index */ void View::VCalibrationSettings::clearRejectionReason(int vIndex, int vSensorIndex) { if (vIndex < 0 || vIndex >= _columnTitle.size()) return; QVariantList rejectionList = _calibrationList.data( _calibrationList.index(vSensorIndex,0) ,eRole_Rejections).toList(); rejectionList[vIndex] = 0; _calibrationList.updateData( vSensorIndex, eRole_Rejections, rejectionList); emit didModelChange(); } /*! * \brief VCalibrationSettings::refreshList * \details Refresh model with current selected index of calibration records * \param vIndex - calibration record index to recreate the model */ void View::VCalibrationSettings::refreshList (int vIndex) { _columnTitle.clear(); _calibrationList.clear(); switch (vIndex) { case ePressure : { QVariantList initPayloadValues = initList ( { tr("Gain"), tr("Offset"), tr("Cal Time") } ) ; _calibrationList.insertRow( GuiDDCalibrationPressure::D9_PRES, {{ eRole_Title, tr("Hydraulics Outlet Pressure")}, { eRole_Component, tr("D9" )}, { eRole_Payload, initPayloadValues }, {eRole_Rejections, initPayloadValues }, {eRole_Received, false }}); _calibrationList.insertRow( GuiDDCalibrationPressure::D66_PRES, {{ eRole_Title, tr("Dry Bicarb Pressure")}, { eRole_Component, tr("D66")}, { eRole_Payload, initPayloadValues }, {eRole_Rejections, initPayloadValues }, {eRole_Received, false }}); _calibrationList.insertRow( GuiDDCalibrationPressure::D51_PRES, {{ eRole_Title, tr("Spent Dialysate Pressure")}, { eRole_Component, tr("D51")}, { eRole_Payload, initPayloadValues }, {eRole_Rejections, initPayloadValues }, {eRole_Received, false }}); _calibrationList.insertRow( GuiDDCalibrationPressure::D18_PRES, {{ eRole_Title, tr("Fresh Dialysate Pressure")}, { eRole_Component, tr("D15")}, { eRole_Payload, initPayloadValues }, {eRole_Rejections, initPayloadValues }, {eRole_Received, false }}); _calibrationList.insertRow( GuiDDCalibrationPressure::D41_PRES, {{ eRole_Title, tr("Transmembrane Pressure")}, { eRole_Component, tr("D41")}, { eRole_Payload, initPayloadValues }, {eRole_Rejections, initPayloadValues }, {eRole_Received, false }}); _calibrationList.insertRow( GuiDDCalibrationPressure::D87_PRES, {{ eRole_Title, tr("D87 Pressure Sensor")}, { eRole_Component, tr("D87")}, { eRole_Payload, initPayloadValues }, {eRole_Rejections, initPayloadValues }, {eRole_Received, false }}); _calibrationList.insertRow( GuiDDCalibrationPressure::M3_PRES, {{ eRole_Title, tr("Water inlet pressure before regulator")}, { eRole_Component, tr("M3") }, { eRole_Payload, initPayloadValues }, {eRole_Rejections, initPayloadValues }, {eRole_Received, false }}); _calibrationList.insertRow( GuiDDCalibrationPressure::P8_PRES, {{ eRole_Title, tr("Water inlet pressure after regulator")}, { eRole_Component, tr("P8") }, { eRole_Payload, initPayloadValues }, {eRole_Rejections, initPayloadValues }, {eRole_Received, false }}); _calibrationList.insertRow( GuiDDCalibrationPressure::P13_PRES, {{ eRole_Title, tr("Water inlet pressure before the cond. sensor")}, { eRole_Component, tr("P13")}, { eRole_Payload, initPayloadValues }, {eRole_Rejections, initPayloadValues }, {eRole_Received, false }}); _calibrationList.insertRow( GuiDDCalibrationPressure::P17_PRES, {{ eRole_Title, tr("Pressure before the RO filter")}, { eRole_Component, tr("P17")}, { eRole_Payload, initPayloadValues }, {eRole_Rejections, initPayloadValues }, {eRole_Received, false }}); _calibrationList.insertRow( GuiDDCalibrationPressure::P46_PRES, {{ eRole_Title, tr("Pressure after the RO filter")}, { eRole_Component, tr("P46")}, { eRole_Payload, initPayloadValues }, {eRole_Rejections, initPayloadValues }, {eRole_Received, false }}); break; } case eTemperature : { QVariantList initPayloadValues = initList ( { tr("Gain"), tr("Offset"), tr("Cal Time") } ) ; _calibrationList.insertRow( GuiDDCalibrationTemperature::D1_TEMP, {{ eRole_Title, tr("Heat exchanger Inlet")}, { eRole_Component, tr("D1" )}, {eRole_Payload, initPayloadValues }, {eRole_Received, false }}); _calibrationList.insertRow( GuiDDCalibrationTemperature::D78_TEMP, {{ eRole_Title, tr("Heat exchanger Outlet")}, { eRole_Component, tr("D78")}, {eRole_Payload, initPayloadValues }, {eRole_Received, false }}); _calibrationList.insertRow( GuiDDCalibrationTemperature::D4_TEMP, {{ eRole_Title, tr("Hydraulics Primary Heater")}, { eRole_Component, tr("D4" )}, {eRole_Payload, initPayloadValues }, {eRole_Received, false }}); _calibrationList.insertRow( GuiDDCalibrationTemperature::D50_TEMP, {{ eRole_Title, tr("Trimmer Heater")}, { eRole_Component, tr("D50")}, {eRole_Payload, initPayloadValues }, {eRole_Received, false }}); _calibrationList.insertRow( GuiDDCalibrationTemperature::D99_TEMP, {{ eRole_Title, tr("Conductivity")}, { eRole_Component, tr("D99")}, {eRole_Payload, initPayloadValues }, {eRole_Received, false }}); _calibrationList.insertRow( GuiDDCalibrationTemperature::BRD_TEMP, {{ eRole_Title, tr("Barometric")}, { eRole_Component, tr("BRD")}, {eRole_Payload, initPayloadValues }, {eRole_Received, false }}); break; } case eConcentratePump : { QVariantList initPayloadValues = initList ( { tr("Gain"), tr("Offset"), tr("Cal Time") } ) ; _calibrationList.appendRow( {{ eRole_Title, tr("Acid")}, { eRole_Component, tr("D11_CP1" )}, {eRole_Payload, initPayloadValues }, {eRole_Received, false }}); _calibrationList.appendRow( {{ eRole_Title, tr("Bicarbonate")}, { eRole_Component, tr("D10_CP2" )}, {eRole_Payload, initPayloadValues }, {eRole_Received, false }}); _calibrationList.appendRow( {{ eRole_Title, tr("Ultrafiltration")}, { eRole_Component, tr("D76" )}, {eRole_Payload, initPayloadValues }, {eRole_Received, false }}); break; } case eDialysatePumpD12 : { QVariantList initPayloadValues = initList ( { tr("Target Pump Speed"), tr("Cal Time") } ) ; _calibrationList.appendRow( {{ eRole_Title, tr("Fresh Dialysate Pump")}, { eRole_Component, tr("D12" )}, {eRole_Payload, initPayloadValues }, {eRole_Received, false }}); break; } case eDialysatePumpD48 : { QVariantList initPayloadValues = initList ( { tr("Gain"), tr("Offset"), tr("Cal Time") } ) ; _calibrationList.appendRow( {{ eRole_Title, tr("Spent Dialysate Pump")}, { eRole_Component, tr("D48" )}, {eRole_Payload, initPayloadValues }, {eRole_Received, false }}); break; } case eAcidTypes : { QVariantList initPayloadValues = initList ( { tr("Mix Ratio"), tr("Full Bottle Vol. (mL)"), tr("Cond. (uS/cm)"), tr("Temp (°C)"), tr("Cal Time") } ) ; _calibrationList.appendRow( {{ eRole_Title, tr("08-1251-1")}, { eRole_Component, tr("")}, {eRole_Payload, initPayloadValues }, {eRole_Received, false }}); _calibrationList.appendRow( {{ eRole_Title, tr("08-2251-0")}, { eRole_Component, tr("")}, {eRole_Payload, initPayloadValues }, {eRole_Received, false }}); _calibrationList.appendRow( {{ eRole_Title, tr("08-3251-9")}, { eRole_Component, tr("")}, {eRole_Payload, initPayloadValues }, {eRole_Received, false }}); break; } case eBicarbTypes : { QVariantList initPayloadValues = initList ( { tr("Mix Ratio"), tr("Start Volume (mL)"), tr("Cond. (uS/cm)"), tr("Temp (°C)"), tr("Cal Time") } ) ; _calibrationList.appendRow( {{ eRole_Title, tr("08-677753-0")}, { eRole_Component, tr("")}, {eRole_Payload, initPayloadValues }, {eRole_Received, false }}); break; } case eAccelerometer : { QVariantList initPayloadValues = initList ( { tr("X axis offset"), tr("Y axis offset"), tr("Z axis offset"), tr("Cal Time") } ) ; _calibrationList.appendRow( {{ eRole_Title, tr("Accelerometer")}, { eRole_Component, tr("")}, {eRole_Payload, initPayloadValues }, {eRole_Received, false }}); break; } case eBloodLeak : { QVariantList initPayloadValues = initList ( { tr("Set Point"), tr("Cal Time") } ) ; _calibrationList.appendRow( {{ eRole_Title, tr("Blood Leak")}, { eRole_Component, tr("")}, {eRole_Payload, initPayloadValues }, {eRole_Received, false }}); break; } case eConductivity : { QVariantList initPayloadValues = initList ( { tr("Coeff 1"),tr("Coeff 2"),tr("Coeff 3"),tr("Coeff 4"),tr("Coeff 5"),tr("Coeff 6"),tr("Coeff 7"), tr("Coeff 8"),tr("Coeff 9"),tr("Coeff 10"),tr("Coeff 11"),tr("Coeff 12"),tr("Cal Time") } ) ; _calibrationList.appendRow( {{ eRole_Title, tr("Closed Loop Control of Dosing")}, { eRole_Component, tr("D17")}, {eRole_Payload, initPayloadValues }, {eRole_Received, false }}); _calibrationList.appendRow( {{ eRole_Title, tr("Closed Loop Control of Dosing")}, { eRole_Component, tr("D27")}, {eRole_Payload, initPayloadValues }, {eRole_Received, false }}); _calibrationList.appendRow( {{ eRole_Title, tr("Water, Bicarbonate, and Acid")}, { eRole_Component, tr("D29")}, {eRole_Payload, initPayloadValues }, {eRole_Received, false }}); _calibrationList.appendRow( {{ eRole_Title, tr("Self Test")}, { eRole_Component, tr("D43")}, {eRole_Payload, initPayloadValues }, {eRole_Received, false }}); _calibrationList.appendRow( {{ eRole_Title, tr("Water and Bicarb Collective")}, { eRole_Component, tr("D74")}, {eRole_Payload, initPayloadValues }, {eRole_Received, false }}); break; } } doRequestRecords(vIndex); } /*! * \brief VCalibrationSettings::refreshList * \details Helper method to request all the sensors per calibration record * \param vIndex - calibration record index */ void View::VCalibrationSettings::doRequestRecords(int vIndex) { switch (vIndex) { case ePressure : { for (int i = 0; i < GuiDDCalibrationPressure::NUM_OF_PRESSURE_SENSORS; i++) { DDCalibrationPressureRequestData data; data.mIndex = i; emit didAdjustment(data); } break; } case eTemperature : break; case eConcentratePump : break; case eDialysatePumpD12 : break; case eDialysatePumpD48 : break; case eAcidTypes : break; case eBicarbTypes : break; case eAccelerometer : break; case eBloodLeak : break; case eConductivity : break; } } /*! * \brief VCalibrationSettings::doAdjustment * \details Adjustment to update calibration record * \param vIndex - calibration record index * \param vSensorIndex - sensor index * \param index - payload */ void View::VCalibrationSettings::doAdjustment(int vIndex, int vSensorIndex, QVariantList vPayload) { enum CalibrationPayload{ eGain = 0 , eOffset , eCalibrationTime }; // epoch for fw payload const quint32 calTimeEpoch = getEpochUTC(); const QString formattedTime = Format::fromEpoch( calTimeEpoch, "yyyy/MM/dd, HH:mm" ); bool ok = true; bool result = false; if ( vPayload.isEmpty() ) { goto invalid; } switch (vIndex) { case ePressure : { if (vPayload.size() < 3) { goto invalid; } AdjustDDCalibrationPressureRequestData data; data.mIndex = vSensorIndex ; data.mGain = vPayload[eGain] .toFloat(&result) ; ok &= result; data.mOffset = vPayload[eOffset] .toFloat(&result) ; ok &= result; data.mCalibrationTime = calTimeEpoch ; if (!ok) goto invalid; emit didAdjustment(data); break; } case eTemperature : break; case eConcentratePump : break; case eDialysatePumpD12 : break; case eDialysatePumpD48 : break; case eAcidTypes : break; case eBicarbTypes : break; case eAccelerometer : break; case eBloodLeak : break; case eConductivity : break; } vPayload[eCalibrationTime] = formattedTime; _calibrationList.updateData(vSensorIndex, eRole_Payload, vPayload); return; invalid: qWarning() << "Invalid calibration payload: " << vPayload; } /*! * \brief VCalibrationSettings::onActionReceive * \details Slot of pressure getter response * \param vData - DDCalibrationPressureResponseData */ void View::VCalibrationSettings::onActionReceive(const DDCalibrationPressureResponseData &vData) { adjustment_Accepted ( vData.mAccepted ); adjustment_Reason ( vData.mReason ); _calibrationList.updateData( vData.mIndex, eRole_Payload, QVariantList ({ vData.mGain, vData.mOffset, vData.mCalTime })); _calibrationList.updateData( vData.mIndex, eRole_Received, true ); adjustment ( true ); } /*! * \brief VCalibrationSettings::onActionReceive * \details Slot of pressure setter response * \param vData - AdjustDDCalibrationPressureResponseData */ void View::VCalibrationSettings::onActionReceive(const AdjustDDCalibrationPressureResponseData &vData) { adjustment_Accepted ( vData.mAccepted ); adjustment_Reason ( vData.mReason ); _calibrationList.updateData( vData.mIndex, eRole_Rejections, QVariantList ({ vData.mGainRejectReason, vData.mOffsetRejectReason, vData.mCalibrationTimeRejectReason })); emit didModelChange(); adjustment ( true ); }