Index: firmware/App/Controllers/AirPump.c =================================================================== diff -u -r9d4aa5ab195ebacbfc6c569b89d841f89bfdc42c -rc8738ed391f9dab772b8ced446ee595d8075186f --- firmware/App/Controllers/AirPump.c (.../AirPump.c) (revision 9d4aa5ab195ebacbfc6c569b89d841f89bfdc42c) +++ firmware/App/Controllers/AirPump.c (.../AirPump.c) (revision c8738ed391f9dab772b8ced446ee595d8075186f) @@ -7,8 +7,8 @@ * * @file AirPump.c * -* @author (last) Dara Navaei -* @date (last) 19-Dec-2025 +* @author (last) Sameer Kalliadan Poyil +* @date (last) 02-Mar-2026 * * @author (original) Sean Nash * @date (original) 19-Sep-2024 @@ -40,16 +40,16 @@ 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 U08 airPumpStallCounter; ///< Air pump stall counter. 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). @@ -93,24 +93,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; } /*********************************************************************//** @@ -135,6 +151,7 @@ *************************************************************************/ void execAirPumpController( void ) { + // update the speed every tick currentAirPumpRPM = getAirPumpMotorRPM(); switch( currentAirPumpState ) @@ -258,8 +275,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; @@ -301,6 +322,7 @@ BOOL testSetAirPump( MESSAGE_T *message ) { BOOL result = FALSE; + // Verify tester has logged in with TD and override type is valid if ( TRUE == isTestingActivated() ) { @@ -311,9 +333,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;