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);
};