Index: firmware/App/Controllers/AirPump.c =================================================================== diff -u -r395522dffef1348e176564925656012f529c1910 -rf2e5da3b659f99aaa0eec9174a472529cf11b95a --- firmware/App/Controllers/AirPump.c (.../AirPump.c) (revision 395522dffef1348e176564925656012f529c1910) +++ firmware/App/Controllers/AirPump.c (.../AirPump.c) (revision f2e5da3b659f99aaa0eec9174a472529cf11b95a) @@ -38,14 +38,14 @@ typedef struct { U32 h12State; ///< Air pump state to command. - U32 h12Power; ///< Air pump power level to command. + F32 h12Power; ///< Air pump power level to command. } AIR_PUMP_SET_CMD_PAYLOAD_T; #pragma pack(pop) // ********** private data ********** static AIR_PUMP_STATE_T currentAirPumpState; ///< Current air pump control state. -static U08 currentAirPumpPowerLevel; ///< Current air pump power level setting. +static F32 currentAirPumpPowerLevel; ///< Current air pump power level setting. static U32 airPumpDataPublicationTimerCounter; ///< Air pump data broadcast timer counter. static OVERRIDE_U32_T airPumpDataPublishInterval; ///< Air pump data broadcast interval (in ms). @@ -88,7 +88,7 @@ * @param power Power level to set air pump to * @return none *************************************************************************/ -void setAirPumpState( AIR_PUMP_STATE_T state, U08 power ) +void setAirPumpState( AIR_PUMP_STATE_T state, F32 power ) { if ( state < NUM_OF_AIR_PUMP_STATES ) { @@ -221,7 +221,7 @@ AIR_PUMP_PAYLOAD_T data; data.h12State = getAirPumpState(); - data.h12Power = (U32)currentAirPumpPowerLevel; + data.h12Power = currentAirPumpPowerLevel; broadcastData( MSG_ID_TD_AIR_PUMP_DATA, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)&data, sizeof( AIR_PUMP_PAYLOAD_T ) ); airPumpDataPublicationTimerCounter = 0; @@ -273,7 +273,7 @@ AIR_PUMP_SET_CMD_PAYLOAD_T payload; memcpy( &payload, msgPayload, sizeof( AIR_PUMP_SET_CMD_PAYLOAD_T ) ); - setAirPumpState( (AIR_PUMP_STATE_T)payload.h12State, (U08)payload.h12Power ); + setAirPumpState( (AIR_PUMP_STATE_T)payload.h12State, payload.h12Power ); result = TRUE; } } Index: firmware/App/Controllers/AirPump.h =================================================================== diff -u -r395522dffef1348e176564925656012f529c1910 -rf2e5da3b659f99aaa0eec9174a472529cf11b95a --- firmware/App/Controllers/AirPump.h (.../AirPump.h) (revision 395522dffef1348e176564925656012f529c1910) +++ firmware/App/Controllers/AirPump.h (.../AirPump.h) (revision f2e5da3b659f99aaa0eec9174a472529cf11b95a) @@ -38,7 +38,7 @@ typedef struct { U32 h12State; ///< Air pump state status - U32 h12Power; ///< Air pump power level setting + F32 h12Power; ///< Air pump power level setting } AIR_PUMP_PAYLOAD_T; #pragma pack(pop) @@ -55,7 +55,7 @@ void initAirPump(void); void execAirPumpController(void); -void setAirPumpState( AIR_PUMP_STATE_T state, U08 power ); +void setAirPumpState( AIR_PUMP_STATE_T state, F32 power ); AIR_PUMP_STATE_T getAirPumpState( void ); BOOL testAirPumpDataPublishIntervalOverride( MESSAGE_T *message ); Index: firmware/App/Controllers/AirTrap.c =================================================================== diff -u -r56d02fbdb137d2665a629dd7162c44d397b6545e -rf2e5da3b659f99aaa0eec9174a472529cf11b95a --- firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision 56d02fbdb137d2665a629dd7162c44d397b6545e) +++ firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision f2e5da3b659f99aaa0eec9174a472529cf11b95a) @@ -51,10 +51,12 @@ /// Air pump on delay after fill adjustment static const U32 AIR_PUMP_ON_DELAY_ADJUST_AFTER_FILL = ( AIR_PUMP_ON_DELAY_TIME_MS - ( 1 * MS_PER_SECOND ) ); -#define AIR_PUMP_MOTOR_FILL_PWM 150 ///< Power level setting (PWM) for H12 air pump to fill (raise level) the air trap. -#define AIR_PUMP_MOTOR_LOWER_PWM 250 ///< Power level setting (PWM) for H12 air pump to lower the level of the air trap. +#define AIR_PUMP_MOTOR_FILL_PWM 58.8f ///< Power level setting (PWM) in percentage for H12 air pump to fill (raise level) the air trap. +#define AIR_PUMP_MOTOR_LOWER_PWM 23.5f ///< Power level setting (PWM) in percentage for H12 air pump to lower the level of the air trap. #define AIR_PUMP_MOTOR_MIN_PWM_OVERRIDE 60 ///< Air pump motor minimum PWM to override. -#define AIR_PUMP_MOTOR_MAX_PWM_OVERRIDE 255 ///< Air pump motor maximum PWM to override. +#define AIR_PUMP_MOTOR_MAX_PWM_OVERRIDE 250 ///< Air pump motor maximum PWM to override. +#define AIR_PUMP_MOTOR_MAX_PWM 255 ///< Air pump motor maximum PWM. +#define AIR_PUMP_MOTOR_PWM_HUNDRED_PCT 100.0f ///< Percentage calculation constant /// from air pump manufacturer's data for pump current draw based on pump speed and venous pressure mmHg, /// the currently set air pump duty cycle (raw PWM) = 0.0005x^2 + 0.2313x + 63.667, where x is H14 venous pressure in mmHg before air pump lower event #define QUADRATIC_COEFFICIENT 0.005F ///< X2 quadratic coefficient @@ -79,8 +81,8 @@ static U32 airTrapDataPublicationTimerCounter; ///< Used to schedule air trap data publication to CAN bus. static OVERRIDE_U32_T airTrapDataPublishInterval; ///< Interval (in ms) at which to publish air trap data to CAN bus. -static OVERRIDE_U32_T airTrapAirPumpRaisePowerLevel; ///< Air pump power level to use when raising the air trap blood level. -static OVERRIDE_U32_T airTrapAirPumpLowerPowerLevel; ///< Air pump power level to use when lowering the air trap blood level. +static OVERRIDE_F32_T airTrapAirPumpRaisePowerLevel; ///< Air pump power level to use when raising the air trap blood level. +static OVERRIDE_F32_T airTrapAirPumpLowerPowerLevel; ///< Air pump power level to use when lowering the air trap blood level. static BOOL pendingStartAirTrapController; ///< Flag indicates an air trap controller start request is pending. static BOOL pendingStopAirTrapController; ///< Flag indicates an air trap controller stop request is pending. @@ -99,8 +101,8 @@ static AIR_TRAP_STATE_T handleAirTrapClosedState( void ); static AIR_TRAP_STATE_T handleAirTrapRaiseLevelState( void ); static AIR_TRAP_STATE_T handleAirTrapLowerlevelState( void ); -static U08 getAirPumpRaisePowerLevel( void ); -static U08 getAirPumpLowerPowerLevel( void ); +static F32 getAirPumpRaisePowerLevel( void ); +static F32 getAirPumpLowerPowerLevel( void ); static void publishAirTrapData( void ); /*********************************************************************//** @@ -335,7 +337,7 @@ /*********************************************************************//** * @brief - * The getCalculatedAirPumpDutyCycle function get the Air Pump calculated raw dutycycle based on H14 pressure + * The getCalculatedAirPumpDutyCycle function get the Air Pump calculated percentage duty cycle based on H14 pressure * @details \b Inputs: H14 venous pressure * @details \b Outputs: none * @return dutyCyclePct @@ -345,6 +347,7 @@ F32 h14Pressure = getFilteredVenousPressure(); // the currently set P12 duty cycle (raw PWM) must be 0.0005x^2 + 0.2313x + 63.667, where x = H14 venous pressure in mmHg before air pump lower event F32 dutyCycle = ( ( QUADRATIC_COEFFICIENT * ( h14Pressure * h14Pressure ) ) - ( LINEAR_COEFFICIENT * ( h14Pressure ) ) ) + CONSTANT_TERM; + dutyCycle = ( dutyCycle / AIR_PUMP_MOTOR_MAX_PWM ) * AIR_PUMP_MOTOR_PWM_HUNDRED_PCT; return dutyCycle; } @@ -506,9 +509,9 @@ * @details \b Outputs: none * @return air pump power level for raising air trap blood level *************************************************************************/ -static U08 getAirPumpRaisePowerLevel( void ) +static F32 getAirPumpRaisePowerLevel( void ) { - U08 result = getU08OverrideValue( &airTrapAirPumpRaisePowerLevel ); + F32 result = getF32OverrideValue( &airTrapAirPumpRaisePowerLevel ); return result; } @@ -521,9 +524,9 @@ * @details \b Outputs: none * @return air pump power level for lowering air trap blood level *************************************************************************/ -static U08 getAirPumpLowerPowerLevel( void ) +static F32 getAirPumpLowerPowerLevel( void ) { - U08 result = getU08OverrideValue( &airTrapAirPumpLowerPowerLevel ); + F32 result = getF32OverrideValue( &airTrapAirPumpLowerPowerLevel ); return result; } @@ -626,7 +629,7 @@ *************************************************************************/ BOOL testAirPumpPowerRaiseOverride( MESSAGE_T *message ) { - BOOL result = u32Override( message, &airTrapAirPumpRaisePowerLevel, AIR_PUMP_MOTOR_OFF, AIR_PUMP_MOTOR_MAX_PWM_OVERRIDE ); + BOOL result = f32Override( message, &airTrapAirPumpRaisePowerLevel ); return result; } @@ -643,7 +646,7 @@ *************************************************************************/ BOOL testAirPumpPowerLowerOverride( MESSAGE_T *message ) { - BOOL result = u32Override( message, &airTrapAirPumpLowerPowerLevel, AIR_PUMP_MOTOR_OFF, AIR_PUMP_MOTOR_MAX_PWM_OVERRIDE ); + BOOL result = f32Override( message, &airTrapAirPumpLowerPowerLevel ); return result; } Index: firmware/App/Drivers/GLXferPump.c =================================================================== diff -u -r395522dffef1348e176564925656012f529c1910 -rf2e5da3b659f99aaa0eec9174a472529cf11b95a --- firmware/App/Drivers/GLXferPump.c (.../GLXferPump.c) (revision 395522dffef1348e176564925656012f529c1910) +++ firmware/App/Drivers/GLXferPump.c (.../GLXferPump.c) (revision f2e5da3b659f99aaa0eec9174a472529cf11b95a) @@ -29,13 +29,17 @@ // ********** private definitions ********** #define AIR_PUMP_PWM_TIME 20 ///< Time (in 10ns increments) per PWM register count for the air pump = 20 kHz. +#define AIR_PUMP_MAX_PWM 255.0f ///< Air pump maximum PWM. +#define AIR_PUMP_PWM_PCT 100.0f ///< Air pump pwm percentage // ********** private data ********** -static U08 currentAirPumpMotorPowerLevel; ///< Current air pump motor state: 0=off, 1..255=power level. +static F32 currentAirPumpMotorPowerLevel; ///< Current air pump motor state: 0=off, 1..255=power level. // ********** private function prototypes ********** +static U08 PercentageToScalar(F32 percentage); + /*********************************************************************//** * @brief * The initGasLiqXferPumpDriver function initializes the gas/liquid transfer @@ -58,16 +62,16 @@ * @details \b Message \b Sent: MSG_ID_TD_EVENT if changing air pump power level. * @details \b Inputs: none * @details \b Outputs: currentAirPumpMotorPowerLevel - * @param power Power level for air pump (0=off, 1..255=lower to higher power level). + * @param power Power level for air pump (0..2=off, 3..100=lower to higher power level). * @return none. *************************************************************************/ -void setAirPumpMotorPower( U08 power ) +void setAirPumpMotorPower( F32 power ) { // if state is changing, set the air pump to the given on/off state and send event if ( power != currentAirPumpMotorPowerLevel ) { - SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_AIR_PUMP_ON_OFF, (U32)currentAirPumpMotorPowerLevel, (U32)power ); - setH12AirPumpMotorPowerLevel( power ); + SEND_EVENT_WITH_2_F32_DATA(TD_EVENT_AIR_PUMP_ON_OFF, currentAirPumpMotorPowerLevel, power ); + setH12AirPumpMotorPowerLevel( PercentageToScalar( power ) ); currentAirPumpMotorPowerLevel = power; } } @@ -80,12 +84,36 @@ * @details \b Outputs: none * @return Current set power level of the air pump motor. *************************************************************************/ -U08 getAirPumpMotorPower( void ) +F32 getAirPumpMotorPower( void ) { return currentAirPumpMotorPowerLevel; } +/*********************************************************************//** + * @brief + * The PercentageToScalar function convert percentage 0-100% duty + * cycle to 0-255 scalar value. + * @details \b Inputs: none + * @details \b Outputs: none + * @param percentage Power level for air pump (0...2=off, 3-100.0 for ON). + * @return U08 8-bit PWM value (0-255) + *************************************************************************/ +static U08 PercentageToScalar(F32 percentage) { + // Clamp input to 0-100% + if ( percentage < 0.0f ) + { + percentage = 0.0f; + } + if ( percentage > AIR_PUMP_PWM_PCT ) + { + percentage = AIR_PUMP_PWM_PCT; + } + // Calculate 0-255 value (255 * percent / 100) + return (U08)( ( ( percentage * AIR_PUMP_MAX_PWM ) / AIR_PUMP_PWM_PCT ) ); +} + + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ Index: firmware/App/Drivers/GLXferPump.h =================================================================== diff -u -r395522dffef1348e176564925656012f529c1910 -rf2e5da3b659f99aaa0eec9174a472529cf11b95a --- firmware/App/Drivers/GLXferPump.h (.../GLXferPump.h) (revision 395522dffef1348e176564925656012f529c1910) +++ firmware/App/Drivers/GLXferPump.h (.../GLXferPump.h) (revision f2e5da3b659f99aaa0eec9174a472529cf11b95a) @@ -33,14 +33,13 @@ // ********** public definitions ********** -#define AIR_PUMP_MOTOR_OFF 0 ///< Power level setting (PWM) for H12 air pump to turn pump off. -#define AIR_PUMP_MOTOR_MAX_PWM 60 ///< Power level setting (PWM) maximum for H12 air pump. +#define AIR_PUMP_MOTOR_OFF 0.0f ///< Power level setting (PWM) for H12 air pump to turn pump off. // ********** public function prototypes ********** void initGasLiqXferPumpDriver( void ); -void setAirPumpMotorPower( U08 power ); -U08 getAirPumpMotorPower( void ); +void setAirPumpMotorPower( F32 power ); +F32 getAirPumpMotorPower( void ); BOOL testSetAirPump( MESSAGE_T *message );