Index: sources/StateController.cpp =================================================================== diff -u -rbf25cc43f3a623f45cadd0c3449838bfe24688c2 -r646712b99c608c9bc67b555497d5a666a0db1fea --- sources/StateController.cpp (.../StateController.cpp) (revision bf25cc43f3a623f45cadd0c3449838bfe24688c2) +++ sources/StateController.cpp (.../StateController.cpp) (revision 646712b99c608c9bc67b555497d5a666a0db1fea) @@ -30,9 +30,6 @@ _dryDemo.connectToState("End_Tx" , this, &StateController::onEndTreatmentStateChange ); _dryDemo.connectToState("Disinfect" , this, &StateController::onDisinfectStateChange ); - - // Start with uninitialized treatment params - _treatmentParams.hasTxParamsBeenInitialized = false; // TODO remove resetVariables(); } @@ -53,7 +50,7 @@ switch(receivedMsgID) { case ID_UI_RQST_TX: - // TODO fix this to start + _treatmentRcvdMessages[receivedMsgID] = msg[1]; break; case ID_UI_TX_PARAMS_RQST: @@ -151,7 +148,6 @@ _isBroadcastListReady = false; _isSendListReady = false; - _treatmentVars.accumulatedVolumeML = 0.0; _treatmentVars.broadcastIntervalCount = 0; _treatmentVars.broadcastIntervalCount = 0; @@ -282,6 +278,9 @@ _treatmentParams.heparinBolusVolML = 0; _treatmentParams.dialysateTemperatureC = DEF_TX_PARAM_DIA_TEMPERATURE_C; _treatmentParams.hasTxParamsBeenInitialized = true; + // The use might start from the treatment directly so everything starts from the default values + // so the UF volume is set to default as well. + _treatmentVars.txParamsUFVolL = DEF_TX_PARAM_UF_VOLUME_L; } qDebug() << "Treatment params" << _treatmentParams.hasTxParamsBeenInitialized; @@ -323,20 +322,6 @@ _isBroadcastListReady = true; } -void StateController::prepareTreatmentStatesBroadcastData(const QVariantList &payload) -{ - QVariantList msg; - msg.append(static_cast(ID_HD_TX_STATES_BC)); - msg.append(Can_Id::eChlid_HD_Sync); - - for (auto item: payload) { - msg.append(item); - } - _isBroadcastListReady = false; - _broadcastMessages.append(msg); - _isBroadcastListReady = true; -} - void StateController::prepareBloodFlowBroadcastData() { QVariantList msg; @@ -427,24 +412,22 @@ _isBroadcastListReady = true; } -void StateController::prepareHDModeTransitionBroadcastData(HD_OP_MODE mode) +void StateController::prepareHDModeTransitionBroadcastData(HD_OP_MODE mode, quint32 subMode) { QVariantList msg; msg.append(static_cast(ID_HD_OP_MODE)); msg.append(Can_Id::eChlid_HD_Sync); msg.append(mode); - msg.append(0); + msg.append(subMode); _isBroadcastListReady = false; _broadcastMessages.append(msg); _isBroadcastListReady = true; - - //qDebug() << "MOde" << msg; } -void StateController::preparePreTreatmentStatesBroadcastData(const QList &preTxStates) +void StateController::prepareStatesBroadcastData(Can::Message_ID_Enum msgID, const QList &preTxStates) { QVariantList msg; - msg.append(static_cast(ID_PRE_TX_STATES_BC)); + msg.append(static_cast(msgID)); msg.append(Can_Id::eChlid_HD_Sync); for (auto item: preTxStates) { @@ -455,18 +438,16 @@ _isBroadcastListReady = true; } - -void StateController::handleTreatmentReceivedMessages() +void StateController::prepareBloodPrimeBroadcastData(float accumulatedVolML) { - // TODO mutex here? - for (auto i = _treatmentRcvdMessages.begin(), end = _treatmentRcvdMessages.end(); i != end; ++i) { - if (!i.value().isNull()) { - if (i.key() == ID_USER_TX_TIME_CHANGES_RQST) { - handleTreatmentTimeChangeRequest(i.value()); - _treatmentRcvdMessages[i.key()].clear(); - } - } - } + 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(accumulatedVolML); + _isBroadcastListReady = false; + _broadcastMessages.append(msg); + _isBroadcastListReady = true; } void StateController::handleTreatmentTimeChangeRequest(const QVariant &payload) @@ -624,16 +605,14 @@ _isSendListReady = true; } - - // ----------- State transition methods ---------------- // void StateController::onIdleStateChange(bool active) { static State_Status status = STATE_ON_ENTRY; auto inEntry = [=](){ resetVariables(); - prepareHDModeTransitionBroadcastData(MODE_STAN); + prepareHDModeTransitionBroadcastData(MODE_STAN, 0); _transitionEventsFromIdle.clear(); _transitionEventsFromIdle[CMD_TX_PARAMS ] = "Transition_2_Tx_Parms"; @@ -654,6 +633,8 @@ }; auto inAction = [=](){ + bool isMsgBBRequested = false; + if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) { qint32 cmd = handleMsgBBPayload(_treatmentRcvdMessages[ID_UI_CONFIRM_RESP]); User_Command_ID cmdIDEnum = static_cast(cmd); @@ -662,11 +643,25 @@ if ((cmdIDEnum > CMD_STAND_BY) && (cmdIDEnum < NUM_OF_USER_CMDS)) { qDebug() << "Submit event" << _transitionEventsFromIdle[cmdIDEnum]; _dryDemo.submitEvent(_transitionEventsFromIdle[cmdIDEnum]); - status = STATE_ON_ENTRY; + isMsgBBRequested = true; + status = STATE_ON_ENTRY; } qDebug() << "Idle in action" << cmdIDEnum; } + + // If the use has requested message 0xBB then ignore create treatment button + if ((!_treatmentRcvdMessages[ID_UI_RQST_TX].isNull()) && (!isMsgBBRequested)) { + qint32 IDIndex = 0; + Types::U32 param; + GetValue(_treatmentRcvdMessages[ID_UI_RQST_TX].toByteArray(), IDIndex, param); + + if (param.value == START_TX_FROM_MSG_38) { + _dryDemo.submitEvent(_transitionEventsFromIdle[CMD_TX_PARAMS]); + qDebug() << "Idle starting Tx"; + } + _treatmentRcvdMessages[ID_UI_RQST_TX].clear(); + } }; auto inExit = [=](){ @@ -685,7 +680,7 @@ static State_Status status = STATE_ON_ENTRY; auto inEntry = [=](){ - prepareHDModeTransitionBroadcastData(MODE_TPAR); + prepareHDModeTransitionBroadcastData(MODE_TPAR, 0); qDebug() << "In treatment params on entry"; status = STATE_ON_ACTION; @@ -732,8 +727,8 @@ auto inEntry = [=](){ qDebug() << "Water sample on entry"; QList preTxStates({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - prepareHDModeTransitionBroadcastData(MODE_PRET); - preparePreTreatmentStatesBroadcastData(preTxStates); + prepareHDModeTransitionBroadcastData(MODE_PRET, 0); + prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates); status = STATE_ON_ACTION; timerCountDownS = DEFAULT_TIMEOUT_S; _treatmentVars.broadcastIntervalCount = 0; @@ -751,7 +746,7 @@ quint32 state = 1; quint32 stateIndex = 1; preTxStates[stateIndex] = state; - preparePreTreatmentStatesBroadcastData(preTxStates); + prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates); } if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) { @@ -765,15 +760,13 @@ Types::U32 param; GetValue(_treatmentRcvdMessages[ID_SAMPLE_WATER_RESULT].toByteArray(), resultIndex, param); - qDebug() << "Counter" << timerCountDownS << param.value; if (param.value == ACCEPT_VALUE) { status = STATE_ON_EXIT; } else { status = STATE_ON_ENTRY; _dryDemo.submitEvent("Transition_back_2_idle"); } - _treatmentRcvdMessages[ID_SAMPLE_WATER_RESULT].clear(); } } @@ -803,8 +796,8 @@ state = 0; QList preTxStates({1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); preTxStates[stateIndex] = state; - prepareHDModeTransitionBroadcastData(MODE_PRET); - preparePreTreatmentStatesBroadcastData(preTxStates); + prepareHDModeTransitionBroadcastData(MODE_PRET, 0); + prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates); status = STATE_ON_ACTION; _hasUserConfirmedToProceed = false; }; @@ -816,7 +809,7 @@ state++; QList preTxStates({1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); preTxStates[stateIndex] = state; - preparePreTreatmentStatesBroadcastData(preTxStates); + prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates); } else { status = STATE_ON_EXIT; @@ -854,8 +847,8 @@ stateNum = 0; QList preTxStates({2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); preTxStates[stateIndex] = stateNum; - prepareHDModeTransitionBroadcastData(MODE_PRET); - preparePreTreatmentStatesBroadcastData(preTxStates); + prepareHDModeTransitionBroadcastData(MODE_PRET, 0); + prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates); status = STATE_ON_ACTION; _hasUserConfirmedToProceed = false; _treatmentVars.broadcastIntervalCount = 0; @@ -871,11 +864,11 @@ stateNum++; QList preTxStates({2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); preTxStates[stateIndex] = stateNum; - preparePreTreatmentStatesBroadcastData(preTxStates); + prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates); } else if (hasTimeElapsed) { QList preTxStates({3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - preparePreTreatmentStatesBroadcastData(preTxStates); + prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates); if (_hasUserConfirmedToProceed) { qDebug() << "Disposables done"; @@ -916,8 +909,8 @@ stateIndex = 5; QList preTxStates({4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); preTxStates[stateIndex] = stateNum; - prepareHDModeTransitionBroadcastData(MODE_PRET); - preparePreTreatmentStatesBroadcastData(preTxStates); + prepareHDModeTransitionBroadcastData(MODE_PRET, 0); + prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates); status = STATE_ON_ACTION; _hasUserConfirmedToProceed = false; _treatmentVars.broadcastIntervalCount = 0; @@ -938,14 +931,14 @@ stateNum++; QList preTxStates({4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); preTxStates[stateIndex] = stateNum; - preparePreTreatmentStatesBroadcastData(preTxStates); + prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates); } else if (hasTimeElapsed) { hasPrimeCompleted = true; stateNum = 0; timerCountDownS = DEFAULT_TIMEOUT_S; QList preTxStates({5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - preparePreTreatmentStatesBroadcastData(preTxStates); + prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates); } } else { @@ -957,11 +950,11 @@ stateIndex = 6; QList preTxStates({5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); preTxStates[stateIndex] = stateNum; - preparePreTreatmentStatesBroadcastData(preTxStates); + prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates); } else if (hasTimeElapsed) { QList preTxStates({6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - preparePreTreatmentStatesBroadcastData(preTxStates); + prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates); if (_hasUserConfirmedToProceed) { status = STATE_ON_EXIT; @@ -995,8 +988,8 @@ auto inEntry = [=](){ qDebug() << "BP/HR on entry"; QList preTxStates({7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - prepareHDModeTransitionBroadcastData(MODE_PRET); - preparePreTreatmentStatesBroadcastData(preTxStates); + prepareHDModeTransitionBroadcastData(MODE_PRET, 0); + prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates); status = STATE_ON_ACTION; _hasUserConfirmedToProceed = false; }; @@ -1030,8 +1023,8 @@ auto inEntry = [=](){ qDebug() << "UF on entry"; QList preTxStates({7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - prepareHDModeTransitionBroadcastData(MODE_PRET); - preparePreTreatmentStatesBroadcastData(preTxStates); + prepareHDModeTransitionBroadcastData(MODE_PRET, 0); + prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates); status = STATE_ON_ACTION; _hasUserConfirmedToProceed = false; }; @@ -1070,8 +1063,8 @@ auto inEntry = [=](){ qDebug() << "Connection on entry"; QList preTxStates({7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - prepareHDModeTransitionBroadcastData(MODE_PRET); - preparePreTreatmentStatesBroadcastData(preTxStates); + prepareHDModeTransitionBroadcastData(MODE_PRET, 0); + prepareStatesBroadcastData(ID_PRE_TX_STATES_BC, preTxStates); status = STATE_ON_ACTION; isConnectionDone = false; _hasUserConfirmedToProceed = false; @@ -1126,29 +1119,19 @@ qDebug() << "Start Treatment active"; resetVariables(); + prepareHDModeTransitionBroadcastData(MODE_TREA, 0); - QVariantList msg; - msg.append(static_cast(ID_HD_OP_MODE)); - msg.append(Can_Id::eChlid_HD_Sync); - msg.append(MODE_TREA); - msg.append(0); - _isBroadcastListReady = false; - _broadcastMessages.append(msg); - _isBroadcastListReady = true; - msg.clear(); + QList txStates({1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); + prepareStatesBroadcastData(ID_HD_TX_STATES_BC, txStates); - 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); - + // Get the default treatment params in case the user did not start from the treatment params QVariant emptyVariantList; setTreatmentParams(false, emptyVariantList); status = STATE_ON_EXIT; }; - auto inAction = [](){}; + auto inAction = [=](){}; auto inExit = [=](){ status = STATE_ON_ENTRY; _dryDemo.submitEvent("Start_Tx_2_Blood_Prime"); @@ -1163,52 +1146,32 @@ void StateController::onTreatmentBloodPrimeStateChange(bool active) { - static State_Status status = STATE_ON_ENTRY; + static State_Status status = STATE_ON_ENTRY; + static float accumBloodVolML = 0.0; auto inEntry = [=](){ resetVariables(); qDebug() << "Blood prime entry"; - 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(0.0); - _isBroadcastListReady = false; - _broadcastMessages.append(msg); - _isBroadcastListReady = true; - prepareOcclusionBroadcastData(); + status = STATE_ON_ACTION; + accumBloodVolML = 0.0; - status = STATE_ON_ACTION; + prepareBloodPrimeBroadcastData(accumBloodVolML); }; auto inAction = [=](){ _treatmentVars.broadcastIntervalCount++; - _treatmentVars.accumulatedVolumeML += (DEF_TX_PARAM_BLOOD_FLOW_RATE_MLPM * BLOOD_FLOW_INTEGRATOR); + accumBloodVolML += (DEF_TX_PARAM_BLOOD_FLOW_RATE_MLPM * BLOOD_FLOW_INTEGRATOR); if (_treatmentVars.broadcastIntervalCount % NUM_OF_COUNTS_TIMER_BC_EMIT == 0) { - 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); - _isBroadcastListReady = false; - _broadcastMessages.append(msg); - _isBroadcastListReady = true; + prepareBloodPrimeBroadcastData(accumBloodVolML); prepareOcclusionBroadcastData(); prepareTreatmentParamsRangesBroadcastData(); } - if (_treatmentVars.accumulatedVolumeML > BLOOD_PRIME_VOLUME_ML) { - // send blood prime value on last time - 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); - _isBroadcastListReady = false; - _broadcastMessages.append(msg); - _isBroadcastListReady = true; + if (accumBloodVolML > BLOOD_PRIME_VOLUME_ML) { + // send blood prime value one last time + prepareBloodPrimeBroadcastData(accumBloodVolML); status = STATE_ON_EXIT; } @@ -1235,18 +1198,16 @@ { static State_Status status = STATE_ON_ENTRY; - handleTreatmentReceivedMessages(); - auto inEntry = [=](){ resetVariables(); - qDebug() << "Treatment Treatment state"; _treatmentVars.prescribedTreatmentTimeS = _treatmentParams.txDurationMins * SECONDS_PER_MINUTE; _treatmentVars.treatmentElapsedTimeS = DEF_TX_ELAPSED_TIME_S; _treatmentVars.remainingTreatmentTimeS = _treatmentVars.prescribedTreatmentTimeS - _treatmentVars.treatmentElapsedTimeS; _treatmentVars.prescribedMaxUFVolML = _treatmentVars.txParamsUFVolL * MILLILITERS_PER_LITER; _treatmentVars.prescribedUFRate = _treatmentVars.prescribedMaxUFVolML / _treatmentParams.txDurationMins; _treatmentVars.refUFVolumeML = (_treatmentVars.treatmentElapsedTimeS / SECONDS_PER_MINUTE) * _treatmentVars.prescribedUFRate; + qDebug() << "Treatment Treatment state" << _treatmentVars.txParamsUFVolL << _treatmentParams.hasTxParamsBeenInitialized; status = STATE_ON_ACTION; }; @@ -1260,11 +1221,8 @@ _treatmentVars.measUFVolumeML = _treatmentVars.refUFVolumeML; //qDebug() << "UF Va;ue" << QTime::currentTime() << _treatmentVars.refUFVolumeML << _treatmentVars.prescribedUFRate; if (_treatmentVars.broadcastIntervalCount % NUM_OF_COUNTS_TIMER_BC_EMIT == 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); + QList txStates({2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); + prepareStatesBroadcastData(ID_HD_TX_STATES_BC, txStates); prepareOcclusionBroadcastData(); prepareTreatmentTimeBroadcastData(); prepareBloodFlowBroadcastData(); @@ -1273,6 +1231,12 @@ prepareTreatmentParamsRangesBroadcastData(); } //qDebug() << "Target treatment" << _treatmentVars.prescribedTreatmentTimeS; + + if (!_treatmentRcvdMessages[ID_USER_TX_TIME_CHANGES_RQST].isNull()) { + handleTreatmentTimeChangeRequest(_treatmentRcvdMessages[ID_USER_TX_TIME_CHANGES_RQST]); + _treatmentRcvdMessages[ID_USER_TX_TIME_CHANGES_RQST].clear(); + } + if (_treatmentVars.remainingTreatmentTimeS <= 0 ) { status = STATE_ON_EXIT; } @@ -1286,7 +1250,7 @@ auto inExit = [=](){ qDebug() << "Treat Treatment exit"; status = STATE_ON_ENTRY; - _dryDemo.submitEvent("Treatment_2_End_Treatment"); // TODO bring back + _dryDemo.submitEvent("Treatment_2_End_Treatment"); }; switch (status) { // TODO macro it later @@ -1307,14 +1271,33 @@ void StateController::onDisinfectStateChange(bool active) { - if (active) { - qDebug() << "Disinfect active"; - QVariantList msg = _dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX); - emit _ApplicationController.didActionTransmit(msg); + static State_Status status = STATE_ON_ENTRY; + + auto inEntry = [=](){ + // transition to disinfect screen + prepareHDModeTransitionBroadcastData(MODE_STAN, 2); + + qDebug() << "Disinfect on entry"; + status = STATE_ON_ACTION; + }; + + auto inAction = [=](){ + + if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) { + status = STATE_ON_ENTRY; + _dryDemo.submitEvent("Transition_back_2_idle"); + } + }; + + auto inExit = [=](){ + qDebug() << "Disinfect 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; } - else - { - qDebug() << "Disinfect exit"; - } }