/************************************************************************** * * 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 BloodLeak.c * * @author (last) Peman Montazemi * @date (last) 18-Mar-2021 * * @author (original) Peman Montazemi * @date (original) 18-Mar-2021 * ***************************************************************************/ #include "AlarmMgmt.h" #include "BloodLeak.h" #include "FPGA.h" #include "OperationModes.h" #include "SystemCommMessages.h" #include "TaskPriority.h" #include "Timers.h" /** * @addtogroup BloodLeak * @{ */ // ********** private definitions ********** #define BLOOD_LEAK_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Interval (ms/task time) at which the blood leak data is published on the CAN bus. /// Defined states for the blood leak detector state machine. typedef enum BloodLeak_States { BLOOD_LEAK_INIT_STATE = 0, ///< Initial state BLOOD_LEAK_ZERO_STATE, ///< Zero state BLOOD_LEAK_SELF_TEST_STATE, ///< Self-test state BLOOD_LEAK_NORMAL_STATE, ///< Normal state NUM_OF_BLOOD_LEAK_DETECTOR_STATES ///< Number of blood leak detector states } BLOOD_LEAK_STATE_T; // ********** private data ********** static OVERRIDE_U32_T bloodLeakState; ///< Current state of blood leak state machine. static U32 bloodLeakStatePublicationTimerCounter = 0; ///< Timer counter used to schedule blood leak publication to CAN bus. static U32 bloodLeakSelfTestTimerCount = 0; ///< Timer counter for blood leak self-test. /// Interval (in ms) at which to publish blood leak data to CAN bus. static OVERRIDE_U32_T bloodLeakStatePublishInterval = { BLOOD_LEAK_PUB_INTERVAL, BLOOD_LEAK_PUB_INTERVAL, 0, 0 }; static OVERRIDE_U32_T bloodLeakStatus; ///< Detected blood leak status for blood leak detector. // ********** private function prototypes ********** static void publishBloodLeakState( void ); static U32 getPublishBloodLeakStateInterval( void ); /*********************************************************************//** * @brief * The initBloodLeak function initializes the Blood Leak module. * @details Inputs: none * @details Outputs: Blood Leak module initialized. * @return none *************************************************************************/ void initBloodLeak( void ) { bloodLeakState.data = BLOOD_LEAK_INIT_STATE; bloodLeakStatus.data = BLOOD_LEAK_NOT_DETECTED; } /*********************************************************************//** * @brief * The zeroBloodLeak function puts the Blood Leak module into zeroing state. * @details Inputs: none * @details Outputs: Blood Leak module zeroing. * @return none *************************************************************************/ void zeroBloodLeak( void ) { bloodLeakState.data = BLOOD_LEAK_ZERO_STATE; //setBloodLeakZero(); } /*********************************************************************//** * @brief * The execBloodLeak function executes the blood leak monitor. * @details Inputs: FPGA blood leak state GPIO pin state * @details Outputs: bloodLeakState * @return none *************************************************************************/ void execBloodLeak( void ) { BOOL noBloodLeakDetected = noFPGABloodLeakDetected(); if ( getCurrentOperationMode() != MODE_INIT ) { // Get latest state reading if ( TRUE == noBloodLeakDetected ) { bloodLeakState.data = BLOOD_LEAK_NOT_DETECTED; } else { bloodLeakState.data = BLOOD_LEAK_DETECTED; } // Check state reading and act upon if ( BLOOD_LEAK_DETECTED == getBloodLeakState() ) { activateAlarmNoData( ALARM_ID_HD_BLOOD_LEAK_DETECTED ); } else // BLOOD_LEAK_NOT_DETECTED == getBloodLeakState() { clearAlarmCondition( ALARM_ID_HD_BLOOD_LEAK_DETECTED ); } } // Publish blood leak state if due publishBloodLeakState(); } /*********************************************************************//** * @brief * The getBloodLeakState function gets the current reading for the blood * leak detector. * @details Inputs: bloodLeakState * @details Outputs: none * @return the current blood leak state. *************************************************************************/ BLOOD_LEAK_STATES_T getBloodLeakState( void ) { BLOOD_LEAK_STATES_T result = (BLOOD_LEAK_STATES_T)bloodLeakState.data; if ( OVERRIDE_KEY == bloodLeakState.override ) { result = (BLOOD_LEAK_STATES_T)bloodLeakState.ovData; } return result; } /*********************************************************************//** * @brief * The getPublishBloodLeakStateInterval function gets the blood leak state * publication interval. * @details Inputs: bloodLeakStatePublishInterval * @details Outputs: none * @return the current blood leak state publication interval (in task intervals). *************************************************************************/ static U32 getPublishBloodLeakStateInterval( void ) { U32 result = bloodLeakStatePublishInterval.data; if ( OVERRIDE_KEY == bloodLeakStatePublishInterval.override ) { result = bloodLeakStatePublishInterval.ovData; } return result; } /*********************************************************************//** * @brief * The publishBloodLeakState function publishes blood leak state at the set interval. * @details Inputs: bloodLeakState * @details Outputs: if broadcast is due, send blood leak state * @return none *************************************************************************/ static void publishBloodLeakState( void ) { // Publish blood leak state on interval if ( ++bloodLeakStatePublicationTimerCounter >= getPublishBloodLeakStateInterval() ) { BLOOD_LEAK_STATES_T state = getBloodLeakState(); broadcastBloodLeakState( state ); bloodLeakStatePublicationTimerCounter = 0; } } /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ /*********************************************************************//** * @brief * The testSetBloodLeakStatePublishIntervalOverride function overrides the * blood leak state publish interval. * @details Inputs: none * @details Outputs: bloodLeakStatePublishInterval * @param value override blood leak state publish interval with (in ms) * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testSetBloodLeakStatePublishIntervalOverride( U32 value ) { BOOL result = FALSE; if ( TRUE == isTestingActivated() ) { U32 intvl = value / TASK_PRIORITY_INTERVAL; result = TRUE; bloodLeakStatePublishInterval.ovData = intvl; bloodLeakStatePublishInterval.override = OVERRIDE_KEY; } return result; } /*********************************************************************//** * @brief * The testResetBloodLeakStatePublishIntervalOverride function resets the override * of the blood leak state publish interval. * @details Inputs: none * @details Outputs: bloodLeakStatePublishInterval * @return TRUE if override reset successful, FALSE if not *************************************************************************/ BOOL testResetBloodLeakStatePublishIntervalOverride( void ) { BOOL result = FALSE; if ( TRUE == isTestingActivated() ) { result = TRUE; bloodLeakStatePublishInterval.override = OVERRIDE_RESET; bloodLeakStatePublishInterval.ovData = bloodLeakStatePublishInterval.ovInitData; } return result; } /*********************************************************************//** * @brief * The testSetBloodLeakStateOverride function overrides the state * of the blood leak detector. * @details Inputs: none * @details Outputs: bloodLeakState * @param none * @param state override blood leak detector with this * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testSetBloodLeakStateOverride( BLOOD_LEAK_STATES_T state ) { BOOL result = FALSE; if ( ( state < NUM_OF_BLOOD_LEAK_STATES ) ) { if ( TRUE == isTestingActivated() ) { result = TRUE; bloodLeakState.ovData = (U32)state; bloodLeakState.override = OVERRIDE_KEY; } } return result; } /*********************************************************************//** * @brief * The testResetBloodLeakStateOverride function resets the override of the * blood leak detector. * @details Inputs: none * @details Outputs: bloodLeakState * @param none * @return TRUE if reset successful, FALSE if not *************************************************************************/ BOOL testResetBloodLeakStateOverride( void ) { BOOL result = FALSE; if ( TRUE == isTestingActivated() ) { result = TRUE; bloodLeakState.override = OVERRIDE_RESET; bloodLeakState.ovData = bloodLeakState.ovInitData; } return result; } /**@}*/