Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -rc1b9ac0dbf2196280895d2e440dd7ac288ac8424 -r4417cc207883b297ccdf9b090fcc6b8016c22b05 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision c1b9ac0dbf2196280895d2e440dd7ac288ac8424) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 4417cc207883b297ccdf9b090fcc6b8016c22b05) @@ -20,6 +20,7 @@ #define __ALARM_MGMT_C__ #include "AlarmLamp.h" +#include "CPLD.h" #include "FPGA.h" #include "InternalADC.h" #include "OperationModes.h" @@ -62,8 +63,8 @@ #define CLR_BACKUP_AUDIO_ENABLE() {mibspiREG3->PC3 &= ~BACKUP_AUDIO_ENABLE_SPI3_PORT_MASK;} ///< Macro to disable backup alarm audio. #define ALARM_AUDIO_TEST_TONE 4 ///< Alarm audio state for continuous test tone. -#define ALARM_AUDIO_CURRENT_HG_MIN_MA 20.0F ///< Minimum audio current (high gain) during test tone self-test (in mA). // TODO - Why is HG so low? S/B same as LG I think. -#define ALARM_AUDIO_CURRENT_LG_MIN_MA 60.0F ///< Minimum audio current (low gain) during test tone self-test (in mA). +#define ALARM_AUDIO_CURRENT_LG_MIN_MA 50.0F ///< Minimum audio current (low gain) during test tone self-test (in mA). +#define ALARM_AUDIO_CURRENT_LG_MAX_MA 20.0F ///< Maximum audio current (low gain) during no tone self-test (in mA). #define ALARM_AUDIO_MAX_TEST_TIME_MS 1000 ///< Maximum time for audio current to reach threshold in test. #define MAX_ALARM_AUDIO_VOLUME_INDEX 0 ///< Index for maximum alarm audio volume. #define MIN_ALARM_AUDIO_VOLUME_INDEX (MAX_ALARM_VOLUME_LEVEL - 1 ) ///< Index for minimum alarm audio volume. @@ -79,10 +80,11 @@ /// Enumeration of alarm audio self-test states. typedef enum Alarm_Lamp_Self_Test_States { - ALARM_AUDIO_SELF_TEST_STATE_START = 0, ///< Start state of alarm lamp self-test. - ALARM_AUDIO_SELF_TEST_STATE_PRIMARY, ///< Red state of alarm lamp self-test. - ALARM_AUDIO_SELF_TEST_STATE_COMPLETE, ///< Completed state of alarm lamp self-test. - NUM_OF_ALARM_AUDIO_SELF_TEST_STATES ///< Number of states in alarm lamp self-test. + ALARM_AUDIO_SELF_TEST_STATE_START = 0, ///< Start state of alarm audio self-test. + ALARM_AUDIO_SELF_TEST_STATE_PRIMARY, ///< Test tone state of alarm audio self-test. + ALARM_AUDIO_SELF_TEST_STATE_NO_TONE, ///< No tone state of alarm audio self-test. + ALARM_AUDIO_SELF_TEST_STATE_COMPLETE, ///< Completed state of alarm audio self-test. + NUM_OF_ALARM_AUDIO_SELF_TEST_STATES ///< Number of states in alarm audio self-test. } ALARM_AUDIO_SELF_TEST_STATE_T; /// Enumeration of alarm audio volume factors. @@ -109,6 +111,7 @@ static OVERRIDE_U32_T alarmStartedAt[ NUM_OF_ALARM_IDS ]; ///< Table - when alarm became active for each alarm (if active) or zero (if inactive) static U32 alarmStatusPublicationTimerCounter = 0; ///< Used to schedule alarm status publication to CAN bus. static U32 alarmInfoPublicationTimerCounter = 0; ///< Used to schedule alarm information publication to CAN bus. +static U32 audioTestStartTime; ///< Start time of audio alarm current self-test. /// Interval (in task intervals) at which to publish alarm status to CAN bus. static OVERRIDE_U32_T alarmStatusPublishInterval = { ALARM_STATUS_PUBLISH_INTERVAL, ALARM_STATUS_PUBLISH_INTERVAL, ALARM_STATUS_PUBLISH_INTERVAL, 0 }; @@ -1150,16 +1153,15 @@ } // If alarm active } // Alarm table loop - // If top alarm condition not cleared, block resume and rinseback flags + // If top alarm condition not cleared, block resume if ( TRUE == alarmStatus.topAlarmConditionDetected ) { noResume = TRUE; - noRinseback = TRUE; } // If top alarm has clear only property or no other user options enabled for recoverable alarm and condition cleared, set user ack flag and block other flags if ( ( TRUE == ALARM_TABLE[ alarmStatus.alarmTop ].alarmClearOnly ) || - ( ( FALSE == alarmStatus.noClear ) && ( noResume ) && ( noRinseback ) && ( noEndTreatment ) && + ( ( FALSE == alarmStatus.noClear ) && ( TRUE == noResume ) && ( TRUE == noRinseback ) && ( TRUE == noEndTreatment ) && ( FALSE == alarmStatus.topAlarmConditionDetected ) ) ) { usrAckReq = TRUE; @@ -1168,6 +1170,15 @@ noEndTreatment = TRUE; } + // If AC power is out, block all user options + if ( TRUE == getCPLDACPowerLossDetected() ) + { + usrAckReq = FALSE; + noResume = TRUE; + noRinseback = TRUE; + noEndTreatment = TRUE; + } + // If in Treatment-Stop state or Fault/Service/Standby Mode, allow user to minimize the alarm window if ( ( MODE_FAUL == currentMode ) || ( MODE_SERV == currentMode ) || ( MODE_STAN == currentMode ) || ( ( MODE_TREA == currentMode ) && ( TREATMENT_STOP_STATE == getTreatmentState() ) ) ) @@ -1368,46 +1379,63 @@ * @brief * The execAlarmAudioSelfTest function outputs a test audio tone and * measures the audio current level. - * @details Inputs: alarmAudioSelfTestState - * @details Outputs: none + * @details Inputs: alarmAudioSelfTestState, audioTestStartTime + * @details Outputs: audioTestStartTime, alarmAudioTestToneRequested * @return the current backup alarm audio current (in mA). *************************************************************************/ SELF_TEST_STATUS_T execAlarmAudioSelfTest( void ) { SELF_TEST_STATUS_T result = SELF_TEST_STATUS_IN_PROGRESS; - static U32 testStartTime; + F32 almLGCurrent = getIntADCVoltageConverted( INT_ADC_PRIMARY_ALARM_CURRENT_LG ); switch ( alarmAudioSelfTestState ) { case ALARM_AUDIO_SELF_TEST_STATE_START: - testStartTime = getMSTimerCount(); - // Start test tone - alarmAudioTestToneRequested = TRUE; - setAlarmAudio(); - alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_PRIMARY; + if ( almLGCurrent < ALARM_AUDIO_CURRENT_LG_MAX_MA ) + { + audioTestStartTime = getMSTimerCount(); + // Start test tone + alarmAudioTestToneRequested = TRUE; + setAlarmAudio(); + alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_PRIMARY; + } + else + { + result = SELF_TEST_STATUS_FAILED; + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_ALARM_AUDIO_SELF_TEST_FAILURE, almLGCurrent, ALARM_AUDIO_CURRENT_LG_MAX_MA ); + alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_COMPLETE; + } break; case ALARM_AUDIO_SELF_TEST_STATE_PRIMARY: + // Check if alarm audio current is sufficiently high indicating alarm tone is being output + if ( almLGCurrent > ALARM_AUDIO_CURRENT_LG_MIN_MA ) { - F32 almHGCurrent = getIntADCVoltageConverted( INT_ADC_PRIMARY_ALARM_CURRENT_HG ); - F32 almLGCurrent = getIntADCVoltageConverted( INT_ADC_PRIMARY_ALARM_CURRENT_LG ); + alarmAudioTestToneRequested = FALSE; + audioTestStartTime = getMSTimerCount(); + alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_NO_TONE; + } + else if ( TRUE == didTimeout( audioTestStartTime, ALARM_AUDIO_MAX_TEST_TIME_MS ) ) + { + alarmAudioTestToneRequested = FALSE; + result = SELF_TEST_STATUS_FAILED; + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_ALARM_AUDIO_SELF_TEST_FAILURE, almLGCurrent, ALARM_AUDIO_CURRENT_LG_MIN_MA ); + alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_COMPLETE; + } + break; - // Check if alarm audio current is sufficiently high indicating alarm tone is being output - if ( ( almHGCurrent > ALARM_AUDIO_CURRENT_HG_MIN_MA ) && - ( almLGCurrent > ALARM_AUDIO_CURRENT_LG_MIN_MA ) ) - { - alarmAudioTestToneRequested = FALSE; - result = SELF_TEST_STATUS_PASSED; - alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_COMPLETE; - } - else if ( TRUE == didTimeout( testStartTime, ALARM_AUDIO_MAX_TEST_TIME_MS ) ) - { - alarmAudioTestToneRequested = FALSE; - result = SELF_TEST_STATUS_FAILED; - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_ALARM_AUDIO_SELF_TEST_FAILURE, almHGCurrent, almLGCurrent ); - alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_COMPLETE; - } + case ALARM_AUDIO_SELF_TEST_STATE_NO_TONE: + if ( almLGCurrent < ALARM_AUDIO_CURRENT_LG_MAX_MA ) + { + result = SELF_TEST_STATUS_PASSED; + alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_COMPLETE; } + else if ( TRUE == didTimeout( audioTestStartTime, ALARM_AUDIO_MAX_TEST_TIME_MS ) ) + { + result = SELF_TEST_STATUS_FAILED; + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_ALARM_AUDIO_SELF_TEST_FAILURE, almLGCurrent, ALARM_AUDIO_CURRENT_LG_MAX_MA ); + alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_COMPLETE; + } break; case ALARM_AUDIO_SELF_TEST_STATE_COMPLETE: