Index: firmware/App/Controllers/SyringePump.c =================================================================== diff -u -rec4abf209e338090e861defd54e38b692d85e2b1 -r943c6072dae3678dbba29f9b63035d44139ea1cf --- firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision ec4abf209e338090e861defd54e38b692d85e2b1) +++ firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 943c6072dae3678dbba29f9b63035d44139ea1cf) @@ -1113,6 +1113,7 @@ syringePumpPosition.data = encPosition - syringePumpHomePositionOffset; // Calculate volume delivered from position syringePumpVolumeDelivered.data = (F32)( syringePumpPosition.data - syringePumpVolumeStartPosition ) / SYRINGE_ENCODER_COUNTS_PER_ML; + syringePumpVolumeDelivered.data = ( syringePumpVolumeDelivered.data < 0.0F ? 0.0F : syringePumpVolumeDelivered.data ); calcSafetyVolumeDelivered(); // Calculate measured rate (mL/hr) calcMeasRate(); Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r82bd1d24c050e79690a7f5b236e49dd7db7e2a91 -r943c6072dae3678dbba29f9b63035d44139ea1cf --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 82bd1d24c050e79690a7f5b236e49dd7db7e2a91) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 943c6072dae3678dbba29f9b63035d44139ea1cf) @@ -148,6 +148,7 @@ resetPreLoadStatus(); setVenousBubbleDetectionEnabled( FALSE ); setCurrentSubState( NO_SUB_STATE ); + clearNoRetriggerFlag(); // Set user alarm recovery actions allowed in this mode setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, FALSE ); Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r069e667671a8732eb9373acf8fcc6d3c9cc1c6b9 -r943c6072dae3678dbba29f9b63035d44139ea1cf --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 069e667671a8732eb9373acf8fcc6d3c9cc1c6b9) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 943c6072dae3678dbba29f9b63035d44139ea1cf) @@ -142,6 +142,7 @@ static BOOL alarmAudioTestToneRequested; ///< Flag indicates whether alarm audio test tone should be output. static BOOL resumeBlockedByAlarmProperty; ///< Flag indicates whether treatment resumption is currently blocked by alarm property. +static BOOL alarmNoRetrigger; ///< Flag indicates whether some alarms should be prevented from re-triggering after being cleared by rinseback or end-tx options // ********** private function prototypes ********** @@ -154,7 +155,7 @@ static void updateAlarmsSilenceStatus( void ); static void updateAlarmsFlags( void ); -static void clearAllRecoverableAlarms( void ); +static void clearAllRecoverableAlarms( ALARM_USER_ACTION_T action ); static void resetAlarmPriorityFIFO( ALARM_PRIORITY_T priority ); static U32 getAlarmStartTime( ALARM_ID_T alarmID ); @@ -222,6 +223,7 @@ alarmsBlockedTimer = 0; alarmAudioTestToneRequested = FALSE; resumeBlockedByAlarmProperty = FALSE; + alarmNoRetrigger = FALSE; alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_START; } @@ -371,7 +373,7 @@ || ( ALARM_ID_HD_AC_POWER_LOST_IN_TREATMENT == alarm ) ) { // Broadcast alarm and data if alarm not already active - if ( FALSE == alarmIsActive[ alarm ] ) + if ( ( FALSE == alarmIsActive[ alarm ] ) && ( FALSE == alarmNoRetrigger ) ) { ALARM_TRIGGERED_PAYLOAD_T data; @@ -463,6 +465,18 @@ { SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_CLEAR, alarm ) } +} + +/*********************************************************************//** + * @brief + * The clearNoRetriggerFlag function clears the no re-trigger flag. + * @details Inputs: none + * @details Outputs: + * @return none + *************************************************************************/ +void clearNoRetriggerFlag( void ) +{ + alarmNoRetrigger = FALSE; } /*********************************************************************//** @@ -530,7 +544,7 @@ *************************************************************************/ void signalAlarmUserActionInitiated( ALARM_USER_ACTION_T action ) { - // Validate given action + // Clear recoverable alarms on user action if ( ( action < NUMBER_OF_ALARM_USER_ACTIONS ) && ( action != ALARM_USER_ACTION_END_TREATMENT ) ) // end tx action must be confirmed first { ALARM_ID_T a = alarmStatus.alarmTop; @@ -545,12 +559,12 @@ // Otherwise we must be in mode/state where ack was only option - so clear all like other options else { - clearAllRecoverableAlarms(); + clearAllRecoverableAlarms( action ); } } else { - clearAllRecoverableAlarms(); + clearAllRecoverableAlarms( action ); } } @@ -881,7 +895,7 @@ // Check for user confirmation of end treatment alarm response if ( CONFIRMATION_REQUEST_STATUS_ACCEPTED == getConfirmationRequestStatus( GENERIC_CONFIRM_ID_TREATMENT_END ) ) { - clearAllRecoverableAlarms(); + clearAllRecoverableAlarms( ALARM_USER_ACTION_END_TREATMENT ); initiateAlarmAction( ALARM_ACTION_END_TREATMENT ); } @@ -1133,7 +1147,7 @@ BOOL stop = FALSE; BOOL noClear = FALSE; BOOL noResume = FALSE; - BOOL noResumePerAlarmPropertyOnly = FALSE; + BOOL noResumePerAlarmPropertyOnly = alarmNoRetrigger; // cannot resume if no re-trigger flag is set BOOL noRinseback = FALSE; BOOL noEndTreatment = FALSE; BOOL usrAckReq = FALSE; @@ -1240,10 +1254,11 @@ * The clearAllRecoverableAlarms function clears all currently active * recoverable alarms. * @details Inputs: ALARM_TABLE[] - * @details Outputs: All currently active recoverable alarms are cleared + * @details Outputs: alarmNoRetrigger, alarmIsActive[] + * @param action user action that prompted clearing of recoverable alarms * @return none *************************************************************************/ -static void clearAllRecoverableAlarms( void ) +static void clearAllRecoverableAlarms( ALARM_USER_ACTION_T action ) { ALARM_ID_T a; @@ -1254,6 +1269,14 @@ // Clear alarm if alarm allowed to be cleared and not clear only (those are cleared individually) if ( ( FALSE == ALARM_TABLE[ a ].alarmNoClear ) && ( FALSE == ALARM_TABLE[ a ].alarmClearOnly ) ) { + if ( ( ALARM_USER_ACTION_RINSEBACK == action ) && ( TRUE == ALARM_TABLE[ a ].alarmNoRetrigOnRB ) ) + { + alarmNoRetrigger = TRUE; + } + else if ( ( ALARM_USER_ACTION_END_TREATMENT == action ) && ( TRUE == ALARM_TABLE[ a ].alarmNoRetrigOnEndTx ) ) + { + alarmNoRetrigger = TRUE; + } clearAlarm( a ); } } Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r12708a04ae3365e11180182fc52d005c229a7bc6 -r943c6072dae3678dbba29f9b63035d44139ea1cf --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 12708a04ae3365e11180182fc52d005c229a7bc6) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 943c6072dae3678dbba29f9b63035d44139ea1cf) @@ -198,6 +198,7 @@ void activateAlarm2Data( ALARM_ID_T alarm, ALARM_DATA_T alarmData1, ALARM_DATA_T alarmData2 ); void clearAlarm( ALARM_ID_T alarm ); void clearAlarmCondition( ALARM_ID_T alarm ); +void clearNoRetriggerFlag( void ); void setAlarmUserActionEnabled( ALARM_USER_ACTION_T action, BOOL enabled ); void signalAlarmSilence( ALARM_SILENCE_CMD_T cmd ); void signalAlarmUserActionInitiated( ALARM_USER_ACTION_T action );