Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -re4cc37257141c5227186ac6d8ca3d6c87d009042 -r0237b2fc49d60b6602bac35ce43831b37f294c81 --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision e4cc37257141c5227186ac6d8ca3d6c87d009042) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 0237b2fc49d60b6602bac35ce43831b37f294c81) @@ -125,7 +125,7 @@ #define PUMP_DIR_ERROR_COUNT_MASK 0x3F ///< Bit mask for pump direction error counter. -#ifdef ENABLE_ALTERNATE_FLOW +#ifndef USE_FMB_FLOW_SENSOR #define BLOOD_PC2 -0.0000090267 ///< Pressure compensation coefficient (2nd order) for blood pump. #define BLOOD_PC1 -0.00071147 ///< Pressure compensation coefficient (1st order) for blood pump. #define BLOOD_NSV 3.4555 ///< Nominal stroke (1/2 rotor revolution) volume (in mL) for blood pump. @@ -188,16 +188,6 @@ static OVERRIDE_F32_T adcBloodPumpMCSpeedRPM = { 0.0, 0.0, 0.0, 0 }; ///< Measured blood pump motor controller speed. static OVERRIDE_F32_T adcBloodPumpMCCurrentmA = { 0.0, 0.0, 0.0, 0 }; ///< Measured blood pump motor controller current. static OVERRIDE_F32_T bloodFlowSignalStrength = { 0.0, 0.0, 0.0, 0 }; ///< Measured blood flow signal strength (%). -#ifdef ENABLE_ALTERNATE_FLOW - static F32 calcBloodFlowRate = 0.0; ///< Calculated blood flow rate from pump speed and upstream pressure. - - static F32 bloodPCSV; ///< Calculated pressure corrected blood pump stroke volume. - static F32 bloodSCSV; ///< Calculated speed corrected blood pump stroke volume. - static F32 bloodPSCSV; ///< Calculated additional pressure corrected blood pump stroke volume. - static F32 bloodHSWF; ///< High speed weighting factor for blood pump stroke volume calculation. - static F32 bloodLSWF; ///< Low speed weighting factor for blood pump stroke volume calculation. - static F32 bloodPSCSVT; ///< Pressure corrected, speed corrected blood pump stroke volume with weighted transition. -#endif static U32 bpControlTimerCounter = 0; ///< Determines when to perform control on blood flow @@ -222,7 +212,16 @@ #ifndef DISABLE_PUMP_FLOW_CHECKS static U08 lastBloodFlowCommErrorCount = 0; ///< Previous BP flow sensor comm error count. #endif +#ifndef USE_FMB_FLOW_SENSOR +static F32 bloodPCSV; ///< Calculated pressure corrected blood pump stroke volume. +static F32 bloodSCSV; ///< Calculated speed corrected blood pump stroke volume. +static F32 bloodPSCSV; ///< Calculated additional pressure corrected blood pump stroke volume. +static F32 bloodHSWF; ///< High speed weighting factor for blood pump stroke volume calculation. +static F32 bloodLSWF; ///< Low speed weighting factor for blood pump stroke volume calculation. +static F32 bloodPSCSVT; ///< Pressure corrected, speed corrected blood pump stroke volume with weighted transition. +#else static HD_FLOW_SENSORS_CAL_RECORD_T bloodFlowCalRecord; ///< Blood flow sensor calibration record. +#endif // ********** private function prototypes ********** @@ -244,19 +243,20 @@ static void checkBloodPumpFlowAgainstSpeed( void ); static void checkBloodPumpMCCurrent( void ); static void checkBloodFlowSensorSignalStrength( void ); -static BOOL processCalibrationData( void ); -#ifdef ENABLE_ALTERNATE_FLOW -static void calcBloodFlow( void ); +#ifdef USE_FMB_FLOW_SENSOR +static BOOL processCalibrationData( void ); +#else +static F32 calcBloodFlow( void ); /*********************************************************************//** * @brief * The calcBloodFlow function calculates an estimated blood flow rate from * blood pump speed and arterial pressure. * @details Inputs: BP set speed, arterial pressure * @details Outputs: calcBloodFlowRate - * @return none + * @return calculated blood flow rate (mL/min) *************************************************************************/ -static void calcBloodFlow( void ) +static F32 calcBloodFlow( void ) { F32 artPres = getLongFilteredArterialPressure(); F32 artPres_2 = pow( artPres, 2.0 ); @@ -274,7 +274,7 @@ bloodPSCSVT = bloodLSWF * bloodPCSV + bloodHSWF * bloodPSCSV; // Blood flow = stroke speed (strokes/min) x stroke volume (mL/stroke) = mL/min - calcBloodFlowRate = strokeSpd * bloodPSCSVT; + return ( strokeSpd * bloodPSCSVT ); } #endif @@ -509,28 +509,25 @@ *************************************************************************/ void execBloodFlowMonitor( void ) { - // Check if a new calibration is available - if ( TRUE == isNewCalibrationRecordAvailable() ) - { - // Get the new calibration data and check its validity - processCalibrationData(); - } - HD_OP_MODE_T opMode = getCurrentOperationMode(); U16 bpRPM = getIntADCReading( INT_ADC_BLOOD_PUMP_SPEED ); U16 bpmA = getIntADCReading( INT_ADC_BLOOD_PUMP_MOTOR_CURRENT ); U08 fpReadCtr = getFPGABloodFlowFastPacketReadCounter(); U08 spReadCtr = getFPGABloodFlowSlowPacketReadCounter(); U08 flowErrorCtr = getFPGABloodFlowErrorCounter(); U08 flowStatus = getFPGABloodFlowMeterStatus(); - + F32 bpFlow; +#ifdef USE_FMB_FLOW_SENSOR F32 fpgaBloodFlow = getFPGABloodFlow(); - F32 bpFlow = pow(fpgaBloodFlow, 4) * bloodFlowCalRecord.hdFlowSensors[ CAL_DATA_HD_BLOOD_FLOW_SENSOR ].fourthOrderCoeff + - pow(fpgaBloodFlow, 3) * bloodFlowCalRecord.hdFlowSensors[ CAL_DATA_HD_BLOOD_FLOW_SENSOR ].thirdOrderCoeff + - pow(fpgaBloodFlow, 2) * bloodFlowCalRecord.hdFlowSensors[ CAL_DATA_HD_BLOOD_FLOW_SENSOR ].secondOrderCoeff + - fpgaBloodFlow * bloodFlowCalRecord.hdFlowSensors[ CAL_DATA_HD_BLOOD_FLOW_SENSOR ].gain + - bloodFlowCalRecord.hdFlowSensors[ CAL_DATA_HD_BLOOD_FLOW_SENSOR ].offset; + // Check if a new calibration is available + if ( TRUE == isNewCalibrationRecordAvailable() ) + { + // Get the new calibration data and check its validity + processCalibrationData(); + } +#endif + #ifndef DISABLE_PUMP_FLOW_CHECKS if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_BP_FLOW_SENSOR_ERROR, ( flowErrorCtr != lastBloodFlowCommErrorCount ) ) ) { @@ -563,7 +560,16 @@ adcBloodPumpMCCurrentmA.data = (F32)(SIGN_FROM_12_BIT_VALUE(bpmA)) * BP_CURRENT_ADC_TO_MA_FACTOR; bloodFlowSignalStrength.data = getFPGABloodFlowSignalStrength(); - filterBloodFlowReadings( bpFlow ); +#ifndef USE_FMB_FLOW_SENSOR + bpFlow = calcBloodFlow(); +#else + bpFlow = pow(fpgaBloodFlow, 4) * bloodFlowCalRecord.hdFlowSensors[ CAL_DATA_HD_BLOOD_FLOW_SENSOR ].fourthOrderCoeff + + pow(fpgaBloodFlow, 3) * bloodFlowCalRecord.hdFlowSensors[ CAL_DATA_HD_BLOOD_FLOW_SENSOR ].thirdOrderCoeff + + pow(fpgaBloodFlow, 2) * bloodFlowCalRecord.hdFlowSensors[ CAL_DATA_HD_BLOOD_FLOW_SENSOR ].secondOrderCoeff + + fpgaBloodFlow * bloodFlowCalRecord.hdFlowSensors[ CAL_DATA_HD_BLOOD_FLOW_SENSOR ].gain + + bloodFlowCalRecord.hdFlowSensors[ CAL_DATA_HD_BLOOD_FLOW_SENSOR ].offset; +#endif + filterBloodFlowReadings( bpFlow ); // TODO - do we need to filter flow if calculated from filtered pressure? // Calculate blood pump motor speed/direction from hall sensor count updateBloodPumpSpeedAndDirectionFromHallSensors(); @@ -584,10 +590,6 @@ checkBloodFlowSensorSignalStrength(); } -#ifdef ENABLE_ALTERNATE_FLOW - calcBloodFlow(); -#endif - // Publish blood flow data on interval publishBloodFlowData(); } @@ -975,11 +977,7 @@ payload.measRotorSpd = getMeasuredBloodPumpRotorSpeed(); payload.measPumpSpd = getMeasuredBloodPumpSpeed(); payload.measMCSpd = getMeasuredBloodPumpMCSpeed(); -#ifdef ENABLE_ALTERNATE_FLOW - payload.measMCCurr = calcBloodFlowRate; -#else payload.measMCCurr = getMeasuredBloodPumpMCCurrent(); -#endif payload.pwmDC = bloodPumpPWMDutyCyclePctSet * FRACTION_TO_PERCENT_FACTOR; payload.flowSigStrength = getMeasuredBloodFlowSignalStrength() * FRACTION_TO_PERCENT_FACTOR; broadcastData( MSG_ID_BLOOD_FLOW_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&payload, sizeof( BLOOD_PUMP_STATUS_PAYLOAD_T ) ); @@ -1307,6 +1305,7 @@ #endif } +#ifdef USE_FMB_FLOW_SENSOR /*********************************************************************//** * @brief * The processCalibrationData function gets the calibration data and makes @@ -1352,7 +1351,7 @@ return status; } - +#endif /*********************************************************************//** * @brief * The execBloodFlowTest function executes the state machine for the @@ -1362,7 +1361,8 @@ * @return the current state of the BloodFlow self-test. *************************************************************************/ SELF_TEST_STATUS_T execBloodFlowTest( void ) -{ +{ +#ifdef USE_FMB_FLOW_SENSOR SELF_TEST_STATUS_T result = SELF_TEST_STATUS_IN_PROGRESS; U08 const bfmStatus = getFPGABloodFlowMeterStatus(); @@ -1384,6 +1384,9 @@ { SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_BLOOD_FLOW_STATUS_SELF_TEST_FAILURE, (U32)bfmStatus ); } +#else + SELF_TEST_STATUS_T result = SELF_TEST_STATUS_PASSED; +#endif return result; }