Index: firmware/App/Modes/BloodPrime.c =================================================================== diff -u -r023b561bbcfe0c8e93f375cfcb96f9b801d93ffd -rc52bfbc3f41fecde11bbec3eb71dc812154fc760 --- firmware/App/Modes/BloodPrime.c (.../BloodPrime.c) (revision 023b561bbcfe0c8e93f375cfcb96f9b801d93ffd) +++ firmware/App/Modes/BloodPrime.c (.../BloodPrime.c) (revision c52bfbc3f41fecde11bbec3eb71dc812154fc760) @@ -58,25 +58,23 @@ // ********** private data ********** -static BLOOD_PRIME_STATE_T bloodPrimeState; ///< Current state of the blood prime sub-mode. +static BLOOD_PRIME_STATE_T bloodPrimeState; ///< Current state of the blood prime sub-mode. -static F32 bloodPrimeRampFlowRate_mL_min; ///< Current blood pump ramp flow rate. -static F32 bloodPrimeRampStep_mL; ///< Blood pump volume step size for ramping. +static F32 bloodPrimeRampFlowRate_mL_min; ///< Current blood pump ramp flow rate. +static F32 bloodPrimeRampStep_mL; ///< Blood pump volume step size for ramping. -static U32 bloodPrimeRampControlTimerCtr; ///< Timer counter for determining interval for controlling BP ramp. -static U32 bloodPrimePublishTimerCtr; ///< Timer counter for determining interval for blood prime status to be published. +static U32 bloodPrimeRampControlTimerCtr; ///< Timer counter for determining interval for controlling BP ramp. +static U32 bloodPrimePublishTimerCtr; ///< Timer counter for determining interval for blood prime status to be published. -static F32 cumulativeBloodPrimeVolume_mL; ///< Total cumulative blood prime volume (in mL). -static S32 bloodPrimeMotorCount; ///< The cumulative sum of BP motor encoder counts used for independent blood prime volume check. -static U32 bloodPrimeLastMotorCount; ///< The last BP motor encoder count read for independent blood prime volume check. -static F32 bloodPrimeVolumeDelivered_Safety; ///< The cumulative independent blood prime volume (in mL) calculated so far. +static OVERRIDE_F32_T cumulativeBloodPrimeVolume_mL = { 0.0, 0.0, 0.0, 0 }; ///< Total cumulative blood prime volume (in mL). +static OVERRIDE_F32_T bloodPrimeVolumeDelivered_Safety = { 0.0, 0.0, 0.0, 0 }; ///< The cumulative independent blood prime volume (in mL) calculated so far. +static S32 bloodPrimeMotorCount; ///< The cumulative sum of BP motor encoder counts used for independent blood prime volume check. +static U32 bloodPrimeLastMotorCount; ///< The last BP motor encoder count read for independent blood prime volume check. // ********** private function prototypes ********** static void resetBloodPrimeFlags( void ); - static BLOOD_PRIME_STATE_T handleBloodPrimeRampState( void ); - static void publishBloodPrimeData( void ); /*********************************************************************//** @@ -94,10 +92,10 @@ bloodPrimeState = BLOOD_PRIME_RAMP_STATE; bloodPrimeRampControlTimerCtr = 0; bloodPrimePublishTimerCtr = 0; - cumulativeBloodPrimeVolume_mL = 0.0; + cumulativeBloodPrimeVolume_mL.data = 0.0; + bloodPrimeVolumeDelivered_Safety.data = 0.0; bloodPrimeMotorCount = 0; bloodPrimeLastMotorCount = getBloodPumpMotorCount(); - bloodPrimeVolumeDelivered_Safety = 0.0; resetBloodPrimeFlags(); bloodPrimeRampFlowRate_mL_min = (F32)BLOOD_PRIME_INIT_BP_FLOW_RATE_ML_MIN; @@ -121,18 +119,6 @@ /*********************************************************************//** * @brief - * The resetBloodPrimeFlags function resets the blood prime request flags. - * @details Inputs: none - * @details Outputs: Blood prime request flags reset to FALSE. - * @return none - *************************************************************************/ -static void resetBloodPrimeFlags( void ) -{ - // No flags for now -} - -/*********************************************************************//** - * @brief * The transitionToBloodPrime function prepares for transition to blood prime * sub-mode. * @details Inputs: none @@ -169,6 +155,58 @@ /*********************************************************************//** * @brief + * The resetBloodPrimeFlags function resets the blood prime request flags. + * @details Inputs: none + * @details Outputs: Blood prime request flags reset to FALSE. + * @return none + *************************************************************************/ +static void resetBloodPrimeFlags( void ) +{ + // No flags for now +} + +/*********************************************************************//** + * @brief + * The getBloodPrimeVolume function gets the calculated blood prime volume + * delivered. + * @details Inputs: cumulativeBloodPrimeVolume_mL + * @details Outputs: none + * @return the current blood prime volume delivered (in mL). + *************************************************************************/ +static F32 getBloodPrimeVolume( void ) +{ + F32 result = cumulativeBloodPrimeVolume_mL.data; + + if ( OVERRIDE_KEY == cumulativeBloodPrimeVolume_mL.override ) + { + result = cumulativeBloodPrimeVolume_mL.ovData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The getBloodPrimeSafetyVolume function gets the calculated independent + * blood prime volume delivered. + * @details Inputs: bloodPrimeVolumeDelivered_Safety + * @details Outputs: none + * @return the current blood prime safety volume delivered (in mL). + *************************************************************************/ +static F32 getBloodPrimeSafetyVolume( void ) +{ + F32 result = bloodPrimeVolumeDelivered_Safety.data; + + if ( OVERRIDE_KEY == bloodPrimeVolumeDelivered_Safety.override ) + { + result = bloodPrimeVolumeDelivered_Safety.ovData; + } + + return result; +} + +/*********************************************************************//** + * @brief * The execBloodPrime function executes the Blood Prime sub-mode state machine. * @details Inputs: bloodPrimeState * @details Outputs: bloodPrimeState @@ -207,19 +245,19 @@ BLOOD_PRIME_STATE_T result = BLOOD_PRIME_RAMP_STATE; // Update blood prime volume delivered so far - cumulativeBloodPrimeVolume_mL += ( getMeasuredBloodFlowRate() * BLOOD_PRIME_FLOW_INTEGRATOR ); + cumulativeBloodPrimeVolume_mL.data += ( getMeasuredBloodFlowRate() * BLOOD_PRIME_FLOW_INTEGRATOR ); // Update independent calculated safety volume delivered so far bloodPrimeMotorCount = u32BiDiffWithWrap( bloodPrimeLastMotorCount, getBloodPumpMotorCount() ) / BP_HALL_EDGE_COUNTS_PER_REV; - bloodPrimeVolumeDelivered_Safety = ( (F32)bloodPrimeMotorCount * VOLUME_PER_BP_MOTOR_REV_ML ); // TODO - include upstream pressure compensation to this calc + bloodPrimeVolumeDelivered_Safety.data = ( (F32)bloodPrimeMotorCount * VOLUME_PER_BP_MOTOR_REV_ML ); // TODO - include upstream pressure compensation to this calc // Has blood prime completed? - if ( cumulativeBloodPrimeVolume_mL >= TARGET_BLOOD_PRIME_VOLUME_ML ) + if ( getBloodPrimeVolume() >= TARGET_BLOOD_PRIME_VOLUME_ML ) { #ifndef DISABLE_PUMP_FLOW_CHECKS // check for under-delivery - if ( bloodPrimeVolumeDelivered_Safety < MIN_BLOOD_PRIME_SAFETY_VOLUME_ML ) + if ( getBloodPrimeSafetyVolume() < MIN_BLOOD_PRIME_SAFETY_VOLUME_ML ) { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_BLOOD_PRIME_VOLUME_CHECK_FAILURE, TARGET_BLOOD_PRIME_VOLUME_ML, bloodPrimeVolumeDelivered_Safety ); + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_BLOOD_PRIME_VOLUME_CHECK_FAILURE, TARGET_BLOOD_PRIME_VOLUME_ML, getBloodPrimeSafetyVolume() ); } else #endif @@ -231,9 +269,9 @@ } #ifndef DISABLE_PUMP_FLOW_CHECKS // Has independent safety volume exceeded safety limit? - else if ( bloodPrimeVolumeDelivered_Safety > MAX_BLOOD_PRIME_SAFETY_VOLUME_ML ) + else if ( getBloodPrimeSafetyVolume() > MAX_BLOOD_PRIME_SAFETY_VOLUME_ML ) { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_BLOOD_PRIME_VOLUME_CHECK_FAILURE, TARGET_BLOOD_PRIME_VOLUME_ML, bloodPrimeVolumeDelivered_Safety ); + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_BLOOD_PRIME_VOLUME_CHECK_FAILURE, TARGET_BLOOD_PRIME_VOLUME_ML, getBloodPrimeSafetyVolume() ); } #endif else @@ -284,9 +322,106 @@ bloodPrimePublishTimerCtr = 0; data.targetBloodPrimeVolumeMl = TARGET_BLOOD_PRIME_VOLUME_ML; - data.deliveredBloodPrimeVolumeMl = cumulativeBloodPrimeVolume_mL; + data.deliveredBloodPrimeVolumeMl = getBloodPrimeVolume(); + data.indDeliveredBloodPrimeVolumeMl = getBloodPrimeSafetyVolume(); broadcastBloodPrimeData( data ); } } + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/*********************************************************************//** + * @brief + * The testSetBloodPrimeVolumeOverride function overrides the calculated + * blood prime volume. + * @details Inputs: none + * @details Outputs: cumulativeBloodPrimeVolume_mL + * @param vol override calculated blood prime volume (in mL) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetBloodPrimeVolumeOverride( F32 vol ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + cumulativeBloodPrimeVolume_mL.ovData = vol; + cumulativeBloodPrimeVolume_mL.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetBloodPrimeVolumeOverride function resets the override of the + * calculated blood prime volume. + * @details Inputs: none + * @details Outputs: cumulativeBloodPrimeVolume_mL + * @return TRUE if reset successful, FALSE if not + *************************************************************************/ +BOOL testResetBloodPrimeVolumeOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + cumulativeBloodPrimeVolume_mL.override = OVERRIDE_RESET; + cumulativeBloodPrimeVolume_mL.ovData = cumulativeBloodPrimeVolume_mL.ovInitData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testSetBloodPrimeSafetyVolumeOverride function overrides the calculated + * blood prime volume. + * @details Inputs: none + * @details Outputs: bloodPrimeVolumeDelivered_Safety + * @param vol override calculated blood prime safety volume (in mL) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetBloodPrimeSafetyVolumeOverride( F32 vol ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + bloodPrimeVolumeDelivered_Safety.ovData = vol; + bloodPrimeVolumeDelivered_Safety.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetBloodPrimeSafetyVolumeOverride function resets the override of the + * calculated blood prime safety volume. + * @details Inputs: none + * @details Outputs: bloodPrimeVolumeDelivered_Safety + * @return TRUE if reset successful, FALSE if not + *************************************************************************/ +BOOL testResetBloodPrimeSafetyVolumeOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + bloodPrimeVolumeDelivered_Safety.override = OVERRIDE_RESET; + bloodPrimeVolumeDelivered_Safety.ovData = bloodPrimeVolumeDelivered_Safety.ovInitData; + } + + return result; +} + /**@}*/