Index: drydemoxmlstates.scxml
===================================================================
diff -u -rb4e5f0d4181127e7941f8ae437e1f61c5c746091 -r6e0ddbfa4863bb12a64dfde5baeada941acadaf8
--- drydemoxmlstates.scxml (.../drydemoxmlstates.scxml) (revision b4e5f0d4181127e7941f8ae437e1f61c5c746091)
+++ drydemoxmlstates.scxml (.../drydemoxmlstates.scxml) (revision 6e0ddbfa4863bb12a64dfde5baeada941acadaf8)
@@ -6,10 +6,10 @@
-
+
-
+
@@ -27,23 +27,29 @@
-
+
-
+
-
+
-
+
-
+
+
+
+
+
+
+
@@ -90,6 +96,9 @@
+
+
+
Index: sources/MessageGlobals.h
===================================================================
diff -u -rb4e5f0d4181127e7941f8ae437e1f61c5c746091 -r6e0ddbfa4863bb12a64dfde5baeada941acadaf8
--- sources/MessageGlobals.h (.../MessageGlobals.h) (revision b4e5f0d4181127e7941f8ae437e1f61c5c746091)
+++ sources/MessageGlobals.h (.../MessageGlobals.h) (revision 6e0ddbfa4863bb12a64dfde5baeada941acadaf8)
@@ -121,7 +121,10 @@
enum Message_ID_Enum {
ID_NONE = 0x0000,
+ ID_HD_BLOOD_FLOW_DATA_BC = 0x0500,
+ ID_HD_DIALYSATE_FLOW_DATA_BC = 0x0800,
ID_PRESSURE_OCCLUSION_DATA_BC = 0x0900,
+ ID_DIALYSATE_OUT_FLOW_DATA_BC = 0x0B00,
ID_TX_TIME_BC = 0x0D00,
ID_HD_TX_STATES_BC = 0x0F00,
ID_USER_TX_TIME_CHANGES_RQST = 0x1600,
Index: sources/StateController.cpp
===================================================================
diff -u -rb4e5f0d4181127e7941f8ae437e1f61c5c746091 -r6e0ddbfa4863bb12a64dfde5baeada941acadaf8
--- sources/StateController.cpp (.../StateController.cpp) (revision b4e5f0d4181127e7941f8ae437e1f61c5c746091)
+++ sources/StateController.cpp (.../StateController.cpp) (revision 6e0ddbfa4863bb12a64dfde5baeada941acadaf8)
@@ -33,8 +33,10 @@
_dryDemoCurrentCmd = CMD_NONE;
+ // Start with uninitialized treatment params
+ _treatmentParams.hasTxParamsBeenInitialized = false;
resetVariables();
- initMessagesHashTable(); // Todo move this?
+ initMessagesHashTable(); // Todo move this once the state machine is finished.
}
void StateController::quit()
@@ -61,26 +63,26 @@
break;
case ID_UI_TX_PARAMS_RQST:
- msgBack.clear();
- msgBack.append(static_cast(ID_HD_NEW_PARAMS_RESP));
- msgBack.append(Can_Id::eChlid_HD_UI);
- msgBack.append(1); msgBack.append(0); msgBack.append(275); msgBack.append(250); msgBack.append(60);
- msgBack.append(0); msgBack.append(100); msgBack.append(0); msgBack.append(0); msgBack.append(0);
- msgBack.append(0); msgBack.append(0); msgBack.append(250); msgBack.append(120); msgBack.append(100);
- msgBack.append(20); msgBack.append(0.000); msgBack.append(0.000); msgBack.append(36.00);
- emit _ApplicationController.didActionTransmit(msgBack);
+ _treatmentRcvdMessages[receivedMsgID] = msg[1];
break;
case ID_UI_CONFIRM_RESP: {
int IDIndex = 0;
Types::U32 IDParam;
GetValue(msg[1].toByteArray(), IDIndex, IDParam);
if (IDParam.value == UI_MSG_BB_PAYLOAD_ID) {
- int cmdIndex = UI_MSG_DD_STATUS_INDEX;
+
+ // TODO this part needs to be removed
+ int cmdIndex = UI_MSG_BB_STATUS_INDEX;
Types::U32 cmdParam;
GetValue(msg[1].toByteArray(), cmdIndex, cmdParam);
User_Command_ID cmdIDEnum = static_cast(cmdParam.value);
- if ((cmdIDEnum > CMD_NONE) && (cmdIDEnum < NUM_OF_USER_CMDS)) {
+ // TODO remove the above part
+
+ // TODO remove this part
+ if ((cmdIDEnum > CMD_NONE) && (cmdIDEnum < NUM_OF_USER_CMDS)
+ //&&(cmdIDEnum != CMD_TX_PARAMS) && (cmdIDEnum != CMD_START_TX)
+ ) {
_dryDemoCurrentCmd = cmdIDEnum;
isCmdValid = true;
qDebug() << "Msg Case 2" << receivedMsgID << cmdParam.value << _dryDemoCurrentCmd <(ID_HD_NEW_PARAMS_RESP));
+ resp.append(Can_Id::eChlid_HD_UI);
+ resp.append(ACCEPT_VALUE);
+ resp.append(0);
+
+ qint32 index = 0;
+ Types::U32 u32Var;
+ Types::F32 f32Var;
+ Types::S32 s32Var;
+
+ GetValue(payload.toByteArray(), index, u32Var);
+ _treatmentParams.bloodFlowRateMLPM = u32Var.value;
+ resp.append(u32Var.value);
+
+ GetValue(payload.toByteArray(), index, u32Var);
+ _treatmentParams.dialysateFlowRateMLPM = u32Var.value;
+ resp.append(u32Var.value);
+
+ GetValue(payload.toByteArray(), index, u32Var);
+ _treatmentParams.txDurationMins = u32Var.value;
+ resp.append(u32Var.value);
+
+ GetValue(payload.toByteArray(), index, u32Var);
+ _treatmentParams.salineBolusVolML = u32Var.value;
+ resp.append(u32Var.value);
+
+ GetValue(payload.toByteArray(), index, u32Var);
+ _treatmentParams.acidConc = u32Var.value;
+ resp.append(u32Var.value);
+
+ GetValue(payload.toByteArray(), index, u32Var);
+ _treatmentParams.bicarbConc = u32Var.value;
+ resp.append(u32Var.value);
+
+ GetValue(payload.toByteArray(), index, u32Var);
+ _treatmentParams.dialyzerType = u32Var.value;
+ resp.append(u32Var.value);
+
+ GetValue(payload.toByteArray(), index, u32Var);
+ _treatmentParams.heparinType = u32Var.value;
+ resp.append(u32Var.value);
+
+ GetValue(payload.toByteArray(), index, u32Var);
+ _treatmentParams.bloodMeasurementInveralMin = u32Var.value;
+ resp.append(u32Var.value);
+
+ GetValue(payload.toByteArray(), index, u32Var);
+ _treatmentParams.rinsebackFlowRateMLPM = u32Var.value;
+ resp.append(u32Var.value);
+
+ GetValue(payload.toByteArray(), index, s32Var);
+ _treatmentParams.areterialPresLimitWindowMMHG = s32Var.value;
+ resp.append(s32Var.value);
+
+ GetValue(payload.toByteArray(), index, s32Var);
+ _treatmentParams.venousPresLimitWindowMMHG = s32Var.value;
+ resp.append(s32Var.value);
+
+ GetValue(payload.toByteArray(), index, s32Var);
+ _treatmentParams.venousPresLimitAsymWindowMMHG = s32Var.value;
+ resp.append(s32Var.value);
+
+ GetValue(payload.toByteArray(), index, f32Var);
+ _treatmentParams.heparinDispenseRateMLHR = f32Var.value;
+ resp.append(f32Var.value);
+
+ GetValue(payload.toByteArray(), index, f32Var);
+ _treatmentParams.heparinBolusVolML = f32Var.value;
+ resp.append(f32Var.value);
+
+ GetValue(payload.toByteArray(), index, f32Var);
+ _treatmentParams.dialysateTemperatureC = f32Var.value;
+ resp.append(f32Var.value);
+ _treatmentParams.hasTxParamsBeenInitialized = true;
+
+ _isSendListReady = false;
+ _sendMessages.append(resp);
+ _isSendListReady = true;
+
+ qDebug() << "Treatment params from TPAR" << _treatmentParams.bloodFlowRateMLPM <<
+ _treatmentParams.dialysateFlowRateMLPM << _treatmentParams.txDurationMins <<
+ _treatmentParams.dialysateTemperatureC;
+ }
+ else if (!_treatmentParams.hasTxParamsBeenInitialized) {
+ _treatmentParams.bloodFlowRateMLPM = DEF_TX_PARAM_BLOOD_FLOW_RATE_MLPM;
+ _treatmentParams.dialysateFlowRateMLPM = DEF_TX_PARAM_DIAL_FLOW_RATE_MLPM;
+ _treatmentParams.txDurationMins = DEF_TX_PARAM_PRESCRIBED_DUR_S / SECONDS_PER_MINUTE;
+ _treatmentParams.salineBolusVolML = DEF_TX_PARAM_SALINE_BOLUS_VOL_ML;
+ _treatmentParams.acidConc = 0;
+ _treatmentParams.bicarbConc = 0;
+ _treatmentParams.dialyzerType = 0;
+ _treatmentParams.heparinType = 0;
+ _treatmentParams.bloodMeasurementInveralMin = 0;
+ _treatmentParams.rinsebackFlowRateMLPM = DEF_TX_PARAM_RINSEBACK_FLOW_RATE_MLPM;
+ _treatmentParams.areterialPresLimitWindowMMHG = DEF_TX_PARAM_ART_PRES_LIMIT_WIN_MMHG;
+ _treatmentParams.venousPresLimitWindowMMHG = DEF_TX_PARAM_VEN_PRES_LIMIT_WIN_MMHG;
+ _treatmentParams.venousPresLimitAsymWindowMMHG = DEF_TX_PARAM_VEN_PRES_LIMIT_ASYM_WIN_MMHG;
+ _treatmentParams.heparinDispenseRateMLHR = 0;
+ _treatmentParams.heparinBolusVolML = 0;
+ _treatmentParams.dialysateTemperatureC = DEF_TX_PARAM_DIA_TEMPERATURE_C;
+ _treatmentParams.hasTxParamsBeenInitialized = true;
+ }
+
+ qDebug() << "Treatment params" << _treatmentParams.hasTxParamsBeenInitialized;
+}
+
void StateController::prepareOcclusionBroadcastData()
{
QVariantList msg;
@@ -1063,6 +1180,10 @@
_treatmentVars.treatmentElapsedTimeS++;
_treatmentVars.remainingTreatmentTimeS = _treatmentVars.prescribedTreatmentTimeS - _treatmentVars.treatmentElapsedTimeS;
+ if (_treatmentVars.remainingTreatmentTimeS <= 0 ) {
+ _treatmentVars.remainingTreatmentTimeS = 0;
+ }
+
//qDebug() << " Treatment time" << QTime::currentTime() << _treatmentVars._broadcastIntervalCount << _treatmentVars._treatmentElapsedTimeS << _treatmentVars._remainingTreatmentTimeS;
QVariantList msg;
@@ -1071,7 +1192,9 @@
msg.append(_treatmentVars.prescribedTreatmentTimeS);
msg.append(_treatmentVars.treatmentElapsedTimeS);
msg.append(_treatmentVars.remainingTreatmentTimeS);
+ _isBroadcastListReady = false;
_broadcastMessages.append(msg);
+ _isBroadcastListReady = true;
}
void StateController::prepareTreatmentStatesBroadcastData(const QVariantList &payload)
@@ -1083,28 +1206,121 @@
for (auto item: payload) {
msg.append(item);
}
+ _isBroadcastListReady = false;
_broadcastMessages.append(msg);
+ _isBroadcastListReady = true;
}
+void StateController::prepareBloodFlowBroadcastData()
+{
+ QVariantList msg;
+ msg.append(static_cast(ID_HD_BLOOD_FLOW_DATA_BC));
+ msg.append(Can_Id::eChlid_HD_Sync);
+ msg.append(_treatmentParams.bloodFlowRateMLPM);
+ msg.append(_treatmentParams.bloodFlowRateMLPM - 0.1);
+ msg.append(0.0); msg.append(0.0); msg.append(0.0); msg.append(0.0);
+ msg.append(0.0); msg.append(0); msg.append(_treatmentParams.bloodFlowRateMLPM);
+ msg.append(0);
+ _isBroadcastListReady = false;
+ _broadcastMessages.append(msg);
+ _isBroadcastListReady = true;
+}
+
+void StateController::prepareDialysateFlowBroadcastData()
+{
+ QVariantList msg;
+ msg.append(static_cast(ID_HD_DIALYSATE_FLOW_DATA_BC));
+ msg.append(Can_Id::eChlid_HD_Sync);
+ msg.append(_treatmentParams.dialysateFlowRateMLPM);
+ msg.append(_treatmentParams.dialysateFlowRateMLPM - 0.1);
+ msg.append(0.0); msg.append(0.0); msg.append(0.0); msg.append(0.0);
+ msg.append(0.0); msg.append(0); msg.append(_treatmentParams.dialysateFlowRateMLPM);
+ msg.append(0);
+ _isBroadcastListReady = false;
+ _broadcastMessages.append(msg);
+ _isBroadcastListReady = true;
+}
+
+void StateController::prepareDialysateOutFlowBroadcastData()
+{
+ QVariantList msg;
+ msg.append(static_cast(ID_DIALYSATE_OUT_FLOW_DATA_BC));
+ msg.append(Can_Id::eChlid_HD_Sync);
+ msg.append(2.0);
+ msg.append(0.3);
+ msg.append(0.0); msg.append(0.0); msg.append(0.0); msg.append(0.0);
+ msg.append(0.0); msg.append(0.0); msg.append(0.0); msg.append(0.0);
+ msg.append(0); msg.append(0.0); msg.append(0);
+ _isBroadcastListReady = false;
+ _broadcastMessages.append(msg);
+ _isBroadcastListReady = true;
+}
+
+void StateController::prepareTreatmentParamsRangesBroadcastData()
+{
+ // Calculations are from broadcastTreatmentSettingsRanges in the HD
+ quint32 elapsedTimeMins = _treatmentVars.treatmentElapsedTimeS / SECONDS_PER_MINUTE;
+ float dialVolumeSoFarML = _treatmentParams.dialysateFlowRateMLPM * (_treatmentVars.treatmentElapsedTimeS / SECONDS_PER_MINUTE);
+ float maxQdMLPM = 0.0;
+
+ if (_treatmentVars.treatmentElapsedTimeS > 0) {
+ maxQdMLPM = (MAX_DIALYSATE_VOLUME_ML - dialVolumeSoFarML) / (_treatmentVars.treatmentElapsedTimeS / SECONDS_PER_MINUTE);
+ }
+ quint32 minTimeMins = qMax(elapsedTimeMins + 2, (quint32)MIN_TX_TIME_MINS);
+ float prescribedUF = (_treatmentVars.prescribedUFRate > 0.0 ? _treatmentVars.prescribedUFRate : 1);
+ quint32 maxTimeRemMins = (MAX_UF_VOL_ML - _treatmentVars.refUFVolumeML) / prescribedUF;
+ quint32 maxTime1 = minTimeMins + maxTimeRemMins;
+ quint32 maxTime2 = MAX_DIAL_RATE_MLPM / _treatmentParams.dialysateFlowRateMLPM;
+ quint32 maxTimeMins = qMax(maxTime1, maxTime2);
+ qDebug() << "Ranges Values" << minTimeMins << maxTimeRemMins << maxTime2 << maxTimeMins;
+
+ float minUFVolML = _treatmentVars.refUFVolumeML + _treatmentVars.prescribedUFRate;
+ float maxUFVol1 = minUFVolML + (_treatmentParams.txDurationMins - elapsedTimeMins) * MAX_UF_RATE_MLPM;
+ float maxUFVol2 = minUFVolML;
+ if (_treatmentVars.prescribedUFRate > 0.0 ) {
+ maxUFVol2 = minUFVolML + (MAX_TX_TIME_MINS - elapsedTimeMins - 1) * _treatmentVars.prescribedUFRate;
+ }
+ float maxUFVol = qMax(maxUFVol1, maxUFVol2);
+ quint32 minDialFlowRateMLPM = MIN_DIAL_RATE_MLPM;
+ quint32 maxDialFlowRateMLPM = (maxQdMLPM > MIN_DIAL_RATE_MLPM ? maxQdMLPM : minDialFlowRateMLPM);
+
+ maxTimeMins = qMin(maxTimeMins, (quint32)MAX_TX_TIME_MINS) ;
+ maxUFVol = qMin(maxUFVol, (float)MAX_UF_VOL_ML);
+ maxDialFlowRateMLPM = qMin(maxDialFlowRateMLPM, (quint32)MAX_DIAL_RATE_MLPM);
+
+ QVariantList msg;
+ msg.append(static_cast(ID_HD_TX_PARAMS_RANGES_DATA));
+ msg.append(Can_Id::eChlid_HD_Sync);
+ msg.append(minTimeMins); msg.append(maxTimeMins);
+ msg.append(minUFVolML); msg.append(maxUFVol);
+ msg.append(minDialFlowRateMLPM); msg.append(maxDialFlowRateMLPM);
+ _isBroadcastListReady = false;
+ _broadcastMessages.append(msg);
+ _isBroadcastListReady = true;
+}
+
void StateController::handleTreatmentReceivedMessages()
{
+ // TODO mutex here?
for (auto i = _treatmentRcvdMessages.begin(), end = _treatmentRcvdMessages.end(); i != end; ++i) {
+ if (!i.value().isNull()) {
+ if (i.key() == ID_UI_TX_PARAMS_RQST) {
+ setTreatmentParams(true, i.value());
+ _treatmentRcvdMessages[i.key()].clear();
+ }
- //qDebug() << "Hash Message" << i.key() << i.value();
-
- if (i.key() == ID_USER_TX_TIME_CHANGES_RQST)
- {
- handleTreatmentTimeChangeRequest(i.value());
+ if (i.key() == ID_USER_TX_TIME_CHANGES_RQST) {
+ handleTreatmentTimeChangeRequest(i.value());
+ _treatmentRcvdMessages[i.key()].clear();
+ }
}
}
-
- _treatmentRcvdMessages.clear();
}
void StateController::handleTreatmentTimeChangeRequest(const QVariant &payload)
{
quint32 accept = REJECT_VALUE;
- int IDIndex = 0;
+ qint32 IDIndex = 0;
Types::U32 txDurMinType;
GetValue(payload.toByteArray(), IDIndex, txDurMinType);
@@ -1116,16 +1332,15 @@
UFVolumeL /= MILLILITERS_PER_LITER;
// TODO from treatment params
- quint32 dialVolume = 600 * txDurMin; // TODO treatment params
+ quint32 dialVolume = _treatmentParams.dialysateFlowRateMLPM * txDurMin;
bool isMinTxTimeValid = (txDurMin >= MIN_TX_TIME_MINS ? true : false);
- bool isTxTimeValid = (txDurMin <= TX_PARAM_PRESCRIBED_DUR_S ? true : false);
+ bool isTxTimeValid = (txDurMin <= DEF_TX_PARAM_PRESCRIBED_DUR_S ? true : false);
bool isMinUFVolValid = ((UFVolumeL >= 0.0) || (UFVolumeL <= 0.0) ? true : false); // TODO fix the UF Vol
- bool isUFVolValid = (UFVolumeL <= TX_PARAM_UF_VOLUME_L ? true : false);
+ bool isUFVolValid = (UFVolumeL <= DEF_TX_PARAM_UF_VOLUME_L ? true : false);
qDebug() << "Test of tx" << _treatmentVars.prescribedUFRate << elapsedTimeMins << UFVolumeL << isUFVolValid;
if (isMinTxTimeValid && isTxTimeValid && isMinUFVolValid && isUFVolValid && (dialVolume <= MAX_DIALYSATE_VOLUME_ML)) {
- // TODO set UF values
_treatmentVars.prescribedTreatmentTimeS = txDurMin * SECONDS_PER_MINUTE;
_treatmentVars.prescribedMaxUFVolML = UFVolumeL * MILLILITERS_PER_LITER;
accept = ACCEPT_VALUE;
@@ -1145,21 +1360,35 @@
_isSendListReady = true;
}
-// ----------- State transition methods ---------------- //
+void StateController::handleMsgBBPayload(const QVariant &payload)
+{
+ qint32 cmdIndex = UI_MSG_BB_STATUS_INDEX;
+ Types::U32 cmdParam;
+ GetValue(payload.toByteArray(), cmdIndex, cmdParam);
+ User_Command_ID cmdIDEnum = static_cast(cmdParam.value);
+ if ((cmdIDEnum > CMD_NONE) && (cmdIDEnum < NUM_OF_USER_CMDS)) {
+ _dryDemoCurrentCmd = cmdIDEnum;
+
+ }
+}
+
+// ----------- State transition methods ---------------- //
void StateController::onIdleStateChange(bool active)
{
if (active) {
qDebug() << "Idle on entry" << _dryDemoCurrentCmd;
// TODO remove
if (_dryDemoCurrentCmd == CMD_START_TX) {
- qDebug() << "Treatment event stareted";
+ qDebug() << "Treatment event stareted";
+ _stateStatus = STATE_ON_ENTRY; // TODO temp
_dryDemo.submitEvent("Transition_2_Start_Tx");
}
else if ((_dryDemoCmds.contains(_dryDemoCurrentCmd)) && (_dryDemoCurrentCmd != CMD_NONE)) {
transitionApplicationToStandBy();
- QString transitionEvent = _dryDemoCmds[_dryDemoCurrentCmd][_index][TRANSITION_EVENT_INDEX].toString();
+ _stateStatus = STATE_ON_ENTRY; // TODO temp
+ QString transitionEvent = _dryDemoCmds[_dryDemoCurrentCmd][_index][TRANSITION_EVENT_INDEX].toString();
qDebug() << "Event" << transitionEvent <<_dryDemoCurrentCmd << _index;
_dryDemo.submitEvent(transitionEvent);
}
@@ -1175,9 +1404,42 @@
}
void StateController::onTreatmentParamsStateChange(bool active)
-{
- if (active) {
+{
+ static State_Status status = STATE_ON_ENTRY;
+
+ Q_UNUSED(active) // TODO remove
+ //if (active) {
+ //qDebug() << "In treatment params on entry";
+ //}
+
+ auto entry = [=](){
+ status = STATE_ON_ACTION;
+ _treatmentParams.hasTxParamsBeenInitialized = false;
+ };
+
+ auto action = [=]() {
qDebug() << "In treatment params on entry";
+ handleTreatmentReceivedMessages();
+
+ if (_treatmentParams.hasTxParamsBeenInitialized) {
+ status = STATE_ON_EXIT;
+ }
+ };
+
+ auto exit = [=](){
+ qDebug() << "In treatment params on exit";
+ status = STATE_ON_ENTRY;
+ _dryDemo.submitEvent("T_2_Water_Sample");
+
+ // TODO REMOVE
+ _index = 0;
+ // TODO remove
+ };
+
+ switch (status) { // TODO macro it later
+ case STATE_ON_ENTRY : entry (); break;
+ case STATE_ON_ACTION: action(); break;
+ case STATE_ON_EXIT : exit (); break;
}
}
@@ -1246,9 +1508,11 @@
}
}
-void StateController::onStartTreatmentStateChange(bool )
+void StateController::onStartTreatmentStateChange(bool)
{
- if (_stateStatus == STATE_ON_ENTRY) {
+ static State_Status status = STATE_ON_ENTRY;
+
+ auto entry = [=](){
qDebug() << "Start Treatment active";
resetVariables();
@@ -1258,112 +1522,159 @@
msg.append(Can_Id::eChlid_HD_Sync);
msg.append(MODE_TREA);
msg.append(0);
+ _isBroadcastListReady = false;
_broadcastMessages.append(msg);
+ _isBroadcastListReady = true;
msg.clear();
- msg.append(static_cast(ID_HD_TX_PARAMS_RANGES_DATA));
- msg.append(Can_Id::eChlid_HD_Sync);
- msg.append(0); msg.append(TX_PARAM_PRESCRIBED_DUR_S / SECONDS_PER_MINUTE);
- msg.append(0.0); msg.append(TX_PARAM_UF_VOLUME_L);
- msg.append(MIN_DIAL_RATE_MLPM); msg.append(MAX_DIAL_RATE_MLPM);
- _broadcastMessages.append(msg);
- msg.clear();
-
msg.append(1); msg.append(0); msg.append(0); msg.append(0); msg.append(0);
msg.append(0); msg.append(0); msg.append(0); msg.append(0); msg.append(0);
msg.append(0);
prepareTreatmentStatesBroadcastData(msg);
+ QVariant emptyVariantList;
+ setTreatmentParams(false, emptyVariantList);
- _treatmentVars.prescribedMaxUFVolML = TX_PARAM_UF_VOLUME_L * MILLILITERS_PER_LITER;
- _treatmentVars.prescribedUFRate = _treatmentVars.prescribedMaxUFVolML / (TX_PARAM_PRESCRIBED_DUR_S / SECONDS_PER_MINUTE);
- _treatmentVars.refUFVolumeML = 0.0;
+ _treatmentVars.prescribedMaxUFVolML = DEF_TX_PARAM_UF_VOLUME_L * MILLILITERS_PER_LITER; // TODO from tx params
+ _treatmentVars.prescribedUFRate = _treatmentVars.prescribedMaxUFVolML / _treatmentParams.txDurationMins;
+ _treatmentVars.refUFVolumeML = (_treatmentVars.treatmentElapsedTimeS / SECONDS_PER_MINUTE) * _treatmentVars.prescribedUFRate;
- _isBoradcastListReady = true;
- _stateStatus = STATE_ON_EXIT;
- }
- else if (_stateStatus == STATE_ON_EXIT)
- {
- _stateStatus = STATE_ON_ENTRY;
+ status = STATE_ON_EXIT;
+ };
+
+ auto action = [](){};
+ auto exit = [=](){
+ status = STATE_ON_ENTRY;
_dryDemo.submitEvent("Start_Tx_2_Blood_Prime");
+ };
+
+ switch (status) { // TODO macro it later
+ case STATE_ON_ENTRY : entry (); break;
+ case STATE_ON_ACTION: action(); break;
+ case STATE_ON_EXIT : exit (); break;
}
}
void StateController::onTreatmentBloodPrimeStateChange(bool)
{
+ static State_Status status = STATE_ON_ENTRY;
+
_treatmentVars.broadcastIntervalCount++;
- if (_treatmentVars.accumulatedVolumeML > BLOOD_PRIME_VOLUME_ML) {
- _stateStatus = STATE_ON_EXIT;
- }
-
- if (_stateStatus == STATE_ON_ENTRY) {
+ auto entry = [=](){
resetVariables();
- qDebug() << "Blood prime enty";
- _stateStatus = STATE_ON_ACTION;
- }
- else if (_stateStatus == STATE_ON_EXIT) {
+ qDebug() << "Blood prime entry";
+ status = STATE_ON_ACTION;
+ };
+
+ auto action = [=](){
+ _treatmentVars.accumulatedVolumeML += (DEF_TX_PARAM_BLOOD_FLOW_RATE_MLPM * BLOOD_FLOW_INTEGRATOR);
+
+ if (_treatmentVars.broadcastIntervalCount % NUM_OF_BC_COUNTS_ADJUSTED == 0) {
+ _isBroadcastListReady = false;
+ QVariantList msg;
+ msg.append(static_cast(ID_HD_BLOOD_PRIME_BC));
+ msg.append(Can_Id::eChlid_HD_Sync);
+ msg.append(BLOOD_PRIME_VOLUME_ML);
+ msg.append(_treatmentVars.accumulatedVolumeML);
+ _broadcastMessages.append(msg);
+ prepareOcclusionBroadcastData();
+ prepareTreatmentParamsRangesBroadcastData();
+ _isBroadcastListReady = true;
+ }
+
+ if (_treatmentVars.accumulatedVolumeML > BLOOD_PRIME_VOLUME_ML) {
+ // send blood prime value on last time
+ _isBroadcastListReady = false;
+ QVariantList msg;
+ msg.append(static_cast(ID_HD_BLOOD_PRIME_BC));
+ msg.append(Can_Id::eChlid_HD_Sync);
+ msg.append(BLOOD_PRIME_VOLUME_ML);
+ msg.append(_treatmentVars.accumulatedVolumeML);
+ _broadcastMessages.append(msg);
+ _isBroadcastListReady = true;
+ status = STATE_ON_EXIT;
+ }
+ };
+
+ auto exit = [=](){
qDebug() << "Blood prime exit";
- _stateStatus = STATE_ON_ENTRY;
+ status = STATE_ON_ENTRY;
_dryDemo.submitEvent("Blood_Prime_2_Treatment");
- }
+ };
- _treatmentVars.accumulatedVolumeML += (TX_PARAM_BLOOD_FLOW_RATE_MLPM * BLOOD_FLOW_INTEGRATOR);
-
- if (_treatmentVars.broadcastIntervalCount % NUM_OF_BC_COUNTS_ADJUSTED == 0) {
- _isBoradcastListReady = false;
- QVariantList msg;
- msg.append(static_cast(ID_HD_BLOOD_PRIME_BC));
- msg.append(Can_Id::eChlid_HD_Sync);
- msg.append(BLOOD_PRIME_VOLUME_ML);
- msg.append(_treatmentVars.accumulatedVolumeML);
- _broadcastMessages.append(msg);
- prepareOcclusionBroadcastData();
- _isBoradcastListReady = true;
+ switch (status) { // TODO macro it later
+ case STATE_ON_ENTRY : entry (); break;
+ case STATE_ON_ACTION: action(); break;
+ case STATE_ON_EXIT : exit (); break;
}
}
void StateController::onTreatmentTreatmentStateChange(bool)
{
+ static State_Status status = STATE_ON_ENTRY;
+
_treatmentVars.broadcastIntervalCount++;
handleTreatmentReceivedMessages();
- if (_stateStatus == STATE_ON_ENTRY) {
+ auto entry = [=](){
resetVariables();
qDebug() << "Treatment Treatment state";
- _treatmentVars.prescribedTreatmentTimeS = TX_PARAM_PRESCRIBED_DUR_S;
- _treatmentVars.treatmentElapsedTimeS = DEFAULT_TX_ELAPSED_TIME_S;
- _stateStatus = STATE_ON_ACTION;
- }
- else if (_stateStatus == STATE_ON_EXIT) {
+ _treatmentVars.prescribedTreatmentTimeS = _treatmentParams.txDurationMins * SECONDS_PER_MINUTE;
+ _treatmentVars.treatmentElapsedTimeS = DEF_TX_ELAPSED_TIME_S;
+ _treatmentVars.remainingTreatmentTimeS = _treatmentVars.prescribedTreatmentTimeS - _treatmentVars.treatmentElapsedTimeS;
+ status = STATE_ON_ACTION;
+ };
+
+ auto action = [=](){
+
+ _treatmentVars.refUFVolumeML += (0.1 / SECONDS_PER_MINUTE) * _treatmentVars.prescribedUFRate;
+ qDebug() << "UF Va;ue" << _treatmentVars.refUFVolumeML << _treatmentVars.prescribedUFRate;
+ if (_treatmentVars.broadcastIntervalCount % NUM_OF_BC_COUNTS_ADJUSTED == 0) {
+ QVariantList msg;
+ msg.append(2); msg.append(1); msg.append(0); msg.append(0); msg.append(0);
+ msg.append(0); msg.append(0); msg.append(0); msg.append(0); msg.append(0);
+ msg.append(0);
+ prepareTreatmentStatesBroadcastData(msg);
+ prepareOcclusionBroadcastData();
+ prepareTreatmentTimeBroadcastData();
+ prepareBloodFlowBroadcastData();
+ prepareDialysateFlowBroadcastData();
+ prepareDialysateOutFlowBroadcastData();
+ prepareTreatmentParamsRangesBroadcastData();
+ }
+ //qDebug() << "Target treatment" << _treatmentVars.prescribedTreatmentTimeS;
+ if (_treatmentVars.remainingTreatmentTimeS <= 0 ) {
+ status = STATE_ON_EXIT;
+ }
+
+ // TODO uncomment later
+ //if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) {
+ // status = STATE_ON_ENTRY;
+ // _dryDemo.submitEvent("Transition_back_2_idle");
+ //}
+ };
+
+ auto exit = [=](){
qDebug() << "Treat Treatment exit";
- // _dryDemo.submitEvent("Treatment_2_End_Treatment");
- }
+ status = STATE_ON_ENTRY;
+ _dryDemo.submitEvent("Treatment_2_End_Treatment"); // TODO bring back
+ };
- if (_treatmentVars.broadcastIntervalCount % NUM_OF_BC_COUNTS_ADJUSTED == 0) {
- _isBoradcastListReady = false;
- QVariantList msg;
- msg.append(2); msg.append(1); msg.append(0); msg.append(0); msg.append(0);
- msg.append(0); msg.append(0); msg.append(0); msg.append(0); msg.append(0);
- msg.append(0);
- prepareTreatmentStatesBroadcastData(msg);
- prepareOcclusionBroadcastData();
- prepareTreatmentTimeBroadcastData();
- _isBoradcastListReady = true;
+ switch (status) { // TODO macro it later
+ case STATE_ON_ENTRY : entry (); break;
+ case STATE_ON_ACTION: action(); break;
+ case STATE_ON_EXIT : exit (); break;
}
-
- if (_treatmentVars.remainingTreatmentTimeS <= 0 ) {
- _stateStatus = STATE_ON_EXIT;
- }
}
void StateController::onEndTreatmentStateChange(bool active)
{
if (active) {
qDebug() << "Treatment end active";
- QVariantList msg = _dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX);
- emit _ApplicationController.didActionTransmit(msg);
+ //QVariantList msg = _dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX);
+ //emit _ApplicationController.didActionTransmit(msg);
}
}
Index: sources/StateController.h
===================================================================
diff -u -rb4e5f0d4181127e7941f8ae437e1f61c5c746091 -r6e0ddbfa4863bb12a64dfde5baeada941acadaf8
--- sources/StateController.h (.../StateController.h) (revision b4e5f0d4181127e7941f8ae437e1f61c5c746091)
+++ sources/StateController.h (.../StateController.h) (revision 6e0ddbfa4863bb12a64dfde5baeada941acadaf8)
@@ -29,7 +29,7 @@
private:
// General defines
- #define UI_MSG_DD_STATUS_INDEX 4
+ #define UI_MSG_BB_STATUS_INDEX 4
#define UI_MSG_BB_PAYLOAD_ID 0x63
#define COUNTER_VAR_DEFAULT_VALUE -1
#define PRESC_TIME_DEFAULT_VALUE -1
@@ -59,20 +59,24 @@
// Treatment params
#define MIN_DIAL_RATE_MLPM 100
#define MAX_DIAL_RATE_MLPM 600
- #define MIN_TX_TIME_MINS 60
+ #define MIN_TX_TIME_MINS (1 * MINUTES_PER_HOUR)
+ #define MAX_TX_TIME_MINS (8 * MINUTES_PER_HOUR)
+ #define MAX_UF_VOL_ML (8 * MILLILITERS_PER_LITER)
+ #define MAX_UF_RATE_MLPM (2000.0 / MINUTES_PER_HOUR)
- #define DEFAULT_TX_ELAPSED_TIME_S (2 * MINUTES_PER_HOUR) * SECONDS_PER_MINUTE
- #define TX_PARAM_PRESCRIBED_DUR_S ((4 * MINUTES_PER_HOUR) + 30) * SECONDS_PER_MINUTE
- #define TX_PARAM_UF_VOLUME_L 2.0
- #define TX_PARAM_BLOOD_FLOW_RATE_MLPM 400
- #define TX_PARAM_DIAL_FLOW_RATE_MLPM 600
- #define TX_PARAM_SALINE_BOLUS_VOL_ML 200
+ #define DEF_TX_ELAPSED_TIME_S (2 * MINUTES_PER_HOUR) * SECONDS_PER_MINUTE
+ #define DEF_TX_PARAM_PRESCRIBED_DUR_S ((4 * MINUTES_PER_HOUR) + 30) * SECONDS_PER_MINUTE
+ #define DEF_TX_PARAM_UF_VOLUME_L 2.0
+ #define DEF_TX_PARAM_BLOOD_FLOW_RATE_MLPM 400
+ #define DEF_TX_PARAM_DIAL_FLOW_RATE_MLPM 600
+ #define DEF_TX_PARAM_SALINE_BOLUS_VOL_ML 200
+ #define DEF_TX_PARAM_RINSEBACK_FLOW_RATE_MLPM 200
+ #define DEF_TX_PARAM_ART_PRES_LIMIT_WIN_MMHG 120
+ #define DEF_TX_PARAM_VEN_PRES_LIMIT_WIN_MMHG 100
+ #define DEF_TX_PARAM_VEN_PRES_LIMIT_ASYM_WIN_MMHG 20
+ #define DEF_TX_PARAM_DIA_TEMPERATURE_C 37.0
// Treatment defines
- #define TIME_PRESCRIBED_S_INDEX 5 // TODO remove
- #define TIME_ELAPSED_S_INDEX 6 // TODo remove
- #define TIME_REMAINING_S_INDEX 7 // TODO remove
-
#define BLOOD_PRIME_VOLUME_ML (106.6 + 40)
#define BLOOD_FLOW_INTEGRATOR (1.0 / (SECONDS_PER_MINUTE * (MILLISECONDS_PER_SECOND /QOBJECT_TIMER_TIMEOUT_MS)))
#define MAX_DIALYSATE_VOLUME_ML 150000
@@ -118,6 +122,26 @@
User_Command_ID _dryDemoCurrentCmd;
drydemoXMLstates _dryDemo;
+ struct Pre_Treatment_Params {
+ bool hasTxParamsBeenInitialized;
+ quint32 bloodFlowRateMLPM;
+ quint32 dialysateFlowRateMLPM;
+ quint32 txDurationMins;
+ quint32 salineBolusVolML;
+ quint32 acidConc;
+ quint32 bicarbConc;
+ quint32 dialyzerType;
+ quint32 heparinType;
+ quint32 bloodMeasurementInveralMin;
+ quint32 rinsebackFlowRateMLPM;
+ qint32 areterialPresLimitWindowMMHG;
+ qint32 venousPresLimitWindowMMHG;
+ qint32 venousPresLimitAsymWindowMMHG;
+ float heparinDispenseRateMLHR;
+ float heparinBolusVolML;
+ float dialysateTemperatureC;
+ };
+
// New state machine stuff
struct Treatment_Variables {
float accumulatedVolumeML;
@@ -131,25 +155,32 @@
float refUFVolumeML;
};
- State_Status _stateStatus;
+ State_Status _stateStatus; // TODO remove
QList _broadcastMessages;
QList _sendMessages;
QHash _treatmentRcvdMessages;
- bool _isBoradcastListReady; // TODO use a mutex
+ bool _isBroadcastListReady; // TODO use a mutex
bool _isSendListReady; // Todo use a mutex
Treatment_Variables _treatmentVars;
+ Pre_Treatment_Params _treatmentParams;
void initMessagesHashTable();
void transitionApplicationToStandBy();
void resetVariables();
-
void sendMessages(bool isBroadcast);
+ void setTreatmentParams(bool isFromUI, const QVariant &payload);
void prepareOcclusionBroadcastData();
void prepareTreatmentTimeBroadcastData();
void prepareTreatmentStatesBroadcastData(const QVariantList &payload);
+ void prepareBloodFlowBroadcastData();
+ void prepareDialysateFlowBroadcastData();
+ void prepareDialysateOutFlowBroadcastData();
+ void prepareTreatmentParamsRangesBroadcastData();
+
void handleTreatmentReceivedMessages();
void handleTreatmentTimeChangeRequest(const QVariant &payload);
+ void handleMsgBBPayload(const QVariant &payload);
void onIdleStateChange(bool active);
void onTreatmentParamsStateChange(bool active);