Index: firmware/App/Modes/StateTxRinseback.c =================================================================== diff -u -ra1f14a4e422f94b6bc25d1b91839761e7e1196d7 -r5ace05425139aa4c64318ecd3b90782e01ef2f7d --- firmware/App/Modes/StateTxRinseback.c (.../StateTxRinseback.c) (revision a1f14a4e422f94b6bc25d1b91839761e7e1196d7) +++ firmware/App/Modes/StateTxRinseback.c (.../StateTxRinseback.c) (revision 5ace05425139aa4c64318ecd3b90782e01ef2f7d) @@ -54,6 +54,7 @@ // ********** private data ********** static RINSEBACK_STATE_T currentRinsebackState; ///< Current state of the rinseback sub-mode. +static RINSEBACK_STATE_T prevRunState; ///< Run or Additional state to resume to from Paused. static FLUID_TYPE_T fluidType; ///< Fluid Type to rinseback static U32 bloodSittingTimerCtr; ///< Timer counter for time spent in rinseback sub-mode. static U32 rinsebackAdditionalTimerCtr; ///< Timer counter for duration of an additional rinseback delivery. @@ -62,13 +63,12 @@ static OVERRIDE_F32_T cummulativeRinsebackVolume_mL; ///< Total cumulative rinseback volume (in mL) from measured blood flow rate. static F32 targetRinsebackVolumePlusAdditional_mL; ///< Target rinseback volume w/ additional volume(s) added (in mL). static F32 additionalRinsebackVolume_mL; ///< Total volume (in mL) delivered so far for additional volume request. +static U32 newRinsebackRate; ///< New rinseback rate when user increase or decrease rinseback flow rate. /// Interval (in task intervals) at which to publish rinseback data to CAN bus. static OVERRIDE_U32_T rinsebackPublishInterval; static BOOL startRinsebackRequested; ///< Flag indicating user requesting rinseback start (confirming saline bag move to arterial line end). -static BOOL incrRinsebackFlowRateRequested; ///< Flag indicating user requesting rinseback flow rate be increased. -static BOOL decrRinsebackFlowRateRequested; ///< Flag indicating user requesting rinseback flow rate be decreased. static BOOL pauseRinsebackRequested; ///< Flag indicating user requesting rinseback pause. static BOOL resumeRinsebackRequested; ///< Flag indicating user requesting rinseback resume. static BOOL additionalRinsebackRequested; ///< Flag indicating user requesting a little more rinseback volume. @@ -80,6 +80,7 @@ static void setupForRinsebackDelivery( void ); static void setupForRinsebackStopOrPause( void ); +static void incOrDecRinsebackFlowRate( void ); static RINSEBACK_STATE_T handleRinsebackStopInitState( void ); static RINSEBACK_STATE_T handleRinsebackRunState( void ); @@ -109,6 +110,7 @@ void initRinseback( void ) { currentRinsebackState = RINSEBACK_STOP_INIT_STATE; + prevRunState = RINSEBACK_STOP_INIT_STATE; fluidType = getFluidType(); setSysConfigTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE, (U32)DEFAULT_RINSEBACK_FLOW_RATE_ML_MIN ); // Set to default rate before rinseback start rinsebackTargetVolume_mL = getTreatmentParameterU32( TREATMENT_PARAM_PRIME_RINSEBACK_VOLUME ); @@ -117,6 +119,7 @@ additionalRinsebackVolume_mL = 0.0F; rinsebackAdditionalTimerCtr = 0; rinsebackPublishTimerCtr = 0; + newRinsebackRate = 0; resetRinsebackFlags(); cummulativeRinsebackVolume_mL.data = 0.0; @@ -140,8 +143,6 @@ static void resetRinsebackFlags( void ) { startRinsebackRequested = FALSE; - incrRinsebackFlowRateRequested = FALSE; - decrRinsebackFlowRateRequested = FALSE; pauseRinsebackRequested = FALSE; resumeRinsebackRequested = FALSE; additionalRinsebackRequested = FALSE; @@ -370,10 +371,10 @@ * timeout, ALARM_ID_TD_EMPTY_SALINE_BAG if saline bag is empty or * saline line is clamped * @details \b Inputs: rinsebackTargetVolume_mL, pauseRinsebackRequestd, - * incrRinsebackFlowRateRequested, decrRinsebackFlowRateRequested, fluidType + * fluidType * @details \b Outputs: bloodSittingTimerCtr, cummulativeRinsebackVolume_mL, - * rinsebackRate_mL_min, incrRinsebackFlowRateRequested, decrRinsebackFlowRateRequested, - * targetRinsebackVolumePlusAdditional_mL + * rinsebackRate_mL_min, , decrRinsebackFlowRateRequested, + * targetRinsebackVolumePlusAdditional_mL, prevRunState * @return next rinseback state *************************************************************************/ static RINSEBACK_STATE_T handleRinsebackRunState( void ) @@ -405,35 +406,13 @@ // Has user or alarm requested stop ? else if ( ( TRUE == pauseRinsebackRequested ) || TRUE == doesAlarmStatusIndicateStop() ) { + prevRunState = currentRinsebackState; setupForRinsebackStopOrPause(); state = RINSEBACK_PAUSED_STATE; } - // Otherwise, continue else { - if ( ( TRUE == incrRinsebackFlowRateRequested ) || ( TRUE == decrRinsebackFlowRateRequested ) ) - { - U32 newRate = getSysConfigTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE ); - - if ( TRUE == incrRinsebackFlowRateRequested ) - { - newRate += RINSEBACK_FLOW_RATE_ADJ_ML_MIN; - } - else - { - newRate -= RINSEBACK_FLOW_RATE_ADJ_ML_MIN; - } - - incrRinsebackFlowRateRequested = FALSE; - decrRinsebackFlowRateRequested = FALSE; - - if ( ( newRate >= MIN_RINSEBACK_FLOW_RATE_ML_MIN ) && ( newRate <= MAX_RINSEBACK_FLOW_RATE_ML_MIN ) ) - { - // Set the rinseabck flow rate with the new rate - setSysConfigTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE, newRate ); - setupForRinsebackDelivery(); - } - } + // Continue, no action required. } return state; @@ -443,7 +422,7 @@ * @brief * The handleRinsebackPausedState function handles the rinseback paused * state operations. - * @details \b Inputs: resumeRinsebackRequested + * @details \b Inputs: resumeRinsebackRequested, prevRunState * @details \b Outputs: none * @return next rinseback state *************************************************************************/ @@ -455,7 +434,7 @@ if ( TRUE == resumeRinsebackRequested ) { setupForRinsebackDelivery(); - state = RINSEBACK_RUN_STATE; + state = prevRunState; } return state; @@ -485,6 +464,7 @@ signalRinsebackToRecirc(); } } + // Additional rinseback requested? Continue with main rinseback rate. else if ( TRUE == additionalRinsebackRequested ) { if ( ( bloodSittingTimerCtr < MAX_TIME_BLOOD_SITTING ) || @@ -493,8 +473,6 @@ rinsebackAdditionalTimerCtr = 0; additionalRinsebackVolume_mL = getDeliveredRinsebackVolume(); targetRinsebackVolumePlusAdditional_mL += TARGET_ADDITIONAL_RINSEBACK_VOLUME_ML; - setSysConfigTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE, - DEFAULT_RINSEBACK_FLOW_RATE_ML_MIN ); setupForRinsebackDelivery(); state = RINSEBACK_RUN_ADDITIONAL_STATE; } @@ -514,9 +492,9 @@ * @details \b Alarms: ALARM_ID_TD_SALINE_BAG_VOLUME_LOW_ALARM if saline bag is empty or * saline line is clamped. * @details \b Inputs: additionalRinsebackVolume_mL, rinsebackAdditionalTimerCtr, fluidType - * @details \b Outputs: bloodSittingTimerCtr, additionalRinsebackVolume_mL, + * @details \b Outputs: bloodSittingTimerCtr, additionalRinsebackVolume_mL, pauseRinsebackRequested * cummulativeRinsebackVolume_mL, rinsebackAdditionalTimerCtr, - * targetRinsebackVolumePlusAdditional_mL + * targetRinsebackVolumePlusAdditional_mL, prevRunState * @return next rinseback state *************************************************************************/ static RINSEBACK_STATE_T handleRinsebackAdditionalState( void ) @@ -547,17 +525,24 @@ additionalRinsebackVolume_mL += rinsebackVolumeSinceLast; state = RINSEBACK_STOP_STATE; } - // Has alarm requested stop or timed out? - else if ( ( TRUE == doesAlarmStatusIndicateStop() ) || - ( rinsebackAdditionalTimerCtr >= MAX_RINSEBACK_ADDITIONAL_TIME ) ) + // Has alarm requested stop? + else if ( ( TRUE == pauseRinsebackRequested ) || + ( TRUE == doesAlarmStatusIndicateStop() ) ) { + prevRunState = currentRinsebackState; setupForRinsebackStopOrPause(); + state = RINSEBACK_PAUSED_STATE; + } + // Timed out? + else if ( rinsebackAdditionalTimerCtr >= MAX_RINSEBACK_ADDITIONAL_TIME ) + { targetRinsebackVolumePlusAdditional_mL = getDeliveredRinsebackVolume(); + setupForRinsebackStopOrPause(); state = RINSEBACK_STOP_STATE; } else { - // No action required. + // Continue, no action required. } return state; @@ -698,21 +683,24 @@ * flow rate user action request. It is assumed that the calling function will set * the reject reason parameter to None beforehand. * @details \b Inputs: currentRinsebackState - * @details \b Outputs: incrRinsebackFlowRateRequested, rinsebackPublishTimerCtr + * @details \b Outputs: rinsebackPublishTimerCtr * @param rejReason Code indicating reason for rejection * @return TRUE if user action accepted, FALSE if not *************************************************************************/ static BOOL handleIncrRinsebackUserAction( REQUEST_REJECT_REASON_CODE_T *rejReason ) { BOOL result = FALSE; - if ( ( getSysConfigTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE ) + - RINSEBACK_FLOW_RATE_ADJ_ML_MIN ) <= MAX_RINSEBACK_FLOW_RATE_ML_MIN ) + newRinsebackRate = getSysConfigTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE ); + newRinsebackRate += RINSEBACK_FLOW_RATE_ADJ_ML_MIN; + + if ( newRinsebackRate <= MAX_RINSEBACK_FLOW_RATE_ML_MIN ) { - if ( RINSEBACK_RUN_STATE == currentRinsebackState ) + if ( ( RINSEBACK_RUN_STATE == currentRinsebackState ) || + ( RINSEBACK_RUN_ADDITIONAL_STATE == currentRinsebackState ) ) { result = TRUE; - incrRinsebackFlowRateRequested = TRUE; + incOrDecRinsebackFlowRate(); rinsebackPublishTimerCtr = getPublishRinsebackInterval(); } else @@ -742,13 +730,16 @@ { BOOL result = FALSE; - if ( ( getSysConfigTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE ) - - RINSEBACK_FLOW_RATE_ADJ_ML_MIN ) >= MIN_RINSEBACK_FLOW_RATE_ML_MIN ) + newRinsebackRate = getSysConfigTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE ); + newRinsebackRate -= RINSEBACK_FLOW_RATE_ADJ_ML_MIN; + + if ( newRinsebackRate >= MIN_RINSEBACK_FLOW_RATE_ML_MIN ) { - if ( RINSEBACK_RUN_STATE == currentRinsebackState ) + if ( ( RINSEBACK_RUN_STATE == currentRinsebackState ) || + ( RINSEBACK_RUN_ADDITIONAL_STATE == currentRinsebackState ) ) { result = TRUE; - decrRinsebackFlowRateRequested = TRUE; + incOrDecRinsebackFlowRate(); rinsebackPublishTimerCtr = getPublishRinsebackInterval(); } else @@ -778,7 +769,8 @@ { BOOL result = FALSE; - if ( RINSEBACK_RUN_STATE == currentRinsebackState ) + if ( ( RINSEBACK_RUN_STATE == currentRinsebackState ) || + ( RINSEBACK_RUN_ADDITIONAL_STATE == currentRinsebackState ) ) { result = TRUE; pauseRinsebackRequested = TRUE; @@ -904,20 +896,20 @@ data.isCompleted = rinsebackComplete; data.isRecircAllowed = isRecircAllowed(); - // Report blood-sitting timeout countdown only while rinseback not completed and blood pump is stopped - if ( ( TRUE == rinsebackComplete ) || ( 0 == bloodSittingTimerCtr ) ) + // Report blood-sitting timeout countdown when blood pump is stopped + if ( bloodSittingTimerCtr > 0 ) { - data.timeout = 0; - data.countdown = 0; - } - else - { U32 countdown = ( bloodSittingTimerCtr <= MAX_TIME_BLOOD_SITTING ) ? ( MAX_TIME_BLOOD_SITTING - bloodSittingTimerCtr ) : 0; data.timeout = MAX_TIME_BLOOD_SITTING / ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ); data.countdown = countdown / ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ); } + else + { + data.timeout = 0; + data.countdown = 0; + } broadcastData( MSG_ID_TD_RINSEBACK_PROGRESS, COMM_BUFFER_OUT_CAN_TD_BROADCAST, @@ -946,7 +938,21 @@ return result; } +/*********************************************************************//** + * @brief + * The incRinsebackFlowRate function adjusts the rinseback flow rate by + * the configured adjustment amount. + * @details \b Inputs: none + * @details \b Outputs: none + * @return none + *************************************************************************/ +static void incOrDecRinsebackFlowRate( void ) +{ + setSysConfigTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE, newRinsebackRate ); + setupForRinsebackDelivery(); +} + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/