/************************************************************************** * * Copyright (c) 2019-2022 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) Michael Garthwaite * @date (last) 21-Nov-2022 * * @author (original) Michael Garthwaite * @date (original) 21-Nov-2022 * ***************************************************************************/ #include "reg_het.h" #include "gio.h" #include "AirPump.h" #include "AlarmMgmt.h" #include "ModeTreatmentParams.h" #include "OperationModes.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" #include "TaskPriority.h" #include "Timers.h" /** * @addtogroup AirPump * @{ */ // ********** private definitions ********** #define AIR_PUMP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) #define DATA_PUBLISH_COUNTER_START_COUNT #define AIR_PUMP_GPIO_PIN 0x04 typedef enum AirPumpMotorStates { AIR_PUMP_MOTOR_OFF = 0, ///< Air Pump Off AIR_PUMP_MOTOR_ON, ///< Air Pump On NUM_OF_AIR_PUMP_MOTOR_STATES, } AIR_PUMP_MOTOR_STATE_T; // ********** private data ********** static const U32 AIR_PUMP_STATUS_PERSISTENCE = ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ); static AIR_PUMP_MOTOR_STATE_T currentAirPumpMotorState; static AIR_PUMP_STATE_T currentAirPumpState; static U32 airPumpDataPublicationTimerCounter; static OVERRIDE_U32_T airPumpDataPublishInterval = { AIR_PUMP_DATA_PUB_INTERVAL, AIR_PUMP_DATA_PUB_INTERVAL, 0, 0 }; // ********** private function prototypes ********** static AIR_PUMP_STATE_T handleAirPumpStartState( void ); static AIR_PUMP_STATE_T handleAirPumpOffState( void ); static AIR_PUMP_STATE_T handleAirPumpOnState ( void ); static void publishAirPumpData( void ); void initAirPump(void) { currentAirPumpMotorState = AIR_PUMP_MOTOR_OFF; currentAirPumpState = AIR_PUMP_STATE_START; } static void setAirPumpMotor( AIR_PUMP_MOTOR_STATE_T state ) { if ( state < NUM_OF_AIR_PUMP_MOTOR_STATES ) { gioSetBit( hetPORT1, AIR_PUMP_GPIO_PIN, (U32)state ); } else { // hard fault } } void setAirPumpState( AIR_PUMP_STATE_T state ) { if ( state < NUM_OF_AIR_PUMP_STATES ) { currentAirPumpState = state; } else { // hard fault } } AIR_PUMP_STATE_T getAirPumpState( void ) { return currentAirPumpState; } void execAirPumpController( void ) { switch( currentAirPumpState ) { case AIR_PUMP_STATE_START: currentAirPumpState = handleAirPumpStartState(); break; case AIR_PUMP_STATE_OFF: currentAirPumpState = handleAirPumpOffState(); break; case AIR_PUMP_STATE_ON: currentAirPumpState = handleAirPumpOnState(); break; default: //hard fault break; } publishAirPumpData(); } static AIR_PUMP_STATE_T handleAirPumpStartState( void ) { AIR_PUMP_STATE_T state = AIR_PUMP_STATE_OFF; return state; } static AIR_PUMP_STATE_T handleAirPumpOffState( void ) { AIR_PUMP_STATE_T state = AIR_PUMP_STATE_OFF; setAirPumpMotor( AIR_PUMP_MOTOR_OFF ); return state; } static AIR_PUMP_STATE_T handleAirPumpOnState( void ) { AIR_PUMP_STATE_T state = AIR_PUMP_STATE_ON; setAirPumpMotor( AIR_PUMP_MOTOR_ON ); return state; } static void publishAirPumpData( void ) { if (++airPumpDataPublicationTimerCounter >= getU32OverrideValue( &airPumpDataPublishInterval ) ) { AIR_PUMP_PAYLOAD_T data; data.airPumpStateStatus = getAirPumpState(); broadcastData( MSG_ID_HD_AIR_PUMP_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&data, sizeof( AIR_PUMP_PAYLOAD_T ) ); } } /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ /*********************************************************************//** * @brief * The testSetAirPumpDataPublishIntervalOverride function overrides the * air pump data publish interval. * @details Inputs: none * @details Outputs: airTrapDataPublishInterval * @param value override air trap data publish interval with (in ms) * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testSetAirPumpDataPublishIntervalOverride( U32 value ) { BOOL result = FALSE; if ( TRUE == isTestingActivated() ) { U32 intvl = value / TASK_GENERAL_INTERVAL; result = TRUE; airPumpDataPublishInterval.ovData = intvl; airPumpDataPublishInterval.override = OVERRIDE_KEY; } return result; } /*********************************************************************//** * @brief * The testResetAirPumpDataPublishIntervalOverride function resets the override * of the air pump data publish interval. * @details Inputs: none * @details Outputs: airPumpDataPublishInterval * @return TRUE if override reset successful, FALSE if not *************************************************************************/ BOOL testResetAirPumpDataPublishIntervalOverride( void ) { BOOL result = FALSE; if ( TRUE == isTestingActivated() ) { result = TRUE; airPumpDataPublishInterval.override = OVERRIDE_RESET; airPumpDataPublishInterval.ovData = airPumpDataPublishInterval.ovInitData; } return result; } BOOL testSetAirPump( U32 state ) { BOOL result = FALSE; if ( TRUE == isTestingActivated() ) { setAirPumpState( ( AIR_PUMP_STATE_T ) state ); result = TRUE; } return result; } /**@}*/