Index: firmware/App/Controllers/AirPump.c =================================================================== diff -u -r1e806f55dd70e314a8bbb70c5233443dc807998a -re7525696d18a5a7c7481fc6a920e95d227a6e72f --- firmware/App/Controllers/AirPump.c (.../AirPump.c) (revision 1e806f55dd70e314a8bbb70c5233443dc807998a) +++ firmware/App/Controllers/AirPump.c (.../AirPump.c) (revision e7525696d18a5a7c7481fc6a920e95d227a6e72f) @@ -93,8 +93,10 @@ BOOL setAirPumpState( AIR_PUMP_STATE_T state, F32 power ) { BOOL result = FALSE; + //BOOL validInput = ( power == AIR_PUMP_DUTY_CYCLE_MIN) || ( power >= AIR_PUMP_DUTY_CYCLE_LIMIT && power <= AIR_PUMP_DUTY_CYCLE_MAX); + BOOL validInput = ( ( ( power >= AIR_PUMP_DUTY_CYCLE_MIN ) && ( power <= AIR_PUMP_DUTY_CYCLE_MAX ) ) && ( FALSE == ( ( power > AIR_PUMP_DUTY_CYCLE_MIN ) && ( power < AIR_PUMP_DUTY_CYCLE_LIMIT ) ) ) ); // need to pass the result immediately to user when user enter invalid range - if ( ( power < AIR_PUMP_DUTY_CYCLE_MIN ) && ( power > AIR_PUMP_DUTY_CYCLE_MAX ) ) + if ( FALSE == validInput ) { result = FALSE; } Index: firmware/App/Controllers/AirTrap.c =================================================================== diff -u -r1e806f55dd70e314a8bbb70c5233443dc807998a -re7525696d18a5a7c7481fc6a920e95d227a6e72f --- firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision 1e806f55dd70e314a8bbb70c5233443dc807998a) +++ firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision e7525696d18a5a7c7481fc6a920e95d227a6e72f) @@ -345,6 +345,7 @@ F32 dutyCycle = ( ( QUADRATIC_COEFFICIENT * ( h14Pressure * h14Pressure ) ) - ( LINEAR_COEFFICIENT * ( h14Pressure ) ) ) + CONSTANT_TERM; dutyCycle = ( dutyCycle / (F32)AIR_PUMP_MAX_PWM ) * FRACTION_TO_PERCENT_FACTOR; + return dutyCycle; } @@ -359,12 +360,17 @@ static AIR_TRAP_STATE_T handleAirTrapManualControlState( void ) { AIR_TRAP_STATE_T result = AIR_TRAP_MANUAL_CONTROL_STATE; + BOOL setPowerResult; // Transition to valve control states when requested if ( TRUE == pendingStartAirTrapController ) { pendingStartAirTrapController = FALSE; - setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); + setPowerResult = setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); + if ( FALSE == setPowerResult ) + { + // TODO: Alarm + } set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); result = AIR_TRAP_CLOSED_STATE; @@ -385,7 +391,7 @@ static AIR_TRAP_STATE_T handleAirTrapClosedState( void ) { AIR_TRAP_STATE_T result = AIR_TRAP_CLOSED_STATE; - + BOOL setPowerResult; // Transition to manual control state when requested if ( TRUE == pendingStopAirTrapController ) { @@ -401,7 +407,11 @@ { 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(); - setAirPumpState( AIR_PUMP_STATE_ON, getAirPumpLowerPowerLevel() ); + setPowerResult = setAirPumpState( AIR_PUMP_STATE_ON, getAirPumpLowerPowerLevel() ); + if ( FALSE == setPowerResult ) + { + // TODO: Alarm + } airTrapLowerStartTime = getMSTimerCount(); signalInitiatePressureStabilization( USE_SHORT_STABILIZATION_PERIOD ); SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_AIR_TRAP_LOWER, ON, 0 ); @@ -413,7 +423,11 @@ else if ( ( airTrapWasFilledAtStartOfTreatement != TRUE ) || ( AIR_TRAP_LEVEL_AIR == getLevelSensorState( H17_LEVL ) ) ) { - setAirPumpState( AIR_PUMP_STATE_ON, getAirPumpRaisePowerLevel() ); + setPowerResult = setAirPumpState( AIR_PUMP_STATE_ON, getAirPumpRaisePowerLevel() ); + if ( FALSE == setPowerResult ) + { + // TODO: Alarm + } set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_OPEN_STATE ); // open valve H20 to allow air to be pumped out of air trap to atmosphere airTrapFillStartTime = getMSTimerCount(); SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_AIR_TRAP_FILL, ON, 0 ); @@ -435,12 +449,16 @@ 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; - setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); + setPowerResult = setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); + if ( FALSE == setPowerResult ) + { + // TODO: Alarm + } set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); result = AIR_TRAP_MANUAL_CONTROL_STATE; } @@ -451,7 +469,11 @@ 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(); - setAirPumpState( AIR_PUMP_STATE_ON, getAirPumpLowerPowerLevel() ); + setPowerResult = setAirPumpState( AIR_PUMP_STATE_ON, getAirPumpLowerPowerLevel() ); + if ( FALSE == setPowerResult ) + { + // TODO: Alarm + } // adjust the air trap lower delay start time after fill complete airTrapLowerDelayStartTime = u32DiffWithWrap( AIR_PUMP_ON_DELAY_ADJUST_AFTER_FILL, getMSTimerCount() ); airTrapLowerStartTime = getMSTimerCount(); @@ -475,20 +497,29 @@ 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; - setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); + setPowerResult = setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); + if ( FALSE == setPowerResult ) + { + // TODO: Alarm + } 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 ) ) ) { - setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); + setPowerResult = setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); + if ( FALSE == setPowerResult ) + { + // TODO: Alarm + } set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); airTrapLowerDelayStartTime = getMSTimerCount(); signalLowVenousPressureCheck(); @@ -510,6 +541,12 @@ 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 ) ) ) + { + result = AIR_PUMP_DUTY_CYCLE_LIMIT; + } return result; } @@ -525,6 +562,12 @@ 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 ) ) ) + { + result = AIR_PUMP_DUTY_CYCLE_LIMIT; + } return result; } Index: firmware/App/Drivers/GLXferPump.h =================================================================== diff -u -r1e806f55dd70e314a8bbb70c5233443dc807998a -re7525696d18a5a7c7481fc6a920e95d227a6e72f --- firmware/App/Drivers/GLXferPump.h (.../GLXferPump.h) (revision 1e806f55dd70e314a8bbb70c5233443dc807998a) +++ firmware/App/Drivers/GLXferPump.h (.../GLXferPump.h) (revision e7525696d18a5a7c7481fc6a920e95d227a6e72f) @@ -36,6 +36,7 @@ #define AIR_PUMP_MOTOR_OFF 0.0F ///< Power level setting (PWM) for H12 air pump to turn pump off. #define AIR_PUMP_DUTY_CYCLE_MIN 0.0F ///< Air pump minimum duty cycle in percentage #define AIR_PUMP_DUTY_CYCLE_MAX 100.0F ///< Air pump maximum duty cycle in percentage +#define AIR_PUMP_DUTY_CYCLE_LIMIT 24.0F ///< Air pump limit duty cycle in percentage from 1- 23 as invalid #define AIR_PUMP_MAX_PWM 250 ///< Air pump maximum PWM, FPGA ignores 251-255 // ********** public function prototypes **********