Index: firmware/App/Modes/ModeInitPOST.c =================================================================== diff -u -r476ef181700cbe3182e760bcd73d978b2752212d -r85a18ee758116bb8e19b80b18f166a691a464bb7 --- firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 476ef181700cbe3182e760bcd73d978b2752212d) +++ firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 85a18ee758116bb8e19b80b18f166a691a464bb7) @@ -133,11 +133,6 @@ postState = handlePOSTStatus( testStatus ); break; - case POST_STATE_FPGA: - testStatus = execFPGATest(); - postState = handlePOSTStatus( testStatus ); - break; - case POST_STATE_RTC: testStatus = execRTCSelfTest(); postState = handlePOSTStatus( testStatus ); @@ -163,6 +158,11 @@ postState = handlePOSTStatus( testStatus ); break; + case POST_STATE_ALARM_AUDIO: + testStatus = execAlarmAudioSelfTest(); + postState = handlePOSTStatus( testStatus ); + break; + case POST_STATE_ALARM_LAMP: #ifdef DONT_SKIP_NV_POST // Skip the rest of the POSTs @@ -182,9 +182,14 @@ postState = handlePOSTStatus( testStatus ); break; - // Should be last POST case POST_STATE_STUCK_BUTTON: testStatus = execStuckButtonTest(); + postState = handlePOSTStatus( testStatus ); + break; + + // Should be last POST + case POST_STATE_FPGA: + testStatus = execFPGATest(); handlePOSTStatus( testStatus ); // Ignoring return value because last test if ( TRUE == tempPOSTPassed ) Index: firmware/App/Modes/TreatmentEnd.c =================================================================== diff -u -re82f92d4dec50a1e1362cf175fb20d412ddc5b32 -r85a18ee758116bb8e19b80b18f166a691a464bb7 --- firmware/App/Modes/TreatmentEnd.c (.../TreatmentEnd.c) (revision e82f92d4dec50a1e1362cf175fb20d412ddc5b32) +++ firmware/App/Modes/TreatmentEnd.c (.../TreatmentEnd.c) (revision 85a18ee758116bb8e19b80b18f166a691a464bb7) @@ -276,7 +276,7 @@ // Ensure we do not sit in stopped state for too long if ( bloodSittingTimerCtr > MAX_TIME_BLOOD_SITTING ) { - activateAlarmNoData( ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RINSEBACK ); + activateAlarmNoData( ALARM_ID_TREATMENT_STOPPED_NO_RINSEBACK ); } } Index: firmware/App/Modes/TreatmentStop.c =================================================================== diff -u -rb5accb82ac043938255883b6c60a6f81795569b0 -r85a18ee758116bb8e19b80b18f166a691a464bb7 --- firmware/App/Modes/TreatmentStop.c (.../TreatmentStop.c) (revision b5accb82ac043938255883b6c60a6f81795569b0) +++ firmware/App/Modes/TreatmentStop.c (.../TreatmentStop.c) (revision 85a18ee758116bb8e19b80b18f166a691a464bb7) @@ -137,7 +137,7 @@ // Ensure we do not sit in stopped state for too long if ( ++bloodSittingTimerCtr > MAX_TIME_BLOOD_SITTING ) { - activateAlarmNoData( ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RINSEBACK ); + activateAlarmNoData( ALARM_ID_TREATMENT_STOPPED_NO_RINSEBACK ); } // Execute treatment stop sub-mode state machine 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; +} /************************************************************************* Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r0b8b852779a4ce611bbf084281feda59f0801c6c -r85a18ee758116bb8e19b80b18f166a691a464bb7 --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 0b8b852779a4ce611bbf084281feda59f0801c6c) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 85a18ee758116bb8e19b80b18f166a691a464bb7) @@ -284,7 +284,8 @@ U32 getAlarmAudioVolume( void ); F32 getAlarmAudioPrimaryHighGainCurrent( void ); F32 getAlarmAudioPrimaryLowGainCurrent( void ); -F32 getAlarmAudioBackupCurrent( void ); +F32 getAlarmAudioBackupCurrent( void ); +SELF_TEST_STATUS_T execAlarmAudioSelfTest( void ); BOOL testSetAlarmStateOverride( U32 alarmID, BOOL value ); BOOL testResetAlarmStateOverride( U32 alarmID ); Index: firmware/App/Services/FPGA.c =================================================================== diff -u -r0798ef0a54e4ddaa551ced7b2bd9b032aa458095 -r85a18ee758116bb8e19b80b18f166a691a464bb7 --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision 0798ef0a54e4ddaa551ced7b2bd9b032aa458095) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision 85a18ee758116bb8e19b80b18f166a691a464bb7) @@ -91,6 +91,8 @@ #define FPGA_PBO_TEMP_GAIN 200.0 ///< Used in conversion of PBo temperature reading to deg C. #define FPGA_PBO_TEMP_OFFSET 50.0 ///< Used in conversion of PBo temperature reading to deg C. +#define FPGA_ALARM_AUDIO_VOLUME_SHIFT 3 ///< Shift alarm audio volume 3 bits to left before writing to register. + // FPGA Sensors Record #pragma pack(push,1) /// Record structure for FPGA header read. @@ -1091,6 +1093,7 @@ * 1 - Low priority alarm tone (c e) * 2 - Medium priority alarm tone (c f# c) * 3 - High priority alarm tone (c f# c - c f#) + * 4 - Continuous test tone (e) * @param volumeLevel the level of attenuation to command (0..4) * 4 - 3 dB gain * 3 - 6 dB gain @@ -1099,25 +1102,24 @@ * 0 - 15 dB gain * @return none *************************************************************************/ -void setAlarmAudioState( ALARM_PRIORITY_T state, U32 volumeLevel ) +void setAlarmAudioState( U32 state, U32 volumeLevel ) { + U08 audioCmd = (U08)state; + + audioCmd |= ( (U08)volumeLevel << FPGA_ALARM_AUDIO_VOLUME_SHIFT ); + if ( ( state < NUM_OF_ALARM_PRIORITIES ) && ( volumeLevel <= MAX_ALARM_VOLUME_ATTENUATION ) ) { - U08 audioCmd = (U08)state; - - audioCmd |= ( (U08)volumeLevel << 2 ); fpgaActuatorSetPoints.alarmControl = audioCmd; } else { - U08 audioCmd = (U08)ALARM_PRIORITY_HIGH; - + // S/w fault to indicate issue w/ s/w + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_FPGA_INVALID_ALARM_AUDIO_PARAM, (U32)audioCmd ) // Set alarm audio to high priority, max volume for safety since s/w seems to be having trouble setting audio correctly - audioCmd |= ( (U08)MIN_ALARM_VOLUME_ATTENUATION << 2 ); + audioCmd = (U08)ALARM_PRIORITY_HIGH; + audioCmd |= ( (U08)MIN_ALARM_VOLUME_ATTENUATION << FPGA_ALARM_AUDIO_VOLUME_SHIFT ); fpgaActuatorSetPoints.alarmControl = audioCmd; - // S/w fault to indicate issue w/ s/w - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_FPGA_INVALID_ALARM_AUDIO_PARAM, volumeLevel ) - } } Index: firmware/App/Services/FPGA.h =================================================================== diff -u -r794f0aea88a5a860448e54e99db6e2e881b22900 -r85a18ee758116bb8e19b80b18f166a691a464bb7 --- firmware/App/Services/FPGA.h (.../FPGA.h) (revision 794f0aea88a5a860448e54e99db6e2e881b22900) +++ firmware/App/Services/FPGA.h (.../FPGA.h) (revision 85a18ee758116bb8e19b80b18f166a691a464bb7) @@ -52,7 +52,7 @@ void getFPGAVersions( U08 *Id, U08 *Maj, U08 *Min, U08 *Lab ); -void setAlarmAudioState( ALARM_PRIORITY_T state, U32 volumeLevel ); +void setAlarmAudioState( U32 state, U32 volumeLevel ); F32 getFPGABloodFlowSignalStrength( void ); F32 getFPGADialysateFlowSignalStrength( void );