Index: firmware/App/Controllers/AirTrap.c =================================================================== diff -u -r4ed766fe84660297858a9af1651e93ff0c4d71f1 -rcecd0a4cd30e14aa9a193ca3e7bf8a27e7a7e5e4 --- firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision 4ed766fe84660297858a9af1651e93ff0c4d71f1) +++ firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision cecd0a4cd30e14aa9a193ca3e7bf8a27e7a7e5e4) @@ -52,20 +52,13 @@ #define AIR_PUMP_MOTOR_FILL_PWM 60.0F ///< Power level setting (PWM) in percentage for H12 air pump to fill (raise level) the air trap. #define AIR_PUMP_MOTOR_LOWER_PWM 24.0F ///< Power level setting (PWM) in percentage for H12 air pump to lower the level of the air trap. -// keeping it here till i get the system team's test result -#ifndef AIR_PUMP_PERCENTAGE_DUTY_CYCLE +/// ax2 + bx + c, x is long filtered venous pressure, a,b,c is quadratic coefficients +#define QUADRATIC_EVAL(a,b,c,x) ( ( ( a ) * ( x ) * ( x) ) + ( ( b ) * ( x ) ) + ( c ) ) /// LDT-2384 test formula for air trap lower events for air pump duty cycle based on venous pressure -/// air pump lowering scalar PWM = 0.0005x^2 + 0.2313x + 63.667, where x is long filtered (60 sec) H14 venous pressure in mmHg before air pump lower event -#define QUADRATIC_COEFFICIENT 0.0005F ///< X2 quadratic coefficient -#define LINEAR_COEFFICIENT 0.2313F ///< X linear coefficient -#define CONSTANT_TERM 63.667F ///< Constant term -#else -/// LDT-2384 test formula for air trap lower events for air pump duty cycle based on venous pressure /// air pump duty cycle (% PWM) = 0.0002x^2 + 0.0925x + 25.467, where x is long filtered H14 venous pressure in mmHg before air trap lower event -#define QUADRATIC_COEFFICIENT 0.0002F ///< X2 quadratic coefficient -#define LINEAR_COEFFICIENT 0.0925F ///< X linear coefficient +#define QUADRATIC_COEFFICIENT 0.0002F ///< X2 -quadratic coefficient +#define LINEAR_COEFFICIENT 0.0925F ///< X -linear coefficient #define CONSTANT_TERM 25.467F ///< Constant term -#endif /// Defined states for the air trap controller state machine. typedef enum AirTrap_States @@ -78,6 +71,13 @@ NUM_OF_AIR_TRAP_STATES ///< Number of air trap controller states. } AIR_TRAP_STATE_T; +/// Quadratic coefficients ax2 + bx + c +typedef struct { + float a; ///< Coefficient for Quadratic term + float b; ///< Coefficient for linear term + float c; ///< Constant term +}QUADRATIC_COEFFICIENTS_T; + // ********** private data ********** static AIR_TRAP_STATE_T airTrapControllerState; ///< Current state of air trap controller state machine. @@ -323,6 +323,7 @@ case AIR_TRAP_RAISE_LEVEL_STATE: airTrapControllerState = handleAirTrapRaiseLevelState(); + break; case AIR_TRAP_LOWER_LEVEL_STATE: @@ -349,23 +350,13 @@ F32 getCalculatedAirPumpDutyCycle( void ) { F32 h14Pressure = getLongFilteredVenousPressure(); -#ifndef AIR_PUMP_PERCENTAGE_DUTY_CYCLE /// LDT-2384 test formula for air trap lower events for air pump duty cycle based on venous pressure - /// air pump lowering PWM (scalar PWM) = 0.0005x^2 + 0.2313x + 63.667, where x is long filtered (60 sec) H14 venous pressure in mmHg before air pump lower event - F32 dutyCycle = ( ( QUADRATIC_COEFFICIENT * ( h14Pressure * h14Pressure ) ) - ( LINEAR_COEFFICIENT * ( h14Pressure ) ) ) + CONSTANT_TERM; - // covert to percentage - dutyCycle = ( dutyCycle / (F32)AIR_PUMP_MAX_PWM ) * FRACTION_TO_PERCENT_FACTOR; -#else - /// LDT-2384 test formula for air trap lower events for air pump duty cycle based on venous pressure /// air pump duty cycle (% PWM) = 0.0002x^2 + 0.0925x + 25.467, where x is long filtered H14 venous pressure in mmHg before air trap lower event - F32 duticycleInPct = ( ( QUADRATIC_COEFFICIENT * ( h14Pressure * h14Pressure ) ) - ( LINEAR_COEFFICIENT * ( h14Pressure ) ) ) + CONSTANT_TERM; -#endif + //F32 duticycleInPct = ( ( QUADRATIC_COEFFICIENT * ( h14Pressure * h14Pressure ) ) - ( LINEAR_COEFFICIENT * ( h14Pressure ) ) ) + CONSTANT_TERM; + QUADRATIC_COEFFICIENTS_T coefficients = { QUADRATIC_COEFFICIENT, LINEAR_COEFFICIENT, CONSTANT_TERM }; + F32 dutycycleInPct = QUADRATIC_EVAL( coefficients.a, coefficients.b, coefficients.c, h14Pressure ); -#ifndef AIR_PUMP_PERCENTAGE_DUTY_CYCLE - return dutyCycle; -#else - return duticycleInPct; -#endif + return dutycycleInPct; } /*********************************************************************//** @@ -411,6 +402,7 @@ { AIR_TRAP_STATE_T result = AIR_TRAP_CLOSED_STATE; BOOL setPowerResult; + // Transition to manual control state when requested if ( TRUE == pendingStopAirTrapController ) { @@ -468,16 +460,12 @@ static AIR_TRAP_STATE_T handleAirTrapRaiseLevelState( void ) { AIR_TRAP_STATE_T result = AIR_TRAP_RAISE_LEVEL_STATE; - BOOL setPowerResult; + // Transition to manual valve control state when requested if ( TRUE == pendingStopAirTrapController ) { pendingStopAirTrapController = FALSE; - setPowerResult = setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); - if ( FALSE == setPowerResult ) - { - // TODO: Alarm - } + setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); result = AIR_TRAP_MANUAL_CONTROL_STATE; } @@ -488,11 +476,7 @@ set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_OPEN_STATE ); // open valve H13 to allow air to be pumped into air trap from atmosphere airTrapAirPumpLowerPowerLevel.data = getCalculatedAirPumpDutyCycle(); - setPowerResult = setAirPumpState( AIR_PUMP_STATE_ON, getAirPumpLowerPowerLevel() ); - if ( FALSE == setPowerResult ) - { - // TODO: Alarm - } + setAirPumpState( AIR_PUMP_STATE_ON, getAirPumpLowerPowerLevel() ); // adjust the air trap lower delay start time after fill complete airTrapLowerDelayStartTime = u32DiffWithWrap( AIR_PUMP_ON_DELAY_ADJUST_AFTER_FILL, getMSTimerCount() ); airTrapLowerStartTime = getMSTimerCount(); @@ -516,29 +500,20 @@ static AIR_TRAP_STATE_T handleAirTrapLowerlevelState( void ) { AIR_TRAP_STATE_T result = AIR_TRAP_LOWER_LEVEL_STATE; - BOOL setPowerResult; // Transition to manual valve control state when requested if ( TRUE == pendingStopAirTrapController ) { pendingStopAirTrapController = FALSE; - setPowerResult = setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); - if ( FALSE == setPowerResult ) - { - // TODO: Alarm - } + setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); result = AIR_TRAP_MANUAL_CONTROL_STATE; } // Transition back to closed state when air trap lower level operation completed when air detected at upper level else if ( ( TRUE == didTimeout( airTrapLowerStartTime, AIR_PUMP_STOP_TIME_MS ) ) || ( AIR_TRAP_LEVEL_AIR == getRawLevelSensorState( H16_LEVL ) ) ) { - setPowerResult = setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); - if ( FALSE == setPowerResult ) - { - // TODO: Alarm - } + setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); airTrapLowerDelayStartTime = getMSTimerCount(); signalLowVenousPressureCheck(); @@ -560,6 +535,7 @@ static F32 getAirPumpRaisePowerLevel( void ) { F32 result = getF32OverrideValue( &airTrapAirPumpRaisePowerLevel ); + result = RANGE( result, AIR_PUMP_DUTY_CYCLE_MIN, AIR_PUMP_DUTY_CYCLE_MAX ); // limit the duty cycle to 24 if power level requested between above 0 and 24, 24 excluded if ( TRUE == ( ( result > AIR_PUMP_DUTY_CYCLE_MIN ) && ( result < AIR_PUMP_DUTY_CYCLE_LIMIT ) ) ) @@ -581,6 +557,7 @@ static F32 getAirPumpLowerPowerLevel( void ) { F32 result = getF32OverrideValue( &airTrapAirPumpLowerPowerLevel ); + result = RANGE( result, AIR_PUMP_DUTY_CYCLE_MIN, AIR_PUMP_DUTY_CYCLE_MAX ); // limit the duty cycle to 24 if power level requested between above 0 and 24, 24 excluded if ( TRUE == ( ( result > AIR_PUMP_DUTY_CYCLE_MIN ) && ( result < AIR_PUMP_DUTY_CYCLE_LIMIT ) ) )