Index: firmware/App/Controllers/AirPump.c =================================================================== diff -u -rf3a26c402a2ec88f5ee7dbb8eb7127ab5b4692aa -r285b5d82539c96524c93703d52a66fff76fb64fc --- firmware/App/Controllers/AirPump.c (.../AirPump.c) (revision f3a26c402a2ec88f5ee7dbb8eb7127ab5b4692aa) +++ firmware/App/Controllers/AirPump.c (.../AirPump.c) (revision 285b5d82539c96524c93703d52a66fff76fb64fc) @@ -36,6 +36,7 @@ // ********** 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 +62,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 +74,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 { @@ -157,7 +166,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 +186,10 @@ { AIR_PUMP_STATE_T state = AIR_PUMP_STATE_ON; - setAirPumpMotorState( AIR_PUMP_MOTOR_ON ); + if ( getAirPumpMotorPower() != currentAirPumpPowerLevel ) + { + setAirPumpMotorPower( currentAirPumpPowerLevel ); + } return state; } @@ -189,11 +205,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;