#include "StateController.h" #include "ApplicationController.h" #include "types.h" bool StateController::handleDryDemoMenuRequestMessage() { quint32 msgPayload = extractU32DataFromReceivedMessage(ID_UI_CONFIRMATION_RESULT_RESP, 0); if (msgPayload != UI_MSG_BB_PAYLOAD_ID) { return false; } msgPayload = extractU32DataFromReceivedMessage(ID_UI_CONFIRMATION_RESULT_RESP, UI_MSG_BB_STATUS_INDEX); _treatmentStatus.userCmd = static_cast(msgPayload); _treatmentRcvdMessages[ID_UI_CONFIRMATION_RESULT_RESP].clear(); return true; } void StateController::handleBackToStandbyEvent(State_Status &status) { if (_treatmentRcvdMessages[ID_UI_CONFIRMATION_RESULT_RESP].isNull()) { return; } // Check for the user request message from the dry-demo menu if (!handleDryDemoMenuRequestMessage()) { return; } _treatmentStatus.stateTransitionEvent = "T_Back_2_SB"; status = STATE_ON_EXIT; _treatmentRcvdMessages[ID_UI_CONFIRMATION_RESULT_RESP].clear(); } void StateController::handleInitiateTreatmentRequestMessage(State_Status &status) { if (_treatmentRcvdMessages[ID_INITIATE_TREATMENT].isNull()){ return; } quint32 treatmentStatus = extractU32DataFromReceivedMessage(ID_INITIATE_TREATMENT, 0); User_Command_ID cmdID = CMD_STAND_BY; // The initiate payload message payload. By default assume we are going back to standby if (treatmentStatus == INITIATE_TREATMENT) { cmdID = CMD_PRE_TX; } _treatmentStatus.stateTransitionEvent = _transitionEventsFromStandby[cmdID][0].toString(); _treatmentRcvdMessages[ID_INITIATE_TREATMENT].clear(); handleUIResponseMessage(ID_TD_RESP_INITIATE_TREATMENT, ACCEPT_VALUE); // Set the state to be on exit because the state has to exit status = STATE_ON_EXIT; } void StateController::handleUIResponseMessage(const Message_ID_Enum msgID, const quint32 acceptReject, const QVariantList &rejectReasons) { QVariantList resp; resp.append(static_cast(msgID)); resp.append(Can_Id::eChlid_TD_UI); resp.append(acceptReject); if (rejectReasons.isEmpty()) { // If the default reject reasons is empty, it means there were no reject reasons or extra payloads so assume none resp.append(REQUEST_REJECT_REASON_NONE); } else { for (auto item: rejectReasons) { resp.append(item); } } _isSendListReady = false; _sendMessages.append(resp); _isSendListReady = true; } void StateController::resetDryDemoVariables() { _treatmentStatus.hasTxParamsBeenInitialized = false; _treatmentStatus.requestTreatmentReset = true; _treatmentStatus.treatmentElapsedTimeMS = DEF_TX_ELAPSED_TIME_S * MILLISECONDS_PER_SECOND; _treatmentStatus.stateTransitionEvent = ""; _treatmentStatus.totalFluidBolusDeliveredML = 0.0; _treatmentStatus.accumFluidBolusDeliveredML = 0.0; _treatmentStatus.fluidBolusState = FLUID_BOLUS_IDLE_STATE; _treatmentStatus.txState = TREAT_START_STATE; _treatmentStatus.rinsebackStates = RINSEBACK_STOP_INIT_STATE; _treatmentStatus.ufVolDeliveredL = 0.0; } void StateController::triggerAnAlarm(Alarm_List alarmID) { if (!_alarmTriggerSpecs.contains(alarmID)) { return; } quint32 state = _alarmTriggerSpecs[alarmID][ALARM_TABLE_PRIORITY_INDEX].toInt(); quint16 properties = _alarmTriggerSpecs[alarmID][ALARM_TABLE_PROPERTIES_INDEX].toInt(); quint32 alarmExpires = 0; _treatmentStatus.activeAlarm = alarmID; QVariantList resp; resp.append(static_cast(ID_ALARM_STATUS_DATA)); resp.append(Can_Id::eChlid_TD_Alarm); resp.append(state); resp.append(alarmID); resp.append(alarmExpires); resp.append(properties); _isSendListReady = false; _sendMessages.append(resp); _isSendListReady = true; } void StateController::handleAlarmUserAction(State_Status &status) { if (_treatmentRcvdMessages[ID_UI_ALARM_USER_ACTION_REQUEST].isNull()) { return; } quint32 userAction = extractU32DataFromReceivedMessage(ID_UI_ALARM_USER_ACTION_REQUEST, 0); switch (userAction) { case ALARM_USER_ACTION_RESUME: _treatmentStatus.dialysisSubState = DIALYSIS_UF_STATE; _treatmentStatus.txState = TREAT_DIALYSIS_STATE; _treatmentStatus.stateTransitionEvent = "T_TP_2_Tx"; break; case ALARM_USER_ACTION_RINSEBACK: case ALARM_USER_ACTION_TEMPOARY_BREAK: _treatmentStatus.stateTransitionEvent = "T_TP_2_RB"; break; case ALARM_USER_ACTION_END_TREATMENT: _treatmentStatus.stateTransitionEvent = "T_TP_2_TE"; break; } // User action has been selected so do not stay in treatment pause status = STATE_ON_EXIT; triggerAnAlarm(ALARM_ID_NO_ALARM); QVariantList msg; msg.append(static_cast(ID_ALARM_CLEARED)); msg.append(Can_Id::eChlid_TD_Alarm); msg.append(_treatmentStatus.activeAlarm); _isBroadcastListReady = false; _broadcastMessages.append(msg); _isBroadcastListReady = true; // Send the alarm clear command and then clear the variable _treatmentStatus.activeAlarm = ALARM_ID_NO_ALARM; _treatmentRcvdMessages[ID_UI_ALARM_USER_ACTION_REQUEST].clear(); } void StateController::handleSendUIConfirmationMessage(const Generic_Confirm_Id confirmID, const Generic_Confirm_Command confirmCmd, const Reject_Reasons rejectReason) { QVariantList resp; resp.append(static_cast(ID_TD_UI_GENERIC_CONFIRMATION_REQUEST)); resp.append(Can_Id::eChlid_TD_UI); resp.append(confirmID); resp.append(confirmCmd); resp.append(rejectReason); resp.append(0.0); resp.append(0.0); resp.append(0.0); resp.append(0.0); _isSendListReady = false; _sendMessages.append(resp); _isSendListReady = true; }