Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -rd7a56c36bbc9b5c66585b0ef39e75bb7766d544f -rc52bfbc3f41fecde11bbec3eb71dc812154fc760 --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision d7a56c36bbc9b5c66585b0ef39e75bb7766d544f) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision c52bfbc3f41fecde11bbec3eb71dc812154fc760) @@ -1357,6 +1357,7 @@ * TEST SUPPORT FUNCTIONS *************************************************************************/ + /*********************************************************************//** * @brief * The testSetBloodFlowDataPublishIntervalOverride function overrides the 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; +} + /**@}*/ Index: firmware/App/Modes/BloodPrime.h =================================================================== diff -u -r9c3f5379ed2fbf1053bb7c446a0a1302f66459b4 -rc52bfbc3f41fecde11bbec3eb71dc812154fc760 --- firmware/App/Modes/BloodPrime.h (.../BloodPrime.h) (revision 9c3f5379ed2fbf1053bb7c446a0a1302f66459b4) +++ firmware/App/Modes/BloodPrime.h (.../BloodPrime.h) (revision c52bfbc3f41fecde11bbec3eb71dc812154fc760) @@ -43,6 +43,7 @@ { F32 targetBloodPrimeVolumeMl; F32 deliveredBloodPrimeVolumeMl; + F32 indDeliveredBloodPrimeVolumeMl; } BLOOD_PRIME_DATA_PAYLOAD_T; #pragma pack(pop) @@ -55,6 +56,11 @@ BLOOD_PRIME_STATE_T getCurrentBloodPrimeState( void ); +BOOL testSetBloodPrimeVolumeOverride( F32 vol ); +BOOL testResetBloodPrimeVolumeOverride( void ); +BOOL testSetBloodPrimeSafetyVolumeOverride( F32 vol ); +BOOL testResetBloodPrimeSafetyVolumeOverride( void ); + /**@}*/ #endif Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r421ffbd3887d136b66da26ee3eeb17dcd9a773b8 -rc52bfbc3f41fecde11bbec3eb71dc812154fc760 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 421ffbd3887d136b66da26ee3eeb17dcd9a773b8) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision c52bfbc3f41fecde11bbec3eb71dc812154fc760) @@ -1503,6 +1503,14 @@ handleTestDialOutPumpHomeRequest( message ); break; + case MSG_ID_SUPER_CLEAR_ALARMS_CMD: + handleTestSuperClearAlarmsRequest( message ); + break; + + case MSG_ID_HD_SET_OP_MODE_REQUEST: + handleTestSetOpModeRequest( message ); + break; + case MSG_ID_HD_FLUID_LEAK_SEND_INTERVAL_OVERRIDE: handleSetFluidLeakBroadcastIntervalOverrideRequest( message ); break; @@ -1535,12 +1543,12 @@ handleBubbleSelfTestRequest( message ); break; - case MSG_ID_HD_SET_OP_MODE_REQUEST: - handleTestSetOpModeRequest( message ); + case MSG_ID_HD_BLOOD_PRIME_VOLUME_OVERRIDE: + handleBloodPrimeVolumeOverrideRequest( message ); break; - case MSG_ID_SUPER_CLEAR_ALARMS_CMD: - handleTestSuperClearAlarmsRequest( message ); + case MSG_ID_HD_BLOOD_PRIME_SAFETY_VOLUME_OVERRIDE: + handleBloodPrimeSafetyVolumeOverrideRequest( message ); break; case MSG_ID_HD_SYRINGE_PUMP_SEND_INTERVAL_OVERRIDE: Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r60e0fc291e3897ab9b86aee7181eeb6d6dd7d35f -rc52bfbc3f41fecde11bbec3eb71dc812154fc760 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 60e0fc291e3897ab9b86aee7181eeb6d6dd7d35f) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision c52bfbc3f41fecde11bbec3eb71dc812154fc760) @@ -5446,6 +5446,70 @@ /*********************************************************************//** * @brief + * The handleBloodPrimeVolumeOverrideRequest function handles a request to + * override the calculated blood prime volume (in mL). + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleBloodPrimeVolumeOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); + if ( FALSE == payload.reset ) + { + result = testSetBloodPrimeVolumeOverride( payload.state.f32 ); + } + else + { + result = testResetBloodPrimeVolumeOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleBloodPrimeSafetyVolumeOverrideRequest function handles a request to + * override the calculated safety blood prime volume (in mL). + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleBloodPrimeSafetyVolumeOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); + if ( FALSE == payload.reset ) + { + result = testSetBloodPrimeSafetyVolumeOverride( payload.state.f32 ); + } + else + { + result = testResetBloodPrimeSafetyVolumeOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief * The handleHDSoftwareResetRequest function handles a request to reset the * HD firmware processor. * @details Inputs: none Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r1240b612f790f931825aba86ec37f37eccce9336 -rc52bfbc3f41fecde11bbec3eb71dc812154fc760 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 1240b612f790f931825aba86ec37f37eccce9336) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision c52bfbc3f41fecde11bbec3eb71dc812154fc760) @@ -620,6 +620,12 @@ // MSG_ID_HD_BUBBLE_SELF_TEST_REQUEST void handleBubbleSelfTestRequest( MESSAGE_T *message ); +// MSG_ID_HD_BLOOD_PRIME_VOLUME_OVERRIDE +void handleBloodPrimeVolumeOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_BLOOD_PRIME_SAFETY_VOLUME_OVERRIDE +void handleBloodPrimeSafetyVolumeOverrideRequest( MESSAGE_T *message ); + // MSG_ID_SUPER_CLEAR_ALARMS_CMD void handleTestSuperClearAlarmsRequest( MESSAGE_T *message );