Index: firmware/App/Controllers/AirPump.c =================================================================== diff -u -r52c71d1f7ca375d7d08829a92ccf3f6363fe22a2 -r1e806f55dd70e314a8bbb70c5233443dc807998a --- firmware/App/Controllers/AirPump.c (.../AirPump.c) (revision 52c71d1f7ca375d7d08829a92ccf3f6363fe22a2) +++ firmware/App/Controllers/AirPump.c (.../AirPump.c) (revision 1e806f55dd70e314a8bbb70c5233443dc807998a) @@ -17,6 +17,7 @@ #include "AirPump.h" #include "AlarmMgmtTD.h" +#include "FpgaTD.h" #include "Messaging.h" #include "OperationModes.h" #include "PersistentAlarm.h" @@ -91,13 +92,13 @@ *************************************************************************/ BOOL setAirPumpState( AIR_PUMP_STATE_T state, F32 power ) { + BOOL result = FALSE; // 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 ) ) { - return FALSE; + result = FALSE; } - - if ( state < NUM_OF_AIR_PUMP_STATES ) + else if ( state >= AIR_PUMP_STATE_INIT && state < NUM_OF_AIR_PUMP_STATES ) { currentAirPumpState = state; // power level should be 0 (OFF) when pump state is not ON @@ -106,13 +107,15 @@ power = AIR_PUMP_MOTOR_OFF; } currentAirPumpPowerLevel = power; + result = TRUE; } else { SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_TD_AIR_PUMP_INVALID_STATE1, (U32)state ) + result = FALSE; } - return TRUE; + return result; } /*********************************************************************//** @@ -236,6 +239,8 @@ data.h12Rpm = (U32)currentAirPumpRPM; //TODO:remove after validating pump speed data.fpgah12Rpm = getH12AirPumpMotorRPM(); + //TODO:remove after validating pump speed + data.scalarPower = getAirPumpMotorScalarPower(); broadcastData( MSG_ID_TD_AIR_PUMP_DATA, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)&data, sizeof( AIR_PUMP_PAYLOAD_T ) ); airPumpDataPublicationTimerCounter = 0; Index: firmware/App/Controllers/AirPump.h =================================================================== diff -u -r52c71d1f7ca375d7d08829a92ccf3f6363fe22a2 -r1e806f55dd70e314a8bbb70c5233443dc807998a --- firmware/App/Controllers/AirPump.h (.../AirPump.h) (revision 52c71d1f7ca375d7d08829a92ccf3f6363fe22a2) +++ firmware/App/Controllers/AirPump.h (.../AirPump.h) (revision 1e806f55dd70e314a8bbb70c5233443dc807998a) @@ -42,6 +42,8 @@ U32 h12Rpm; ///< Air pump speed in RPM. //TODO: remove after validating air pump speed U32 fpgah12Rpm; ///< Air pump fpga speed in RPM. + //TODO: remove after validating air pump speed + U08 scalarPower; ///< Scalar power } AIR_PUMP_PAYLOAD_T; #pragma pack(pop) Index: firmware/App/Controllers/AirTrap.c =================================================================== diff -u -r52c71d1f7ca375d7d08829a92ccf3f6363fe22a2 -r1e806f55dd70e314a8bbb70c5233443dc807998a --- firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision 52c71d1f7ca375d7d08829a92ccf3f6363fe22a2) +++ firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision 1e806f55dd70e314a8bbb70c5233443dc807998a) @@ -51,11 +51,12 @@ #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. + /// 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 (60 sec) 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 CONSTANT_TERM 25.467F ///< Constant term +/// air pump lowering duty cycle (% 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 00.2313 ///< X linear coefficient +#define CONSTANT_TERM 63.667F ///< Constant term /// Defined states for the air trap controller state machine. typedef enum AirTrap_States @@ -340,7 +341,7 @@ { F32 h14Pressure = getLongFilteredVenousPressure(); /// 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 (60 sec) H14 venous pressure in mmHg before air trap lower event + /// air pump lowering duty cycle (% 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; dutyCycle = ( dutyCycle / (F32)AIR_PUMP_MAX_PWM ) * FRACTION_TO_PERCENT_FACTOR; @@ -553,6 +554,10 @@ data.h20State = get3WayValveState( H20_VALV ); data.isAutoControlling = isAirTrapControlling(); data.airTrapState = airTrapControllerState; + //TODO: remove after testing + data.AirPumpLowerPowerLevel = getAirPumpLowerPowerLevel(); + //TODO: remove after testing + data.AirPumpRaisePowerLevel = getAirPumpRaisePowerLevel(); broadcastData( MSG_ID_TD_AIR_TRAP_DATA, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)&data, sizeof( AIR_TRAP_PAYLOAD_T ) ); airTrapDataPublicationTimerCounter = 0; Index: firmware/App/Controllers/AirTrap.h =================================================================== diff -u -r395522dffef1348e176564925656012f529c1910 -r1e806f55dd70e314a8bbb70c5233443dc807998a --- firmware/App/Controllers/AirTrap.h (.../AirTrap.h) (revision 395522dffef1348e176564925656012f529c1910) +++ firmware/App/Controllers/AirTrap.h (.../AirTrap.h) (revision 1e806f55dd70e314a8bbb70c5233443dc807998a) @@ -45,6 +45,10 @@ U32 h20State; ///< Is air trap outlet valve open or closed BOOL isAutoControlling; ///< Flag indicates whether air trap level is being auto controlled U32 airTrapState; ///< Air trap state + // TODO: remove after testing + U32 AirPumpLowerPowerLevel; ///< Air pump lower power + // TODO: remove after testing + U32 AirPumpRaisePowerLevel; ///< Air pump raise power } AIR_TRAP_PAYLOAD_T; #pragma pack(pop) Index: firmware/App/Drivers/GLXferPump.c =================================================================== diff -u -r52c71d1f7ca375d7d08829a92ccf3f6363fe22a2 -r1e806f55dd70e314a8bbb70c5233443dc807998a --- firmware/App/Drivers/GLXferPump.c (.../GLXferPump.c) (revision 52c71d1f7ca375d7d08829a92ccf3f6363fe22a2) +++ firmware/App/Drivers/GLXferPump.c (.../GLXferPump.c) (revision 1e806f55dd70e314a8bbb70c5233443dc807998a) @@ -32,6 +32,8 @@ #define AIR_PUMP_PWM_TIME 20 ///< Time (in 10ns increments) per PWM register count for the air pump = 20 kHz. #define AIR_PUMP_RPM_FACTOR 60 ///< Air pump rpm pump factor +#define TEN_MICRO ( 10 * 1E-6F ) ///< 10 X 10^-6 +#define MOTOR_RPM_ZERO_RAW 0xFFFFU ///< Air pump Zero RPM // ********** private data ********** @@ -40,6 +42,8 @@ // ********** private function prototypes ********** static U08 convertPercentageToScalar( F32 percentage ); +// TODO: remove after validating power +static U08 scalarPowerLevel; ///< Current scalar power level /*********************************************************************//** * @brief @@ -68,7 +72,7 @@ *************************************************************************/ void setAirPumpMotorPower( F32 power ) { - U08 scalarPower = convertPercentageToScalar( power ); + U08 scalarPower = scalarPowerLevel = convertPercentageToScalar( power ); // if state is changing, set the air pump to the given on/off state and send event if ( power != currentAirPumpMotorPowerLevel ) { @@ -92,10 +96,23 @@ } /*********************************************************************//** + * @brief + * The getAirPumpMotorScalarPower function gets the current set scalar power level of the + * air pump motor. + * @details \b Inputs: none + * @details \b Outputs: scalarPowerLevel + * @return Current set scalar power level of the air pump motor. + *************************************************************************/ +F32 getAirPumpMotorScalarPower( void ) +{ + return scalarPowerLevel; +} + +/*********************************************************************//** * @brief * The getAirPumpMotorRPM function reads the air pump RPM from FPGA. * minimum RPM that reports is 400 rpm and anything slower considered 0 (0xFFFF) -* to convert the real RPM, use the formula rpm = (60.0 / getH12AirPumpMotorRPM()* 1e-6) +* to convert the real RPM, use the formula rpm = (60.0 / ( getH12AirPumpMotorRPM() * 10 * 1E-6 ) * @details \b Inputs: none * @details \b Outputs: none * @return air pump motor RPM value. @@ -105,13 +122,13 @@ F32 realRPM; U16 fpgaRPM = getH12AirPumpMotorRPM(); - if ( 0xFFFF == fpgaRPM ) + if ( MOTOR_RPM_ZERO_RAW == fpgaRPM ) { realRPM = 0.0F; } else { - realRPM = ( ( ( F32 )AIR_PUMP_RPM_FACTOR ) / ( F32 )( fpgaRPM * 1e-6F ) ); + realRPM = ( ( ( F32 )AIR_PUMP_RPM_FACTOR ) / ( F32 )( fpgaRPM * TEN_MICRO ) ); } return ( U16 )realRPM; @@ -133,7 +150,7 @@ power = RANGE( percentage, AIR_PUMP_DUTY_CYCLE_MIN, AIR_PUMP_DUTY_CYCLE_MAX ); // Calculate 0-250 scalar value = ( power / 100 ) * 250 - return (U08)( ceilf ( ( ( power / FRACTION_TO_PERCENT_FACTOR ) / (F32)AIR_PUMP_MAX_PWM ) ) ); + return (U08)( ceilf ( ( ( power / FRACTION_TO_PERCENT_FACTOR ) * (F32)AIR_PUMP_MAX_PWM ) ) ); } Index: firmware/App/Drivers/GLXferPump.h =================================================================== diff -u -ra4774f170562e33a48238cb3e3137bdd06ac374a -r1e806f55dd70e314a8bbb70c5233443dc807998a --- firmware/App/Drivers/GLXferPump.h (.../GLXferPump.h) (revision a4774f170562e33a48238cb3e3137bdd06ac374a) +++ firmware/App/Drivers/GLXferPump.h (.../GLXferPump.h) (revision 1e806f55dd70e314a8bbb70c5233443dc807998a) @@ -44,6 +44,8 @@ void setAirPumpMotorPower( F32 power ); F32 getAirPumpMotorPower( void ); U16 getAirPumpMotorRPM( void ); +// TODO:remove after testing +F32 getAirPumpMotorScalarPower( void ); BOOL testSetAirPump( MESSAGE_T *message );