Index: firmware/App/Controllers/AirPump.c =================================================================== diff -u -r395522dffef1348e176564925656012f529c1910 -rc70a43525f1db35c45d79d4e1b2f87f7ea84e579 --- firmware/App/Controllers/AirPump.c (.../AirPump.c) (revision 395522dffef1348e176564925656012f529c1910) +++ firmware/App/Controllers/AirPump.c (.../AirPump.c) (revision c70a43525f1db35c45d79d4e1b2f87f7ea84e579) @@ -38,14 +38,15 @@ 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 U16 currentAirPumpRPM; ///< Current air pump RPM. +static F32 currentAirPumpPowerLevel; ///< Current air pump power level setting in % duty cycle (0..100%). static U32 airPumpDataPublicationTimerCounter; ///< Air pump data broadcast timer counter. static OVERRIDE_U32_T airPumpDataPublishInterval; ///< Air pump data broadcast interval (in ms). @@ -86,24 +87,40 @@ * @details \b Outputs: currentAirPumpState, currentAirPumpMotorPowerLevel * @param state Air pump state to set * @param power Power level to set air pump to - * @return none + * @return TRUE if set else FALSE *************************************************************************/ -void setAirPumpState( AIR_PUMP_STATE_T state, U08 power ) +BOOL setAirPumpState( AIR_PUMP_STATE_T state, F32 power ) { - if ( state < NUM_OF_AIR_PUMP_STATES ) + BOOL result = FALSE; + //There is a limitation on the TD circuit to be able to run the pump at the low speed. change planned in next version of the board. right now limiting the pump duty cycle below 24% + //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 ( FALSE == validInput ) { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_TD_AIR_PUMP_DUTY_CYCLE_OUT_OF_RANGE, power ) + result = FALSE; + } + // unsigned integer never be less than 0 + else if ( state < NUM_OF_AIR_PUMP_STATES ) + { currentAirPumpState = state; // power level should be 0 (OFF) when pump state is not ON if ( state != AIR_PUMP_STATE_ON ) { 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 result; } /*********************************************************************//** @@ -128,6 +145,9 @@ *************************************************************************/ void execAirPumpController( void ) { + // update the speed every tick + currentAirPumpRPM = getAirPumpMotorRPM(); + switch( currentAirPumpState ) { case AIR_PUMP_STATE_INIT: @@ -221,7 +241,12 @@ AIR_PUMP_PAYLOAD_T data; data.h12State = getAirPumpState(); - data.h12Power = (U32)currentAirPumpPowerLevel; + data.h12Power = currentAirPumpPowerLevel; + data.h12Rpm = (U32)currentAirPumpRPM; + //TODO:remove after validating pump speed + data.fpgah12Rpm = getAirPumpMotorFPGARPM(); + //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; @@ -263,6 +288,7 @@ BOOL testSetAirPump( MESSAGE_T *message ) { BOOL result = FALSE; + // Verify tester has logged in with TD and override type is valid if ( TRUE == isTestingActivated() ) { @@ -273,9 +299,9 @@ 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 ); - result = TRUE; - } + + result = setAirPumpState( (AIR_PUMP_STATE_T)payload.h12State, payload.h12Power ); + } } return result;