Index: firmware/App/Controllers/BloodLeak.c =================================================================== diff -u -r494fa9614f7ec4cb0f677763c499044336ea8214 -r47eb930c3f010b7933ddf1b5d2d9f1a95be90c58 --- firmware/App/Controllers/BloodLeak.c (.../BloodLeak.c) (revision 494fa9614f7ec4cb0f677763c499044336ea8214) +++ firmware/App/Controllers/BloodLeak.c (.../BloodLeak.c) (revision 47eb930c3f010b7933ddf1b5d2d9f1a95be90c58) @@ -31,6 +31,7 @@ // ********** 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. +#define BLOOD_LEAK_TIMEOUT 30 ///< Blood leak detector timeout for zeroing and self-test (15 ms extended edge detection) /// Defined states for the blood leak detector state machine. typedef enum BloodLeakStates @@ -46,6 +47,7 @@ static BLOOD_LEAK_STATES_T bloodLeakState; ///< Current state of blood leak state machine. static OVERRIDE_U32_T bloodLeakStatus; ///< Detected blood leak status for blood leak detector. +static SELF_TEST_STATUS_T bloodLeakSelfTestStatus; ///< Current status of blood leak self-test. static BOOL bloodLeakZeroRequested = FALSE; ///< Blood leak zero requested flag static U32 bloodLeakZeroStartTime = 0; ///< Blood leak zeroing start time. @@ -112,7 +114,7 @@ break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, (U32)SW_FAULT_ID_HD_INVALID_BLOOD_LEAK_STATE, (U32)bloodLeakState ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_HD_INVALID_BLOOD_LEAK_STATE, bloodLeakState ) bloodLeakState = BLOOD_LEAK_INIT_STATE; break; } @@ -170,17 +172,17 @@ { BLOOD_LEAK_STATES_T state = BLOOD_LEAK_ZERO_STATE; - if ( TRUE == didTimeout( bloodLeakZeroStartTime, 10 ) ) // TODO: Define 10 up in the code + if ( TRUE == FPGABloodLeakZeroDetected() ) { - if ( TRUE == FPGABloodLeakZeroDetected() ) + state = BLOOD_LEAK_SELF_TEST_STATE; + clearFPGABloodLeakZero(); + setFPGABloodLeakSelfTest(); + bloodLeakSelfTestStartTime = getMSTimerCount(); + } + else + { + if ( TRUE == didTimeout( bloodLeakZeroStartTime, BLOOD_LEAK_TIMEOUT ) ) { - state = BLOOD_LEAK_SELF_TEST_STATE; - clearFPGABloodLeakZero(); - setFPGABloodLeakSelfTest(); - bloodLeakSelfTestStartTime = getMSTimerCount(); - } - else - { activateAlarmNoData( ALARM_ID_HD_BLOOD_LEAK_FAULT ); } } @@ -194,21 +196,22 @@ * in self-test state. * @details Inputs: none * @details Outputs: Blood Leak module self test. - * @return none + * @return next state *************************************************************************/ static BLOOD_LEAK_STATES_T handleBloodLeakSelfTestState( void ) { - BLOOD_LEAK_STATES_T state = BLOOD_LEAK_SELF_TEST_STATE; + BLOOD_LEAK_STATES_T state = BLOOD_LEAK_NORMAL_STATE; - if ( TRUE == didTimeout( bloodLeakSelfTestStartTime, 10 ) ) // TODO: Define 10 up in the code + if ( FALSE == noFPGABloodLeakDetected() ) // Faked blood leak caused by independent MCU board { - if ( FALSE == noFPGABloodLeakDetected() ) + bloodLeakSelfTestStatus = SELF_TEST_STATUS_PASSED; + clearFPGABloodLeakSelfTest(); + } + else + { + if ( TRUE == didTimeout( bloodLeakSelfTestStartTime, BLOOD_LEAK_TIMEOUT ) ) { - state = BLOOD_LEAK_NORMAL_STATE; - clearFPGABloodLeakSelfTest(); - } - else - { + bloodLeakSelfTestStatus = SELF_TEST_STATUS_FAILED; activateAlarmNoData( ALARM_ID_HD_BLOOD_LEAK_SELF_TEST_FAILURE ); } } @@ -282,13 +285,36 @@ * @brief * The getBloodLeakSelfTestStatus function gets the status for the blood * leak detector self-test. - * @details Inputs: bloodLeakStatus + * @details Inputs: bloodLeakSelfTestStatus * @details Outputs: none * @return status of blood leak detector self-test. *************************************************************************/ -BOOL getBloodLeakSelfTestStatus( void ) +SELF_TEST_STATUS_T getBloodLeakSelfTestStatus( void ) { - return ( bloodLeakState == BLOOD_LEAK_NORMAL_STATE ); + switch ( bloodLeakState ) + { + case BLOOD_LEAK_INIT_STATE: + bloodLeakSelfTestStatus = SELF_TEST_STATUS_IN_PROGRESS; + break; + + case BLOOD_LEAK_ZERO_STATE: + bloodLeakSelfTestStatus = SELF_TEST_STATUS_IN_PROGRESS; + break; + + case BLOOD_LEAK_SELF_TEST_STATE: + bloodLeakSelfTestStatus = SELF_TEST_STATUS_IN_PROGRESS; + break; + + case BLOOD_LEAK_NORMAL_STATE: + bloodLeakSelfTestStatus = SELF_TEST_STATUS_PASSED; + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_HD_INVALID_BLOOD_LEAK_STATE, bloodLeakState ) + break; + } + + return bloodLeakSelfTestStatus; } /*********************************************************************//** @@ -325,7 +351,7 @@ { BLOOD_LEAK_STATUS_T status = getBloodLeakStatus(); - broadcastBloodLeakData( status, bloodLeakState ); + broadcastBloodLeakData( status, (U32)bloodLeakState ); bloodLeakDataPublicationTimerCounter = 0; } }