Index: sources/StateController.cpp =================================================================== diff -u -r13f1a9b24d08848b27c8e345c21d0e540c0b78de -rac917f2cc891cabeae3edbd353b72d00c3637fcd --- sources/StateController.cpp (.../StateController.cpp) (revision 13f1a9b24d08848b27c8e345c21d0e540c0b78de) +++ sources/StateController.cpp (.../StateController.cpp) (revision ac917f2cc891cabeae3edbd353b72d00c3637fcd) @@ -36,7 +36,7 @@ // Start with uninitialized treatment params _treatmentParams.hasTxParamsBeenInitialized = false; resetVariables(); - initMessagesHashTable(); // Todo move this once the state machine is finished. + initMessagesHashTable(); // Todo remove this once the state machine is finished. } void StateController::quit() @@ -52,92 +52,41 @@ } MessageID receivedMsgID = static_cast(msg[0].toUInt()); - bool isCmdValid = false; QVariantList msgBack; switch(receivedMsgID) { case ID_UI_RQST_TX: - isCmdValid = true; _dryDemoCurrentCmd = CMD_TX_PARAMS; break; case ID_UI_TX_PARAMS_RQST: _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) { - - // 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); - // 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_UI_CONFIRM_RQST)); - msgBack.append(Can_Id::eChlid_HD_UI); - msgBack.append(UI_MSG_BB_PAYLOAD_ID); - msgBack.append(1); - msgBack.append(0); - emit _ApplicationController.didActionTransmit(msgBack); - } - // TODO remove this part - else { - _treatmentRcvdMessages[receivedMsgID] = msg[1]; - } - - } - } + case ID_UI_CONFIRM_RESP: + _treatmentRcvdMessages[receivedMsgID] = msg[1]; break; case ID_UI_CONFIRM_TX_PARAMS: - isCmdValid = true; - _dryDemoCurrentCmd = CMD_WATER_SAMPLE; + _hasUserConfirmedToProceed = true; break; - case ID_SAMPLE_WATER_RESULT: { - isCmdValid = true; - int resultIndex = 0; - Types::U32 resultParam; - GetValue(msg[1].toByteArray(), resultIndex, resultParam); - if ( resultParam.value == 1 ) { - _dryDemoCurrentCmd = CMD_CONSUMABLES; - } - else { - _dryDemoCurrentCmd = CMD_NONE; - transitionApplicationToStandBy(); - } - } + case ID_SAMPLE_WATER_RESULT: + _treatmentRcvdMessages[receivedMsgID] = msg[1]; break; case ID_UI_CONSUMABLES_INSTALL: - _hasUserConfirmedToProceed = true; - break; + _hasUserConfirmedToProceed = true; + break; case ID_UI_INTALLATION_CONFIRM: - _hasUserConfirmedToProceed = true; - _dryDemoCurrentCmd = CMD_SYSTEM_PRIME; - isCmdValid = true; - break; + _hasUserConfirmedToProceed = true; + break; case ID_UI_PATIENT_CONNECTION_RQST: _hasUserConfirmedToProceed = true; _dryDemoCurrentCmd = CMD_BP_HR; - isCmdValid = true; break; case ID_UI_SET_UF_VOLUME_RQST: @@ -149,7 +98,6 @@ msgBack.append(1.8); emit _ApplicationController.didActionTransmit(msgBack); _dryDemoCurrentCmd = CMD_CONNECTION; - isCmdValid = true; break; case ID_UI_PATIENT_CONNECTION_CONF_RQST: @@ -160,7 +108,6 @@ msgBack.append(0); emit _ApplicationController.didActionTransmit(msgBack); _dryDemoCurrentCmd = CMD_START_TX; - isCmdValid = true; break; case ID_UI_START_TX_RQST: @@ -194,129 +141,19 @@ // Do nothing break; } - - if ((isCmdValid) && (_dryDemo.isRunning())) { - isCmdValid = false; - _dryDemo.submitEvent("Transition_back_2_idle"); - } } void StateController::timerEvent(QTimerEvent *) { _dryDemo.submitEvent("TimeoutEvent"); - //qDebug() << "Index" << _index; - if (_isBroadcastListReady) { sendMessages(true); } if (_isSendListReady) { sendMessages(false); } - - quint16 listSize = _dryDemoCmds[_dryDemoCurrentCmd].size(); - - if (_dryDemoCurrentCmd != CMD_START_TX) { - if ((listSize > 1) && (_index < listSize)) { - - int counterType = _dryDemoCmds[_dryDemoCurrentCmd][_index][IS_TIMER_INDEX].toInt(); - Counter_Type counterTypeEnum = static_cast(counterType); - - //qDebug() << "Counter Type" << _dryDemoCurrentCmd << _index << counterTypeEnum; - - //if (_dryDemoCmds[_dryDemoCurrentCmd][_index][IS_TIMER_INDEX].toBool()) { - if (counterTypeEnum != COUNTER_NONE) { - - if (_timerBroadcastCount >= NUM_OF_COUNTS_TIMER_BC_EMIT) { - - QVariant tempVar; - QVariantList msg; - - switch ( counterTypeEnum) - { - case COUNTER_NONE: - // Do nothing - break; - - case COUNTER_PRE_TX_TIMERS: - if (_currentCounterValue < 0) { - _currentCounterValue = _dryDemoCmds[_dryDemoCurrentCmd][_index][COUNT_DOWN_TIMER_INDEX].toUInt(); - } - - _currentCounterValue--; - _timerBroadcastCount = 0; - - tempVar = _dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX); - msg = tempVar.toList(); - msg[COUNT_DOWN_TIMER_INDEX - RESP_MSG_START_INDEX] = _currentCounterValue; - //qDebug() << "Counters Pre Tx" << _currentCounterValue << _dryDemoCmds[_dryDemoCurrentCmd][_index][COUNT_DOWN_TIMER_INDEX].toUInt(); - emit _ApplicationController.didActionTransmit(msg); - break; - - case COUNTER_TX_TIMER: - /* - if ((_currentCounterValue < 0) && (_prescribedTreatmentTimeS < 0)) { - _prescribedTreatmentTimeS = _dryDemoCmds[_dryDemoCurrentCmd][_index][TIME_PRESCRIBED_S_INDEX].toUInt(); - quint32 elapsedTimeS = _dryDemoCmds[_dryDemoCurrentCmd][_index][TIME_ELAPSED_S_INDEX].toUInt(); - _currentCounterValue = _prescribedTreatmentTimeS - elapsedTimeS; - } - - _currentCounterValue--; - _timerBroadcastCount = 0; - - tempVar = _dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX); - msg = tempVar.toList(); - msg[TIME_PRESCRIBED_S_INDEX - RESP_MSG_START_INDEX] = _prescribedTreatmentTimeS; - msg[TIME_REMAINING_S_INDEX - RESP_MSG_START_INDEX] = _currentCounterValue; - qDebug() << "Counters Tx" << _currentCounterValue << _dryDemoCmds[_dryDemoCurrentCmd][_index]; - emit _ApplicationController.didActionTransmit(msg); - */ - break; - - case COUNTER_RINSEBACK_TIMER: - break; - } - - if (_currentCounterValue == 0) { - _index++; - _currentCounterValue = COUNTER_VAR_DEFAULT_VALUE; - } - } - else { - _timerBroadcastCount++; - } - } - else { - if (_broadcastMsgCount <= NUM_OF_COUNTS_TO_BC_MSG) { - emit _ApplicationController.didActionTransmit(_dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX)); - _broadcastMsgCount++; - } - - bool isWaitNeeded = _dryDemoCmds[_dryDemoCurrentCmd][_index][IS_WAIT_NEEDED_INDEX].toBool(); - - if ((!isWaitNeeded) || (isWaitNeeded && _hasUserConfirmedToProceed)) { - //qDebug() << "Nex Inedx" << _dryDemoCmds[_dryDemoCurrentCmd][_index]; - - if (_broadcastMsgCount > NUM_OF_COUNTS_TO_BC_MSG) { - int nextCmd = _dryDemoCmds[_dryDemoCurrentCmd][_index][NEXT_AUTO_TRANSITION_INDEX].toInt(); - User_Command_ID nextCmdEnum = static_cast(nextCmd); - qDebug() << "NONE" << nextCmd << nextCmdEnum; - if (nextCmdEnum != CMD_NONE) { - qDebug() << "Current Enum" << _dryDemoCurrentCmd; - _dryDemoCurrentCmd = nextCmdEnum; - qDebug() << "New transition" << nextCmdEnum << _dryDemoCurrentCmd << _index; - _dryDemo.submitEvent("Transition_back_2_idle"); - } - - _index++; - _broadcastMsgCount = 0; - _hasUserConfirmedToProceed = false; - } - } - } - } - } } // ---------------------- Private methods ------------------ // @@ -1003,18 +840,6 @@ temp.clear(); } -void StateController::transitionApplicationToStandBy() -{ - resetVariables(); - - QVariantList list; - list.append(static_cast(ID_HD_OP_MODE)); - list.append(Can_Id::eChlid_HD_Sync); - list.append(MODE_STAN); - list.append(0); - emit _ApplicationController.didActionTransmit(list); -} - void StateController::resetVariables() { _index = 0; @@ -1166,6 +991,7 @@ void StateController::prepareOcclusionBroadcastData() { + // TODO a random variation here QVariantList msg; msg.append(static_cast(ID_PRESSURE_OCCLUSION_DATA_BC)); msg.append(Can_Id::eChlid_HD_Sync); @@ -1274,7 +1100,7 @@ quint32 maxTime1 = minTimeMins + maxTimeRemMins; quint32 maxTime2 = MAX_DIAL_RATE_MLPM / _treatmentParams.dialysateFlowRateMLPM; quint32 maxTimeMins = qMax(maxTime1, maxTime2); - qDebug() << "Time Ranges Values" << minTimeMins << maxTimeRemMins << maxTime2 << maxTimeMins << _treatmentVars.prescribedUFRate; + //qDebug() << "Time Ranges Values" << minTimeMins << maxTimeRemMins << maxTime2 << maxTimeMins << _treatmentVars.prescribedUFRate; float minUFVolML = _treatmentVars.refUFVolumeML + _treatmentVars.prescribedUFRate; float maxUFVol1 = minUFVolML + ((_treatmentParams.txDurationMins - elapsedTimeMins) * MAX_UF_RATE_MLPM); @@ -1290,7 +1116,7 @@ maxUFVol = qMin(maxUFVol, (float)MAX_UF_VOL_ML); maxDialFlowRateMLPM = qMin(maxDialFlowRateMLPM, (quint32)MAX_DIAL_RATE_MLPM); - qDebug() << "New UF" << minUFVolML << maxUFVol1 << maxUFVol2 << maxUFVol << maxDialFlowRateMLPM; + //qDebug() << "New UF" << minUFVolML << maxUFVol1 << maxUFVol2 << maxUFVol << maxDialFlowRateMLPM; QVariantList msg; msg.append(static_cast(ID_HD_TX_PARAMS_RANGES_DATA)); @@ -1303,6 +1129,35 @@ _isBroadcastListReady = true; } +void StateController::prepareHDModeTransitionBroadcastData(HD_OP_MODE mode) +{ + QVariantList msg; + msg.append(static_cast(ID_HD_OP_MODE)); + msg.append(Can_Id::eChlid_HD_Sync); + msg.append(mode); + msg.append(0); + _isBroadcastListReady = false; + _broadcastMessages.append(msg); + _isBroadcastListReady = true; + + //qDebug() << "MOde" << msg; +} + +void StateController::preparePreTreatmentStatesBroadcastData(const QList &preTxStates) +{ + QVariantList msg; + msg.append(static_cast(ID_PRE_TX_STATES_BC)); + msg.append(Can_Id::eChlid_HD_Sync); + + for (auto item: preTxStates) { + msg.append(item); + } + _isBroadcastListReady = false; + _broadcastMessages.append(msg); + _isBroadcastListReady = true; +} + + void StateController::handleTreatmentReceivedMessages() { // TODO mutex here? @@ -1364,135 +1219,346 @@ _isSendListReady = true; } -void StateController::handleMsgBBPayload(const QVariant &payload) +qint32 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); + qint32 cmd = CMD_NONE; + qint32 IDIndex = 0; + Types::U32 param; + GetValue(payload.toByteArray(), IDIndex, param); - if ((cmdIDEnum > CMD_NONE) && (cmdIDEnum < NUM_OF_USER_CMDS)) { - _dryDemoCurrentCmd = cmdIDEnum; - + if (param.value == UI_MSG_BB_PAYLOAD_ID) { + IDIndex = UI_MSG_BB_STATUS_INDEX; + GetValue(payload.toByteArray(), IDIndex, param); + cmd = param.value; } + + QVariantList msg; + msg.append(static_cast(ID_HD_UI_CONFIRM_RQST)); + msg.append(Can_Id::eChlid_HD_UI); + msg.append(UI_MSG_BB_PAYLOAD_ID); + msg.append(ACCEPT_VALUE); + msg.append(0); + _isSendListReady = false; + _sendMessages.append(msg); + _isSendListReady = true; + + return cmd; } // ----------- State transition methods ---------------- // void StateController::onIdleStateChange(bool active) { - if (active) { - qDebug() << "Idle on entry" << _dryDemoCurrentCmd; + static State_Status status = STATE_ON_ENTRY; - // TODO remove - if (_dryDemoCurrentCmd == CMD_START_TX) { - qDebug() << "Treatment event stareted"; - _stateStatus = STATE_ON_ENTRY; // TODO temp - _dryDemo.submitEvent("Transition_2_Start_Tx"); + auto inEntry = [=](){ + resetVariables(); + prepareHDModeTransitionBroadcastData(MODE_STAN); + + _transitionEventsFromIdle.clear(); + _transitionEventsFromIdle[CMD_TX_PARAMS ] = "Transition_2_Tx_Parms"; + _transitionEventsFromIdle[CMD_WATER_SAMPLE ] = "Transition_2_Water_Sample"; + _transitionEventsFromIdle[CMD_CONSUMABLES ] = "Transition_2_Consumables"; + _transitionEventsFromIdle[CMD_DISPOSABLES ] = "Transition_2_Disposables"; + _transitionEventsFromIdle[CMD_SYSTEM_PRIME ] = "Transition_2_Sys_Prime"; + _transitionEventsFromIdle[CMD_BP_HR ] = "Transition_2_BP_HR"; + _transitionEventsFromIdle[CMD_ULTRAFILTRATION ] = "Transition_2_Ultrafiltraion"; + _transitionEventsFromIdle[CMD_CONNECTION ] = "Transition_2_Patient_Connection"; + _transitionEventsFromIdle[CMD_START_TX ] = "Transition_2_Start_Tx"; + _transitionEventsFromIdle[CMD_END_TX ] = "Transition_2_End_Tx"; + _transitionEventsFromIdle[CMD_DISINFECTION ] = "Transition_2_Disinfect"; + + status = STATE_ON_ACTION; + + qDebug() << "Idle on entry"; + }; + + auto inAction = [=](){ + if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) { + qint32 cmd = handleMsgBBPayload(_treatmentRcvdMessages[ID_UI_CONFIRM_RESP]); + User_Command_ID cmdIDEnum = static_cast(cmd); + _treatmentRcvdMessages[ID_UI_CONFIRM_RESP].clear(); + + if ((cmdIDEnum > CMD_STAND_BY) && (cmdIDEnum < NUM_OF_USER_CMDS)) { + qDebug() << "Submit event" << _transitionEventsFromIdle[cmdIDEnum]; + _dryDemo.submitEvent(_transitionEventsFromIdle[cmdIDEnum]); + status = STATE_ON_ENTRY; } - else if ((_dryDemoCmds.contains(_dryDemoCurrentCmd)) && (_dryDemoCurrentCmd != CMD_NONE)) { - transitionApplicationToStandBy(); - _stateStatus = STATE_ON_ENTRY; // TODO temp - QString transitionEvent = _dryDemoCmds[_dryDemoCurrentCmd][_index][TRANSITION_EVENT_INDEX].toString(); - qDebug() << "Event" << transitionEvent <<_dryDemoCurrentCmd << _index; - _dryDemo.submitEvent(transitionEvent); - } + + qDebug() << "Idle in action" << cmdIDEnum; + } + }; + + auto inExit = [=](){ + 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 { - if (_dryDemoCurrentCmd != CMD_START_TX) { - qDebug() << "Idle on exit!"; - QVariantList msg = _dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX); - emit _ApplicationController.didActionTransmit(msg); - _index++; - } - } } void StateController::onTreatmentParamsStateChange(bool active) { static State_Status status = STATE_ON_ENTRY; - Q_UNUSED(active) // TODO remove - //if (active) { - //qDebug() << "In treatment params on entry"; - //} + auto inEntry = [=](){ + prepareHDModeTransitionBroadcastData(MODE_TPAR); - auto entry = [=](){ - status = STATE_ON_ACTION; + qDebug() << "In treatment params on entry"; + status = STATE_ON_ACTION; _treatmentParams.hasTxParamsBeenInitialized = false; + _hasUserConfirmedToProceed = false; }; - auto action = [=]() { - qDebug() << "In treatment params on entry"; + auto inAction = [=]() { + //qDebug() << "In treatment params on action"; handleTreatmentReceivedMessages(); - if (_treatmentParams.hasTxParamsBeenInitialized) { + if ((_treatmentParams.hasTxParamsBeenInitialized) && (_hasUserConfirmedToProceed)) { status = STATE_ON_EXIT; } + + if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) { + _dryDemo.submitEvent("Transition_back_2_idle"); + status = STATE_ON_ENTRY; + } }; - auto exit = [=](){ + auto inExit = [=](){ 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; + 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::onWaterSampleStateChange(bool active) { - if(active) { - qDebug() << "Sample" << _index; - QVariantList msg = _dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX); - emit _ApplicationController.didActionTransmit(msg); + static State_Status status = STATE_ON_ENTRY; + static quint32 timerCountDownS = DEFAULT_TIMEOUT_S; + + 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); + status = STATE_ON_ACTION; + timerCountDownS = DEFAULT_TIMEOUT_S; + _treatmentVars.broadcastIntervalCount = 0; + }; + + auto inAction = [=]() { + handleTreatmentReceivedMessages(); + + if (timerCountDownS != 0) { + _treatmentVars.broadcastIntervalCount++; + if (_treatmentVars.broadcastIntervalCount % NUM_OF_COUNTS_TIMER_BC_EMIT == 0) { + timerCountDownS--; + + QVariantList msg; + msg.append(static_cast(ID_FILTER_FLUSH_TIME_BC)); + msg.append(Can_Id::eChlid_DG_Sync); + msg.append(DEFAULT_TIMEOUT_S); + msg.append(timerCountDownS); + _isBroadcastListReady = false; + _broadcastMessages.append(msg); + _isBroadcastListReady = true; + } + } + else { + QList preTxStates({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); + quint32 state = 1; + quint32 stateIndex = 1; + preTxStates[stateIndex] = state; + preparePreTreatmentStatesBroadcastData(preTxStates); + } + + if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) { + status = STATE_ON_ENTRY; + _dryDemo.submitEvent("Transition_back_2_idle"); + } + + if (timerCountDownS == 0) { + if (!_treatmentRcvdMessages[ID_SAMPLE_WATER_RESULT].isNull()) { + qint32 resultIndex = 0; + Types::U32 param; + GetValue(_treatmentRcvdMessages[ID_SAMPLE_WATER_RESULT].toByteArray(), resultIndex, param); + + 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(); + } + } + }; + + auto inExit = [=](){ + qDebug() << "In treatment params on exit"; + status = STATE_ON_ENTRY; + _dryDemo.submitEvent("T_2_Consumables"); + }; + + 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() << "Sample inactive"; - } } void StateController::onConsumablesStateChange(bool active) { - if(active) { - qDebug() << "Consumables" << _index; - QVariantList msg = _dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX); - emit _ApplicationController.didActionTransmit(msg); + static State_Status status = STATE_ON_ENTRY; + static quint32 state = 0; + static quint32 stateIndex = 2; + + auto inEntry = [=](){ + qDebug() << "Consumables on entry"; + state = 0; + QList preTxStates({1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); + preTxStates[stateIndex] = state; + prepareHDModeTransitionBroadcastData(MODE_PRET); + preparePreTreatmentStatesBroadcastData(preTxStates); + status = STATE_ON_ACTION; + _hasUserConfirmedToProceed = false; + }; + + auto inAction = [=]() { + if (_hasUserConfirmedToProceed) { + qDebug() << " State " << state; + if (state < 4) { + state++; + QList preTxStates({1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); + preTxStates[stateIndex] = state; + preparePreTreatmentStatesBroadcastData(preTxStates); + } + else { + status = STATE_ON_EXIT; + } + } + + if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) { + status = STATE_ON_ENTRY; + _dryDemo.submitEvent("Transition_back_2_idle"); + } + }; + + auto inExit = [=](){ + qDebug() << "In consumables on exit"; + status = STATE_ON_ENTRY; + _dryDemo.submitEvent("T_2_Disposables"); + }; + + 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::onDisposablesStateChange(bool active) { - if(active) { - qDebug() << "Disposables" << _index; - QVariantList msg = _dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX); - emit _ApplicationController.didActionTransmit(msg); + static State_Status status = STATE_ON_ENTRY; + static quint32 timerCountDownS = DEFAULT_TIMEOUT_S; + static quint32 stateNum = 0; + static quint32 stateIndex = 3; + + auto inEntry = [=](){ + qDebug() << "Disposables on entry"; + stateNum = 0; + QList preTxStates({2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); + preTxStates[stateIndex] = stateNum; + prepareHDModeTransitionBroadcastData(MODE_PRET); + preparePreTreatmentStatesBroadcastData(preTxStates); + status = STATE_ON_ACTION; + _hasUserConfirmedToProceed = false; + _treatmentVars.broadcastIntervalCount = 0; + timerCountDownS = DEFAULT_TIMEOUT_S; + }; + + auto inAction = [=]() { + + if (timerCountDownS != 0) { + _treatmentVars.broadcastIntervalCount++; + if (_treatmentVars.broadcastIntervalCount % NUM_OF_COUNTS_TIMER_BC_EMIT == 0) { + timerCountDownS--; + + QVariantList msg; + msg.append(static_cast(ID_HD_SYS_SELF_TEST_TIME_BC)); + msg.append(Can_Id::eChlid_HD_Sync); + msg.append(DEFAULT_TIMEOUT_S); + msg.append(timerCountDownS); + _isBroadcastListReady = false; + _broadcastMessages.append(msg); + _isBroadcastListReady = true; + } + } + + if (stateNum < 12) { + stateNum++; + QList preTxStates({2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); + preTxStates[stateIndex] = stateNum; + preparePreTreatmentStatesBroadcastData(preTxStates); + } + else if (timerCountDownS == 0) { + QList preTxStates({3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); + preparePreTreatmentStatesBroadcastData(preTxStates); + + if (_hasUserConfirmedToProceed) { + qDebug() << "Disposables done"; + status = STATE_ON_EXIT; + } + } + + if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) { + status = STATE_ON_ENTRY; + _dryDemo.submitEvent("Transition_back_2_idle"); + } + }; + + auto inExit = [=](){ + qDebug() << "In disposables on exit"; + status = STATE_ON_ENTRY; + _dryDemo.submitEvent("T_2_System_Prime"); + }; + + 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::onSystemPrimeStateChange(bool active) { - if (active) { - qDebug() << "Prime active"; - QVariantList msg = _dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX); - emit _ApplicationController.didActionTransmit(msg); - } + + qDebug() << active; + + + //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::onBPHRStateChange(bool active) { if (active) { qDebug() << "BP/HR 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); } } @@ -1507,8 +1573,8 @@ { if(active) { qDebug() << "Connection 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); } } @@ -1549,28 +1615,27 @@ }; switch (status) { // TODO macro it later - case STATE_ON_ENTRY : inEntry (); break; + case STATE_ON_ENTRY : if (active) inEntry (); break; case STATE_ON_ACTION: if (active) inAction(); break; - case STATE_ON_EXIT : inExit (); break; + case STATE_ON_EXIT : if (active) inExit (); break; } } void StateController::onTreatmentBloodPrimeStateChange(bool active) { static State_Status status = STATE_ON_ENTRY; - _treatmentVars.broadcastIntervalCount++; - auto inEntry = [=](){ resetVariables(); qDebug() << "Blood prime entry"; status = STATE_ON_ACTION; }; auto inAction = [=](){ + _treatmentVars.broadcastIntervalCount++; _treatmentVars.accumulatedVolumeML += (DEF_TX_PARAM_BLOOD_FLOW_RATE_MLPM * BLOOD_FLOW_INTEGRATOR); - if (_treatmentVars.broadcastIntervalCount % NUM_OF_BC_COUNTS_ADJUSTED == 0) { + 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); @@ -1595,6 +1660,11 @@ _isBroadcastListReady = true; status = STATE_ON_EXIT; } + + if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) { + status = STATE_ON_ENTRY; + _dryDemo.submitEvent("Transition_back_2_idle"); + } }; auto inExit = [=](){ @@ -1604,17 +1674,16 @@ }; switch (status) { // TODO macro it later - case STATE_ON_ENTRY : inEntry (); break; + case STATE_ON_ENTRY : if (active) inEntry (); break; case STATE_ON_ACTION: if (active) inAction(); break; - case STATE_ON_EXIT : inExit (); break; + case STATE_ON_EXIT : if (active) inExit (); break; } } void StateController::onTreatmentTreatmentStateChange(bool active) { static State_Status status = STATE_ON_ENTRY; - handleTreatmentReceivedMessages(); auto inEntry = [=](){ @@ -1639,7 +1708,7 @@ _treatmentVars.refUFVolumeML += (timeSinceLastCallMS / SECONDS_PER_MINUTE) * _treatmentVars.prescribedUFRate; _treatmentVars.measUFVolumeML = _treatmentVars.refUFVolumeML; //qDebug() << "UF Va;ue" << QTime::currentTime() << _treatmentVars.refUFVolumeML << _treatmentVars.prescribedUFRate; - if (_treatmentVars.broadcastIntervalCount % NUM_OF_BC_COUNTS_ADJUSTED == 0) { + 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); @@ -1657,11 +1726,10 @@ status = STATE_ON_EXIT; } - // TODO uncomment later - //if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) { - // status = STATE_ON_ENTRY; - // _dryDemo.submitEvent("Transition_back_2_idle"); - //} + if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) { + status = STATE_ON_ENTRY; + _dryDemo.submitEvent("Transition_back_2_idle"); + } }; auto inExit = [=](){ @@ -1671,9 +1739,9 @@ }; switch (status) { // TODO macro it later - case STATE_ON_ENTRY : inEntry (); break; + case STATE_ON_ENTRY : if (active) inEntry (); break; case STATE_ON_ACTION: if (active) inAction(); break; - case STATE_ON_EXIT : inExit (); break; + case STATE_ON_EXIT : if (active) inExit (); break; } }