/************************************************************************** * * Copyright (c) 2019-2021 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 FluidLeak.c * * @author (last) Peman Montazemi * @date (last) 09-Mar-2021 * * @author (original) Peman Montazemi * @date (original) 09-Mar-2021 * ***************************************************************************/ #include "AlarmMgmt.h" #include "FluidLeak.h" #include "FPGA.h" #include "MessageSupport.h" #include "OperationModes.h" #include "SystemCommMessages.h" #include "TaskPriority.h" #include "Timers.h" /** * @addtogroup FluidLeak * @{ */ // ********** private definitions ********** #define FLUID_LEAK_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Interval (ms/task time) at which the fluid leak data is published on the CAN bus. // ********** private data ********** static U32 fluidLeakStatePublicationTimerCounter = 0; ///< Timer counter used to schedule fluid leak publication to CAN bus. /// Interval (in ms) at which to publish fluid leak data to CAN bus. static OVERRIDE_U32_T fluidLeakStatePublishInterval = { FLUID_LEAK_PUB_INTERVAL, FLUID_LEAK_PUB_INTERVAL, 0, 0 }; static OVERRIDE_U32_T fluidLeakState; ///< Detected fluid leak state for fluid leak detector. // ********** private function prototypes ********** static void publishFluidLeakState( void ); /*********************************************************************//** * @brief * The initFluidLeak function initializes the Fluid Leak module. * @details Inputs: none * @details Outputs: Fluid Leak module initialized. * @return none *************************************************************************/ void initFluidLeak( void ) { fluidLeakState.data = FLUID_LEAK_STATE_DRY; fluidLeakState.ovData = FLUID_LEAK_STATE_DRY; fluidLeakState.ovInitData = FLUID_LEAK_STATE_DRY; fluidLeakState.override = OVERRIDE_RESET; } /*********************************************************************//** * @brief * The execFluidLeak function executes the fluid leak monitor. * @details Inputs: FPGA fluid leak state GPIO pin state * @details Outputs: fluidLeakState * @return none *************************************************************************/ void execFluidLeak( void ) { BOOL noFluidLeakDetected = noFPGAFluidLeakDetected(); if ( getCurrentOperationMode() != DG_MODE_INIT ) { // Get latest state reading if ( TRUE == noFluidLeakDetected ) { fluidLeakState.data = FLUID_LEAK_STATE_DRY; } else { fluidLeakState.data = FLUID_LEAK_STATE_WET; } // Check state reading and act upon if ( FLUID_LEAK_STATE_WET == getFluidLeakState() ) { activateAlarmNoData( ALARM_ID_DG_FLUID_LEAK_DETECTED ); } else // FLUID_LEAK_STATE_DRY == getFluidLeakState() { clearAlarmCondition( ALARM_ID_DG_FLUID_LEAK_DETECTED ); } } // Publish fluid leak state if due publishFluidLeakState(); } /*********************************************************************//** * @brief * The getFluidLeakState function gets the current reading for the fluid * leak detector. * @details Inputs: fluidLeakState * @details Outputs: none * @param none * @return the current fluid leak state. *************************************************************************/ FLUID_LEAK_STATES_T getFluidLeakState( void ) { FLUID_LEAK_STATES_T result = (FLUID_LEAK_STATES_T)fluidLeakState.data; if ( OVERRIDE_KEY == fluidLeakState.override ) { result = (FLUID_LEAK_STATES_T)fluidLeakState.ovData; } return result; } /*********************************************************************//** * @brief * The publishFluidLeakState function publishes fluid leak state at the set interval. * @details Inputs: fluidLeakState * @details Outputs: if broadcast is due, send fluid leak state * @return none *************************************************************************/ static void publishFluidLeakState( void ) { // Publish fluid leak state on interval if ( ++fluidLeakStatePublicationTimerCounter >= getU32OverrideValue( &fluidLeakStatePublishInterval ) ) { U32 state = (U32)getFluidLeakState(); broadcastData( MSG_ID_DG_FLUID_LEAK_STATE, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&state, sizeof( U32 ) ); fluidLeakStatePublicationTimerCounter = 0; } } /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ /*********************************************************************//** * @brief * The testSetFluidLeakStatePublishIntervalOverride function overrides the * fluid leak state publish interval. * @details Inputs: none * @details Outputs: fluidLeakStatePublishInterval * @param value override fluid leak state publish interval with (in ms) * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testSetFluidLeakStatePublishIntervalOverride( U32 value ) { BOOL result = FALSE; if ( TRUE == isTestingActivated() ) { U32 intvl = value / TASK_PRIORITY_INTERVAL; result = TRUE; fluidLeakStatePublishInterval.ovData = intvl; fluidLeakStatePublishInterval.override = OVERRIDE_KEY; } return result; } /*********************************************************************//** * @brief * The testResetFluidLeakStatePublishIntervalOverride function resets the override * of the fluid leak state publish interval. * @details Inputs: none * @details Outputs: fluidLeakStatePublishInterval * @return TRUE if override reset successful, FALSE if not *************************************************************************/ BOOL testResetFluidLeakStatePublishIntervalOverride( void ) { BOOL result = FALSE; if ( TRUE == isTestingActivated() ) { result = TRUE; fluidLeakStatePublishInterval.override = OVERRIDE_RESET; fluidLeakStatePublishInterval.ovData = fluidLeakStatePublishInterval.ovInitData; } return result; } /*********************************************************************//** * @brief * The testSetFluidLeakStateOverride function overrides the state * of the fluid leak detector. * @details Inputs: none * @details Outputs: fluidLeakState * @param none * @param state override fluid leak detector with this * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testSetFluidLeakStateOverride( FLUID_LEAK_STATES_T state ) { BOOL result = FALSE; if ( ( state < NUM_OF_FLUID_LEAK_STATES ) ) { if ( TRUE == isTestingActivated() ) { result = TRUE; fluidLeakState.ovData = (U32)state; fluidLeakState.override = OVERRIDE_KEY; } } return result; } /*********************************************************************//** * @brief * The testResetFluidLeakStateOverride function resets the override of the * fluid leak detector. * @details Inputs: none * @details Outputs: fluidLeakState * @param none * @return TRUE if reset successful, FALSE if not *************************************************************************/ BOOL testResetFluidLeakStateOverride( void ) { BOOL result = FALSE; if ( TRUE == isTestingActivated() ) { result = TRUE; fluidLeakState.override = OVERRIDE_RESET; fluidLeakState.ovData = fluidLeakState.ovInitData; } return result; } /**@}*/