Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -r6463655c18b173e335b6d475ac7289336f1bf092 -r9d4666bf3064df18a6d935125d7a69e4e8234e84 --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 6463655c18b173e335b6d475ac7289336f1bf092) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 9d4666bf3064df18a6d935125d7a69e4e8234e84) @@ -1,4 +1,4 @@ -/************************************************************************** +/**********************************************************************//** * * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. * @@ -31,105 +31,119 @@ #include "Timers.h" #include "BloodFlow.h" +/** + * @addtogroup BloodFlow + * @{ + */ + // ********** private definitions ********** -#define BLOOD_FLOW_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) // interval (ms/task time) at which the blood flow data is published on the CAN bus +#define BLOOD_FLOW_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< interval (ms/task time) at which the blood flow data is published on the CAN bus -#define MAX_BLOOD_PUMP_PWM_STEP_CHANGE 0.01 // max duty cycle change when ramping -#define MAX_BLOOD_PUMP_PWM_DUTY_CYCLE 0.88 // controller will error if PWM duty cycle > 90%, so set max to 88% -#define MIN_BLOOD_PUMP_PWM_DUTY_CYCLE 0.12 // controller will error if PWM duty cycle < 10%, so set min to 12% +#define MAX_BLOOD_PUMP_PWM_STEP_CHANGE 0.01 ///< max duty cycle change when ramping +#define MAX_BLOOD_PUMP_PWM_DUTY_CYCLE 0.88 ///< controller will error if PWM duty cycle > 90%, so set max to 88% +#define MIN_BLOOD_PUMP_PWM_DUTY_CYCLE 0.12 ///< controller will error if PWM duty cycle < 10%, so set min to 12% -#define BP_CONTROL_INTERVAL ( 1000 / TASK_GENERAL_INTERVAL ) // interval (ms/task time) at which the blood pump is controlled -#define BP_P_COEFFICIENT 0.00005 // P term for blood pump control -#define BP_I_COEFFICIENT 0.00015 // I term for blood pump control +#define BP_CONTROL_INTERVAL ( 1000 / TASK_GENERAL_INTERVAL ) ///< interval (ms/task time) at which the blood pump is controlled +#define BP_P_COEFFICIENT 0.00005 ///< P term for blood pump control +#define BP_I_COEFFICIENT 0.00015 ///< I term for blood pump control -#define BP_MAX_CURR_WHEN_STOPPED_MA 150.0 // motor controller current should not exceed this when pump should be stopped -#define BP_MIN_CURR_WHEN_RUNNING_MA 150.0 // motor controller current should always exceed this when pump should be running -#define BP_MAX_CURR_WHEN_RUNNING_MA 1000.0 // motor controller current should not exceed this when pump should be running -#define BP_MAX_CURR_ERROR_DURATION_MS 2000 // motor controller current errors persisting beyond this duration will trigger an alarm +#define BP_HOME_RATE 50 ///< target pump speed (in estimate mL/min) for homing. +#define BP_HOME_TIMEOUT_MS 10000 ///< maximum time allowed for homing to complete (in ms). -#define BP_SPEED_ADC_TO_RPM_FACTOR 1.280938 // conversion factor from ADC counts to RPM for blood pump motor -#define BP_CURRENT_ADC_TO_MA_FACTOR 3.002 // conversion factor from ADC counts to mA for blood pump motor +#define BP_MAX_CURR_WHEN_STOPPED_MA 150.0 ///< motor controller current should not exceed this when pump should be stopped +#define BP_MIN_CURR_WHEN_RUNNING_MA 150.0 ///< motor controller current should always exceed this when pump should be running +#define BP_MAX_CURR_WHEN_RUNNING_MA 1000.0 ///< motor controller current should not exceed this when pump should be running +#define BP_MAX_CURR_ERROR_DURATION_MS 2000 ///< motor controller current errors persisting beyond this duration will trigger an alarm -#define BP_REV_PER_LITER 150.24 // rotor revolutions per liter -#define BP_ML_PER_MIN_TO_PUMP_RPM_FACTOR ( BP_REV_PER_LITER / ML_PER_LITER ) -#define BP_GEAR_RATIO 32.0 // blood pump motor to blood pump gear ratio -#define BP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.00035 // ~28 BP motor RPM = 1% PWM duty cycle -#define BP_PWM_ZERO_OFFSET 0.1 // 10% PWM duty cycle = zero speed -#define BP_PWM_FROM_ML_PER_MIN(rate) ( (rate) * BP_ML_PER_MIN_TO_PUMP_RPM_FACTOR * BP_GEAR_RATIO * BP_MOTOR_RPM_TO_PWM_DC_FACTOR + BP_PWM_ZERO_OFFSET ) +#define BP_SPEED_ADC_TO_RPM_FACTOR 1.280938 ///< conversion factor from ADC counts to RPM for blood pump motor +#define BP_CURRENT_ADC_TO_MA_FACTOR 3.002 ///< conversion factor from ADC counts to mA for blood pump motor -#define BLOODPUMP_ADC_FULL_SCALE_V 3.0 // BP analog signals are 0-3V (while int. ADC ref may be different) -#define BLOODPUMP_ADC_ZERO ( (F32)( INT_ADC_ZERO ) * ( BLOODPUMP_ADC_FULL_SCALE_V / INT_ADC_REF_V ) ) -#define SIGN_FROM_12_BIT_VALUE(v) ( (S16)(v) - (S16)BLOODPUMP_ADC_ZERO ) +#define BP_REV_PER_LITER 150.24 ///< rotor revolutions per liter +#define BP_ML_PER_MIN_TO_PUMP_RPM_FACTOR ( BP_REV_PER_LITER / ML_PER_LITER ) ///< conversion factor from mL/min to motor RPM. +#define BP_GEAR_RATIO 32.0 ///< blood pump motor to blood pump gear ratio +#define BP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.00035 ///< ~28 BP motor RPM = 1% PWM duty cycle +#define BP_PWM_ZERO_OFFSET 0.1 ///< 10% PWM duty cycle = zero speed +#define BP_PWM_FROM_ML_PER_MIN(rate) ( (rate) * BP_ML_PER_MIN_TO_PUMP_RPM_FACTOR * BP_GEAR_RATIO * BP_MOTOR_RPM_TO_PWM_DC_FACTOR + BP_PWM_ZERO_OFFSET ) ///< conversion factor from mL/min to estimated PWM duty cycle %. -#define BLOOD_FLOW_SAMPLE_FREQ ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) -#define SIZE_OF_ROLLING_AVG ( BLOOD_FLOW_SAMPLE_FREQ * 2 ) // measured blood flow is filtered w/ moving average -#define MAX_FLOW_FILTER_INTERVAL 5 // slowest sample interval for filter is every 5th sample +#define BLOODPUMP_ADC_FULL_SCALE_V 3.0 ///< BP analog signals are 0-3V (while int. ADC ref may be different) +#define BLOODPUMP_ADC_ZERO ( (F32)( INT_ADC_ZERO ) * ( BLOODPUMP_ADC_FULL_SCALE_V / INT_ADC_REF_V ) ) ///< Blood pump ADC channel zero offset. +#define SIGN_FROM_12_BIT_VALUE(v) ( (S16)(v) - (S16)BLOODPUMP_ADC_ZERO ) ///< macro converts 12 bit ADC value to signed 16-bit value. +#define BLOOD_FLOW_SAMPLE_FREQ ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Blood flow sample frequency (in task intervals). +#define SIZE_OF_ROLLING_AVG ( BLOOD_FLOW_SAMPLE_FREQ * 2 ) ///< measured blood flow is filtered w/ moving average +#define MAX_FLOW_FILTER_INTERVAL 5 ///< slowest sample interval for filter is every 5th sample + +/// Enumeration of blood pump controller states. typedef enum BloodPump_States { - BLOOD_PUMP_OFF_STATE = 0, - BLOOD_PUMP_RAMPING_UP_STATE, - BLOOD_PUMP_RAMPING_DOWN_STATE, - BLOOD_PUMP_CONTROL_TO_TARGET_STATE, - NUM_OF_BLOOD_PUMP_STATES + BLOOD_PUMP_OFF_STATE = 0, ///< Blood pump off state. + BLOOD_PUMP_RAMPING_UP_STATE, ///< Blood pump ramping up state. + BLOOD_PUMP_RAMPING_DOWN_STATE, ///< Blood pump ramping down state. + BLOOD_PUMP_CONTROL_TO_TARGET_STATE, ///< Blood pump controlling to target state. + NUM_OF_BLOOD_PUMP_STATES ///< Number of blood pump states. } BLOOD_PUMP_STATE_T; +/// Enumeration of blood pump self test states. typedef enum BloodFlow_Self_Test_States { - BLOOD_FLOW_SELF_TEST_STATE_START = 0, - BLOOD_FLOW_TEST_STATE_IN_PROGRESS, - BLOOD_FLOW_TEST_STATE_COMPLETE, - NUM_OF_BLOOD_FLOW_SELF_TEST_STATES + BLOOD_FLOW_SELF_TEST_STATE_START = 0, ///< Blood pump self test start state. + BLOOD_FLOW_TEST_STATE_IN_PROGRESS, ///< Blood pump self test in progress state. + BLOOD_FLOW_TEST_STATE_COMPLETE, ///< Blood pump self test completed state. + NUM_OF_BLOOD_FLOW_SELF_TEST_STATES ///< Number of blood pump self test states. } BLOOD_FLOW_SELF_TEST_STATE_T; // pin assignments for pump stop and direction outputs #define STOP_CAN3_PORT_MASK 0x00000002 // (Tx - re-purposed as output GPIO for blood pump stop signal) #define DIR_CAN3_PORT_MASK 0x00000002 // (Rx - re-purposed as output GPIO for blood pump direction signal) // blood pump stop and direction macros -#define SET_BP_DIR() {canREG3->RIOC |= DIR_CAN3_PORT_MASK;} -#define CLR_BP_DIR() {canREG3->RIOC &= ~DIR_CAN3_PORT_MASK;} +#define SET_BP_DIR() {canREG3->RIOC |= DIR_CAN3_PORT_MASK;} // macro to set blood pump direction signal high. +#define CLR_BP_DIR() {canREG3->RIOC &= ~DIR_CAN3_PORT_MASK;} // macro to set blood pump direction signal low. #ifndef BREADBOARD_TARGET - #define SET_BP_STOP() {canREG3->TIOC &= ~STOP_CAN3_PORT_MASK;} - #define CLR_BP_STOP() {canREG3->TIOC |= STOP_CAN3_PORT_MASK;} + #define SET_BP_STOP() {canREG3->TIOC &= ~STOP_CAN3_PORT_MASK;} // macro to set blood pump stop signal (active low). + #define CLR_BP_STOP() {canREG3->TIOC |= STOP_CAN3_PORT_MASK;} // macro to clear blood pump stop signal (active low). #else #define SET_BP_STOP() {canREG3->TIOC |= STOP_CAN3_PORT_MASK;} #define CLR_BP_STOP() {canREG3->TIOC &= ~STOP_CAN3_PORT_MASK;} #endif // ********** private data ********** -static BLOOD_PUMP_STATE_T bloodPumpState = BLOOD_PUMP_OFF_STATE; // current state of blood flow controller state machine -static U32 bloodFlowDataPublicationTimerCounter = 0; // used to schedule blood flow data publication to CAN bus -static BOOL isBloodPumpOn = FALSE; // blood pump is currently running -static F32 bloodPumpPWMDutyCyclePct = 0.0; // initial blood pump PWM duty cycle -static F32 bloodPumpPWMDutyCyclePctSet = 0.0; // currently set blood pump PWM duty cycle -static MOTOR_DIR_T bloodPumpDirection = MOTOR_DIR_FORWARD; // requested blood flow direction -static MOTOR_DIR_T bloodPumpDirectionSet = MOTOR_DIR_FORWARD; // currently set blood flow direction +static BLOOD_PUMP_STATE_T bloodPumpState = BLOOD_PUMP_OFF_STATE; ///< current state of blood flow controller state machine +static U32 bloodFlowDataPublicationTimerCounter = 0; ///< used to schedule blood flow data publication to CAN bus +static BOOL isBloodPumpOn = FALSE; ///< blood pump is currently running +static F32 bloodPumpPWMDutyCyclePct = 0.0; ///< initial blood pump PWM duty cycle +static F32 bloodPumpPWMDutyCyclePctSet = 0.0; ///< currently set blood pump PWM duty cycle +static MOTOR_DIR_T bloodPumpDirection = MOTOR_DIR_FORWARD; ///< requested blood flow direction +static MOTOR_DIR_T bloodPumpDirectionSet = MOTOR_DIR_FORWARD; ///< currently set blood flow direction static PUMP_CONTROL_MODE_T bloodPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< requested blood pump control mode. static PUMP_CONTROL_MODE_T bloodPumpControlModeSet = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< currently set blood pump control mode. -DATA_DECL( U32, BloodFlowDataPub, bloodFlowDataPublishInterval, BLOOD_FLOW_DATA_PUB_INTERVAL, BLOOD_FLOW_DATA_PUB_INTERVAL ); // interval (in ms) at which to publish blood flow data to CAN bus -DATA_DECL( S32, TargetBloodFlowRate, targetBloodFlowRate, 0, 0 ); // requested blood flow rate -DATA_DECL( F32, MeasuredBloodFlowRate, measuredBloodFlowRate, 0.0, 0.0 ); // measured blood flow rate -DATA_DECL( F32, MeasuredBloodPumpRotorSpeed, bloodPumpRotorSpeedRPM, 0.0, 0.0 );// measured blood pump rotor speed -DATA_DECL( F32, MeasuredBloodPumpSpeed, bloodPumpSpeedRPM, 0.0, 0.0 ); // measured blood pump motor speed -DATA_DECL( F32, MeasuredBloodPumpMCSpeed, adcBloodPumpMCSpeedRPM, 0.0, 0.0 ); // measured blood pump motor controller speed -DATA_DECL( F32, MeasuredBloodPumpMCCurrent, adcBloodPumpMCCurrentmA, 0.0, 0.0 );// measured blood pump motor controller current +static OVERRIDE_U32_T bloodFlowDataPublishInterval = { BLOOD_FLOW_DATA_PUB_INTERVAL, BLOOD_FLOW_DATA_PUB_INTERVAL, BLOOD_FLOW_DATA_PUB_INTERVAL, 0 }; ///< Interval (in ms) at which to publish blood flow data to CAN bus +static OVERRIDE_S32_T targetBloodFlowRate = { 0, 0, 0, 0 }; ///< requested blood flow rate +static OVERRIDE_F32_T measuredBloodFlowRate = { 0.0, 0.0, 0.0, 0 }; ///< measured blood flow rate +static OVERRIDE_F32_T bloodPumpRotorSpeedRPM = { 0.0, 0.0, 0.0, 0 }; ///< measured blood pump rotor speed +static OVERRIDE_F32_T bloodPumpSpeedRPM = { 0.0, 0.0, 0.0, 0 }; ///< measured blood pump motor speed +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 U32 bpControlTimerCounter = 0; // determines when to perform control on blood flow +static U32 bpControlTimerCounter = 0; ///< determines when to perform control on blood flow -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; // # of samples in flow rolling average buffer -static U32 flowReadingsTmrCtr = 0; // determines when to add samples to filter +static U32 bpRotorRevStartTime = 0; ///< blood pump rotor rotation start time (in ms) +static BOOL bpStopAtHomePosition = FALSE; ///< stop blood pump at next home position +static U32 bpHomeStartTime = 0; ///< when did blood pump home command begin? (in ms) -static U32 bpCurrErrorDurationCtr = 0; // used for tracking persistence of bp current errors +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; ///< # of samples in flow rolling average buffer +static U32 flowReadingsTmrCtr = 0; ///< determines when to add samples to filter -static BLOOD_FLOW_SELF_TEST_STATE_T bloodPumpSelfTestState = BLOOD_FLOW_SELF_TEST_STATE_START; // current blood pump self test state -static U32 bloodPumpSelfTestTimerCount = 0; // timer counter for blood pump self test +static U32 bpCurrErrorDurationCtr = 0; ///< used for tracking persistence of bp current errors +static BLOOD_FLOW_SELF_TEST_STATE_T bloodPumpSelfTestState = BLOOD_FLOW_SELF_TEST_STATE_START; ///< current blood pump self test state +static U32 bloodPumpSelfTestTimerCount = 0; ///< timer counter for blood pump self test + // ********** private function prototypes ********** static BLOOD_PUMP_STATE_T handleBloodPumpOffState( void ); @@ -147,13 +161,12 @@ static void checkBloodPumpMCCurrent( void ); static DATA_GET_PROTOTYPE( U32, getPublishBloodFlowDataInterval ); -/************************************************************************* - * @brief initBloodFlow +/*********************************************************************//** + * @brief * The initBloodFlow function initializes the BloodFlow module. * @details * Inputs : none * Outputs : BloodFlow module initialized. - * @param none * @return none *************************************************************************/ void initBloodFlow( void ) @@ -170,8 +183,8 @@ MIN_BLOOD_PUMP_PWM_DUTY_CYCLE, MAX_BLOOD_PUMP_PWM_DUTY_CYCLE ); } -/************************************************************************* - * @brief setBloodPumpTargetFlowRate +/*********************************************************************//** + * @brief * The setBloodPumpTargetFlowRate function sets a new target flow rate and * pump direction. * @details @@ -238,13 +251,12 @@ return result; } -/************************************************************************* +/*********************************************************************//** * @brief signalBloodPumpHardStop * The signalBloodPumpHardStop function stops the blood pump immediately. * @details * Inputs : none * Outputs : Blood pump stopped, set point reset, state changed to off - * @param none * @return none *************************************************************************/ void signalBloodPumpHardStop( void ) @@ -257,13 +269,61 @@ resetPIController( PI_CONTROLLER_ID_BLOOD_FLOW, MIN_BLOOD_PUMP_PWM_DUTY_CYCLE ); } -/************************************************************************* - * @brief execBloodFlowMonitor +/*********************************************************************//** + * @brief + * The signalBloodPumpRotorHallSensor function handles the blood pump rotor \n + * hall sensor detection. Calculates rotor speed (in RPM). Stops pump if \n + * there is a pending request to home the pump. + * @details + * Inputs : bpRotorRevStartTime, bpStopAtHomePosition + * Outputs : bpRotorRevStartTime, bloodPumpRotorSpeedRPM + * @return none + *************************************************************************/ +void signalBloodPumpRotorHallSensor( void ) +{ + U32 rotTime = getMSTimerCount(); + U32 deltaTime = calcTimeBetween( bpRotorRevStartTime, rotTime ); + + // calculate rotor speed (in RPM) + bloodPumpRotorSpeedRPM.data = ( 1.0 / (F32)deltaTime ) * (F32)MS_PER_SECOND * (F32)SEC_PER_MIN; + bpRotorRevStartTime = rotTime; + + // if we're supposed to stop pump at home position, stop pump now. + if ( TRUE == bpStopAtHomePosition ) + { + signalBloodPumpHardStop(); + bpStopAtHomePosition = FALSE; + } +} + +/*********************************************************************//** + * @brief + * The homeBloodPump function initiates a blood pump home operation. + * @details + * Inputs : bloodPumpState + * Outputs : bpStopAtHomePosition, bpHomeStartTime, blood pump started (slow) + * @return none + *************************************************************************/ +BOOL homeBloodPump( void ) +{ + BOOL result = FALSE; + + if ( BLOOD_PUMP_OFF_STATE == bloodPumpState ) + { + bpStopAtHomePosition = TRUE; + bpHomeStartTime = getMSTimerCount(); + result = setBloodPumpTargetFlowRate( BP_HOME_RATE, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + } + + return result; +} + +/*********************************************************************//** + * @brief * The execBloodFlowMonitor function executes the blood flow monitor. * @details * Inputs : none * Outputs : measuredBloodFlowRate, adcBloodPumpMCSpeedRPM, adcBloodPumpMCCurrentmA - * @param none * @return none *************************************************************************/ void execBloodFlowMonitor( void ) @@ -277,24 +337,31 @@ filterBloodFlowReadings( bpFlow ); - // don't start enforcing checks until out of init/POST mode + // don't start enforcing checks until out of init/POST mode if ( getCurrentOperationMode() != MODE_INIT ) { checkBloodPumpDirection(); checkBloodPumpMCCurrent(); } + // if homing, check timeout + if ( ( TRUE == bpStopAtHomePosition ) && ( TRUE == didTimeout( bpHomeStartTime, BP_HOME_TIMEOUT_MS ) ) ) + { + signalBloodPumpHardStop(); + bpStopAtHomePosition = FALSE; + // TODO - alarm??? + } + // publish blood flow data on interval publishBloodFlowData(); } -/************************************************************************* - * @brief execBloodFlowController +/*********************************************************************//** + * @brief * The execBloodFlowController function executes the blood flow controller. * @details * Inputs : bloodPumpState * Outputs : bloodPumpState - * @param none * @return none *************************************************************************/ void execBloodFlowController( void ) @@ -323,14 +390,13 @@ } } -/************************************************************************* - * @brief handleBloodPumpOffState +/*********************************************************************//** + * @brief * The handleBloodPumpOffState function handles the blood pump off state \n * of the blood pump controller state machine. * @details * Inputs : targetBloodFlowRate, bloodPumpDirection * Outputs : bloodPumpPWMDutyCyclePctSet, bloodPumpDirectionSet, isBloodPumpOn - * @param none * @return next state *************************************************************************/ static BLOOD_PUMP_STATE_T handleBloodPumpOffState( void ) @@ -353,14 +419,13 @@ return result; } -/************************************************************************* - * @brief handleBloodPumpRampingUpState +/*********************************************************************//** + * @brief * The handleBloodPumpRampingUpState function handles the ramp up state \n * of the blood pump controller state machine. * @details * Inputs : bloodPumpPWMDutyCyclePctSet * Outputs : bloodPumpPWMDutyCyclePctSet - * @param none * @return next state *************************************************************************/ static BLOOD_PUMP_STATE_T handleBloodPumpRampingUpState( void ) @@ -399,14 +464,13 @@ return result; } -/************************************************************************* - * @brief handleBloodPumpRampingDownState +/*********************************************************************//** + * @brief * The handleBloodPumpRampingDownState function handles the ramp down state \n * of the blood pump controller state machine. * @details * Inputs : bloodPumpPWMDutyCyclePctSet * Outputs : bloodPumpPWMDutyCyclePctSet - * @param none * @return next state *************************************************************************/ static BLOOD_PUMP_STATE_T handleBloodPumpRampingDownState( void ) @@ -443,14 +507,13 @@ return result; } -/************************************************************************* - * @brief handleBloodPumpControlToTargetState +/*********************************************************************//** + * @brief * The handleBloodPumpControlToTargetState function handles the "control to \n * target" state of the blood pump controller state machine. * @details * Inputs : none * Outputs : bloodPumpState - * @param none * @return next state *************************************************************************/ static BLOOD_PUMP_STATE_T handleBloodPumpControlToTargetState( void ) @@ -476,8 +539,8 @@ return result; } -/************************************************************************* - * @brief setBloodPumpControlSignalPWM +/*********************************************************************//** + * @brief * The setBloodPumpControlSignalPWM function sets the PWM duty cycle for \n * the blood pump to a given %. * @details @@ -491,13 +554,12 @@ etpwmSetCmpA( etpwmREG1, (U32)( (S32)( ( newPWM * (F32)(etpwmREG1->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); } -/************************************************************************* - * @brief stopBloodPump +/*********************************************************************//** + * @brief * The stopBloodPump function sets the blood pump stop signal. * @details * Inputs : none * Outputs : blood pump stop signal activated, PWM duty cycle zeroed - * @param none * @return none *************************************************************************/ static void stopBloodPump( void ) @@ -508,22 +570,21 @@ SET_BP_STOP(); } -/************************************************************************* - * @brief releaseBloodPumpStop +/*********************************************************************//** + * @brief * The releaseBloodPumpStop function clears the blood pump stop signal. * @details * Inputs : none * Outputs : blood pump stop signal - * @param none * @return none *************************************************************************/ static void releaseBloodPumpStop( void ) { CLR_BP_STOP(); } -/************************************************************************* - * @brief setBloodPumpDirection +/*********************************************************************//** + * @brief * The setBloodPumpDirection function sets the set blood pump direction to \n * the given direction. * @details @@ -552,99 +613,161 @@ } } -/************************************************************************* - * @brief getPublishBloodFlowDataInterval +/*********************************************************************//** + * @brief * The getPublishBloodFlowDataInterval function gets the blood flow data \n * publication interval. * @details * Inputs : bloodFlowDataPublishInterval * Outputs : none - * @param none * @return the current blood flow data publication interval (in ms). *************************************************************************/ -DATA_GET( U32, getPublishBloodFlowDataInterval, bloodFlowDataPublishInterval ) +U32 getPublishBloodFlowDataInterval( void ) +{ + U32 result = bloodFlowDataPublishInterval.data; -/************************************************************************* - * @brief getTargetBloodFlowRate + if ( OVERRIDE_KEY == bloodFlowDataPublishInterval.override ) + { + result = bloodFlowDataPublishInterval.ovData; + } + + return result; +} + +/*********************************************************************//** + * @brief * The getTargetBloodFlowRate function gets the current target blood flow \n * rate. * @details * Inputs : targetBloodFlowRate * Outputs : none - * @param none - * @return the current target blood flow rate (in mL/min). +/ * @return the current target blood flow rate (in mL/min). *************************************************************************/ -DATA_GET( S32, getTargetBloodFlowRate, targetBloodFlowRate ) +S32 getTargetBloodFlowRate( void ) +{ + S32 result = targetBloodFlowRate.data; -/************************************************************************* - * @brief getMeasuredBloodFlowRate + if ( OVERRIDE_KEY == targetBloodFlowRate.override ) + { + result = targetBloodFlowRate.ovData; + } + + return result; +} + +/*********************************************************************//** + * @brief * The getMeasuredBloodFlowRate function gets the measured blood flow \n * rate. * @details * Inputs : measuredBloodFlowRate * Outputs : none - * @param none * @return the current blood flow rate (in mL/min). *************************************************************************/ -DATA_GET( F32, getMeasuredBloodFlowRate, measuredBloodFlowRate ) +F32 getMeasuredBloodFlowRate( void ) +{ + F32 result = measuredBloodFlowRate.data; -/************************************************************************* - * @brief getMeasuredBloodPumpRotorSpeed + if ( OVERRIDE_KEY == measuredBloodFlowRate.override ) + { + result = measuredBloodFlowRate.ovData; + } + + return result; +} + +/*********************************************************************//** + * @brief * The getMeasuredBloodPumpRotorSpeed function gets the measured blood flow \n * rate. * @details * Inputs : bloodPumpRotorSpeedRPM * Outputs : none - * @param none * @return the current blood flow rate (in mL/min). *************************************************************************/ -DATA_GET( F32, getMeasuredBloodPumpRotorSpeed, bloodPumpRotorSpeedRPM ) +F32 getMeasuredBloodPumpRotorSpeed( void ) +{ + F32 result = bloodPumpRotorSpeedRPM.data; -/************************************************************************* - * @brief getMeasuredBloodPumpSpeed + if ( OVERRIDE_KEY == bloodPumpRotorSpeedRPM.override ) + { + result = bloodPumpRotorSpeedRPM.ovData; + } + + return result; +} + +/*********************************************************************//** + * @brief * The getMeasuredBloodPumpSpeed function gets the measured blood flow \n * rate. * @details * Inputs : bloodPumpSpeedRPM * Outputs : none - * @param none * @return the current blood flow rate (in mL/min). *************************************************************************/ -DATA_GET( F32, getMeasuredBloodPumpSpeed, bloodPumpSpeedRPM ) +F32 getMeasuredBloodPumpSpeed( void ) +{ + F32 result = bloodPumpSpeedRPM.data; -/************************************************************************* - * @brief getMeasuredBloodPumpMCSpeed + if ( OVERRIDE_KEY == bloodPumpSpeedRPM.override ) + { + result = bloodPumpSpeedRPM.ovData; + } + + return result; +} + +/*********************************************************************//** + * @brief * The getMeasuredBloodPumpMCSpeed function gets the measured blood pump \n * speed. * @details * Inputs : adcBloodPumpMCSpeedRPM * Outputs : none - * @param none * @return the current blood pump speed (in RPM). *************************************************************************/ -DATA_GET( F32, getMeasuredBloodPumpMCSpeed, adcBloodPumpMCSpeedRPM ) +F32 getMeasuredBloodPumpMCSpeed( void ) +{ + F32 result = adcBloodPumpMCSpeedRPM.data; -/************************************************************************* - * @brief getMeasuredBloodPumpMCCurrent + if ( OVERRIDE_KEY == adcBloodPumpMCSpeedRPM.override ) + { + result = adcBloodPumpMCSpeedRPM.ovData; + } + + return result; +} + +/*********************************************************************//** + * @brief * The getMeasuredBloodPumpMCCurrent function gets the measured blood pump \n * current. * @details * Inputs : adcBloodPumpMCCurrentmA * Outputs : none - * @param none * @return the current blood pump current (in mA). *************************************************************************/ -DATA_GET( F32, getMeasuredBloodPumpMCCurrent, adcBloodPumpMCCurrentmA ) +F32 getMeasuredBloodPumpMCCurrent( void ) +{ + F32 result = adcBloodPumpMCCurrentmA.data; -/************************************************************************* - * @brief publishBloodFlowData + if ( OVERRIDE_KEY == adcBloodPumpMCCurrentmA.override ) + { + result = adcBloodPumpMCCurrentmA.ovData; + } + + return result; +} + +/*********************************************************************//** + * @brief * The publishBloodFlowData function publishes blood flow data at the set \n * interval. * @details * Inputs : target flow rate, measured flow rate, measured MC speed, \n * measured MC current * Outputs : Blood flow data is published to CAN bus. - * @param none * @return none *************************************************************************/ static void publishBloodFlowData( void ) @@ -663,20 +786,20 @@ F32 measMCSpd = getMeasuredBloodPumpMCSpeed(); F32 measMCCurr = getMeasuredBloodPumpMCCurrent(); F32 pumpPWMPctDutyCycle = bloodPumpPWMDutyCyclePctSet * FRACTION_TO_PERCENT_FACTOR; -//#ifdef DEBUG_ENABLED -// // TODO - temporary debug code - remove later -// char debugFlowStr[ 256 ]; -// -// sprintf( debugFlowStr, "Blood Set Pt.:%5d, Meas. Flow:%5d, Speed:%5d RPM, Current:%5d mA, PWM:%5d \n", flowStPt, (S32)measFlow, (S32)measMCSpd, (S32)measMCCurr, (S32)pumpPWMPctDutyCycle ); -// sendDebugData( (U08*)debugFlowStr, strlen(debugFlowStr) ); -//#endif +#ifdef DEBUG_ENABLED + // TODO - temporary debug code - remove later + char debugFlowStr[ 256 ]; + + sprintf( debugFlowStr, "Tgt:%5d, Flow:%5d, Speed:%5d RPM, Rotor:%5d RPM, Curr:%5d mA, PWM:%5d \n", flowStPt, (S32)measFlow, (S32)measMCSpd, (S32)measRotSpd, (S32)measMCCurr, (S32)pumpPWMPctDutyCycle ); + sendDebugData( (U08*)debugFlowStr, strlen(debugFlowStr) ); +#endif broadcastBloodFlowData( flowStPt, measFlow, measRotSpd, measSpd, measMCSpd, measMCCurr, pumpPWMPctDutyCycle ); bloodFlowDataPublicationTimerCounter = 0; } } -/************************************************************************* - * @brief resetBloodFlowMovingAverage +/*********************************************************************//** + * @brief * The resetBloodFlowMovingAverage function re-sizes and re-initializes the \n * blood flow moving average sample buffer. * @details @@ -695,8 +818,8 @@ bpControlTimerCounter = 0; } -/************************************************************************* - * @brief filterBloodFlowReadings +/*********************************************************************//** + * @brief * The filterBloodFlowReadings function adds a new flow sample to the filter \n * if decimation rate for current set point calls for it. * @details @@ -766,32 +889,15 @@ } flowReadingsTmrCtr = INC_WRAP( flowReadingsTmrCtr, 0, MAX_FLOW_FILTER_INTERVAL - 1 ); -#ifdef DEBUG_ENABLED - { - // TODO - temporary debug code - remove later -// char debugFlowStr[ 40 ]; - //S32 num = (S32)(flow); - //S32 dec = (S32)(fabs(flow-(S32)(flow))*100.0); -// S32 numf = (S32)(measuredBloodFlowRate.data); -// S32 decf = (S32)(fabs(measuredBloodFlowRate.data-(S32)(measuredBloodFlowRate.data))*100.0); -// S32 nump = (S32)bloodPumpPWMDutyCyclePctSet; -// S32 decp = (S32)((bloodPumpPWMDutyCyclePctSet-(S32)bloodPumpPWMDutyCyclePctSet)*100.0); - -// sprintf( debugFlowStr, "%5d.%02d %5d.%02d\n", numf, decf, numf, decf ); -// sprintf( debugFlowStr, "%5d.%02d %5d.%02d\n", num, dec, numf, decf ); -// sendDebugData( (U08*)debugFlowStr, strlen(debugFlowStr) ); - } -#endif } -/************************************************************************* - * @brief checkBloodPumpDirection +/*********************************************************************//** + * @brief * The checkBloodPumpDirection function checks the set direction vs. \n * the direction implied by the sign of the measured MC speed. * @details * Inputs : * Outputs : - * @param none * @return none *************************************************************************/ static void checkBloodPumpDirection( void ) @@ -809,14 +915,13 @@ } } -/************************************************************************* - * @brief checkBloodPumpMCCurrent +/*********************************************************************//** + * @brief * The checkBloodPumpMCCurrent function checks the measured MC current vs. \n * the set state of the blood pump (stopped or running). * @details * Inputs : * Outputs : - * @param none * @return none *************************************************************************/ static void checkBloodPumpMCCurrent( void ) @@ -863,14 +968,13 @@ } } -/************************************************************************* - * @brief execBloodFlowTest +/*********************************************************************//** + * @brief * The execBloodFlowTest function executes the state machine for the \n * BloodFlow self test. * @details * Inputs : none * Outputs : none - * @param none * @return the current state of the BloodFlow self test. *************************************************************************/ SELF_TEST_STATUS_T execBloodFlowTest( void ) @@ -888,8 +992,8 @@ *************************************************************************/ -/************************************************************************* - * @brief testSetBloodFlowDataPublishIntervalOverride +/*********************************************************************//** + * @brief * The testSetBloodFlowDataPublishIntervalOverride function overrides the \n * blood flow data publish interval. * @details @@ -914,8 +1018,8 @@ return result; } -/************************************************************************* - * @brief testResetBloodFlowDataPublishIntervalOverride +/*********************************************************************//** + * @brief * The testResetBloodFlowDataPublishIntervalOverride function resets the override \n * of the blood flow data publish interval. * @details @@ -937,7 +1041,7 @@ return result; } -/************************************************************************* +/*********************************************************************//** * @brief * The testSetTargetBloodFlowRateOverride function overrides the target \n * blood flow rate. @@ -972,14 +1076,13 @@ return result; } -/************************************************************************* +/*********************************************************************//** * @brief * The testResetTargetBloodFlowRateOverride function resets the override of the \n * target blood flow rate. * @details * Inputs : none * Outputs : targetBloodFlowRate - * @param none * @return TRUE if override reset successful, FALSE if not *************************************************************************/ BOOL testResetTargetBloodFlowRateOverride( void ) @@ -998,7 +1101,7 @@ return result; } -/************************************************************************* +/*********************************************************************//** * @brief * The testResetMeasuredBloodFlowRateOverride function overrides the measured \n * blood flow rate. @@ -1022,7 +1125,7 @@ return result; } -/************************************************************************* +/*********************************************************************//** * @brief * The testResetOffButtonStateOverride function resets the override of the \n * measured blood flow rate. @@ -1045,7 +1148,7 @@ return result; } -/************************************************************************* +/*********************************************************************//** * @brief * The testSetMeasuredBloodPumpRotorSpeedOverride function overrides the measured \n * blood pump rotor speed. @@ -1069,7 +1172,7 @@ return result; } -/************************************************************************* +/*********************************************************************//** * @brief * The testResetMeasuredBloodPumpRotorSpeedOverride function resets the override of the \n * measured blood pump rotor speed. @@ -1092,7 +1195,7 @@ return result; } -/************************************************************************* +/*********************************************************************//** * @brief * The testSetMeasuredBloodPumpSpeedOverride function overrides the measured \n * blood pump motor speed. @@ -1116,7 +1219,7 @@ return result; } -/************************************************************************* +/*********************************************************************//** * @brief * The testResetMeasuredBloodPumpSpeedOverride function resets the override of the \n * measured blood pump motor speed. @@ -1139,7 +1242,7 @@ return result; } -/************************************************************************* +/*********************************************************************//** * @brief * The testSetMeasuredBloodPumpMCSpeedOverride function overrides the measured \n * blood pump motor speed. @@ -1163,7 +1266,7 @@ return result; } -/************************************************************************* +/*********************************************************************//** * @brief * The testResetMeasuredBloodPumpMCSpeedOverride function resets the override of the \n * measured blood pump motor speed. @@ -1186,7 +1289,7 @@ return result; } -/************************************************************************* +/*********************************************************************//** * @brief * The testSetMeasuredBloodPumpMCCurrentOverride function overrides the measured \n * blood pump motor current. @@ -1210,7 +1313,7 @@ return result; } -/************************************************************************* +/*********************************************************************//** * @brief * The testResetMeasuredBloodPumpMCCurrentOverride function resets the override of the \n * measured blood pump motor current. @@ -1233,4 +1336,4 @@ return result; } - +/**@}*/