Index: firmware/App/Controllers/AlarmLamp.c =================================================================== diff -u -rc67def50892f9a7c2f1f22985b5351465a8f6773 -rc672f41061bcd500d6593655641cb27ce3ae58fc --- firmware/App/Controllers/AlarmLamp.c (.../AlarmLamp.c) (revision c67def50892f9a7c2f1f22985b5351465a8f6773) +++ firmware/App/Controllers/AlarmLamp.c (.../AlarmLamp.c) (revision c672f41061bcd500d6593655641cb27ce3ae58fc) @@ -15,11 +15,12 @@ * ***************************************************************************/ +#include "AlarmLamp.h" +#include "AlarmMgmt.h" #include "CPLD.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" #include "Timers.h" -#include "AlarmLamp.h" /** * @addtogroup AlarmLamp @@ -28,7 +29,7 @@ // ********** private definitions ********** -#define NUM_OF_ALARM_LAMP_PATTERN_SEQUENCE_STEPS 2 ///< Number of steps in an alarm lamp pattern sequence. +#define NUM_OF_ALARM_LAMP_PATTERN_SEQUENCE_STEPS 2 ///< Number of steps in an alarm lamp pattern sequence. /// Enumeration of alarm lamp color states. typedef enum LampStates @@ -127,7 +128,7 @@ // otherwise, increment pattern timer else { - lampPatternStepTimer += TASK_GENERAL_INTERVAL; + lampPatternStepTimer += ALARM_LAMP_AND_AUDIO_CONTROL_INTERVAL_MS; } // control alarm lamp to currently set pattern (unless we're in manual pattern) Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r93b7026089877765744c2c465c51fd6912d7084b -rc672f41061bcd500d6593655641cb27ce3ae58fc --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 93b7026089877765744c2c465c51fd6912d7084b) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision c672f41061bcd500d6593655641cb27ce3ae58fc) @@ -19,7 +19,8 @@ #define __ALARM_MGMT_C__ -#include "AlarmLamp.h" +#include "AlarmLamp.h" +#include "FPGA.h" #include "OperationModes.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" @@ -31,9 +32,10 @@ */ // ********** private definitions ********** + +/// Interval to control lamp and audio and to publish alarm status data. +#define ALARM_STATUS_PUBLISH_INTERVAL ( ALARM_LAMP_AND_AUDIO_CONTROL_INTERVAL_MS / TASK_GENERAL_INTERVAL ) -#define ALARM_STATUS_PUBLISH_INTERVAL (250 / TASK_GENERAL_INTERVAL) ///< Default interval to publish alarm status data. - #define ALARM_SILENCE_EXPIRES_IN_SECS (60) ///< Alarm silence expiration time in seconds. #define SUPERVISOR_ALARM_KEY 0xD2C3B4A5 ///< 32-bit key required for clear all alarms request. @@ -52,8 +54,6 @@ // ********** private data ********** -/// interval (in ms) at which to publish alarm status to CAN bus -DATA_DECL( U32, AlarmStatusPub, alarmStatusPublishInterval, ALARM_STATUS_PUBLISH_INTERVAL, ALARM_STATUS_PUBLISH_INTERVAL ); static U32 alarmStatusPublicationTimerCounter = 0; ///< Used to schedule alarm status publication to CAN bus. /// table - current state of each alarm @@ -65,22 +65,24 @@ static COMP_ALARM_STATUS_T alarmStatus; ///< Record for the current composite alarm status. -static ALARM_ID_T alarmPriorityFIFO[ NUM_OF_ALARM_PRIORITIES ]; ///< FIFO - first activated alarm in each alarm priority category. +static ALARM_ID_T alarmPriorityFIFO[ NUM_OF_ALARM_PRIORITIES ]; ///< FIFO - first activated alarm in each alarm priority category. + +static U32 alarmAudioVolumeLevel = MAX_ALARM_VOLUME_LEVEL; ///< Set alarm audio volume level (0..7). // ********** private function prototypes ********** static void activateAlarm( ALARM_ID_T alarm ); static void updateAlarmsState( void ); -static void setAlarmLampAndAudio( void ); +static void setAlarmLamp( void ); +static void setAlarmAudio( void ); static void updateAlarmsSilenceStatus( void ); static void handleAlarmEscalations( void ); static void updateAlarmsFlags( void ); static void resetAlarmPriorityFIFO( ALARM_PRIORITY_T priority ); static U32 getAlarmStartTime( U32 alarmID ); -static U32 getPublishAlarmStatusInterval( void ); /*********************************************************************//** * @brief @@ -146,10 +148,12 @@ updateAlarmsState(); updateAlarmsFlags(); updateAlarmsSilenceStatus(); - setAlarmLampAndAudio(); // publish alarm status at interval - if ( ++alarmStatusPublicationTimerCounter >= getPublishAlarmStatusInterval() ) - { + if ( ++alarmStatusPublicationTimerCounter >= ALARM_STATUS_PUBLISH_INTERVAL ) + { + // lamp and audio timing sync'd with broadcast so UI can stay in sync with lamp rhythm + setAlarmLamp(); + setAlarmAudio(); broadcastAlarmStatus( alarmStatus ); alarmStatusPublicationTimerCounter = 0; } @@ -336,7 +340,7 @@ ALARM_ID_T a; // inactivate (clear) all active recoverable alarms - for ( a = 0; a < NUM_OF_ALARM_IDS; a++ ) + for ( a = ALARM_ID_NO_ALARM; a < NUM_OF_ALARM_IDS; a++ ) { clearAlarm( a ); } @@ -458,6 +462,22 @@ return result; } + +/*********************************************************************//** + * @brief +* The setAlarmAudioVolume function sets the current alarm audio volume level. +* @details Inputs: none +* @details Outputs: alarmAudioVolumeLevel +* @param volumeLevel level of volume requested (0..7) +* @return none +*************************************************************************/ +void setAlarmAudioVolume( U32 volumeLevel ) +{ + if ( volumeLevel <= MAX_ALARM_VOLUME_LEVEL ) + { + alarmAudioVolumeLevel = volumeLevel; + } +} /*********************************************************************//** * @brief @@ -530,14 +550,15 @@ /*********************************************************************//** * @brief - * The setAlarmLampAndAudio function sets the alarm lamp and audio patterns - * according to the current state of alarms. + * The setAlarmLamp function sets the alarm lamp pattern according to the + * current state of alarms. * @details Inputs: none * @details Outputs: Alarm lamp patter set according to current alarms status. * @return none *************************************************************************/ -static void setAlarmLampAndAudio( void ) -{ +static void setAlarmLamp( void ) +{ + // set alarm lamp pattern to appropriate pattern for current alarm state if ( getCurrentAlarmLampPattern() != LAMP_PATTERN_MANUAL ) { switch ( alarmStatus.alarmsState ) @@ -570,45 +591,50 @@ SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_LAMP_INVALID_ALARM_STATE, alarmStatus.alarmsState ) break; } - alarmStatus.lampOn = getAlarmLampOn(); } + + // execute alarm lamp controller + execAlarmLamp(); + + // set lamp on flag to match current state of alarm lamp + if ( getCurrentAlarmLampPattern() != LAMP_PATTERN_MANUAL ) + { + alarmStatus.lampOn = getAlarmLampOn(); + } else { alarmStatus.lampOn = FALSE; } - - if ( TRUE == alarmStatus.alarmsSilenced ) - { - // TODO - no audio - } - else // alarms not silenced - { - switch ( alarmStatus.alarmsState ) - { - case ALARM_PRIORITY_NONE: - // TODO - no audio - break; - - case ALARM_PRIORITY_LOW: - // TODO - low priority audio - break; - - case ALARM_PRIORITY_MEDIUM: - // TODO - medium priority audio - break; - - case ALARM_PRIORITY_HIGH: - // TODO - high priority audio - break; - - default: - // TODO - high priority audio - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_LAMP_INVALID_ALARM_STATE, alarmStatus.alarmsState ) - break; - } - } } +/*********************************************************************//** + * @brief + * The setAlarmAudio function sets the alarm audio pattern according to + * the current state of alarms. + * @details Inputs: none + * @details Outputs: Alarm audio patter set according to current alarms status. + * @return none + *************************************************************************/ +static void setAlarmAudio( void ) +{ + if ( TRUE == alarmStatus.alarmsSilenced ) + { + setAlarmAudioState( ALARM_PRIORITY_NONE, alarmAudioVolumeLevel ); + } + else // alarms not silenced + { + if ( alarmStatus.alarmsState < NUM_OF_ALARM_PRIORITIES ) + { + setAlarmAudioState( alarmStatus.alarmsState, alarmAudioVolumeLevel ); + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_AUDIO_INVALID_ALARM_STATE, alarmStatus.alarmsState ) + setAlarmAudioState( ALARM_PRIORITY_HIGH, alarmAudioVolumeLevel ); + } + } +} + /*********************************************************************//** * @brief * The updateAlarmsSilenceStatus function updates the alarms silence state. @@ -781,83 +807,14 @@ } } -/*********************************************************************//** - * @brief - * The getPublishAlarmStatusInterval function gets the alarm status - * publication interval. - * @details Inputs: alarmStatusPublishInterval - * @details Outputs: none - * @return the current alarm status publication interval (in ms). - *************************************************************************/ -U32 getPublishAlarmStatusInterval( void ) -{ - U32 result = alarmStatusPublishInterval.data; - - if ( OVERRIDE_KEY == alarmStatusPublishInterval.override ) - { - result = alarmStatusPublishInterval.ovData; - } - - return result; -} - /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ /*********************************************************************//** * @brief - * The testSetAlarmStatusPublishIntervalOverride function overrides the - * alarm status publish interval. - * @details Inputs: none - * @details Outputs: alarmStatusPublishInterval - * @param value override blood flow data publish interval with (in ms) - * @return TRUE if override successful, FALSE if not - *************************************************************************/ -BOOL testSetAlarmStatusPublishIntervalOverride( U32 value ) -{ - BOOL result = FALSE; - - // verify tester has logged in with HD - if ( TRUE == isTestingActivated() ) - { - U32 intvl = value / TASK_GENERAL_INTERVAL; - - result = TRUE; - alarmStatusPublishInterval.ovData = intvl; - alarmStatusPublishInterval.override = OVERRIDE_KEY; - } - - return result; -} - -/*********************************************************************//** - * @brief - * The testResetAlarmStatusPublishIntervalOverride function resets the override - * of the alarm status publish interval. - * @details Inputs: none - * @details Outputs: alarmStatusPublishInterval - * @return TRUE if override reset successful, FALSE if not - *************************************************************************/ -BOOL testResetAlarmStatusPublishIntervalOverride( void ) -{ - BOOL result = FALSE; - - // verify tester has logged in with HD - if ( TRUE == isTestingActivated() ) - { - result = TRUE; - alarmStatusPublishInterval.override = OVERRIDE_RESET; - alarmStatusPublishInterval.ovData = alarmStatusPublishInterval.ovInitData; - } - - return result; -} - -/*********************************************************************//** - * @brief * The testSetAlarmStateOverride function overrides the state of the * alarm active state for a given alarm with the alarm management with * a given active state. Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r93b7026089877765744c2c465c51fd6912d7084b -rc672f41061bcd500d6593655641cb27ce3ae58fc --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 93b7026089877765744c2c465c51fd6912d7084b) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision c672f41061bcd500d6593655641cb27ce3ae58fc) @@ -33,7 +33,12 @@ // ********** public definitions ********** #include "AlarmDefs.h" - + +/// Interval (in ms) at which alarm lamp and audio control will be executed. +#define ALARM_LAMP_AND_AUDIO_CONTROL_INTERVAL_MS 250 + +#define MAX_ALARM_VOLUME_LEVEL 7 + /// Alarm data types list. typedef enum Alarm_Data_Types { @@ -166,8 +171,8 @@ SW_FAULT_ID_DIAL_OUT_FLOW_INVALID_DIAL_OUT_PUMP_DIRECTION, SW_FAULT_ID_DIAL_OUT_FLOW_INVALID_DIAL_OUT_PUMP_STATE, // 40 SW_FAULT_ID_DIAL_OUT_FLOW_SET_TOO_HIGH, - SW_FAULT_ID____AVAILABLE_1, - SW_FAULT_ID____AVAILABLE_2, + SW_FAULT_ID_ALARM_MGMT_AUDIO_INVALID_ALARM_STATE, + SW_FAULT_ID_FPGA_INVALID_ALARM_AUDIO_PARAM, SW_FAULT_ID_RTC_EXEC_INVALID_STATE, SW_FAULT_ID_RTC_SELF_TEST_INVALID_STATE, // 45 SW_FAULT_ID_RTC_TRANSACTION_SERVICE_INVALID_STATE, @@ -232,10 +237,9 @@ void signalAlarmUserActionInitiated( ALARM_USER_ACTION_T action ); BOOL isAlarmActive( ALARM_ID_T alarm ); ALARM_PRIORITY_T getCurrentAlarmStatePriority( void ); -BOOL isAlarmRecoverable( ALARM_ID_T alarm ); +BOOL isAlarmRecoverable( ALARM_ID_T alarm ); +void setAlarmAudioVolume( U32 volumeLevel ); -BOOL testSetAlarmStatusPublishIntervalOverride( U32 value ); -BOOL testResetAlarmStatusPublishIntervalOverride( void ); BOOL testSetAlarmStateOverride( U32 alarmID, BOOL value ); BOOL testResetAlarmStateOverride( U32 alarmID ); BOOL testSetAlarmStartOverride( U32 alarmID, U32 value ); Index: firmware/App/Services/FPGA.c =================================================================== diff -u -r933a18d740285e70be9d00696ed0f5a5381bc8e4 -rc672f41061bcd500d6593655641cb27ce3ae58fc --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision 933a18d740285e70be9d00696ed0f5a5381bc8e4) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision c672f41061bcd500d6593655641cb27ce3ae58fc) @@ -299,6 +299,7 @@ memset( &fpgaHeader, 0, sizeof(FPGA_HEADER_T) ); memset( &fpgaSensorReadings, 0, sizeof(FPGA_SENSORS_T) ); memset( &fpgaActuatorSetPoints, 0, sizeof(FPGA_ACTUATORS_T) ); + fpgaActuatorSetPoints.AlarmControl = (U08)MAX_ALARM_VOLUME_LEVEL << 2; // start alarm audio volume at maximum // initialize fpga comm buffers memset( &fpgaWriteCmdBuffer, 0, FPGA_WRITE_CMD_BUFFER_LEN ); @@ -1053,6 +1054,31 @@ /*********************************************************************//** * @brief + * The setAlarmAudioState function sets the fpga audio control to the given + * state and volume. + * @details Inputs: none + * @details Outputs: alarm audio state and amplification gain set + * @param state the state of alarm audio to command + * @param volumeLevel the amount of amplification gain to command + * @return none + *************************************************************************/ +void setAlarmAudioState( ALARM_PRIORITY_T state, U32 volumeLevel ) +{ + if ( state < NUM_OF_ALARM_PRIORITIES && volumeLevel <= MAX_ALARM_VOLUME_LEVEL ) + { + U08 audioCmd = (U08)state; + + audioCmd |= ( (U08)volumeLevel << 2 ); + fpgaActuatorSetPoints.AlarmControl = audioCmd; + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_FPGA_INVALID_ALARM_AUDIO_PARAM, volumeLevel ) + } +} + +/*********************************************************************//** + * @brief * The getFPGABloodFlowSignalStrength function gets the latest blood flow * signal strength reading. * @details Inputs: fpgaSensorReadings2 Index: firmware/App/Services/FPGA.h =================================================================== diff -u -r933a18d740285e70be9d00696ed0f5a5381bc8e4 -rc672f41061bcd500d6593655641cb27ce3ae58fc --- firmware/App/Services/FPGA.h (.../FPGA.h) (revision 933a18d740285e70be9d00696ed0f5a5381bc8e4) +++ firmware/App/Services/FPGA.h (.../FPGA.h) (revision c672f41061bcd500d6593655641cb27ce3ae58fc) @@ -45,6 +45,8 @@ void getFPGAVersions( U08 *Id, U08 *Maj, U08 *Min, U08 *Lab ); +void setAlarmAudioState( ALARM_PRIORITY_T state, U32 volumeLevel ); + F32 getFPGABloodFlowSignalStrength( void ); F32 getFPGADialysateFlowSignalStrength( void ); Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r93b7026089877765744c2c465c51fd6912d7084b -rc672f41061bcd500d6593655641cb27ce3ae58fc --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 93b7026089877765744c2c465c51fd6912d7084b) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision c672f41061bcd500d6593655641cb27ce3ae58fc) @@ -1257,10 +1257,6 @@ handleTestBloodFlowBroadcastIntervalOverrideRequest( message ); break; - case MSG_ID_ALARM_STATUS_SEND_INTERVAL_OVERRIDE: - handleTestAlarmStatusBroadcastIntervalOverrideRequest( message ); - break; - case MSG_ID_BLOOD_PUMP_MEAS_SPEED_OVERRIDE: handleTestBloodPumpMeasuredSpeedOverrideRequest( message ); break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r93b7026089877765744c2c465c51fd6912d7084b -rc672f41061bcd500d6593655641cb27ce3ae58fc --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 93b7026089877765744c2c465c51fd6912d7084b) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision c672f41061bcd500d6593655641cb27ce3ae58fc) @@ -2334,38 +2334,6 @@ /*********************************************************************//** * @brief - * The handleTestAlarmStatusBroadcastIntervalOverrideRequest function handles a request to - * override the broadcast interval for alarm status. - * @details Inputs: none - * @details Outputs: message handled - * @param message a pointer to the message to handle - * @return none - *************************************************************************/ -void handleTestAlarmStatusBroadcastIntervalOverrideRequest( MESSAGE_T *message ) -{ - TEST_OVERRIDE_PAYLOAD_T payload; - BOOL result = FALSE; - - // verify payload length - if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) - { - memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); - if ( FALSE == payload.reset ) - { - result = testSetAlarmStatusPublishIntervalOverride( payload.state.u32 ); - } - else - { - result = testResetAlarmStatusPublishIntervalOverride(); - } - } - - // respond to request - sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); -} - -/*********************************************************************//** - * @brief * The handleTestBloodFlowSetPointOverrideRequest function handles a request to * override the set point for the blood flow rate (mL/min). * @details Inputs: none Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r93b7026089877765744c2c465c51fd6912d7084b -rc672f41061bcd500d6593655641cb27ce3ae58fc --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 93b7026089877765744c2c465c51fd6912d7084b) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision c672f41061bcd500d6593655641cb27ce3ae58fc) @@ -265,9 +265,6 @@ // MSG_ID_ALARM_TIME_OVERRIDE void handleTestAlarmTimeOverrideRequest( MESSAGE_T *message ); -// MSG_ID_ALARM_STATUS_SEND_INTERVAL_OVERRIDE -void handleTestAlarmStatusBroadcastIntervalOverrideRequest( MESSAGE_T *message ); - // MSG_ID_BLOOD_FLOW_SET_PT_OVERRIDE void handleTestBloodFlowSetPointOverrideRequest( MESSAGE_T *message ); Index: firmware/App/Tasks/TaskGeneral.c =================================================================== diff -u -rc67def50892f9a7c2f1f22985b5351465a8f6773 -rc672f41061bcd500d6593655641cb27ce3ae58fc --- firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision c67def50892f9a7c2f1f22985b5351465a8f6773) +++ firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision c672f41061bcd500d6593655641cb27ce3ae58fc) @@ -93,9 +93,6 @@ // manage alarm state execAlarmMgmt(); - // control alarm lamp - execAlarmLamp(); - #ifdef RM46_EVAL_BOARD_TARGET if ( getUserButtonState() == PIN_SIGNAL_LOW ) {