Index: sources/drydemo/StateControllerRecirc.cpp =================================================================== diff -u -rbb80bbccaf1c911be48493868c18c656d84b2ec1 -rfb3e70cb47f3d22f31f68358c1bda69cce9cd248 --- sources/drydemo/StateControllerRecirc.cpp (.../StateControllerRecirc.cpp) (revision bb80bbccaf1c911be48493868c18c656d84b2ec1) +++ sources/drydemo/StateControllerRecirc.cpp (.../StateControllerRecirc.cpp) (revision fb3e70cb47f3d22f31f68358c1bda69cce9cd248) @@ -5,7 +5,11 @@ void StateController::initializeRecirc() { - + _treatmentStatus.recircTimerCounter = 0; + _treatmentStatus.recircTimeoutS = RECIRC_TIMEOUT_MIN * SECONDS_PER_MINUTE; + _treatmentStatus.hasResumeTxBeenRequested = false; + _treatmentStatus.hasRecircWarnAlarmBeenTrig = false; + _treatmentStatus.hasRecircTimeoutAlarmBeenTrig = false; } void StateController::handleRecircRequestMessage() @@ -23,28 +27,83 @@ } switch (recircCmd) { - case REQUESTED_USER_ACTION_TX_RECIRC_RECONNECT : - break; - case REQUESTED_USER_ACTION_TX_RECIRC_CONFIRM_RECONNECT : - break; - case REQUESTED_USER_ACTION_TX_RECIRC_RESUME_RC : - break; - case REQUESTED_USER_ACTION_TX_RECIRC_END_TREATMENT : - break; - case REQUESTED_USER_ACTION_TX_RECIRC_CONFIRM_DISCONNECT : - break; - default: - // Do nothing - break; + case REQUESTED_USER_ACTION_TX_RECIRC_RECONNECT: + if (_treatmentSubStates.recircState == TREATMENT_RECIRC_RECIRC_STATE) { + _treatmentSubStates.recircState = TREATMENT_RECIRC_RECONNECT_PATIENT_STATE; + } + else { reason.append(REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE); } + break; + + case REQUESTED_USER_ACTION_TX_RECIRC_CONFIRM_RECONNECT: + if (_treatmentSubStates.recircState == TREATMENT_RECIRC_RECONNECT_PATIENT_STATE) { + _treatmentSubStates.recircState = TREATMENT_RECIRC_RECONNECT_PATIENT_STATE; + _treatmentStatus.hasResumeTxBeenRequested = true; + } + // TODO check if recirc is allowed + else { reason.append(REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE); } + break; + + case REQUESTED_USER_ACTION_TX_RECIRC_RESUME_RC: + if (_treatmentSubStates.recircState == TREATMENT_RECIRC_STOPPED_STATE) { + _treatmentSubStates.recircState = TREATMENT_RECIRC_RECIRC_STATE; + } + else { reason.append(REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE); } + break; + + case REQUESTED_USER_ACTION_TX_RECIRC_END_TREATMENT: + handleSendUIConfirmationMessage(GENERIC_CONFIRM_ID_TREATMENT_END, GENERIC_CONFIRM_CMD_REQUEST_OPEN); + break; + + case REQUESTED_USER_ACTION_TX_RECIRC_CONFIRM_DISCONNECT: + if (_treatmentSubStates.recircState == TREATMENT_RECIRC_DISCONNECT_PATIENT_STATE) { + _treatmentSubStates.recircState = TREATMENT_RECIRC_RECIRC_STATE; + } + else { reason.append(REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE); } + break; + + default: + // Do nothing + break; } handleUIResponseMessage(ID_TD_RECIRCULATE_RESP, acceptReject, reason); _treatmentRcvdMessages[ID_UI_RECIRCULATE_RQST].clear(); } +void StateController::handleRecircTimeout() +{ + if (_treatmentSubStates.recircState != TREATMENT_RECIRC_RECIRC_STATE ) { return; } + + quint32 recircElapsedTimeS = (_treatmentStatus.recircTimerCounter * QOBJECT_TIMER_TIMEOUT_MS) / MILLISECONDS_PER_SECOND; + quint32 warningTimeS = _treatmentStatus.recircTimeoutS - (RECIRC_WARN_BEFORE_TIMEOUT_MIN * SECONDS_PER_MINUTE); + Q_UNUSED(warningTimeS) + + //if ((recircElapsedTimeS >= warningTimeS) && (_treatmentStatus.activeAlarm != ALARM_ID_TD_RECIRC_TIMEOUT_WARNING)) { + if ((recircElapsedTimeS >= 20) && !_treatmentStatus.hasRecircWarnAlarmBeenTrig) { + _treatmentStatus.hasRecircWarnAlarmBeenTrig = true; + triggerAnAlarm(ALARM_ID_TD_RECIRC_TIMEOUT_WARNING); + } + + //if ((recircElapsedTimeS >= _treatmentStatus.recircTimeoutS) && (_treatmentStatus.activeAlarm != ALARM_ID_TD_RECIRC_TIMEOUT)) { + if ((recircElapsedTimeS >= 30) && !_treatmentStatus.hasRecircTimeoutAlarmBeenTrig) { + _treatmentStatus.hasRecircTimeoutAlarmBeenTrig = true; + triggerAnAlarm(ALARM_ID_TD_RECIRC_TIMEOUT); + } +} + void StateController::handleRecircBroadcastData(const Broadcast_Type BCType) { static quint32 broadcastCounter = 52; if ((++broadcastCounter % NUM_OF_COUNTS_TIMER_BC_EMIT != 0) && (BCType == BC_DELAYED)) { return; } + quint32 elapsedTimeS = (_treatmentStatus.recircTimerCounter * QOBJECT_TIMER_TIMEOUT_MS) / MILLISECONDS_PER_SECOND; + quint32 countdownS = (elapsedTimeS < _treatmentStatus.recircTimeoutS ? _treatmentStatus.recircTimeoutS - elapsedTimeS : 0); + + QVariantList msg; + msg.append(static_cast(ID_TD_RECIRCULATE_DATA)); + msg.append(Can_Id::eChlid_TD_Sync); + msg.append(countdownS); + _isBroadcastListReady = false; + _broadcastMessages.append(msg); + _isBroadcastListReady = true; }