Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r0b8b852779a4ce611bbf084281feda59f0801c6c -r85a18ee758116bb8e19b80b18f166a691a464bb7 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 0b8b852779a4ce611bbf084281feda59f0801c6c) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 85a18ee758116bb8e19b80b18f166a691a464bb7) @@ -52,12 +52,16 @@ /// A blank alarm data record for alarms that do not include alarm data when triggered. const ALARM_DATA_T BLANK_ALARM_DATA = { ALARM_DATA_TYPE_NONE, 0 }; -// Pin assignment for backup alarm audio enable -#define BACKUP_AUDIO_ENABLE_SPI3_PORT_MASK 0x00000001 ///< Pin SPI3-CS0 - re-purposed as output GPIO for back audio enable. +/// Pin SPI3-CS0 - re-purposed as output GPIO for backup alarm audio enable. +#define BACKUP_AUDIO_ENABLE_SPI3_PORT_MASK 0x00000001 // Backup alarm audio enable/disable macros #define SET_BACKUP_AUDIO_ENABLE() {mibspiREG3->PC3 |= BACKUP_AUDIO_ENABLE_SPI3_PORT_MASK;} ///< Macro to enable backup alarm audio. #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 10.0 ///< Minimum audio current (high gain) during test tone self-test (in mA). +#define ALARM_AUDIO_CURRENT_LG_MIN_MA 10.0 ///< Minimum audio current (low gain) during test tone self-test (in mA). + /// Alarm priority ranking record. typedef struct { @@ -101,6 +105,9 @@ /// Alarm user recovery actions enabled flags. static BOOL alarmUserRecoveryActionEnabled[ NUMBER_OF_ALARM_USER_ACTIONS ]; +/// Flag indicates whether alarm audio test tone should be output. +static BOOL alarmAudioTestToneRequested; + // ********** private function prototypes ********** static void activateAlarm( ALARM_ID_T alarm ); @@ -170,7 +177,9 @@ alarmStatus.noEndTreatment = FALSE; alarmStatus.noNewTreatment = FALSE; alarmStatus.noDialRecirc = FALSE; - alarmStatus.usrACKRequired = FALSE; + alarmStatus.usrACKRequired = FALSE; + + alarmAudioTestToneRequested = FALSE; } /*********************************************************************//** @@ -794,11 +803,16 @@ { U32 volume = getAlarmAudioVolume(); - if ( TRUE == alarmStatus.alarmsSilenced ) + if ( TRUE == alarmAudioTestToneRequested ) + { // Play test tone at max volume for next 50 ms + setAlarmAudioState( ALARM_AUDIO_TEST_TONE, 0 ); + alarmAudioTestToneRequested = FALSE; + } + else if ( TRUE == alarmStatus.alarmsSilenced ) { setAlarmAudioState( ALARM_PRIORITY_NONE, volume ); } - else // Alarms not silenced + else { if ( alarmStatus.alarmsState < NUM_OF_ALARM_PRIORITIES ) { @@ -1174,6 +1188,44 @@ return result; } + +/*********************************************************************//** + * @brief + * The execAlarmAudioSelfTest function outputs a test audio tone and + * measures the audio current level. The test passes if the audio current + * exceeds TBD mA. + * @details Inputs: alarmBackupAudioCurrent + * @details Outputs: none + * @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; + + if ( alarmAudioTestToneRequested != TRUE ) + { + alarmAudioTestToneRequested = TRUE; + } + else + { + F32 almHGCurrent = getIntADCVoltageConverted( INT_ADC_PRIMARY_ALARM_CURRENT_HG ); + F32 almLGCurrent = getIntADCVoltageConverted( INT_ADC_PRIMARY_ALARM_CURRENT_LG ); + + // 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 ) ) + { + result = SELF_TEST_STATUS_PASSED; + } + else + { + result = SELF_TEST_STATUS_FAILED; + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_ALARM_AUDIO_SELF_TEST_FAILURE, almHGCurrent, almLGCurrent ); + } + } + + return result; +} /*************************************************************************