Index: firmware/App/Controllers/BloodLeak.c =================================================================== diff -u -rb2afbf7b9bb007d06c28a56cd4e61d3cd9bbe150 -raa2b06eeb111ba51376b90a2bee9b9fbf26f9a58 --- firmware/App/Controllers/BloodLeak.c (.../BloodLeak.c) (revision b2afbf7b9bb007d06c28a56cd4e61d3cd9bbe150) +++ firmware/App/Controllers/BloodLeak.c (.../BloodLeak.c) (revision aa2b06eeb111ba51376b90a2bee9b9fbf26f9a58) @@ -46,6 +46,10 @@ // ********** private function prototypes ********** +static BLOOD_LEAK_STATES_T handleBloodLeakZeroState( void ); +static BLOOD_LEAK_STATES_T handleBloodLeakSelfTestState( void ); +static BLOOD_LEAK_STATES_T handleBloodLeakNormalState( void ); + static void publishBloodLeakData( void ); static U32 getPublishBloodLeakDataInterval( void ); @@ -64,87 +68,127 @@ /*********************************************************************//** * @brief - * The zeroBloodLeak function puts the Blood Leak module into zeroing state. + * The execBloodLeak function executes the blood leak monitor. + * @details Inputs: FPGA blood leak status GPIO pin state + * @details Outputs: bloodLeakStatus + * @return none + *************************************************************************/ +void execBloodLeak( void ) +{ + if ( getCurrentOperationMode() != MODE_INIT ) + { + // Execute blood leak state machine + switch( bloodLeakState.data ) + { + case BLOOD_LEAK_INIT_STATE: + initBloodLeak(); + break; + + case BLOOD_LEAK_ZERO_STATE: + bloodLeakState.data = handleBloodLeakZeroState(); + break; + + case BLOOD_LEAK_SELF_TEST_STATE: + bloodLeakState.data = handleBloodLeakSelfTestState(); + break; + + case BLOOD_LEAK_NORMAL_STATE: + bloodLeakState.data = handleBloodLeakNormalState(); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, (U32)SW_FAULT_ID_HD_INVALID_BLOOD_LEAK_STATE, (U32)bloodLeakState.data ) + initBloodLeak(); + break; + } + } + + // Publish blood leak data if due + publishBloodLeakData(); +} + +/*********************************************************************//** + * @brief + * The handleBloodLeakZeroState function handles the Blood Leak module in zeroing + * state. * @details Inputs: none * @details Outputs: Blood Leak module zeroing. - * @return none + * @return next state *************************************************************************/ -BOOL zeroBloodLeak( void ) +static BLOOD_LEAK_STATES_T handleBloodLeakZeroState( void ) { - bloodLeakState.data = BLOOD_LEAK_ZERO_STATE; - //setFPGABloodLeakZero(); TODO + BLOOD_LEAK_STATES_T result = BLOOD_LEAK_ZERO_STATE; - return TRUE; // TODO + // TODO: Complete + //if ( FALSE == zeroBloodLeak() ) + //{ + //activateAlarmNoData( ALARM_ID_HD_BLOOD_LEAK_FAULT ); + //} + //else + //{ + // TODO: Fill in + //} + + return result; } /*********************************************************************//** * @brief - * The selfTestBloodLeak function puts the Blood Leak module into self-test state. + * The handleBloodLeakSelfTestState function handles the Blood Leak module + * in self-test state. * @details Inputs: none * @details Outputs: Blood Leak module self test. - * @return none + * @return next state *************************************************************************/ -BOOL selfTestBloodLeak( void ) +static BLOOD_LEAK_STATES_T handleBloodLeakSelfTestState( void ) { - bloodLeakState.data = BLOOD_LEAK_SELF_TEST_STATE; - //setFPGABloodLeakSelfTest(); TODO + BLOOD_LEAK_STATES_T result = BLOOD_LEAK_SELF_TEST_STATE; - return TRUE; // TODO + // TODO: Complete + //if ( FALSE == selfTestBloodLeak() ) + //{ + //activateAlarmNoData( ALARM_ID_HD_BLOOD_LEAK_FAULT ); + //} + //else + //{ + // TODO: Fill in + //} + + return result; } /*********************************************************************//** * @brief - * The execBloodLeak function executes the blood leak monitor. - * @details Inputs: FPGA blood leak status GPIO pin state - * @details Outputs: bloodLeakStatus - * @return none + * The handleBloodLeakNormalState function handles the Blood Leak module + * in normal state. + * @details Inputs: none + * @details Outputs: Blood Leak module normal. + * @return next state *************************************************************************/ -void execBloodLeak( void ) +static BLOOD_LEAK_STATES_T handleBloodLeakNormalState( void ) { - BOOL noBloodLeakDetected = noFPGABloodLeakDetected(); + BLOOD_LEAK_STATES_T result = BLOOD_LEAK_NORMAL_STATE; - if ( getCurrentOperationMode() != MODE_INIT ) + // Check status reading and act upon + if ( BLOOD_LEAK_DETECTED == getBloodLeakStatus() ) { - // Get latest status reading - if ( TRUE == noBloodLeakDetected ) + if ( ( getCurrentOperationMode() >= TREATMENT_BLOOD_PRIME_STATE ) && + ( getCurrentOperationMode() <= TREATMENT_RECIRC_STATE ) ) // TODO: Not sure this is correct range of states { - bloodLeakStatus.data = BLOOD_LEAK_NOT_DETECTED; + activateAlarmNoData( ALARM_ID_HD_BLOOD_LEAK_DETECTED ); + bloodLeakStatus.data = BLOOD_LEAK_DETECTED; } else { - bloodLeakStatus.data = BLOOD_LEAK_DETECTED; + activateAlarmNoData( ALARM_ID_HD_BLOOD_LEAK_FAULT ); } - - if ( bloodLeakState.data == BLOOD_LEAK_SELF_TEST_STATE ) - { - if ( FALSE == selfTestBloodLeak() ) - { - activateAlarmNoData( ALARM_ID_HD_BLOOD_LEAK_DETECTOR_FAULT ); - } - } - else // Blood Leak Detector is not in self-test state (normal state) - { - // Check status reading and act upon - if ( BLOOD_LEAK_DETECTED == getBloodLeakStatus() ) - { - if ( getCurrentOperationMode() == HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE ) // TODO: Any other mode/sub-mode to be added here? - { - activateAlarmNoData( ALARM_ID_HD_BLOOD_LEAK_DETECTED ); - } - else - { - activateAlarmNoData( ALARM_ID_HD_BLOOD_LEAK_DETECTOR_FAULT ); - } - } - else // BLOOD_LEAK_NOT_DETECTED == getBloodLeakStatus() - { - clearAlarmCondition( ALARM_ID_HD_BLOOD_LEAK_DETECTED ); - } - } } + else // Blood leak not detected + { + clearAlarmCondition( ALARM_ID_HD_BLOOD_LEAK_DETECTED ); + } - // Publish blood leak data if due - publishBloodLeakData(); + return result; } /*********************************************************************//**