Index: drydemoxmlstates.scxml =================================================================== diff -u -r424c81d03f7d915d39ab962f652c0b565f465bf7 -rbb3ff2c95ef0529f6251e7097ffdb19d8e7554f1 --- drydemoxmlstates.scxml (.../drydemoxmlstates.scxml) (revision 424c81d03f7d915d39ab962f652c0b565f465bf7) +++ drydemoxmlstates.scxml (.../drydemoxmlstates.scxml) (revision bb3ff2c95ef0529f6251e7097ffdb19d8e7554f1) @@ -9,7 +9,7 @@ - + @@ -29,108 +29,91 @@ - + - + - - - + - - - + - + - - - + - - - + - + - - - + - - - + - - - + - - - + - - - + - - - + - + - + - + - + + + + - + @@ -139,13 +122,22 @@ - + - + + + + + + + + + + Index: sources/MessageGlobals.h =================================================================== diff -u -r5fe7e8bab66c3bed059ba84dd5092ea94ed736bc -rbb3ff2c95ef0529f6251e7097ffdb19d8e7554f1 --- sources/MessageGlobals.h (.../MessageGlobals.h) (revision 5fe7e8bab66c3bed059ba84dd5092ea94ed736bc) +++ sources/MessageGlobals.h (.../MessageGlobals.h) (revision bb3ff2c95ef0529f6251e7097ffdb19d8e7554f1) @@ -123,6 +123,7 @@ ID_NONE = 0x0000, ID_HD_ALARM_STATUS_BC = 0x0200, ID_HD_BLOOD_FLOW_DATA_BC = 0x0500, + ID_UI_POST_TREATMNET_NEXT_RQST = 0x0600, ID_HD_DIALYSATE_FLOW_DATA_BC = 0x0800, ID_PRESSURE_OCCLUSION_DATA_BC = 0x0900, ID_DIALYSATE_OUT_FLOW_DATA_BC = 0x0B00, @@ -162,6 +163,11 @@ ID_HD_PATINET_CONNECTION_CONF_RESP = 0x6700, ID_UI_CONSUMABLES_INSTALL = 0x6800, ID_UI_START_TX_RQST = 0x7100, + ID_UI_DISPOSABLE_REMOVAL_CONFIRM_RQST = 0x7300, + ID_UI_DISPOSABLE_REMOVAL_CONFIRM_RESP = 0x7400, + ID_UI_TREATMENT_LOG_RQST = 0x7500, + ID_HD_TREATMENT_LOG_RESP = 0x7600, + ID_HD_POST_TREATMENT_NEXT_CMD_RESP = 0x7E00, ID_UI_SERVICE_MODE_RQST = 0XB000, ID_HD_UI_CONFIRM_RQST = 0xBA00, ID_UI_CONFIRM_RESP = 0xBB00, 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; Index: sources/StateController.h =================================================================== diff -u -r5fe7e8bab66c3bed059ba84dd5092ea94ed736bc -rbb3ff2c95ef0529f6251e7097ffdb19d8e7554f1 --- sources/StateController.h (.../StateController.h) (revision 5fe7e8bab66c3bed059ba84dd5092ea94ed736bc) +++ sources/StateController.h (.../StateController.h) (revision bb3ff2c95ef0529f6251e7097ffdb19d8e7554f1) @@ -61,6 +61,11 @@ #define MIN_UF_RATE_MLPM 0.0 #define MAX_UF_RATE_MLPM (2000.0 / MINUTES_PER_HOUR) + #define ACID_TYPES_1251_1_K 1.0 + #define ACID_TYPES_CALCIUM 2.5 + #define ACID_TYPES_BICARB 33 + #define ACID_TYPES_SODIUM 137 + #define DEF_TX_ELAPSED_TIME_S (2 * MINUTES_PER_HOUR) * SECONDS_PER_MINUTE #define DEF_TX_PARAM_PRESCRIBED_DUR_MIN ((4 * MINUTES_PER_HOUR) + 30) #define DEF_TX_PARAM_PRESCRIBED_DUR_S DEF_TX_PARAM_PRESCRIBED_DUR_MIN * SECONDS_PER_MINUTE @@ -189,13 +194,18 @@ float prescribedUFRate; float refUFVolumeML; float measUFVolumeML; - + // Arterial/venous values float curArtPresMMHG; float curVenPresMMHG; qint32 minArtPresLimitMMHG; qint32 maxArtPresLimitMMHG; qint32 minVenPresLimitMMHG; qint32 maxVenPresLimitMMHG; + // Accumulated saline bolus volume in millilters + quint32 cumSalineVolML; + // Treatment start and end times + quint32 treatmentStarTimeEpoch; + quint32 treatmentEndTimeEpoch; }; QHash_transitionEventsFromIdle; @@ -239,6 +249,7 @@ void generateOcclusionPresureValues(bool initArray, quint32 stableCount); void handlePressureChangeReqeust(const QVariant &payload); void handleBloodDialRateChangeRequest(const QVariant &payload); + void handleTreatmentLogRequest(); // State handlers void onIdleStateChange(bool active); @@ -256,5 +267,6 @@ void onTreatmentTreatmentStateChange(bool active); void onEndTreatmentStateChange(bool active); + void onPostTreatmentStateChange(bool active); void onDisinfectStateChange(bool active); };