Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r28d515e25f5f3b2c0bbff55abd68641927b6659c -rc124da1c51c10b6b646559323db27acda273d62b --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 28d515e25f5f3b2c0bbff55abd68641927b6659c) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision c124da1c51c10b6b646559323db27acda273d62b) @@ -752,18 +752,16 @@ if ( CALC_ELAPSED_TREAT_TIME_IN_SECS() >= presTreatmentTimeSecs ) { treatmentCompleted = TRUE; -// sendLastTreatmentPeriodicData = TRUE; -// treatmentEndTimeStamp = getRTCTimestamp(); -// pauseDialysis(); +// sendLastTreatmentPeriodicData = TRUE; +// treatmentEndTimeStamp = getRTCTimestamp(); +// pauseDialysis(); - /// CKOE - // stopDialysis(); +// stopDialysis(); transitionToTreatmentEnd(); //CKOE Do we need data to broadd cast here - //SET_ALARM_WITH_1_U32_DATA( ALARM_ID_TD_END_OF_TREATMENT_WARNING, presTreatmentTimeSecs ); // Trigger the low-priority End of Treatment alarm - activateAlarmNoData( ALARM_ID_TD_END_OF_TREATMENT ); + //activateAlarmNoData( ALARM_ID_TD_END_OF_TREATMENT ); result = TREATMENT_END_STATE; } // Otherwise, execute state machine for treatment dialysis sub-mode @@ -942,26 +940,24 @@ { TREATMENT_STATE_T result = TREATMENT_END_STATE; -// // Handle final rinseback alarm response from user - if ( TRUE == initiateRinsebackAlarmResponseRequest ) + // Handle final rinseback alarm response from user + if ( TRUE == initiateRinsebackAlarmResponseRequest ) { signalTreatmentEndAlarmRinsebackUserAction(); - } - // Handle alarm response from user to end treatment w/o rinseback - else if ( TRUE == endTreatmentAlarmResponseRequest ) - { - //sendLastTreatmentPeriodicData = TRUE; TODO - requestNewOperationMode( MODE_POST ); } - // End treatment state does not allow resume + else if ( TRUE == endTreatmentAlarmResponseRequest ) + { + requestNewOperationMode( MODE_POST ); + } // Execute treatment end sub-mode execTreatmentEnd(); - if ( TRUE == treatmentEndToRinsebackRequest ) - { + + if ( TRUE == treatmentEndToRinsebackRequest ) + { transitionToRinseback(); result = TREATMENT_RINSEBACK_STATE; - } + } return result; } /*********************************************************************//** Index: firmware/App/Modes/TreatmentEnd.c =================================================================== diff -u -r28d515e25f5f3b2c0bbff55abd68641927b6659c -rc124da1c51c10b6b646559323db27acda273d62b --- firmware/App/Modes/TreatmentEnd.c (.../TreatmentEnd.c) (revision 28d515e25f5f3b2c0bbff55abd68641927b6659c) +++ firmware/App/Modes/TreatmentEnd.c (.../TreatmentEnd.c) (revision c124da1c51c10b6b646559323db27acda273d62b) @@ -33,16 +33,17 @@ // ********** private definitions *********** /// Time before escalating the low-priority End of Treatment alarm to high priority. -static const U32 TX_END_ESCALATION_TIMEOUT_MS = ( ( 10 * 60 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ); +static const U32 TX_END_ESCALATION_TIMEOUT_MS = ( ( 10 * 60 * MS_PER_SECOND ) + / TASK_GENERAL_INTERVAL ); // ********** private data ********** -static TREATMENT_END_STATE_T treatmentEndState; ///< Current substate of Treatment End. -static U32 txEndTimerCtr; ///< Timer counter (GP task intervals) tracking time in Wait for Rinseback, drives low->high alarm escalation. -static U32 bloodSittingTimerCtr; ///< blood sitting timer counter -static BOOL txEndAlarmRinsebackRequested; ///< User requested rinseback via alarm action / UI message. -static BOOL txEndBolusRequested; ///< User requested a fluid bolus while in End of Treatment. -static BOOL txEndEscalated; ///< Tracks whether the high-priority alarm has already been raised, to avoid re-triggering every cycle. +static TREATMENT_END_STATE_T treatmentEndState; ///< Current substate of Treatment End. +static U32 txEndTimerCtr; ///< Timer counter (GP task intervals) tracking time in Wait for Rinseback, drives low->high alarm escalation. +static U32 bloodSittingTimerCtr; ///< blood sitting timer counter +static BOOL txEndAlarmRinsebackRequested; ///< User requested rinseback via alarm action / UI message. +static BOOL txEndBolusRequested; ///< User requested a fluid bolus while in End of Treatment. +static BOOL txEndEscalated; ///< Tracks whether the high-priority alarm has already been raised, to avoid re-triggering every cycle. static TREATMENT_END_STATE_T txEndPriorStateBeforeBolus; // ********** private function prototypes ********** @@ -53,7 +54,6 @@ static void resetTreatmentEndFlags( void ); static void setupForTreatmentEndSubState( TREATMENT_END_STATE_T newState ); static void handleTreatmentEndBloodSittingTimer( void ); -static BOOL handleTxEndRinsebackUserAction( REQUEST_REJECT_REASON_CODE_T *rejReason ); /*********************************************************************//** * @brief @@ -86,28 +86,30 @@ cmdBypassDialyzer( TRUE ); stopSyringePump(); - setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, TRUE ); - setAlarmUserActionEnabled( ALARM_USER_ACTION_RINSEBACK, TRUE ); - setAlarmUserActionEnabled( ALARM_USER_ACTION_END_TREATMENT, TRUE ); + // Set up alarms buttons in UI + setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, FALSE ); + setAlarmUserActionEnabled( ALARM_USER_ACTION_RINSEBACK, FALSE ); + setAlarmUserActionEnabled( ALARM_USER_ACTION_TEMPORARY_BREAK, FALSE ); + setAlarmUserActionEnabled( ALARM_USER_ACTION_END_TREATMENT, FALSE ); if ( FLUID_TYPE_SALINE == getFluidType() ) { cmdStopGenerateDialysate(); } else { - ///CKOE by passing the value manually suppose give 100 for substitution and check once - //CKOE write a print for get function - cmdSubstitutionRate((F32) getSysConfigTreatmentParameterU32DefaultValue( TREATMENT_PARAM_RINSEBACK_FLOW_RATE )); + cmdSubstitutionRate((F32) getSysConfigTreatmentParameterU32DefaultValue + ( TREATMENT_PARAM_RINSEBACK_FLOW_RATE )); } setCurrentSubState( (U32)treatmentEndState ); setupForTreatmentEndSubState(TREATMENT_END_WAIT_FOR_RINSEBACK_STATE); + // Enable venous bubble detection setVenousBubbleDetectionEnabled( H18_BBLD, TRUE ); -// // Trigger the low-priority End of Treatment alarm -// activateAlarmNoData( ALARM_ID_TD_END_OF_TREATMENT ); + // Trigger the low-priority End of Treatment alarm + activateAlarmNoData( ALARM_ID_TD_END_OF_TREATMENT ); } /*********************************************************************//** @@ -126,7 +128,7 @@ // Ensure we do not sit in stopped state for too long (if blood in line) bloodSittingTimerCtr++; - if ( FALSE == doesAlarmStatusIndicateEndTxOnly() ) // Alarms appropriate only if we are not already at an alarm stop, end Tx only + if ( FALSE == doesAlarmStatusIndicateEndTxOnly() ) { if ( bloodSittingTimerCtr > WARN_TIME_BLOOD_SITTING ) { @@ -148,7 +150,6 @@ * @param newState substate being entered * @return none *************************************************************************/ - static void setupForTreatmentEndSubState( TREATMENT_END_STATE_T newState ) { switch ( newState ) @@ -158,7 +159,8 @@ setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); setValvePosition( H19_VALV, VALVE_POSITION_B_OPEN ); setBloodPumpTargetFlowRate( getTreatmentParameterU32( TREATMENT_PARAM_BLOOD_FLOW ), - MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + MOTOR_DIR_FORWARD, + PUMP_CONTROL_MODE_OPEN_LOOP ); startAirTrapControl(); break; @@ -175,13 +177,16 @@ setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); setValvePosition( H19_VALV, VALVE_POSITION_B_OPEN ); setBloodPumpTargetFlowRate( getTreatmentParameterU32( TREATMENT_PARAM_BLOOD_FLOW ), - MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + MOTOR_DIR_FORWARD, + PUMP_CONTROL_MODE_OPEN_LOOP ); startAirTrapControl(); signalStartFluidBolus( getTreatmentParameterU32( TREATMENT_PARAM_BLOOD_FLOW ) ); break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_TREATMENT_END_INVALID_STATE, (U32)newState ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, + SW_FAULT_ID_TREATMENT_END_INVALID_STATE, + (U32)newState ); break; } } @@ -202,7 +207,8 @@ TREATMENT_END_STATE_T priorSubState = treatmentEndState; // Escalate low -> high alarm after confirmed 10-minute timeout, once only. - if ( ( ++txEndTimerCtr > TX_END_ESCALATION_TIMEOUT_MS ) && ( FALSE == txEndEscalated ) ) + if ( ( ++txEndTimerCtr > TX_END_ESCALATION_TIMEOUT_MS ) && + ( FALSE == txEndEscalated ) ) { activateAlarmNoData( ALARM_ID_TD_END_OF_TREATMENT_TIMEOUT ); txEndEscalated = TRUE; @@ -224,30 +230,31 @@ break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_TREATMENT_END_INVALID_STATE, (U32)treatmentEndState ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, + SW_FAULT_ID_TREATMENT_END_INVALID_STATE, + (U32)treatmentEndState ); break; } if ( priorSubState != treatmentEndState ) { setupForTreatmentEndSubState( treatmentEndState ); setCurrentSubState( (U32)treatmentEndState ); - SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_SUB_STATE_CHANGE, priorSubState, treatmentEndState ); + SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_SUB_STATE_CHANGE, priorSubState, + treatmentEndState ); } - // Flags should be handled by now — reset in case not handled by current state. + // reset flags upon request is completed. resetTreatmentEndFlags(); } /*********************************************************************//** * @brief - * Wait for Rinseback substate — rinseback and fluid bolus requests are - * available immediately, no escalation-gating. Also handles transition - * to Paused if an alarm requires blood pump stop. + * Wait for RinseBack subState is initial waiting state where it allows + * user to perform Bolus, take reports and RinseBack options. * @details \b Inputs: txEndAlarmRinsebackRequested, txEndBolusRequested * @details \b Outputs: none * @return next Treatment End substate *************************************************************************/ - static TREATMENT_END_STATE_T handleTxEndWaitForRinsebackState( void ) { TREATMENT_END_STATE_T result = TREATMENT_END_WAIT_FOR_RINSEBACK_STATE; @@ -276,7 +283,6 @@ * @details \b Outputs: none * @return next Treatment End substate *************************************************************************/ - static TREATMENT_END_STATE_T handleTxEndFluidBolusState( void ) { TREATMENT_END_STATE_T result = TREATMENT_END_FLUID_BOLUS_STATE; @@ -303,11 +309,11 @@ * @details \b Outputs: none * @return next Treatment End substate *************************************************************************/ - static TREATMENT_END_STATE_T handleTxEndPausedState( void ) { TREATMENT_END_STATE_T result = TREATMENT_END_PAUSED_STATE; + // Transition to wait state upon alarms are addressed. if ( FALSE == isBloodRecircBlocked() ) { result = TREATMENT_END_WAIT_FOR_RINSEBACK_STATE; @@ -324,7 +330,6 @@ // result = TREATMENT_END_FLUID_BOLUS_STATE; // } - return result; } @@ -335,7 +340,6 @@ * @details \b Outputs: txEndAlarmRinsebackRequested, txEndBolusRequested * @return none *************************************************************************/ - static void resetTreatmentEndFlags( void ) { txEndAlarmRinsebackRequested = FALSE; @@ -353,35 +357,32 @@ BOOL signalTreatmentEndFluidBolusRequest( void ) { BOOL result = FALSE; -// TODO REMOVE PAUSED STATE IF W CANT ABLE TO MOVE TO RINSEBACK UPON ANY ALARMS - if ( ( TREATMENT_END_WAIT_FOR_RINSEBACK_STATE == treatmentEndState ) || - ( TREATMENT_END_PAUSED_STATE == treatmentEndState ) ) + if ( TREATMENT_END_WAIT_FOR_RINSEBACK_STATE == treatmentEndState ) { txEndBolusRequested = TRUE; result = TRUE; } return result; } + /*********************************************************************//** * @brief - * The getCurrentTreatmentEndState function returns the current substate of + * The getCurrentTreatmentEndState function returns the current sub-state of * the Treatment End sub-mode. * @details \b Inputs: treatmentEndState * @details \b Outputs: none - * @return current Treatment End substate + * @return current Treatment End sub-state *************************************************************************/ - U32 getCurrentTreatmentEndState( void ) { return (U32)treatmentEndState; } /*********************************************************************//** * @brief - * The signalTreatmentEndAlarmRinsebackUserAction function is called by - * ModeTreatment.c when the user has requested rinseback via an alarm - * recovery action while in Treatment End. + * The signalTreatmentEndAlarmRinsebackUserAction function informs + * Treatment mode for SubState Change to RinseBack * @details \b Inputs: none * @details \b Outputs: txEndAlarmRinsebackRequested * @return none @@ -393,84 +394,34 @@ /*********************************************************************//** * @brief - * The handleTxEndRinsebackUserAction function handles an end treatment - * rinseback user action request. - * @details \b Inputs: treatmentEndState - * @details \b Outputs: txEndAlarmRinsebackRequested - * @param rejReason Code indicating reason for rejection - * @return TRUE if user action accepted, FALSE if not - *************************************************************************/ - -static BOOL handleTxEndRinsebackUserAction( REQUEST_REJECT_REASON_CODE_T *rejReason ) -{ - BOOL result = FALSE; - - if ( TREATMENT_END_WAIT_FOR_RINSEBACK_STATE == treatmentEndState ) - { - result = TRUE; - txEndAlarmRinsebackRequested = TRUE; - } - else - { - *rejReason = REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE; - } - - return result; -} - -/*********************************************************************//** - * @brief * The handleTreatmentEndUserAction function handles a UI Treatment End * command request message. - * @details \b Inputs: none - * @details \b Outputs: none + * @details \b Inputs: treatmentEndState + * @details \b Outputs: txEndAlarmRinsebackRequested * @param message Incoming UI message containing the requested action. * @return TRUE if request is accepted, FALSE if rejected. *************************************************************************/ - BOOL handleTreatmentEndUserAction( MESSAGE_T *message ) { - BOOL result = FALSE; - U32 cmd = 0; + U32 result = FALSE; REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NONE; - UI_RESPONSE_PAYLOAD_T response; + UI_ENDTX_RESPONSE_PAYLOAD_T response; - if ( sizeof(U32) == message->hdr.payloadLen ) + if ( TREATMENT_END_WAIT_FOR_RINSEBACK_STATE == treatmentEndState ) { - memcpy( &cmd, message->payload, sizeof(U32) ); - - // Reject if any alarm active — user must clear alarm first. - if ( FALSE == isAnyAlarmActive() ) - { - switch ( (REQUESTED_TREATMENT_END_USER_ACTIONS_T)cmd ) - { - case REQUESTED_USER_ACTION_TX_END_RINSEBACK_START: - result = handleTxEndRinsebackUserAction( &rejReason ); - break; - - default: - rejReason = REQUEST_REJECT_REASON_INVALID_COMMAND; - break; - } - } - else - { - rejReason = REQUEST_REJECT_REASON_ALARM_IS_ACTIVE; - } + result = TRUE; + txEndAlarmRinsebackRequested = TRUE; } else { - rejReason = REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT; + rejReason = REQUEST_REJECT_REASON_INVALID_TREATMENT_SUB_STATE; } response.accepted = result; response.rejectionReason = rejReason; - sendMessage( MSG_ID_TD_END_TREATMENT_RESPONSE, - COMM_BUFFER_OUT_CAN_TD_2_UI, - (U08*)&response, - sizeof( UI_RESPONSE_PAYLOAD_T ) ); + sendMessage( MSG_ID_TD_END_TREATMENT_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, + (U08*)&response, sizeof( UI_RESPONSE_PAYLOAD_T ) ); return result; } - /**@}*/ Index: firmware/App/Services/Messaging.h =================================================================== diff -u -r28d515e25f5f3b2c0bbff55abd68641927b6659c -rc124da1c51c10b6b646559323db27acda273d62b --- firmware/App/Services/Messaging.h (.../Messaging.h) (revision 28d515e25f5f3b2c0bbff55abd68641927b6659c) +++ firmware/App/Services/Messaging.h (.../Messaging.h) (revision c124da1c51c10b6b646559323db27acda273d62b) @@ -122,6 +122,12 @@ U32 targetVolumeMl; ///< Target fluid bolus volume in mL. } FLUID_BOLUS_RESPONSE_PAYLOAD_T; +/// Payload record structure for UI response. +typedef struct +{ + U32 accepted; ///< Accepted/Rejected + U32 rejectionReason; ///< Rejection reason if not accepted. +} UI_ENDTX_RESPONSE_PAYLOAD_T; // ********** public function prototypes ********** // Serialize message Index: firmware/App/Services/TxParams.c =================================================================== diff -u -r3a0f0f1abc53e6e8ba17c77838bf223cceb79b74 -rc124da1c51c10b6b646559323db27acda273d62b --- firmware/App/Services/TxParams.c (.../TxParams.c) (revision 3a0f0f1abc53e6e8ba17c77838bf223cceb79b74) +++ firmware/App/Services/TxParams.c (.../TxParams.c) (revision c124da1c51c10b6b646559323db27acda273d62b) @@ -114,12 +114,7 @@ { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=2}, {.uInt=0} }, // TREATMENT_PARAM_HDF_DILUTION { CRITICAL_DATA_TYPE_U32, {.uInt=50}, {.uInt=500}, {.uInt=50} }, // TREATMENT_PARAM_BLOOD_FLOW { CRITICAL_DATA_TYPE_U32, {.uInt=50}, {.uInt=600}, {.uInt=50} }, // TREATMENT_PARAM_DIALYSATE_FLOW - -#if SIMULATION_TEST_RINSEBACK - { CRITICAL_DATA_TYPE_U32, {.uInt=5}, {.uInt=480}, {.uInt=60} }, // TREATMENT_PARAM_TREATMENT_DURATION -#else { CRITICAL_DATA_TYPE_U32, {.uInt=60}, {.uInt=480}, {.uInt=60} }, // TREATMENT_PARAM_TREATMENT_DURATION -#endif { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=480}, {.uInt=0} }, // TREATMENT_PARAM_HEPARIN_DELIVERY_DURATION { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=0}, {.uInt=0} }, // TREATMENT_PARAM_HEPARIN_TYPE { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=5}, {.uInt=0} }, // TREATMENT_PARAM_DRY_BICARB_CART_SIZE