Index: firmware/App/Modes/StateTxRinseback.c =================================================================== diff -u -rb56dffdfe60950630de83b03eb8527a1e10e1f63 -rb30f390acbd6c972d4ecea536b875a409a2c8e77 --- firmware/App/Modes/StateTxRinseback.c (.../StateTxRinseback.c) (revision b56dffdfe60950630de83b03eb8527a1e10e1f63) +++ firmware/App/Modes/StateTxRinseback.c (.../StateTxRinseback.c) (revision b30f390acbd6c972d4ecea536b875a409a2c8e77) @@ -59,12 +59,12 @@ static U32 rinsebackAdditionalTimerCtr; ///< Timer counter for duration of an additional rinseback delivery. static U32 rinsebackPublishTimerCtr; ///< Timer counter for determining interval for rinseback status to be published. static U32 rinsebackTargetVolume_mL; ///< Calculated target rinseback volume (based on selected dialyzer and fixed tubing volume). -static OVERRIDE_F32_T cummulativeRinsebackVolume_mL = { 0.0, 0.0, 0.0, 0 }; ///< Total cumulative rinseback volume (in mL) from measured blood flow rate. +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. /// Interval (in task intervals) at which to publish rinseback data to CAN bus. -static OVERRIDE_U32_T rinsebackPublishInterval = { RINSEBACK_DATA_PUBLISH_INTERVAL, RINSEBACK_DATA_PUBLISH_INTERVAL, RINSEBACK_DATA_PUBLISH_INTERVAL, 0}; +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. @@ -108,17 +108,26 @@ *************************************************************************/ void initRinseback( void ) { - currentRinsebackState = RINSEBACK_STOP_INIT_STATE; - fluidType = FLUID_TYPE_SALINE; //getFluidType(); + currentRinsebackState = 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 ); + rinsebackTargetVolume_mL = getTreatmentParameterU32( TREATMENT_PARAM_PRIME_RINSEBACK_VOLUME ); targetRinsebackVolumePlusAdditional_mL = rinsebackTargetVolume_mL; - bloodSittingTimerCtr = 0; - cummulativeRinsebackVolume_mL.data = 0.0F; - additionalRinsebackVolume_mL = 0.0F; - rinsebackAdditionalTimerCtr = 0; - rinsebackPublishTimerCtr = 0; + bloodSittingTimerCtr = 0; + additionalRinsebackVolume_mL = 0.0F; + rinsebackAdditionalTimerCtr = 0; + rinsebackPublishTimerCtr = 0; resetRinsebackFlags(); + + cummulativeRinsebackVolume_mL.data = 0.0; + cummulativeRinsebackVolume_mL.ovInitData = 0.0; + cummulativeRinsebackVolume_mL.ovData = 0.0; + cummulativeRinsebackVolume_mL.override = OVERRIDE_RESET; + + rinsebackPublishInterval.data = RINSEBACK_DATA_PUBLISH_INTERVAL; + rinsebackPublishInterval.ovInitData = RINSEBACK_DATA_PUBLISH_INTERVAL; + rinsebackPublishInterval.ovData = 0; + rinsebackPublishInterval.override = OVERRIDE_RESET; } /*********************************************************************//** @@ -185,7 +194,8 @@ // Select the rinseback fluid source based fluid medium, which is based on modality. if ( FLUID_TYPE_SALINE == fluidType ) { - setBloodPumpTargetFlowRate( getSysConfigTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE ), MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); + setBloodPumpTargetFlowRate( getSysConfigTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE ), + MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); } else { @@ -253,6 +263,8 @@ * @brief * The handleRinsebackBloodSittingAlarms function handles blood sitting alarms * (when blood pump is not running). + * @details \b Alarms: ALARM_ID_TD_BLOOD_SITTING_WARNING if 1 min left from timeout, + * ALARM_ID_TD_BLOOD_SITTING_TOO_LONG if blood sitting timeout * @details \b Inputs: bloodSittingTimerCtr * @details \b Outputs: none * @return none @@ -273,6 +285,7 @@ /*********************************************************************//** * @brief * The execRinseback function executes the Rinseback sub-mode state machine. + * @details \b Inputs: ALARM_ID_TD_SOFTWARE_FAULT if exec state is invalid * @details \b Inputs: currentRinsebackState * @details \b Outputs: currentRinsebackState, bloodSittingTimerCtr * @return none @@ -357,9 +370,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 - * @details \b Outputs: bloodSittingTimerCtr, cumulativeRinsebackVolume_mL, - * rinsebackRate_mL_min, incrRinsebackFlowRateRequested, decrRinsebackFlowRateRequested + * incrRinsebackFlowRateRequested, decrRinsebackFlowRateRequested, fluidType + * @details \b Outputs: bloodSittingTimerCtr, cummulativeRinsebackVolume_mL, + * rinsebackRate_mL_min, incrRinsebackFlowRateRequested, decrRinsebackFlowRateRequested, + * targetRinsebackVolumePlusAdditional_mL * @return next rinseback state *************************************************************************/ static RINSEBACK_STATE_T handleRinsebackRunState( void ) @@ -370,7 +384,8 @@ bloodSittingTimerCtr = 0; // Update rinseback volume delivered so far - cummulativeRinsebackVolume_mL.data += ( getSysConfigTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE ) * RINSEBACK_FLOW_INTEGRATOR ); + cummulativeRinsebackVolume_mL.data += ( getSysConfigTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE ) * + RINSEBACK_FLOW_INTEGRATOR ); // Check for empty saline bag if we are using saline to rinseback. if ( ( FLUID_TYPE_SALINE == fluidType ) && ( TRUE == isSalineBagEmpty() ) ) @@ -428,10 +443,8 @@ * @brief * The handleRinsebackPausedState function handles the rinseback paused * state operations. - * @details \b Alarms: ALARM_ID_TD_RINSEBACK_TIMEOUT_ALARM if rinseback - * timeout - * @details \b Inputs: bloodSittingTimerCtr, resumeRinsebackRequested - * @details \b Outputs: targetRinsebackVolumePlusAdditional_mL + * @details \b Inputs: resumeRinsebackRequested + * @details \b Outputs: none * @return next rinseback state *************************************************************************/ static RINSEBACK_STATE_T handleRinsebackPausedState( void ) @@ -455,7 +468,7 @@ * @details \b Alarms: ALARM_ID_TD_RINSEBACK_TIMEOUT_ALARM if rinseback * timeout * @details \b Inputs: bloodSittingTimerCtr, rinsebackTargetVolume_mL, recircRequested, - * additionalRinsebackRequested + * additionalRinsebackRequested, recircRequested * @details \b Outputs: additionalRinsebackRequested, * rinsebackAdditionalTimerCtr, additionalRinsebackVolume_mL * @return next rinseback state @@ -474,14 +487,14 @@ } else if ( TRUE == additionalRinsebackRequested ) { - additionalRinsebackRequested = FALSE; - - if ( ( bloodSittingTimerCtr < MAX_TIME_BLOOD_SITTING ) || ( getDeliveredRinsebackVolume() >= rinsebackTargetVolume_mL ) ) + if ( ( bloodSittingTimerCtr < MAX_TIME_BLOOD_SITTING ) || + ( getDeliveredRinsebackVolume() >= rinsebackTargetVolume_mL ) ) { rinsebackAdditionalTimerCtr = 0; additionalRinsebackVolume_mL = getDeliveredRinsebackVolume(); targetRinsebackVolumePlusAdditional_mL += TARGET_ADDITIONAL_RINSEBACK_VOLUME_ML; - setSysConfigTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE, DEFAULT_RINSEBACK_FLOW_RATE_ML_MIN ); + setSysConfigTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE, + DEFAULT_RINSEBACK_FLOW_RATE_ML_MIN ); setupForRinsebackDelivery(); state = RINSEBACK_RUN_ADDITIONAL_STATE; } @@ -498,17 +511,19 @@ * @brief * The handleRinsebackRunAdditionalState function handles the rinseback additional * state operations. - * @details \b Alarms: ALARM_ID_TD_EMPTY_SALINE_BAG if saline bag is empty or + * @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 - * @details \b Outputs: bloodSittingTimerCtr, additionalRinsebackVolume_mL, cumulativeRinsebackVolume_mL, - * rinsebackAdditionalTimerCtr, targetRinsebackVolumePlusAdditional_mL + * @details \b Inputs: additionalRinsebackVolume_mL, rinsebackAdditionalTimerCtr, fluidType + * @details \b Outputs: bloodSittingTimerCtr, additionalRinsebackVolume_mL, + * cummulativeRinsebackVolume_mL, rinsebackAdditionalTimerCtr, + * targetRinsebackVolumePlusAdditional_mL * @return next rinseback state *************************************************************************/ static RINSEBACK_STATE_T handleRinsebackAdditionalState( void ) { RINSEBACK_STATE_T state = RINSEBACK_RUN_ADDITIONAL_STATE; - F32 rinsebackVolumeSinceLast = ( getSysConfigTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE ) * RINSEBACK_FLOW_INTEGRATOR ); + F32 rinsebackVolumeSinceLast = ( getSysConfigTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE ) * + RINSEBACK_FLOW_INTEGRATOR ); // Reset rinseback t/o bloodSittingTimerCtr = 0; @@ -533,7 +548,8 @@ state = RINSEBACK_STOP_STATE; } // Has alarm requested stop or timed out? - else if ( ( TRUE == doesAlarmStatusIndicateStop() ) || ( rinsebackAdditionalTimerCtr >= MAX_RINSEBACK_ADDITIONAL_TIME ) ) + else if ( ( TRUE == doesAlarmStatusIndicateStop() ) || + ( rinsebackAdditionalTimerCtr >= MAX_RINSEBACK_ADDITIONAL_TIME ) ) { setupForRinsebackStopOrPause(); targetRinsebackVolumePlusAdditional_mL = getDeliveredRinsebackVolume(); @@ -617,7 +633,8 @@ break; case REQUESTED_USER_ACTION_RINSEBACK_END_TREATMENT: - // Send message to UI to get user confirmation to end treatment - action initiated only upon receipt of user confirmation from UI + // Send message to UI to get user confirmation to end treatment - action + // initiated only upon receipt of user confirmation from UI addConfirmationRequest( GENERIC_CONFIRM_ID_TREATMENT_END, GENERIC_CONFIRM_CMD_REQUEST_OPEN, 0U ); result = TRUE; break; @@ -640,7 +657,10 @@ // Respond to user action request response.accepted = result; response.rejectionReason = rejReason; - sendMessage( MSG_ID_TD_RINSEBACK_CMD_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08*)&response, sizeof( UI_RESPONSE_PAYLOAD_T ) ); + sendMessage( MSG_ID_TD_RINSEBACK_CMD_RESPONSE, + COMM_BUFFER_OUT_CAN_TD_2_UI, + (U08*)&response, + sizeof( UI_RESPONSE_PAYLOAD_T ) ); return result; } @@ -678,15 +698,16 @@ * 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 + * @details \b Outputs: incrRinsebackFlowRateRequested, 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 ) + if ( ( getSysConfigTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE ) + + RINSEBACK_FLOW_RATE_ADJ_ML_MIN ) <= MAX_RINSEBACK_FLOW_RATE_ML_MIN ) { if ( RINSEBACK_RUN_STATE == currentRinsebackState ) { @@ -713,15 +734,16 @@ * flow rte 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: decrRinsebackFlowRateRequested + * @details \b Outputs: decrRinsebackFlowRateRequested, rinsebackPublishTimerCtr * @param rejReason Code indicating reason for rejection * @return TRUE if user action accepted, FALSE if not *************************************************************************/ static BOOL handleDecrRinsebackUserAction( REQUEST_REJECT_REASON_CODE_T *rejReason ) { BOOL result = FALSE; - if ( ( getSysConfigTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE ) - RINSEBACK_FLOW_RATE_ADJ_ML_MIN ) >= MIN_RINSEBACK_FLOW_RATE_ML_MIN ) + if ( ( getSysConfigTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE ) - + RINSEBACK_FLOW_RATE_ADJ_ML_MIN ) >= MIN_RINSEBACK_FLOW_RATE_ML_MIN ) { if ( RINSEBACK_RUN_STATE == currentRinsebackState ) { @@ -864,7 +886,7 @@ * at 1 Hz interval. * @details \b Inputs: rinsebackPublishTimerCtr, bloodSittingTimerCtr, targetRinsebackVolumePlusAdditional_mL * rinsebackRate_mL_min - * @details \b Outputs: none + * @details \b Outputs: rinsebackPublishTimerCtr * @return none *************************************************************************/ static void publishRinsebackData( void ) @@ -890,13 +912,17 @@ } else { - U32 countdown = ( bloodSittingTimerCtr <= MAX_TIME_BLOOD_SITTING ) ? ( MAX_TIME_BLOOD_SITTING - bloodSittingTimerCtr ) : 0; + 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 ); } - broadcastData( MSG_ID_TD_RINSEBACK_PROGRESS, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)&data, sizeof( RINSEBACK_DATA_PAYLOAD_T ) ); + broadcastData( MSG_ID_TD_RINSEBACK_PROGRESS, + COMM_BUFFER_OUT_CAN_TD_BROADCAST, + (U08*)&data, + sizeof( RINSEBACK_DATA_PAYLOAD_T ) ); } }