Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -r46617afb446c35270b59e21085b270433d13d113 -r8cebc7f282f403c99f712d422454c15414b6fc73 --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 46617afb446c35270b59e21085b270433d13d113) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 8cebc7f282f403c99f712d422454c15414b6fc73) @@ -69,12 +69,7 @@ #define BP_MAX_MOTOR_SPEED_WHILE_OFF_RPM 100.0 ///< Maximum motor speed (RPM) while motor is commanded off. #define BP_MAX_ROTOR_VS_MOTOR_DIFF_RPM 5.0 ///< Maximum difference in speed between motor and rotor (in rotor RPM). #define BP_MAX_MOTOR_SPEED_ERROR_RPM 300.0 ///< Maximum difference in speed between measured and commanded RPM. -#ifdef USE_FMB_FLOW_SENSOR -#define BP_MAX_FLOW_VS_SPEED_DIFF_RPM 200.0 ///< Maximum difference between measured speed and speed implied by measured flow. -/// Persist time (task intervals) for flow vs. motor speed error condition. -static const U32 BP_FLOW_VS_SPEED_PERSIST = ( 5 * MS_PER_SECOND ); -#endif /// Persist time (task intervals) for motor off error condition. static const U32 BP_OFF_ERROR_PERSIST = ( 5 * MS_PER_SECOND ); /// Persist time (task intervals) motor speed error condition. @@ -111,36 +106,15 @@ /// Macro converts 12 bit ADC value to signed 16-bit value. #define SIGN_FROM_12_BIT_VALUE(v) ( (S16)(v) - (S16)BLOODPUMP_ADC_ZERO ) -#ifndef USE_FMB_FLOW_SENSOR /// Measured blood flow is filtered w/ moving average. #define SIZE_OF_ROLLING_AVG ( ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) * 1 ) -#else -/// Measured blood flow is filtered w/ moving average. -#define SIZE_OF_ROLLING_AVG ( ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) * 10 ) -/// Blood flow sensor signal strength low alarm persistence. -#define FLOW_SIG_STRGTH_ALARM_PERSIST ( BP_CONTROL_INTERVAL_SEC * MS_PER_SECOND ) -#define MIN_FLOW_SIG_STRENGTH 0.9 ///< Minimum flow sensor signal strength (90%). - -/// Blood flow fast read timeout alarm persistence. -#define BLOOD_FLOW_FAST_READ_TO_PERSIST 100 -/// Blood flow slow read timeout alarm persistence. -#define BLOOD_FLOW_SLOW_READ_TO_PERSIST ( MS_PER_SECOND * 3 ) -/// Blood flow comm error persistence. -#define BLOOD_FLOW_COMM_ERROR_PERSIST MS_PER_SECOND - -#define BFM_SENSOR_CONNECTED_STATUS 0x00 ///< Blood flow meter connected status. -#define BFM_SENSOR_PARAM_CORRUPT_STATUS 0x07 ///< Blood flow meter NVM parameter status. -#endif - #define PUMP_DIR_ERROR_COUNT_MASK 0x3F ///< Bit mask for pump direction error counter. -#ifndef USE_FMB_FLOW_SENSOR #define BP_FLOW_ALPHA_Y_INTERCEPT 1.218 ///< Y intercept used for alpha flow coefficient calculation. #define BP_FLOW_WEAR_A_TERM 0.000000007474 ///< A term used for wear portion of alpha flow coefficient. #define BP_FLOW_WEAR_B_TERM 0.0006053 ///< B term used for wear portion of alpha flow coefficient. #define BP_MAX_ROTOR_COUNT_FOR_WEAR 25000 ///< Maximum rotor count for determining wear of the cartridge (negligible affect beyond this threshold). -#endif /// Enumeration of blood pump controller states. typedef enum BloodPump_States @@ -191,35 +165,18 @@ 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. -#ifdef USE_FMB_FLOW_SENSOR -static OVERRIDE_F32_T bloodFlowSignalStrength = { 0.0, 0.0, 0.0, 0 }; ///< Measured blood flow signal strength (%). - -static U08 lastBloodFlowFastPacketReadCtr = 0; ///< Previous read counter for the blood flow fast packets. -static U08 lastBloodFlowSlowPacketReadCtr = 0; ///< Previous read counter for the blood flow slow packets. -#ifndef DISABLE_PUMP_FLOW_CHECKS -static U08 lastBloodFlowCommErrorCount = 0; ///< Previous BP flow sensor comm error count. -#endif -static HD_FLOW_SENSORS_CAL_RECORD_T bloodFlowCalRecord; ///< Blood flow sensor calibration record. -#endif - static U08 lastBloodPumpDirectionCount = 0; ///< Previous pump direction error count reported by FPGA. -#ifndef USE_FMB_FLOW_SENSOR static F32 rpmReadings[ SIZE_OF_ROLLING_AVG ]; ///< Holds RPM samples for a rolling average. static U32 rpmReadingsIdx = 0; ///< Index for next sample in rolling average array. static F32 rpmReadingsTotal = 0.0; ///< Rolling total - used to calc average. static U32 rpmReadingsCount = 0; ///< Number of samples in RPM rolling average buffer. static F32 filteredBloodPumpSpeed = 0.0; ///< Filtered blood pump speed used in blood flow estimation. -#else -static F32 flowReadings[ SIZE_OF_ROLLING_AVG ]; ///< Holds flow samples for a rolling average. -static U32 flowReadingsIdx = 0; ///< Index for next sample in rolling average array. -static F32 flowReadingsTotal = 0.0; ///< Rolling total - used to calc average. -static U32 flowReadingsCount = 0; ///< Number of samples in flow rolling average buffer. -#endif + static U32 bpControlTimerCounter = 0; ///< Determines when to perform control on blood flow static U32 bpRotorRevStartTime = 0; ///< Blood pump rotor rotation start time (in ms) -static U32 bloodPumpRotorCounter = 0; ///< Running counter for blood pump rotor revolutions +static OVERRIDE_U32_T bloodPumpRotorCounter = { 0, 0, 0, 0 }; ///< Running counter for blood pump rotor revolutions static BOOL bpStopAtHomePosition = FALSE; ///< Stop blood pump at next home position static U32 bpHomeStartTime = 0; ///< When did blood pump home command begin? (in ms) @@ -246,16 +203,9 @@ static void checkBloodPumpMCCurrent( void ); static void checkBloodPumpFlowRate( void ); -#ifdef USE_FMB_FLOW_SENSOR -static void resetBloodFlowMovingAverage( void ); -static void filterBloodFlowReadings( F32 flow ); -static void checkBloodFlowSensorSignalStrength( void ); -static BOOL processCalibrationData( void ); -#else static F32 calcBloodFlow( void ); static void resetBloodPumpRPMMovingAverage( void ); static void filterBloodPumpRPMReadings( F32 rpm ); -#endif /*********************************************************************//** * @brief @@ -271,13 +221,8 @@ stopBloodPump(); setBloodPumpDirection( MOTOR_DIR_FORWARD ); -#ifndef USE_FMB_FLOW_SENSOR // Zero rolling pump speed average buffer resetBloodPumpRPMMovingAverage(); -#else - // Zero rolling flow average buffer - resetBloodFlowMovingAverage(); -#endif // Zero motor hall sensors counts buffer bpMotorSpeedCalcIdx = 0; @@ -299,13 +244,6 @@ initPersistentAlarm( ALARM_ID_BLOOD_PUMP_MC_DIRECTION_CHECK, 0, BP_DIRECTION_ERROR_PERSIST ); initPersistentAlarm( ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_TOO_HIGH, 0, BP_MAX_ROTOR_SPEED_ERROR_PERSIST ); initPersistentAlarm( ALARM_ID_BLOOD_PUMP_MC_CURRENT_CHECK, 0, BP_MAX_CURR_ERROR_DURATION_MS ); -#ifdef USE_FMB_FLOW_SENSOR - initPersistentAlarm( ALARM_ID_BLOOD_PUMP_FLOW_VS_MOTOR_SPEED_CHECK, 0, BP_FLOW_VS_SPEED_PERSIST ); - initPersistentAlarm( ALARM_ID_BLOOD_FLOW_SIGNAL_STRENGTH_TOO_LOW, FLOW_SIG_STRGTH_ALARM_PERSIST, FLOW_SIG_STRGTH_ALARM_PERSIST ); - initPersistentAlarm( ALARM_ID_HD_BP_FLOW_READ_TIMEOUT_ERROR, 0, BLOOD_FLOW_FAST_READ_TO_PERSIST ); - initPersistentAlarm( ALARM_ID_HD_BP_FLOW_SLOW_READ_TIMEOUT_ERROR, 0, BLOOD_FLOW_SLOW_READ_TO_PERSIST ); - initPersistentAlarm( ALARM_ID_HD_BP_FLOW_SENSOR_ERROR, 0, BLOOD_FLOW_COMM_ERROR_PERSIST ); -#endif initPersistentAlarm( ALARM_ID_HD_BLOOD_FLOW_OUT_OF_RANGE, 0, BP_MAX_FLOW_RATE_OUT_OF_RANGE_PERSIST ); } @@ -332,11 +270,7 @@ if ( flowRate <= MAX_SET_BLOOD_FLOW_RATE ) #endif { -#ifndef USE_FMB_FLOW_SENSOR resetBloodPumpRPMMovingAverage(); -#else - resetBloodFlowMovingAverage(); -#endif targetBloodFlowRate = ( dir == MOTOR_DIR_FORWARD ? (S32)flowRate : (S32)flowRate * -1 ); bloodPumpDirection = dir; bloodPumpControlMode = mode; @@ -387,7 +321,6 @@ return result; } -#ifndef USE_FMB_FLOW_SENSOR /*********************************************************************//** * @brief * The calcBloodFlow function calculates an estimated blood flow rate from @@ -402,7 +335,8 @@ F32 artPres = getLongFilteredArterialPressure(); F32 rotSpd = filteredBloodPumpSpeed / BP_GEAR_RATIO; #ifndef WORN_OUT_CARTRIDGE - U32 rotCnt = CAP( bloodPumpRotorCounter, BP_MAX_ROTOR_COUNT_FOR_WEAR ); + U32 r = getBloodPumpRotorCount(); + U32 rotCnt = CAP( r, BP_MAX_ROTOR_COUNT_FOR_WEAR ); #else U32 rotCnt = BP_MAX_ROTOR_COUNT_FOR_WEAR; #endif @@ -412,7 +346,6 @@ return flow; } -#endif /*********************************************************************//** * @brief @@ -446,7 +379,7 @@ U32 deltaTime = calcTimeBetween( bpRotorRevStartTime, rotTime ); // Increment rotor counter - bloodPumpRotorCounter++; + bloodPumpRotorCounter.data++; // Calculate rotor speed (in RPM) bloodPumpRotorSpeedRPM.data = ( 1.0 / (F32)deltaTime ) * (F32)MS_PER_SECOND * (F32)SEC_PER_MIN; @@ -504,7 +437,14 @@ *************************************************************************/ U32 getBloodPumpRotorCount( void ) { - return bloodPumpRotorCounter; + U32 result = bloodPumpRotorCounter.data; + + if ( OVERRIDE_KEY == bloodPumpRotorCounter.override ) + { + result = bloodPumpRotorCounter.ovData; + } + + return result; } /*********************************************************************//** @@ -531,7 +471,7 @@ *************************************************************************/ void resetBloodPumpRotorCount( void ) { - bloodPumpRotorCounter = 0; + bloodPumpRotorCounter.data = 0; } /*********************************************************************//** @@ -551,59 +491,12 @@ U08 spReadCtr = getFPGABloodFlowSlowPacketReadCounter(); U08 flowErrorCtr = getFPGABloodFlowErrorCounter(); U08 flowStatus = getFPGABloodFlowMeterStatus(); -#ifdef USE_FMB_FLOW_SENSOR - F32 bpFlow; - F32 fpgaBloodFlow = getFPGABloodFlow(); - // Check if a new calibration is available - if ( TRUE == isNewCalibrationRecordAvailable() ) - { - // Get the new calibration data and check its validity - processCalibrationData(); - } -#ifndef DISABLE_PUMP_FLOW_CHECKS - if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_BP_FLOW_SENSOR_ERROR, ( flowErrorCtr != lastBloodFlowCommErrorCount ) ) ) - { - activateAlarmNoData( ALARM_ID_HD_BP_FLOW_SENSOR_ERROR ); - } - if ( flowStatus != BFM_SENSOR_CONNECTED_STATUS ) - { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_BLOOD_FLOW_STATUS_SELF_TEST_FAILURE, (U32)flowStatus ); - } - lastBloodFlowCommErrorCount = flowErrorCtr; -#endif -#ifndef DISABLE_FPGA_COUNTER_CHECKS - // Check for stale flow reading - if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_BP_FLOW_READ_TIMEOUT_ERROR, ( fpReadCtr == lastBloodFlowFastPacketReadCtr ) ) ) - { - activateAlarmNoData( ALARM_ID_HD_BP_FLOW_READ_TIMEOUT_ERROR ); - } - if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_BP_FLOW_SLOW_READ_TIMEOUT_ERROR, ( spReadCtr == lastBloodFlowSlowPacketReadCtr ) ) ) - { - activateAlarmNoData( ALARM_ID_HD_BP_FLOW_SLOW_READ_TIMEOUT_ERROR ); - } -#endif - - // Record flow read counters for next time around - lastBloodFlowFastPacketReadCtr = fpReadCtr; - lastBloodFlowSlowPacketReadCtr = spReadCtr; -#endif - adcBloodPumpMCSpeedRPM.data = (F32)(SIGN_FROM_12_BIT_VALUE(bpRPM)) * BP_SPEED_ADC_TO_RPM_FACTOR; adcBloodPumpMCCurrentmA.data = (F32)(SIGN_FROM_12_BIT_VALUE(bpmA)) * BP_CURRENT_ADC_TO_MA_FACTOR; -#ifndef USE_FMB_FLOW_SENSOR filterBloodPumpRPMReadings( getMeasuredBloodPumpMCSpeed() ); measuredBloodFlowRate.data = calcBloodFlow(); // Pressure and rotor speed already filtered as inputs to calc, so no need to filter flow any further -#else - bloodFlowSignalStrength.data = getFPGABloodFlowSignalStrength(); - 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; - filterBloodFlowReadings( bpFlow ); -#endif // Calculate blood pump motor speed/direction from hall sensor count updateBloodPumpSpeedAndDirectionFromHallSensors(); @@ -620,10 +513,6 @@ checkBloodPumpFlowRate(); // Check for home position, zero/low speed checkBloodPumpRotor(); -#ifdef USE_FMB_FLOW_SENSOR - // Check flow sensor signal strength - checkBloodFlowSensorSignalStrength(); -#endif } // Publish blood flow data on interval @@ -714,11 +603,7 @@ // Have we reached end of ramp up? else if ( bloodPumpPWMDutyCyclePctSet >= bloodPumpPWMDutyCyclePct ) { -#ifndef USE_FMB_FLOW_SENSOR resetBloodPumpRPMMovingAverage(); -#else - resetBloodFlowMovingAverage(); -#endif bloodPumpPWMDutyCyclePctSet = bloodPumpPWMDutyCyclePct; resetPIController( PI_CONTROLLER_ID_BLOOD_FLOW, bloodPumpPWMDutyCyclePctSet ); bloodPumpControlModeSet = bloodPumpControlMode; @@ -757,11 +642,7 @@ // Have we reached end of ramp down? else if ( bloodPumpPWMDutyCyclePctSet <= bloodPumpPWMDutyCyclePct ) { -#ifndef USE_FMB_FLOW_SENSOR resetBloodPumpRPMMovingAverage(); -#else - resetBloodFlowMovingAverage(); -#endif bloodPumpPWMDutyCyclePctSet = bloodPumpPWMDutyCyclePct; resetPIController( PI_CONTROLLER_ID_BLOOD_FLOW, bloodPumpPWMDutyCyclePctSet ); bloodPumpControlModeSet = bloodPumpControlMode; @@ -900,28 +781,6 @@ return result; } -#ifdef USE_FMB_FLOW_SENSOR -/*********************************************************************//** - * @brief - * The getMeasuredBloodFlowSignalStrength function gets the measured blood flow - * signal strength. - * @details Inputs: bloodFlowSignalStrength - * @details Outputs: none - * @return the current blood flow signal strength (in %). - *************************************************************************/ -F32 getMeasuredBloodFlowSignalStrength( void ) -{ - F32 result = bloodFlowSignalStrength.data; - - if ( OVERRIDE_KEY == bloodFlowSignalStrength.override ) - { - result = bloodFlowSignalStrength.ovData; - } - - return result; -} -#endif - /*********************************************************************//** * @brief * The getMeasuredBloodPumpRotorSpeed function gets the measured blood flow @@ -1025,17 +884,12 @@ payload.measMCSpd = getMeasuredBloodPumpMCSpeed(); payload.measMCCurr = getMeasuredBloodPumpMCCurrent(); payload.pwmDC = bloodPumpPWMDutyCyclePctSet * FRACTION_TO_PERCENT_FACTOR; -#ifdef USE_FMB_FLOW_SENSOR - payload.flowSigStrength = getMeasuredBloodFlowSignalStrength() * FRACTION_TO_PERCENT_FACTOR; -#else - payload.flowSigStrength = 0.0; -#endif + payload.rotorCount = getBloodPumpRotorCount(); broadcastData( MSG_ID_BLOOD_FLOW_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&payload, sizeof( BLOOD_PUMP_STATUS_PAYLOAD_T ) ); bloodFlowDataPublicationTimerCounter = 0; } } -#ifndef USE_FMB_FLOW_SENSOR /*********************************************************************//** * @brief * The resetBloodPumpRPMMovingAverage function re-initializes the pump speed @@ -1073,47 +927,9 @@ rpmReadingsCount = INC_CAP( rpmReadingsCount, SIZE_OF_ROLLING_AVG ); filteredBloodPumpSpeed = rpmReadingsTotal / (F32)rpmReadingsCount; } -#else + /*********************************************************************//** * @brief - * The resetBloodFlowMovingAverage function re-initializes the blood flow - * moving average sample buffer. - * @details Inputs: none - * @details Outputs: flowReadingsTotal, flowReadingsIdx, flowReadingsCount all set to zero. - * @return none - *************************************************************************/ -static void resetBloodFlowMovingAverage( void ) -{ - flowReadingsIdx = 0; - flowReadingsCount = 0; - flowReadingsTotal = 0.0; - bpControlTimerCounter = 0; -} - -/*********************************************************************//** - * @brief - * The filterBloodFlowReadings function adds a new flow sample to the filter. - * @details Inputs: none - * @details Outputs: flowReadings[], flowReadingsIdx, flowReadingsCount, flowReadingsTotal - * @param flow newest blood flow sample - * @return none - *************************************************************************/ -static void filterBloodFlowReadings( F32 flow ) -{ - if ( flowReadingsCount >= SIZE_OF_ROLLING_AVG ) - { - flowReadingsTotal -= flowReadings[ flowReadingsIdx ]; - } - flowReadings[ flowReadingsIdx ] = flow; - flowReadingsTotal += flow; - flowReadingsIdx = INC_WRAP( flowReadingsIdx, 0, SIZE_OF_ROLLING_AVG - 1 ); - flowReadingsCount = INC_CAP( flowReadingsCount, SIZE_OF_ROLLING_AVG ); - measuredBloodFlowRate.data = flowReadingsTotal / (F32)flowReadingsCount; -} -#endif - -/*********************************************************************//** - * @brief * The updateBloodPumpSpeedAndDirectionFromHallSensors function calculates * the blood pump motor speed and direction from hall sensor counter on * a 1 second interval. @@ -1341,103 +1157,7 @@ SET_ALARM_WITH_1_F32_DATA( ALARM_ID_HD_BLOOD_FLOW_OUT_OF_RANGE, flow ); } #endif - -#ifdef USE_FMB_FLOW_SENSOR - // Flow vs. speed check only performed while in treatment mode and while we are in control to target state - if ( ( MODE_TREA == getCurrentOperationMode() ) && ( BLOOD_PUMP_CONTROL_TO_TARGET_STATE == bloodPumpState ) ) - { - F32 speed = getMeasuredBloodPumpSpeed(); - F32 impliedSpeed = ( flow / (F32)ML_PER_LITER ) * BP_REV_PER_LITER * BP_GEAR_RATIO; - F32 delta = fabs( speed - impliedSpeed ); - - if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_BLOOD_PUMP_FLOW_VS_MOTOR_SPEED_CHECK, delta > BP_MAX_FLOW_VS_SPEED_DIFF_RPM ) ) - { -#ifndef DISABLE_PUMP_SPEED_CHECKS - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_BLOOD_PUMP_FLOW_VS_MOTOR_SPEED_CHECK, flow, speed ); -#endif - } - } - else - { - resetPersistentAlarmTimer( ALARM_ID_BLOOD_PUMP_FLOW_VS_MOTOR_SPEED_CHECK ); - } -#endif } - -#ifdef USE_FMB_FLOW_SENSOR -/*********************************************************************//** - * @brief - * The checkBloodFlowSensorSignalStrength function checks the measured blood - * flow sensor signal strength is sufficient for accurate flow sensing. - * @details Inputs: - * @details Outputs: - * @return none - *************************************************************************/ -static void checkBloodFlowSensorSignalStrength( void ) -{ -#ifndef DISABLE_PUMP_FLOW_CHECKS - HD_OP_MODE_T opMode = getCurrentOperationMode(); - - // Check flow sensor signal strength when appropriate TODO - in pre-treatment, must be far enough along for fluid to be in tubing - if ( MODE_TREA == opMode || ( MODE_PRET == opMode && FALSE ) ) - { - F32 sigStrength = getMeasuredBloodFlowSignalStrength(); - BOOL outOfRange = ( sigStrength < MIN_FLOW_SIG_STRENGTH ? TRUE : FALSE ); - - if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_BLOOD_FLOW_SIGNAL_STRENGTH_TOO_LOW, outOfRange ) ) - { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_BLOOD_FLOW_SIGNAL_STRENGTH_TOO_LOW, sigStrength, MIN_FLOW_SIG_STRENGTH ); - } - } -#endif -} - -/*********************************************************************//** - * @brief - * The processCalibrationData function gets the calibration data and makes - * sure it is valid by checking the calibration date. The calibration date - * should not be 0. - * @details Inputs: none - * @details Outputs: bloodFlowCalRecord - * @return TRUE if the calibration record is valid, otherwise FALSE - *************************************************************************/ -static BOOL processCalibrationData( void ) -{ - BOOL status = TRUE; - - // Get the calibration record from NVDataMgmt - HD_FLOW_SENSORS_CAL_RECORD_T calData = getHDFlowSensorsCalibrationRecord(); - - // Check if the calibration data that was received from NVDataMgmt is legitimate - // The calibration date item should not be zero. If the calibration date is 0, - // then the blood flow sensors data is not stored in the NV memory or it was corrupted. - if ( 0 == calData.hdFlowSensors[ CAL_DATA_HD_BLOOD_FLOW_SENSOR ].calibrationTime ) - { -#ifndef SKIP_CAL_CHECK - activateAlarmNoData( ALARM_ID_HD_BLOOD_FLOW_INVALID_CAL_RECORD ); - status = FALSE; -#endif - } - - // The calibration data was valid, update the local copy - bloodFlowCalRecord.hdFlowSensors[ CAL_DATA_HD_BLOOD_FLOW_SENSOR ].fourthOrderCoeff = - calData.hdFlowSensors[ CAL_DATA_HD_BLOOD_FLOW_SENSOR ].fourthOrderCoeff; - - bloodFlowCalRecord.hdFlowSensors[ CAL_DATA_HD_BLOOD_FLOW_SENSOR ].thirdOrderCoeff = - calData.hdFlowSensors[ CAL_DATA_HD_BLOOD_FLOW_SENSOR ].thirdOrderCoeff; - - bloodFlowCalRecord.hdFlowSensors[ CAL_DATA_HD_BLOOD_FLOW_SENSOR ].secondOrderCoeff = - calData.hdFlowSensors[ CAL_DATA_HD_BLOOD_FLOW_SENSOR ].secondOrderCoeff; - - bloodFlowCalRecord.hdFlowSensors[ CAL_DATA_HD_BLOOD_FLOW_SENSOR ].gain = - calData.hdFlowSensors[ CAL_DATA_HD_BLOOD_FLOW_SENSOR ].gain; - - bloodFlowCalRecord.hdFlowSensors[ CAL_DATA_HD_BLOOD_FLOW_SENSOR ].offset = - calData.hdFlowSensors[ CAL_DATA_HD_BLOOD_FLOW_SENSOR ].offset; - - return status; -} -#endif /*********************************************************************//** * @brief @@ -1449,31 +1169,9 @@ *************************************************************************/ 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(); - - // Retrieve blood flow sensor calibration data and check for sensor connected status - if ( BFM_SENSOR_PARAM_CORRUPT_STATUS != bfmStatus ) - { - BOOL calStatus = processCalibrationData(); - - if ( TRUE == calStatus ) - { - result = SELF_TEST_STATUS_PASSED; - } - else - { - result = SELF_TEST_STATUS_FAILED; - } - } - else - { - 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 + + // TODO - anything to test here? return result; } @@ -1792,51 +1490,49 @@ return result; } -#ifdef USE_FMB_FLOW_SENSOR /*********************************************************************//** * @brief - * The testSetMeasuredBloodFlowSignalStrengthOverride function overrides the measured - * blood flow signal strength. + * The testSetBloodPumpRotorCountOverride function overrides the blood pump + * rotor counter value. * @details Inputs: none - * @details Outputs: bloodFlowSignalStrength - * @param value override measured blood flow signal strength (in %) + * @details Outputs: bloodPumpRotorCounter + * @param value override blood pump rotor counter value * @return TRUE if override successful, FALSE if not *************************************************************************/ -BOOL testSetMeasuredBloodFlowSignalStrengthOverride( F32 value ) +BOOL testSetBloodPumpRotorCountOverride( U32 value ) { BOOL result = FALSE; if ( TRUE == isTestingActivated() ) { result = TRUE; - bloodFlowSignalStrength.ovData = value / 100.0; - bloodFlowSignalStrength.override = OVERRIDE_KEY; + bloodPumpRotorCounter.ovData = value; + bloodPumpRotorCounter.override = OVERRIDE_KEY; } return result; } /*********************************************************************//** * @brief - * The testResetMeasuredBloodFlowSignalStrengthOverride function resets the override - * of the measured blood flow signal strength. + * The testResetBloodPumpRotorCountOverride function resets the override + * of the blood pump rotor counter. * @details Inputs: none - * @details Outputs: bloodFlowSignalStrength + * @details Outputs: bloodPumpRotorCounter * @return TRUE if reset successful, FALSE if not *************************************************************************/ -BOOL testResetMeasuredBloodFlowSignalStrengthOverride( void ) +BOOL testResetBloodPumpRotorCountOverride( void ) { BOOL result = FALSE; if ( TRUE == isTestingActivated() ) { result = TRUE; - bloodFlowSignalStrength.override = OVERRIDE_RESET; - bloodFlowSignalStrength.ovData = bloodFlowSignalStrength.ovInitData; + bloodPumpRotorCounter.override = OVERRIDE_RESET; + bloodPumpRotorCounter.ovData = bloodPumpRotorCounter.ovInitData; } return result; } -#endif /**@}*/ Index: firmware/App/Controllers/BloodFlow.h =================================================================== diff -u -r02fa169f02dd5a8caf27d1ea4441c74ba38317e8 -r8cebc7f282f403c99f712d422454c15414b6fc73 --- firmware/App/Controllers/BloodFlow.h (.../BloodFlow.h) (revision 02fa169f02dd5a8caf27d1ea4441c74ba38317e8) +++ firmware/App/Controllers/BloodFlow.h (.../BloodFlow.h) (revision 8cebc7f282f403c99f712d422454c15414b6fc73) @@ -48,7 +48,7 @@ F32 measMCSpd; F32 measMCCurr; F32 pwmDC; - F32 flowSigStrength; + U32 rotorCount; } BLOOD_PUMP_STATUS_PAYLOAD_T; // ********** public function prototypes ********** @@ -69,9 +69,6 @@ SELF_TEST_STATUS_T execBloodFlowTest( void ); F32 getMeasuredBloodFlowRate( void ); -#ifdef USE_FMB_FLOW_SENSOR -F32 getMeasuredBloodFlowSignalStrength( void); -#endif F32 getMeasuredBloodPumpRotorSpeed( void ); F32 getMeasuredBloodPumpSpeed( void ); F32 getMeasuredBloodPumpMCSpeed( void ); @@ -90,10 +87,8 @@ BOOL testResetMeasuredBloodPumpMCSpeedOverride( void ); BOOL testSetMeasuredBloodPumpMCCurrentOverride( F32 value ); BOOL testResetMeasuredBloodPumpMCCurrentOverride( void ); -#ifdef USE_FMB_FLOW_SENSOR -BOOL testSetMeasuredBloodFlowSignalStrengthOverride( F32 value ); -BOOL testResetMeasuredBloodFlowSignalStrengthOverride( void ); -#endif +BOOL testSetBloodPumpRotorCountOverride( U32 value ); +BOOL testResetBloodPumpRotorCountOverride( void ); /**@}*/ Index: firmware/App/Controllers/DGInterface.c =================================================================== diff -u -r031627883dbd40abd52312d64a1a3b811478d1c3 -r8cebc7f282f403c99f712d422454c15414b6fc73 --- firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision 031627883dbd40abd52312d64a1a3b811478d1c3) +++ firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision 8cebc7f282f403c99f712d422454c15414b6fc73) @@ -71,7 +71,6 @@ static U32 resMgmtTimer = 0; ///< Used for keeping state time. // DG sensor data -static F32 dgPressures[ NUM_OF_DG_PRESSURE_SENSORS ]; ///< Latest pressures reported by the DG. static F32 dgDialysateTemp = 0.0; ///< Dialysate temperature reported by the DG. static F32 dgRedundantDialysateTemp = 0.0; ///< Redundant dialysate temperature reported by the DG. static F32 dgPrimaryTempSet = 0.0; ///< Primary heater target temperature commanded. @@ -90,11 +89,6 @@ static U32 lgLoadCellReadingsIdx = 0; ///< Index for next sample in large load cell rolling average sample array. static F32 lgLoadCellReadingsTotal[ NUM_OF_DG_RESERVOIRS ]; ///< Rolling total - used to calc large load cell moving average. -// DG pumps data -static F32 dgROPumpFlowRateMlMin = 0.0; ///< Latest RO water flow rate reported by the DG. -static U32 dgROPumpPressureSetPtPSI = 0; ///< Latest RO pump target pressure reported by the DG. -static U32 dgDrainPumpSpeedSetPtRPM = 0; ///< Latest Drain pump target speed reported by the DG. - // Reservoir data static DG_RESERVOIR_ID_T dgActiveReservoir = DG_RESERVOIR_2; ///< Latest active reservoir reported by the DG. static DG_RESERVOIR_ID_T dgActiveReservoirSet = DG_RESERVOIR_2; ///< Active reservoir commanded. @@ -419,76 +413,6 @@ return ( dgActiveReservoir == dgActiveReservoirSet ); } -/*********************************************************************//** - * @brief - * The getDGPressure function gets the latest pressure reported by the DG - * for a given pressure sensor. - * @details Inputs: dgPressures[] - * @details Outputs: none - * @param sensorID pressure sensor we are getting reading for - * @return Latest pressure reading reported by DG for the given sensor. - *************************************************************************/ -F32 getDGPressure( DG_PRESSURE_SENSORS_T sensorID ) -{ - F32 result = 0.0; - - if ( sensorID < NUM_OF_DG_PRESSURE_SENSORS ) - { - result = dgPressures[ sensorID ]; - } - else - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_DG_PRESSURE_ID, sensorID ) - } - - return result; -} - -/*********************************************************************//** - * @brief - * The getDGROPumpPressureSetPt function gets the latest RO pump - * pressure set point reported by the DG. - * @details Inputs: dgROPumpPressureSetPtPSI - * @details Outputs: none - * @return Latest RO pump pressure set point reported by DG. - *************************************************************************/ -U32 getDGROPumpPressureSetPt( void ) -{ - U32 result = dgROPumpPressureSetPtPSI; - - return result; -} - -/*********************************************************************//** - * @brief - * The getDGROPumpFlowRateMlMin function gets the latest RO pump flow - * rate reported by the DG. - * @details Inputs: dgROPumpFlowRateMlMin - * @details Outputs: none - * @return Latest RO pump flow rate reported by DG. - *************************************************************************/ -F32 getDGROPumpFlowRateMlMin( void ) -{ - F32 result = dgROPumpFlowRateMlMin; - - return result; -} - -/*********************************************************************//** - * @brief - * The getDGDrainPumpRPMSetPt function gets the latest drain pump RPM - * set point reported by the DG. - * @details Inputs: dgDrainPumpSpeedSetPtRPM - * @details Outputs: none - * @return Latest drain pump RPM set point reported by DG. - *************************************************************************/ -U32 getDGDrainPumpRPMSetPt( void ) -{ - U32 result = dgDrainPumpSpeedSetPtRPM; - - return result; -} - /*********************************************************************//** * @brief * The getLoadCellWeight function gets the current load cell weight. @@ -661,53 +585,6 @@ } } -/*********************************************************************//** - * @brief - * The setDGPressures function sets the latest pressures reported by the DG. - * @details Inputs: none - * @details Outputs: dgPressures[] - * @param roIn latest RO pump inlet pressure reported by DG - * @param roOut latest RO pump outlet pressure reported by DG - * @param drainIn latest drain pump inlet pressure reported by DG - * @param drainOut latest drain pump outlet pressure reported by DG - * @return none - *************************************************************************/ -void setDGPressures( F32 roIn, F32 roOut, F32 drainIn, F32 drainOut ) -{ - dgPressures[ DG_PRESSURE_SENSOR_RO_PUMP_INLET ] = roIn; - dgPressures[ DG_PRESSURE_SENSOR_RO_PUMP_OUTLET ] = roOut; - dgPressures[ DG_PRESSURE_SENSOR_DRAIN_PUMP_INLET ] = drainIn; - dgPressures[ DG_PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ] = drainOut; -} - -/*********************************************************************//** - * @brief - * The setDGROPumpData function sets the latest RO pump data reported by the DG. - * @details Inputs: none - * @details Outputs: dgROPumpPressureSetPtPSI, dgROPumpFlowRateMlMin - * @param presSetPt latest RO pump pressure set point reported by DG - * @param flowRate latest RO pump flow rate (LPM) reported by DG - * @return none - *************************************************************************/ -void setDGROPumpData( U32 presSetPt, F32 flowRate ) -{ - dgROPumpPressureSetPtPSI = presSetPt; - dgROPumpFlowRateMlMin = flowRate * ML_PER_LITER; -} - -/*********************************************************************//** - * @brief - * The setDGDrainPumpData function sets the latest drain pump data reported by the DG. - * @details Inputs: none - * @details Outputs: dgDrainPumpSpeedSetPtRPM - * @param rpmSetPt latest drain pump RPM set point reported by DG - * @return none - *************************************************************************/ -void setDGDrainPumpData( U32 rpmSetPt ) -{ - dgDrainPumpSpeedSetPtRPM = rpmSetPt; -} - /*********************************************************************//** * @brief * The setNewLoadCellReadings function sets the latest DG reservoir load cell Index: firmware/App/Controllers/DGInterface.h =================================================================== diff -u -rf2cecb1dae0cfccc768b321f1d0cdec9a73c5824 -r8cebc7f282f403c99f712d422454c15414b6fc73 --- firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision f2cecb1dae0cfccc768b321f1d0cdec9a73c5824) +++ firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision 8cebc7f282f403c99f712d422454c15414b6fc73) @@ -37,40 +37,6 @@ #define FILL_RESERVOIR_TO_VOLUME_LOW_FLOW_ML 1300 ///< Fill reservoir to this volume (in mL) during treatment if dialysate flow is slow. #define SLOW_DIALYSATE_FLOW_ML_MIN 250 ///< Threshold for slow dialysate flow designation. -/// Enumeration of DG pressure sensors. -typedef enum DG_PressureSensors -{ - DG_PRESSURE_SENSOR_RO_PUMP_INLET = 0, ///< RO pump pressure sensor - DG_PRESSURE_SENSOR_RO_PUMP_OUTLET, ///< RO pump pressure sensor - DG_PRESSURE_SENSOR_DRAIN_PUMP_INLET, ///< Drain pump inlet pressure - DG_PRESSURE_SENSOR_DRAIN_PUMP_OUTLET, ///< Drain pump outlet pressure - NUM_OF_DG_PRESSURE_SENSORS ///< Number of pressure sensors -} DG_PRESSURE_SENSORS_T; - -/// Payload record structure for an RO pump data message. -typedef struct -{ - U32 setPtPSI; ///< RO pump set target pressure - F32 measFlowRateMlMin; ///< RO pump measured flow rate in mL per min - F32 setPWMDutyCyclePct; ///< RO pump set PWM duty cycle percent -} DG_RO_PUMP_DATA_PAYLOAD_T; - -/// Payload record structure for a drain pump data message. -typedef struct -{ - U32 setPtRPM; ///< Drain pump set RPM value - F32 setDAC; ///< Drain pump set DAC value -} DG_DRAIN_PUMP_DATA_PAYLOAD_T; - -/// Payload record structure for a DG pressures data message. -typedef struct -{ - F32 roInPSI; ///< DG inlet pressure in PSI - F32 roOutPSI; ///< DG outlet pressure in PSI - F32 drainInPSI; ///< DG drain inlet pressure in PSI - F32 drainOutPSI; ///< DG drain outlet pressure in PSI -} DG_PRESSURES_DATA_PAYLOAD_T; - /// Payload record structure for a reservoirs data message. typedef struct { @@ -147,10 +113,6 @@ DG_RESERVOIR_ID_T getDGActiveReservoir( void ); DG_RESERVOIR_ID_T getDGInactiveReservoir( void ); BOOL hasDGCompletedReservoirSwitch( void ); -F32 getDGPressure( DG_PRESSURE_SENSORS_T sensorID ); -U32 getDGROPumpPressureSetPt( void ); -F32 getDGROPumpFlowRateMlMin( void ); -U32 getDGDrainPumpRPMSetPt( void ); F32 getLoadCellWeight( LOAD_CELL_ID_T loadCellID ); F32 getReservoirWeight( DG_RESERVOIR_ID_T resID ); F32 getReservoirWeightLargeFilter( DG_RESERVOIR_ID_T resID ); @@ -161,9 +123,6 @@ void setDialysateTemperatureReadings( F32 temp1, F32 temp2 ); void setDGDialysateTemperatures( F32 primaryHtrTemp, F32 trimmerHtrTemp ); void setDGReservoirsData( DG_RESERVOIR_ID_T resID, U32 fillVol, U32 drainVol ); -void setDGPressures( F32 roIn, F32 roOut, F32 drainIn, F32 drainOut ); -void setDGROPumpData( U32 presSetPt, F32 flowRate ); -void setDGDrainPumpData( U32 rpmSetPt ); void setNewLoadCellReadings( F32 res1Primary, F32 res1Backup, F32 res2Primary, F32 res2Backup ); void setDGDisinfectsStates( DG_DISINFECT_UI_STATES_T states ); Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -r46617afb446c35270b59e21085b270433d13d113 -r8cebc7f282f403c99f712d422454c15414b6fc73 --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 46617afb446c35270b59e21085b270433d13d113) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 8cebc7f282f403c99f712d422454c15414b6fc73) @@ -110,7 +110,8 @@ /// Interval (in ms) at which to publish pressure/occlusion data to CAN bus. static OVERRIDE_U32_T presOcclDataPublishInterval = { PRES_OCCL_DATA_PUB_INTERVAL, PRES_OCCL_DATA_PUB_INTERVAL, 0, 0 }; -static OVERRIDE_F32_T arterialPressure = {0.0, 0.0, 0.0, 0 }; ///< Measured arterial pressure. +static OVERRIDE_F32_T arterialPressure = {0.0, 0.0, 0.0, 0 }; ///< Measured arterial pressure. +static OVERRIDE_F32_T arterialPressureOffset = {0.0, 0.0, 0.0, 0 }; ///< Calculated arterial pressure offset. static OVERRIDE_F32_T venousPressure = {0.0, 0.0, 0.0, 0 }; ///< Measured venous pressure. static OVERRIDE_U32_T bloodPumpOcclusion = {0, 0, 0, 0 }; ///< Measured blood pump occlusion pressure. static F32 longFilteredArterialPressure; ///< Measured arterial pressure after long (10 s) filter. @@ -362,7 +363,7 @@ // Check for stale arterial pressure reading if ( FALSE == isPersistentAlarmTriggered( ALARM_ID_HD_VENOUS_PRESSURE_READ_TIMEOUT_ERROR, ( lastArterialPressureReadCtr == artReadCtr || artErrorCtr > 0 ) ) ) { - arterialPressure.data = ARTERIAL_PRESSURE_V_PER_BIT * ( (F32)(artPres) / ( ARTERIAL_PRESSURE_SENSITIVITY * ARTERIAL_PRESSURE_V_BIAS ) ); + arterialPressure.data = ARTERIAL_PRESSURE_V_PER_BIT * ( (F32)(artPres) / ( ARTERIAL_PRESSURE_SENSITIVITY * ARTERIAL_PRESSURE_V_BIAS ) ) + getF32OverrideValue( &arterialPressureOffset ); } else { @@ -985,6 +986,51 @@ } return result; -} +} + +/*********************************************************************//** + * @brief + * The testSetBloodPumpOcclusionOverride function overrides the arterial + * pressure offset. + * @details Inputs: none + * @details Outputs: arterialPressureOffset + * @param value override arterial pressure offset with + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetArterialPressureOffsetOverride( F32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + arterialPressureOffset.ovData = value; + arterialPressureOffset.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetArterialPressureOffsetOverride function resets the override of the + * arterial pressure offset. + * @details Inputs: none + * @details Outputs: arterialPressureOffset + * @return TRUE if reset successful, FALSE if not + *************************************************************************/ +BOOL testResetArterialPressureOffsetOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + arterialPressureOffset.override = OVERRIDE_RESET; + arterialPressureOffset.ovData = arterialPressureOffset.ovInitData; + } + + return result; +} /**@}*/ Index: firmware/App/Controllers/PresOccl.h =================================================================== diff -u -r0237b2fc49d60b6602bac35ce43831b37f294c81 -r8cebc7f282f403c99f712d422454c15414b6fc73 --- firmware/App/Controllers/PresOccl.h (.../PresOccl.h) (revision 0237b2fc49d60b6602bac35ce43831b37f294c81) +++ firmware/App/Controllers/PresOccl.h (.../PresOccl.h) (revision 8cebc7f282f403c99f712d422454c15414b6fc73) @@ -88,6 +88,8 @@ BOOL testResetVenousPressureOverride( void ); BOOL testSetBloodPumpOcclusionOverride( U32 value ); BOOL testResetBloodPumpOcclusionOverride( void ); +BOOL testSetArterialPressureOffsetOverride( F32 value ); +BOOL testResetArterialPressureOffsetOverride( void ); /**@}*/ Index: firmware/App/HDCommon.h =================================================================== diff -u -r9b831d8407ad2ac737a58f369455074306d5097a -r8cebc7f282f403c99f712d422454c15414b6fc73 --- firmware/App/HDCommon.h (.../HDCommon.h) (revision 9b831d8407ad2ac737a58f369455074306d5097a) +++ firmware/App/HDCommon.h (.../HDCommon.h) (revision 8cebc7f282f403c99f712d422454c15414b6fc73) @@ -47,7 +47,6 @@ // #define DISABLE_CRC_ERROR 1 // Do not error on bad CRC for CAN messages #define DISABLE_ACK_ERRORS 1 // Do not error on failure of other node(s) to ACK a message #define USE_FMD_FLOW_SENSOR 1 // Use FMD flow sensor (on HD) instead of FMD on DG -// #define USE_FMB_FLOW_SENSOR 1 // Use FMB flow sensor instead of flow estimation from pump speed/pressure/wearing // #define RUN_BP_OPEN_LOOP 1 // Run blood pump in open loop mode // #define RUN_DPI_OPEN_LOOP 1 // Run dialysate inlet pump in open loop mode #define WORN_OUT_CARTRIDGE 1 // Running with an old worn out cartridge (max wear) Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -re4cc37257141c5227186ac6d8ca3d6c87d009042 -r8cebc7f282f403c99f712d422454c15414b6fc73 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision e4cc37257141c5227186ac6d8ca3d6c87d009042) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 8cebc7f282f403c99f712d422454c15414b6fc73) @@ -113,6 +113,13 @@ setBloodPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); setDialInPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); setDialOutPumpTargetRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); + + // Set valves to default positions + setValveAirTrap( STATE_CLOSED ); + setValvePosition( VDI, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( VDO, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( VBA, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( VBV, VALVE_POSITION_A_INSERT_EJECT ); } /*********************************************************************//** Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -re4cc37257141c5227186ac6d8ca3d6c87d009042 -r8cebc7f282f403c99f712d422454c15414b6fc73 --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision e4cc37257141c5227186ac6d8ca3d6c87d009042) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 8cebc7f282f403c99f712d422454c15414b6fc73) @@ -202,6 +202,10 @@ signalDialInPumpHardStop(); signalDialOutPumpHardStop(); stopSyringePump(); + setValvePosition( VDI, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( VDO, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( VBA, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( VBV, VALVE_POSITION_A_INSERT_EJECT ); } /*********************************************************************//** @@ -784,6 +788,10 @@ if ( STATE_CLOSED == getFPGADoorState() ) { state = DRY_SELF_TESTS_USED_CARTRIDGE_CHECK_STATE; + setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); + setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); + setValvePosition( VBA, VALVE_POSITION_C_CLOSE ); + setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); } if ( TRUE == doesAlarmStatusIndicateStop() ) Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r9b831d8407ad2ac737a58f369455074306d5097a -r8cebc7f282f403c99f712d422454c15414b6fc73 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 9b831d8407ad2ac737a58f369455074306d5097a) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 8cebc7f282f403c99f712d422454c15414b6fc73) @@ -1146,18 +1146,6 @@ handleDGTemperatureData( message ); break; - case MSG_ID_RO_PUMP_DATA: - handleROPumpData( message ); - break; - - case MSG_ID_DG_PRESSURES_DATA: - handleDGPressuresData( message ); - break; - - case MSG_ID_DRAIN_PUMP_DATA: - handleDrainPumpData( message ); - break; - case MSG_ID_DG_OP_MODE: handleDGOpMode( message ); break; @@ -1515,16 +1503,14 @@ handleHDSoftwareResetRequest( message ); break; -#ifdef USE_FMB_FLOW_SENSOR - case MSG_ID_BLOOD_FLOW_SIG_STRENGTH_OVERRIDE: - handleTestBloodFlowSignalStrengthOverrideRequest( message ); + case MSG_ID_BLOOD_ROTOR_COUNT_OVERRIDE: + handleHDBloodPumpRotorCountOverrideRequest( message ); break; -#endif -#ifdef USE_FMD_FLOW_SENSOR - case MSG_ID_DIAL_IN_FLOW_SIG_STRENGTH_OVERRIDE: - handleTestDialInFlowSignalStrengthOverrideRequest( message ); + + case MSG_ID_SET_ARTERIAL_PRESSURE_OFFSET: + handleHDSetArterialPressureOffsetRequest( message ); break; -#endif + case MSG_ID_BLOOD_PUMP_HOME_CMD: handleTestBloodPumpHomeRequest( message ); break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r5070f8552a200e15dcc2ca0532db10fba9dc8c6b -r8cebc7f282f403c99f712d422454c15414b6fc73 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 5070f8552a200e15dcc2ca0532db10fba9dc8c6b) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 8cebc7f282f403c99f712d422454c15414b6fc73) @@ -2262,66 +2262,6 @@ /*********************************************************************//** * @brief - * The handleROPumpData function handles an RO pump data broadcast - * message from the DG. - * @details Inputs: none - * @details Outputs: message handled - * @param message a pointer to the message to handle - * @return none - *************************************************************************/ -void handleROPumpData( MESSAGE_T *message ) -{ - if ( message->hdr.payloadLen == sizeof(DG_RO_PUMP_DATA_PAYLOAD_T) ) - { - DG_RO_PUMP_DATA_PAYLOAD_T payload; - - memcpy( &payload, message->payload, sizeof(DG_RO_PUMP_DATA_PAYLOAD_T) ); - setDGROPumpData( payload.setPtPSI, payload.measFlowRateMlMin ); - } -} - -/*********************************************************************//** - * @brief - * The handleDrainPumpData function handles a drain pump broadcast - * message from the DG. - * @details Inputs: none - * @details Outputs: message handled - * @param message a pointer to the message to handle - * @return none - *************************************************************************/ -void handleDrainPumpData( MESSAGE_T *message ) -{ - if ( message->hdr.payloadLen == sizeof(DG_DRAIN_PUMP_DATA_PAYLOAD_T) ) - { - DG_DRAIN_PUMP_DATA_PAYLOAD_T payload; - - memcpy( &payload, message->payload, sizeof(DG_DRAIN_PUMP_DATA_PAYLOAD_T) ); - setDGDrainPumpData( payload.setPtRPM ); - } -} - -/*********************************************************************//** - * @brief - * The handleDGPressuresData function handles a DG pressure sensor readings - * broadcast message from the DG. - * @details Inputs: none - * @details Outputs: message handled - * @param message a pointer to the message to handle - * @return none - *************************************************************************/ -void handleDGPressuresData( MESSAGE_T *message ) -{ - if ( message->hdr.payloadLen == sizeof(DG_PRESSURES_DATA_PAYLOAD_T) ) - { - DG_PRESSURES_DATA_PAYLOAD_T payload; - - memcpy( &payload, message->payload, sizeof(DG_PRESSURES_DATA_PAYLOAD_T) ); - setDGPressures( payload.roInPSI, payload.roOutPSI, payload.drainInPSI, payload.drainOutPSI ); - } -} - -/*********************************************************************//** - * @brief * The handleDGReservoirData function handles a reservoir data broadcast * message from the DG. * @details Inputs: none @@ -3556,17 +3496,16 @@ sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); } -#ifdef USE_FMB_FLOW_SENSOR /*********************************************************************//** * @brief - * The handleTestBloodFlowSignalStrengthOverrideRequest function handles a - * request to override the measured blood flow signal strength (%). + * The handleHDBloodPumpRotorCountOverrideRequest function handles a request to + * override the blood pump rotor count. * @details Inputs: none * @details Outputs: message handled * @param message a pointer to the message to handle * @return none *************************************************************************/ -void handleTestBloodFlowSignalStrengthOverrideRequest( MESSAGE_T *message ) +void handleHDBloodPumpRotorCountOverrideRequest( MESSAGE_T *message ) { TEST_OVERRIDE_PAYLOAD_T payload; BOOL result = FALSE; @@ -3577,19 +3516,50 @@ memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); if ( FALSE == payload.reset ) { - result = testSetMeasuredBloodFlowSignalStrengthOverride( payload.state.f32 ); + result = testSetBloodPumpRotorCountOverride( payload.state.u32 ); } else { - result = testResetMeasuredBloodFlowSignalStrengthOverride(); + result = testResetBloodPumpRotorCountOverride(); } } // Respond to request sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); } -#endif - + +/*********************************************************************//** + * @brief + * The handleHDSetArterialPressureOffsetRequest function handles a request to + * set the arterial pressure offset. + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleHDSetArterialPressureOffsetRequest( 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 = testSetArterialPressureOffsetOverride( payload.state.f32 ); + } + else + { + result = testResetArterialPressureOffsetOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + /*********************************************************************//** * @brief * The handleTestBloodPumpRotorMeasuredSpeedOverrideRequest function handles a request to Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r5070f8552a200e15dcc2ca0532db10fba9dc8c6b -r8cebc7f282f403c99f712d422454c15414b6fc73 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 5070f8552a200e15dcc2ca0532db10fba9dc8c6b) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 8cebc7f282f403c99f712d422454c15414b6fc73) @@ -436,11 +436,12 @@ // MSG_ID_BLOOD_FLOW_MEAS_OVERRIDE void handleTestBloodFlowMeasuredOverrideRequest( MESSAGE_T *message ); -#ifdef USE_FMB_FLOW_SENSOR -// MSG_ID_BLOOD_FLOW_SIG_STRENGTH_OVERRIDE -void handleTestBloodFlowSignalStrengthOverrideRequest( MESSAGE_T *message ); -#endif +// MSG_ID_BLOOD_ROTOR_COUNT_OVERRIDE +void handleHDBloodPumpRotorCountOverrideRequest( MESSAGE_T *message ); +// MSG_ID_SET_ARTERIAL_PRESSURE_OFFSET +void handleHDSetArterialPressureOffsetRequest( MESSAGE_T *message ); + // MSG_ID_BLOOD_PUMP_MC_MEAS_SPEED_OVERRIDE void handleTestBloodPumpMCMeasuredSpeedOverrideRequest( MESSAGE_T *message );