Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -ra0aca1a4d87df989303b4f7f41208a4916861afa -r1f3647830e9de0a1f0a4e445ce8d72d5525f51fb --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision a0aca1a4d87df989303b4f7f41208a4916861afa) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 1f3647830e9de0a1f0a4e445ce8d72d5525f51fb) @@ -32,6 +32,8 @@ #define BP_SPEED_ADC_2_RPM_FACTOR 1.0 // conversion factor from ADC counts to RPM for blood pump motor TODO - set appropriate value #define BP_CURRENT_ADC_2_MA_FACTOR 1.0 // conversion factor from ADC counts to mA for blood pump motor TODO - set appropriate value +#define BLOOD_FLOW_DATA_PUB_INTERVAL (1000 / TASK_PRIORITY_INTERVAL) // interval (ms) at which the blood flow data is published on the CAN bus + typedef enum BloodPump_States { BLOOD_PUMP_OFF_STATE = 0, @@ -60,21 +62,23 @@ // ********** private data ********** -static BLOOD_PUMP_STATE_T bloodPumpState = BLOOD_PUMP_OFF_STATE; // current state of blood flow controller state machine -static BOOL isBloodPumpOn = FALSE; // blood pump is currently running -DATA_DECL( U32, TargetBloodFlowRate, targetBloodFlowRate, 0, 0 ); // requested blood flow rate -static U32 targetBloodFlowRateSet = 0; // currently set blood flow rate -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 +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 +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 -DATA_DECL( F32, MeasuredBloodFlowRate, measuredBloodFlowRate, 0.0, 0.0 ); // requested blood flow rate -DATA_DECL( F32, MeasuredBloodPumpSpeed, adcBloodPumpSpeedRPM, 0.0, 0.0 ); // requested blood flow rate -DATA_DECL( F32, MeasuredBloodPumpCurrent, adcBloodPumpCurrentmA, 0.0, 0.0 ); // requested blood flow rate +DATA_DECL( U32, TargetBloodFlowRate, targetBloodFlowRate, 0, 0 ); // requested blood flow rate +static U32 targetBloodFlowRateSet = 0; // currently set blood flow rate +DATA_DECL( F32, MeasuredBloodFlowRate, measuredBloodFlowRate, 0.0, 0.0 ); // measured blood flow rate +DATA_DECL( F32, MeasuredBloodPumpSpeed, adcBloodPumpSpeedRPM, 0.0, 0.0 ); // measured blood pump speed +DATA_DECL( F32, MeasuredBloodPumpCurrent, adcBloodPumpCurrentmA, 0.0, 0.0 ); // measured blood pump motor current -static BLOOD_FLOW_SELF_TEST_STATE_T bloodPumpSelfTestState = BLOOD_FLOW_SELF_TEST_STATE_START; -static U32 bloodPumpSelfTestTimerCount = 0; +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 ********** @@ -181,6 +185,18 @@ adcBloodPumpSpeedRPM.data = (F32)(SIGN_FROM_12_BIT_VALUE(bpRPM)) * BP_SPEED_ADC_2_RPM_FACTOR; adcBloodPumpCurrentmA.data = (F32)(SIGN_FROM_12_BIT_VALUE(bpmA)) * BP_CURRENT_ADC_2_MA_FACTOR; + + // publish blood flow data on interval + if ( ++bloodFlowDataPublicationTimerCounter > getPublishBloodFlowDataInterval() ) + { + U32 flowStPt = getTargetBloodFlowRate(); + F32 measFlow = getMeasuredBloodFlowRate(); + F32 measSpd = getMeasuredBloodPumpSpeed(); + F32 measCurr = getMeasuredBloodPumpCurrent(); + + broadcastBloodFlowData( flowStPt, measFlow, measSpd, measCurr ); + bloodFlowDataPublicationTimerCounter = 0; + } } /************************************************************************* @@ -360,7 +376,6 @@ static void stopBloodPump( void ) { SET_BP_STOP(); -// CLR_BP_STOP(); } /************************************************************************* @@ -375,7 +390,6 @@ static void releaseBloodPumpStop( void ) { CLR_BP_STOP(); -// SET_BP_STOP(); } /************************************************************************* @@ -409,6 +423,18 @@ } /************************************************************************* + * @brief getPublishBloodFlowDataInterval + * 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 ) + +/************************************************************************* * @brief getTargetBloodFlowRate * The getTargetBloodFlowRate function gets the current target blood flow \n * rate. @@ -463,6 +489,55 @@ /************************************************************************* + * @brief testSetBloodFlowDataPublishIntervalOverride + * The testSetBloodFlowDataPublishIntervalOverride function overrides the \n + * blood flow data publish interval. \n + * @details + * Inputs : none + * Outputs : bloodFlowDataPublishInterval + * @param value : override blood flow data publish interval with (in ms) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetBloodFlowDataPublishIntervalOverride( U32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + U32 intvl = value / TASK_PRIORITY_INTERVAL; + + result = TRUE; + bloodFlowDataPublishInterval.ovData = intvl; + bloodFlowDataPublishInterval.override = OVERRIDE_KEY; + } + + return result; +} + +/************************************************************************* + * @brief testResetBloodFlowDataPublishIntervalOverride + * The testResetBloodFlowDataPublishIntervalOverride function resets the override \n + * of the blood flow data publish interval. + * @details + * Inputs : none + * Outputs : bloodFlowDataPublishInterval + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetBloodFlowDataPublishIntervalOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + bloodFlowDataPublishInterval.override = OVERRIDE_RESET; + bloodFlowDataPublishInterval.ovData = bloodFlowDataPublishInterval.ovInitData; + } + + return result; +} + +/************************************************************************* * @brief testSetTargetBloodFlowRateOverride and testResetTargetBloodFlowRateOverride * The testSetTargetBloodFlowRateOverride function overrides the target \n * blood flow rate. \n