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