Index: sources/StateController.cpp =================================================================== diff -u -r75ca4bd322b1b11b7feb113086645979c95533a3 -rde65521102d2315e1812b8b14b2b21d6c4e5e949 --- sources/StateController.cpp (.../StateController.cpp) (revision 75ca4bd322b1b11b7feb113086645979c95533a3) +++ sources/StateController.cpp (.../StateController.cpp) (revision de65521102d2315e1812b8b14b2b21d6c4e5e949) @@ -41,10 +41,6 @@ void StateController::doStateControllerUnhandledMsgReceived(const QVariantList &msg) { - if (!_dryDemo.isRunning()) { - _dryDemo.start(); // TODO why cannot start the state machine somewhere else? - } - MessageID receivedMsgID = static_cast(msg[0].toUInt()); switch(receivedMsgID) @@ -134,6 +130,10 @@ void StateController::timerEvent(QTimerEvent *) { + if (!_dryDemo.isRunning()) { + _dryDemo.start(); + } + _dryDemo.submitEvent("TimeoutEvent"); if (_isBroadcastListReady) { @@ -624,27 +624,52 @@ _isSendListReady = true; } -void StateController::handleRinsebackSubstate(const QVariant &payload, quint32 &rbState) +void StateController::handleRinsebackSubstate(const QVariant &payload, float &accumVolML, + quint32 &txState, quint32 &rbState) { qint32 cmdIndex = 0; Types::U32 param; GetValue(payload.toByteArray(), cmdIndex, param); switch (param.value) { - case RINSEBACK_START: - rbState = 1; + case RINSEBACK_START_RB: + case RINSEBACK_RESUME_RB: + rbState = RINSEBACK_RUN_STATE; break; - case RINSEBACK_END_TX: - rbState = 999; + case RINSEBACK_PAUSE_RB: + rbState = RINSEBACK_PAUSE_STATE; break; + case RINSEBACK_END_RB: + rbState = RINSEBACK_STOP_STATE; + break; + case RINSEBACK_SALINE_BOLUS: + // TODO fill up break; + case RINSEBACK_END_TX: + // When end treatment is requested, signal 999 is sent back from + // here. This is just a drydemo code to get back to the treatment + // end state function. Then the treatment end state submits an event + // transition back to Idle + rbState = RINSEBACK_END_TREATMENT_SIGNAL; + break; + case RINSEBACK_BACK: - rbState--; + // When the back button is pressed reset volume. + // TODO do we reset the rinseback volume when we hit the End button? + // If the rinseback state is 0 the back is to change to previous tx substate + // If the rinseback state is not 0, the rinseback state is decremented + accumVolML = 0.0; + if (rbState != RINSEBACK_STOP_INIT_STATE) { + rbState--; + } + else { + txState = TX_END_SUB_STATE; + } break; } @@ -656,7 +681,20 @@ _isSendListReady = false; _sendMessages.append(msg); _isSendListReady = true; +} +bool StateController::isTreatmenStartRequested(const QVariant &payload) +{ + bool status = false; + qint32 IDIndex = 0; + Types::U32 param; + GetValue(payload.toByteArray(), IDIndex, param); + + if (param.value == START_TX_FROM_MSG_38) { + status = true; + } + + return status; } // ----------- State transition methods ---------------- // @@ -669,17 +707,17 @@ prepareHDModeTransitionBroadcastData(MODE_STAN, 0); _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"; + _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; @@ -706,11 +744,8 @@ // 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) { + if (isTreatmenStartRequested(_treatmentRcvdMessages[ID_UI_RQST_TX])) { _dryDemo.submitEvent(_transitionEventsFromIdle[CMD_TX_PARAMS]); status = STATE_ON_EXIT; qDebug() << "Idle starting Tx"; @@ -756,6 +791,16 @@ status = STATE_ON_EXIT; } + if (!_treatmentRcvdMessages[ID_UI_RQST_TX].isNull()) { + // If the user wants to go back in treatment params go back. + if (!isTreatmenStartRequested(_treatmentRcvdMessages[ID_UI_RQST_TX])) { + status = STATE_ON_ENTRY; + _dryDemo.submitEvent("Transition_back_2_idle"); + qDebug() << "Going back to Idle"; + } + _treatmentRcvdMessages[ID_UI_RQST_TX].clear(); + } + if (!_treatmentRcvdMessages[ID_UI_CONFIRM_RESP].isNull()) { _dryDemo.submitEvent("Transition_back_2_idle"); status = STATE_ON_ENTRY; @@ -1318,12 +1363,13 @@ void StateController::onEndTreatmentStateChange(bool active) { - static State_Status status = STATE_ON_ENTRY; - static quint32 txSubState = DIALYSIS_SUB_STATE; - static quint32 rbSubState = 0; + static State_Status status = STATE_ON_ENTRY; + static quint32 txSubState = DIALYSIS_SUB_STATE; + static quint32 rbSubState = 0; + static quint32 rbCountDownS = RINSEBACK_BACK_MAX_TIME_S; // The default rinseback volume is 300 mL but the demo should be done in 10 seconds so it is recalculated here - static float rbTargetVolML = 0.0; - static float rbAcuumVolML = 0.0; + static float rbTargetVolML = 0.0; + static float rbAcuumVolML = 0.0; auto inEntry = [=](){ // Call the treatment params first in case the use just started from the end treatment @@ -1335,6 +1381,7 @@ // to end treatment. txSubState = DIALYSIS_SUB_STATE; rbSubState = 0; + rbCountDownS = RINSEBACK_BACK_MAX_TIME_S; rbAcuumVolML = 0.0; rbTargetVolML = (_treatmentParams.rinsebackFlowRateMLPM * DEFAULT_TIMEOUT_S) / SECONDS_PER_MINUTE; prepareHDModeTransitionBroadcastData(MODE_TREA, 0); @@ -1359,7 +1406,7 @@ QList txStates({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); QList rinsebackVolsML({rbTargetVolML, rbAcuumVolML}); QList rinsebackBC({_treatmentParams.rinsebackFlowRateMLPM, - DEFAULT_TIMEOUT_S, DEFAULT_TIMEOUT_S, 0}); + RINSEBACK_BACK_MAX_TIME_S, rbCountDownS, 0}); if (_hasUserConfirmedToProceed) { // Switching to the rinseback send the screen change quickly @@ -1371,17 +1418,14 @@ } if (!_treatmentRcvdMessages[ID_UI_RINSEBACK_CMD_RQST].isNull()) { - qDebug() << "Msg 52" << rbSubState; - handleRinsebackSubstate(_treatmentRcvdMessages[ID_UI_RINSEBACK_CMD_RQST], rbSubState); - qDebug() << "Msg 52 after" << rbSubState; - if (rbSubState != 999) { - txStates[0] = txSubState; - txStates[4] = rbSubState; - qDebug() << "Tx substates" << txStates; - prepareStatesBroadcastData(ID_HD_TX_STATES_BC, txStates); - prepareRinsebackBroadcastData(rinsebackVolsML, rinsebackBC); - } - else { + handleRinsebackSubstate(_treatmentRcvdMessages[ID_UI_RINSEBACK_CMD_RQST], + rbAcuumVolML, txSubState, rbSubState); + txStates[0] = txSubState; + txStates[4] = rbSubState; + prepareStatesBroadcastData(ID_HD_TX_STATES_BC, txStates); + prepareRinsebackBroadcastData(rinsebackVolsML, rinsebackBC); + + if (rbSubState == RINSEBACK_END_TREATMENT_SIGNAL) { // Done with end treatment go back to standby as the dry demo currently does not have // post treatment qDebug() << "Done with end tx"; @@ -1391,12 +1435,13 @@ _treatmentRcvdMessages[ID_UI_RINSEBACK_CMD_RQST].clear(); } - if (rbSubState == 1) { + if (rbSubState == RINSEBACK_RUN_STATE) { + // Only accumulate the rinseback volume if we are in the run state rbAcuumVolML += _treatmentParams.rinsebackFlowRateMLPM * FLOW_INTEGRATOR; } if (rbAcuumVolML >= rbTargetVolML) { - rbSubState = 3; + rbSubState = RINSEBACK_STOP_STATE; txStates[0] = txSubState; txStates[4] = rbSubState; prepareStatesBroadcastData(ID_HD_TX_STATES_BC, txStates); @@ -1408,6 +1453,13 @@ } if (_treatmentVars.broadcastIntervalCount % NUM_OF_COUNTS_TIMER_BC_EMIT == 0) { + if (rbSubState != RINSEBACK_RUN_STATE) { + // If the rinseback is not in the run state, count down rinseback timer + // TODO do we count down from the start rinseback button? + rbCountDownS--; + rinsebackBC[2] = rbCountDownS; + } + prepareStatesBroadcastData(ID_HD_TX_STATES_BC, txStates); prepareRinsebackBroadcastData(rinsebackVolsML, rinsebackBC); }