Index: firmware/App/Controllers/BloodLeak.c =================================================================== diff -u -r356b6e39ee43e291f0ab2df4af1f4cf45318fdbb -r518745cc77b07b0a6aa35d5530255d2bcc8b1090 --- firmware/App/Controllers/BloodLeak.c (.../BloodLeak.c) (revision 356b6e39ee43e291f0ab2df4af1f4cf45318fdbb) +++ firmware/App/Controllers/BloodLeak.c (.../BloodLeak.c) (revision 518745cc77b07b0a6aa35d5530255d2bcc8b1090) @@ -31,7 +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_MS 30 ///< Blood leak detector timeout for zeroing and self-test (15 ms extended edge detection) +#define BLOOD_LEAK_TIMEOUT_MS 100 ///< 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 @@ -52,6 +52,7 @@ static BOOL bloodLeakZeroRequested = FALSE; ///< Blood leak zero requested flag static U32 bloodLeakZeroStartTime = 0; ///< Blood leak zeroing start time. static U32 bloodLeakSelfTestStartTime = 0; ///< Blood leak self-test start time. +static U32 clearSelfTestStartTime = 0; ///< Blood leak self-test clear start time. /// Interval (in ms) at which to publish blood leak data to CAN bus. static OVERRIDE_U32_T bloodLeakDataPublishInterval = { BLOOD_LEAK_PUB_INTERVAL, BLOOD_LEAK_PUB_INTERVAL, 0, 0 }; @@ -201,22 +202,28 @@ *************************************************************************/ static BLOOD_LEAK_STATES_T handleBloodLeakSelfTestState( void ) { - BLOOD_LEAK_STATES_T state = BLOOD_LEAK_NORMAL_STATE; + BLOOD_LEAK_STATES_T state = BLOOD_LEAK_SELF_TEST_STATE; if ( FALSE == noFPGABloodLeakDetected() ) // Faked blood leak caused by independent MCU board { bloodLeakSelfTestStatus = SELF_TEST_STATUS_PASSED; + clearSelfTestStartTime = getMSTimerCount(); clearFPGABloodLeakSelfTest(); } else { - if ( TRUE == didTimeout( bloodLeakSelfTestStartTime, BLOOD_LEAK_TIMEOUT_MS ) ) + if ( ( ( SELF_TEST_STATUS_PASSED != bloodLeakSelfTestStatus ) ) && ( TRUE == didTimeout( bloodLeakSelfTestStartTime, BLOOD_LEAK_TIMEOUT_MS ) ) ) { bloodLeakSelfTestStatus = SELF_TEST_STATUS_FAILED; activateAlarmNoData( ALARM_ID_HD_BLOOD_LEAK_SELF_TEST_FAILURE ); } } + if ( ( SELF_TEST_STATUS_PASSED == bloodLeakSelfTestStatus ) && ( TRUE == didTimeout( clearSelfTestStartTime, 500 ) ) ) + { + state = BLOOD_LEAK_NORMAL_STATE; + } + return state; } @@ -232,13 +239,21 @@ { BLOOD_LEAK_STATES_T state = BLOOD_LEAK_NORMAL_STATE; + if ( TRUE == noFPGABloodLeakDetected() ) + { + bloodLeakStatus.data = BLOOD_LEAK_NOT_DETECTED; + } + else + { + bloodLeakStatus.data = BLOOD_LEAK_DETECTED; + } + // Check status reading and act upon if ( BLOOD_LEAK_DETECTED == getBloodLeakStatus() ) { if ( getCurrentOperationMode() == MODE_TREA ) { activateAlarmNoData( ALARM_ID_HD_BLOOD_LEAK_DETECTED ); - bloodLeakStatus.data = BLOOD_LEAK_DETECTED; } else {