#include "StateController.h" #include "ApplicationController.h" #include "types.h" 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() { if (_treatmentRcvdMessages[ID_UI_RECIRCULATE_RQST].isNull()) { return; } QVariantList reason; quint32 acceptReject = REJECT_VALUE; quint32 recircCmd = extractU32DataFromReceivedMessage(ID_UI_RECIRCULATE_RQST, 0); if (_treatmentStatus.activeTopAlarm != ALARM_ID_NO_ALARM) { reason.append(REQUEST_REJECT_REASON_ALARM_IS_ACTIVE); handleUIResponseMessage(ID_TD_RECIRCULATE_RESP, acceptReject, reason); _treatmentRcvdMessages[ID_UI_RECIRCULATE_RQST].clear(); return; } switch (recircCmd) { 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.activeTopAlarm != ALARM_ID_TD_RECIRC_TIMEOUT_WARNING)) { _treatmentStatus.hasRecircWarnAlarmBeenTrig = true; triggerAnAlarm(ALARM_ID_TD_RECIRC_TIMEOUT_WARNING); } if ((recircElapsedTimeS >= _treatmentStatus.recircTimeoutS) && (_treatmentStatus.activeTopAlarm != ALARM_ID_TD_RECIRC_TIMEOUT)) { _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; }