/************************************************************************** * * 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_PRIORITY_INTERVAL ) #define DATA_PUBLISH_COUNTER_START_COUNT #define AIR_PUMP_GPIO_PIN 0x24 static const U32 AIR_PUMP_STATUS_PERSISTENCE = ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ); 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 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 ( NUM_OF_AIR_PUMP_MOTOR_STATES < state ) { gioSetBit( hetPORT1, AIR_PUMP_GPIO_PIN, (BOOL) state ); } else { // hard fault } } void setAirPumpState( AIR_PUMP_STATE_T state ) { if ( NUM_OF_AIR_PUMP_STATES < state ) { currentAirPumpState = state; } else { // hard fault } } AIR_PUMP_MOTOR_STATE_T getAirPumpMotorState( void ) { return gioGetBit( hetPORT1, AIR_PUMP_GPIO_PIN ); } AIR_PUMP_STATE_T getAirPumpState( void ) { return currentAirPumpState; } void execAirPumpMonitor( void ) { AIR_PUMP_MOTOR_STATE_T state = currentAirPumpMotorState; //check if motor is running at the state we requested it to. // how to handle testers? // otherwise we alarm/fault publishAirPumpData(); } 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; /// open loop state for testing? default: //hard fault break; } } 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; if (AIR_PUMP_MOTOR_ON == getAirPumpMotorState() ) { setAirPumpMotor( AIR_PUMP_MOTOR_OFF ); } return state; } static AIR_PUMP_STATE_T handleAirPumpOnState( void ) { AIR_PUMP_STATE_T state = AIR_PUMP_STATE_ON; if (AIR_PUMP_MOTOR_OFF == getAirPumpMotorState()) { setAirPumpMotor( AIR_PUMP_MOTOR_ON ); } return state; } static void publishAirPumpData( void ) { if (++airPumpDataPublicationTimerCounter >= getU32OverrideValue( &airPumpDataPublishInterval ) ) { AIR_PUMP_PAYLOAD_T data; data.airPumpStateStatus = getAirPumpState(); data.airPumpMotorStatus = getAirPumpMotorState(); broadcastData( MSG_ID_HD_AIR_PUMP_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&data, sizeof( AIR_PUMP_PAYLOAD_T ) ); } } /*********************************************************************//** * @brief * The execAirPumpTest function executes the state machine for the air pump * self-test. * @details Inputs: none * @details Outputs: none * @return the current state of the air pump self-test. *************************************************************************/ SELF_TEST_STATUS_T execAirPumpTest( void ) { SELF_TEST_STATUS_T status = SELF_TEST_STATUS_PASSED; // TODO - Implement POST return status; } /************************************************************************* * 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; } /**@}*/