Index: sources/StateController.cpp =================================================================== diff -u -r5fe7e8bab66c3bed059ba84dd5092ea94ed736bc -rbb3ff2c95ef0529f6251e7097ffdb19d8e7554f1 --- sources/StateController.cpp (.../StateController.cpp) (revision 5fe7e8bab66c3bed059ba84dd5092ea94ed736bc) +++ sources/StateController.cpp (.../StateController.cpp) (revision bb3ff2c95ef0529f6251e7097ffdb19d8e7554f1) @@ -30,6 +30,7 @@ _dryDemo.connectToState("Treatment" , this, &StateController::onTreatmentTreatmentStateChange ); _dryDemo.connectToState("End_Tx" , this, &StateController::onEndTreatmentStateChange ); + _dryDemo.connectToState("Post_Tx" , this, &StateController::onPostTreatmentStateChange ); _dryDemo.connectToState("Disinfect" , this, &StateController::onDisinfectStateChange ); } @@ -59,6 +60,14 @@ _treatmentRcvdMessages[receivedMsgID] = msg[1]; break; + // These messages do not have a payload in from UI so a fake payload is added to be consumed + // and processed + case ID_UI_TREATMENT_LOG_RQST: + case ID_UI_POST_TREATMNET_NEXT_RQST: + case ID_UI_DISPOSABLE_REMOVAL_CONFIRM_RQST: + _treatmentRcvdMessages[receivedMsgID] = 0; + break; + case ID_UI_TX_END_RQST: case ID_UI_CONSUMABLES_INSTALL: case ID_UI_INTALLATION_CONFIRM: @@ -95,6 +104,9 @@ case ID_HD_SALINE_BOLUS_BC: case ID_HD_PRESSURE_LIMITS_CHANGE_RESP: case ID_USER_BLOOD_DIAL_RATE_CHANGE_RESP: + case ID_HD_TREATMENT_LOG_RESP: + case ID_HD_POST_TREATMENT_NEXT_CMD_RESP: + case ID_UI_DISPOSABLE_REMOVAL_CONFIRM_RESP: // Do nothing break; } @@ -694,7 +706,7 @@ // When end treatment is requested, signal 999 is sent back from // here. This is just a drydemo code to get back to the treatment // end state function. Then the treatment end state submits an event - // transition back to Idle + // to transition to post treatment rbState = RINSEBACK_END_TREATMENT_SIGNAL; break; @@ -923,6 +935,63 @@ _isSendListReady = true; } +void StateController::handleTreatmentLogRequest() +{ + QVariantList msg; + msg.append(static_cast(ID_HD_TREATMENT_LOG_RESP)); + msg.append(Can_Id::eChlid_HD_UI); + + msg.append(ACCEPT_VALUE); + msg.append(0); + + msg.append(_treatmentParams.bloodFlowRateMLPM); + msg.append(_treatmentParams.dialysateFlowRateMLPM); + msg.append(_treatmentParams.txDurationMins * SECONDS_PER_MINUTE); + msg.append(_treatmentVars.treatmentElapsedTimeS); + + msg.append(_treatmentParams.acidConc); + msg.append(_treatmentParams.bicarbConc); + msg.append(static_cast(ACID_TYPES_1251_1_K)); + msg.append(static_cast(ACID_TYPES_CALCIUM)); + msg.append(static_cast(ACID_TYPES_BICARB)); + msg.append(static_cast(ACID_TYPES_SODIUM)); + + msg.append(_treatmentParams.dialysateTemperatureC); + msg.append(_treatmentParams.dialyzerType); + msg.append(_treatmentVars.treatmentStarTimeEpoch); + msg.append(_treatmentVars.treatmentEndTimeEpoch); + + msg.append(_treatmentParams.bloodFlowRateMLPM); + msg.append(_treatmentParams.dialysateFlowRateMLPM); + msg.append((static_cast(_treatmentParams.dialysateFlowRateMLPM) * + _treatmentVars.treatmentElapsedTimeS) / (MILLILITERS_PER_LITER * SECONDS_PER_MINUTE)); + msg.append(_treatmentParams.dialysateTemperatureC); + + msg.append(_treatmentVars.txParamsUFVolL); + msg.append(_treatmentVars.txParamsUFVolL); + msg.append(_treatmentVars.txParamsUFVolL); + msg.append((_treatmentVars.txParamsUFVolL * MILLILITERS_PER_LITER * SECONDS_PER_MINUTE) / _treatmentParams.txDurationMins); + msg.append((_treatmentVars.txParamsUFVolL * MILLILITERS_PER_LITER * SECONDS_PER_MINUTE) / _treatmentParams.txDurationMins); + msg.append((_treatmentVars.txParamsUFVolL * MILLILITERS_PER_LITER * SECONDS_PER_MINUTE) / _treatmentParams.txDurationMins); + + msg.append(_treatmentVars.cumSalineVolML); + msg.append(_treatmentParams.heparinBolusVolML); + msg.append(_treatmentParams.heparinDispenseRateMLHR); + msg.append(_treatmentParams.heparinPreStopMin); + msg.append(0.0); + msg.append(_treatmentParams.heparinType); + + msg.append(_treatmentVars.curArtPresMMHG); + msg.append(_treatmentVars.curVenPresMMHG); + + msg.append(1234); + msg.append(1); + + _isSendListReady = false; + _sendMessages.append(msg); + _isSendListReady = true; +} + // ----------- State transition methods ---------------- // void StateController::onIdleStateChange(bool active) { @@ -1563,6 +1632,9 @@ setTreatmentParams(false, emptyVariantList); prepareOcclusionBroadcastData(); status = STATE_ON_EXIT; + + qint64 currentTimeEpoch64 = QDateTime::currentSecsSinceEpoch(); + _treatmentVars.treatmentStarTimeEpoch = static_cast(currentTimeEpoch64); }; auto inAction = [=](){}; @@ -1668,6 +1740,7 @@ auto inEntry = [=](){ _treatmentVars.broadcastIntervalCount = 0; + _treatmentVars.cumSalineVolML = 0; _treatmentVars.prescribedTreatmentTimeS = _treatmentParams.txDurationMins * SECONDS_PER_MINUTE; _treatmentVars.treatmentElapsedTimeS = (_treatmentVars.prescribedTreatmentTimeS < DEF_TX_ELAPSED_TIME_S ? 0 : DEF_TX_ELAPSED_TIME_S); @@ -1697,6 +1770,7 @@ auto inAction = [=](){ _treatmentVars.broadcastIntervalCount++; + _treatmentVars.cumSalineVolML = static_cast(cumSalineVolML); quint32 ufSubState = UF_RUNNING_STATE; quint32 salineSubState = SALINE_BOLUS_IDLE_STATE; @@ -1745,6 +1819,9 @@ } if (_treatmentVars.remainingTreatmentTimeS <= 0 ) { + qint64 currentTimeEpoch64 = QDateTime::currentSecsSinceEpoch(); + _treatmentVars.treatmentEndTimeEpoch = static_cast(currentTimeEpoch64); + status = STATE_ON_EXIT; } @@ -1862,7 +1939,7 @@ // post treatment qDebug() << "Done with end tx"; status = STATE_ON_ENTRY; - _dryDemo.submitEvent("Transition_back_2_idle"); + _dryDemo.submitEvent("Treatment_2_Post_Treatment"); } _treatmentRcvdMessages[ID_UI_RINSEBACK_CMD_RQST].clear(); } @@ -1911,6 +1988,69 @@ } } +void StateController::onPostTreatmentStateChange(bool active) +{ + static State_Status status = STATE_ON_ENTRY; + + auto inEntry = [=](){ + qDebug() << "Post treatment on entry"; + prepareHDModeTransitionBroadcastData(MODE_POST, 0); + status = STATE_ON_ACTION; + }; + + auto inAction = [=](){ + if (!_treatmentRcvdMessages[ID_UI_TREATMENT_LOG_RQST].isNull()) { + handleTreatmentLogRequest(); + _treatmentRcvdMessages[ID_UI_TREATMENT_LOG_RQST].clear(); + } + + if (!_treatmentRcvdMessages[ID_UI_POST_TREATMNET_NEXT_RQST].isNull()) { + _treatmentRcvdMessages[ID_UI_POST_TREATMNET_NEXT_RQST].clear(); + + QVariantList msg; + msg.append(static_cast(ID_HD_POST_TREATMENT_NEXT_CMD_RESP)); + msg.append(Can_Id::eChlid_HD_UI); + msg.append(ACCEPT_VALUE); + msg.append(0); + _isSendListReady = false; + _sendMessages.append(msg); + _isSendListReady = true; + } + + if (!_treatmentRcvdMessages[ID_UI_DISPOSABLE_REMOVAL_CONFIRM_RQST].isNull()) { + _treatmentRcvdMessages[ID_UI_DISPOSABLE_REMOVAL_CONFIRM_RQST].clear(); + + QVariantList msg; + msg.append(static_cast(ID_UI_DISPOSABLE_REMOVAL_CONFIRM_RESP)); + msg.append(Can_Id::eChlid_HD_UI); + msg.append(ACCEPT_VALUE); + msg.append(0); + _isSendListReady = false; + _sendMessages.append(msg); + _isSendListReady = true; + + status = STATE_ON_EXIT; + _dryDemo.submitEvent("Post_treatment_2_disinfect"); + } + + if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) { + status = STATE_ON_ENTRY; + _dryDemo.submitEvent("Transition_back_2_idle"); + } + }; + + auto inExit = [=](){ + qDebug() << "Post treatment on exit"; + status = STATE_ON_ENTRY; + }; + + switch (status) { // TODO macro it later + case STATE_ON_ENTRY : if (active) inEntry (); break; + case STATE_ON_ACTION: if (active) inAction(); break; + case STATE_ON_EXIT : if (active) inExit (); break; + } +} + void StateController::onDisinfectStateChange(bool active) { static State_Status status = STATE_ON_ENTRY;