Index: firmware/App/Controllers/AirPump.c =================================================================== diff -u -reffc2a8283d6528109b2401bbad70dc554db4e53 -re24a98a344ba13ceb0663b415268a7e1dd5ce99e --- firmware/App/Controllers/AirPump.c (.../AirPump.c) (revision effc2a8283d6528109b2401bbad70dc554db4e53) +++ firmware/App/Controllers/AirPump.c (.../AirPump.c) (revision e24a98a344ba13ceb0663b415268a7e1dd5ce99e) @@ -1,17 +1,17 @@ /************************************************************************** * -* Copyright (c) 2024-2024 Diality Inc. - All Rights Reserved. +* Copyright (c) 2024-2025 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file AirPump.c * -* @author (last) Sean -* @date (last) 17-Sep-2024 +* @author (last) Sean Nash +* @date (last) 29-Jul-2025 * -* @author (original) Sean -* @date (original) 17-Sep-2024 +* @author (original) Sean Nash +* @date (original) 19-Sep-2024 * ***************************************************************************/ @@ -33,9 +33,19 @@ #define AIR_PUMP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Air pump data publish interval. #define DATA_PUBLISH_COUNTER_START_COUNT 13 ///< Air pump data publish start counter. +#pragma pack(push, 1) +/// Payload record structure for air pump test set command message payload. +typedef struct +{ + U32 h12State; ///< Air pump state to command. + U32 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 U32 airPumpDataPublicationTimerCounter; ///< Air pump data broadcast timer counter. static OVERRIDE_U32_T airPumpDataPublishInterval; ///< Air pump data broadcast interval (in ms). @@ -61,6 +71,7 @@ // Initialize controller variables airPumpDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; currentAirPumpState = AIR_PUMP_STATE_INIT; + currentAirPumpPowerLevel = AIR_PUMP_MOTOR_OFF; airPumpDataPublishInterval.data = AIR_PUMP_DATA_PUB_INTERVAL; airPumpDataPublishInterval.ovData = AIR_PUMP_DATA_PUB_INTERVAL; airPumpDataPublishInterval.ovInitData = AIR_PUMP_DATA_PUB_INTERVAL; @@ -72,15 +83,22 @@ * The setAirPumpState function sets the current air pump state machine state. * @details \b Alarm: ALARM_ID_TD_SOFTWARE_FAULT if invalid state given. * @details \b Inputs: currentAirPumpState - * @details \b Outputs: currentAirPumpState + * @details \b Outputs: currentAirPumpState, currentAirPumpMotorPowerLevel * @param state Air pump state to set + * @param power Power level to set air pump to * @return none *************************************************************************/ -void setAirPumpState( AIR_PUMP_STATE_T state ) +void setAirPumpState( AIR_PUMP_STATE_T state, U08 power ) { 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; } else { @@ -92,7 +110,7 @@ * @brief * The getAirPumpState function returns the current air pump state machine. * @details \b Inputs: currentAirPumpState - * @details \b Outputs: currentAirPumpState + * @details \b Outputs: none * @return current state of the air pump state machine. *************************************************************************/ AIR_PUMP_STATE_T getAirPumpState( void ) @@ -157,7 +175,11 @@ { AIR_PUMP_STATE_T state = AIR_PUMP_STATE_OFF; - setAirPumpMotorState( AIR_PUMP_MOTOR_OFF ); + if ( getAirPumpMotorPower() != 0 ) + { + currentAirPumpPowerLevel = 0; + setAirPumpMotorPower( currentAirPumpPowerLevel ); + } return state; } @@ -173,7 +195,10 @@ { AIR_PUMP_STATE_T state = AIR_PUMP_STATE_ON; - setAirPumpMotorState( AIR_PUMP_MOTOR_ON ); + if ( getAirPumpMotorPower() != currentAirPumpPowerLevel ) + { + setAirPumpMotorPower( currentAirPumpPowerLevel ); + } return state; } @@ -189,11 +214,14 @@ *************************************************************************/ static void publishAirPumpData( void ) { + currentAirPumpPowerLevel = getAirPumpMotorPower(); // update local power setting from driver + if ( ++airPumpDataPublicationTimerCounter >= getU32OverrideValue( &airPumpDataPublishInterval ) ) { AIR_PUMP_PAYLOAD_T data; data.h12State = getAirPumpState(); + data.h12Power = (U32)currentAirPumpPowerLevel; broadcastData( MSG_ID_TD_AIR_PUMP_DATA, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)&data, sizeof( AIR_PUMP_PAYLOAD_T ) ); airPumpDataPublicationTimerCounter = 0; @@ -223,5 +251,38 @@ return result; } +/*********************************************************************//** + * @brief + * The testSetAirPump function sets the air pump to a given power level. + * @details \b Inputs: none + * @details \b Outputs: currentAirPumpMotorPowerLevel + * @param message set message from Dialin which includes the state to set + * the air pump to. + * @return TRUE if set request is successful, FALSE if not + *************************************************************************/ +BOOL testSetAirPump( MESSAGE_T *message ) +{ + BOOL result = FALSE; + // Verify tester has logged in with TD and override type is valid + if ( TRUE == isTestingActivated() ) + { + // Verify payload length is valid + if ( sizeof( U32 ) + sizeof( U32 ) == message->hdr.payloadLen ) + { + U08 *msgPayload = &message->payload[0]; + AIR_PUMP_SET_CMD_PAYLOAD_T payload; + + memcpy( &payload, msgPayload, sizeof( AIR_PUMP_SET_CMD_PAYLOAD_T ) ); + if ( payload.h12Power <= AIR_PUMP_MOTOR_MAX_PWM ) + { + setAirPumpState( (AIR_PUMP_STATE_T)payload.h12State, (U08)payload.h12Power ); + result = TRUE; + } + } + } + + return result; +} + /**@}*/