Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r1156c9be51ef9f40054860355ebee40b49ef03ca -r52863cba9685f31136ab3f4b4764a17ccf34fc05 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 1156c9be51ef9f40054860355ebee40b49ef03ca) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 52863cba9685f31136ab3f4b4764a17ccf34fc05) @@ -1,6 +1,6 @@ /************************************************************************** * - * Copyright (c) 2019-2019 Diality Inc. - All Rights Reserved. + * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. @@ -18,32 +18,18 @@ #include "Common.h" #include "AlarmLamp.h" +#include "OperationModes.h" +#include "SystemCommMessages.h" +#include "TaskGeneral.h" #include "Timers.h" -#include "AlarmMgmt.h" // ********** private definitions ********** +#define ALARM_STATUS_PUBLISH_INTERVAL (500/TASK_GENERAL_INTERVAL) // 500ms / task interval + #pragma pack(push,1) typedef struct { - ALARM_PRIORITY_T alarmsState; // current alarm priority level - BOOL alarmsSilenced; // alarms are currently silenced? - U32 alarmsSilenceStart; // time stamp for when alarms were silenced (ms) - U32 alarmsSilenceExpiresIn; // time until alarm silence expires (seconds) - U32 alarmsEscalatesIn; // time until alarm will escalate (seconds) - ALARM_ID_T alarmTop; // ID of current top alarm that will drive lamp/audio and UI should be displaying right now - BOOL systemFault; // a system fault is active? - BOOL stop; // we should be in controlled stop right now - BOOL noClear; // no recovery will be possible - BOOL noResume; // treatment may not be resumed at this time - BOOL noRinseback; // rinseback may not be initiated at this time - BOOL noEndTreatment; // ending the treatment is not an option at this time - BOOL noNewTreatment; // no new treatments may be started even if current treatment is ended - BOOL bypassDialyzer; // the dialyzer should be bypassed at this time -} COMP_ALARM_STATUS_T; - -typedef struct -{ ALARM_PRIORITY_T alarmPriority; // priority of alarm U32 alarmEscalatesAfter; // time (s) after start when alarm will escalate if not cleared (zero indicates no escalation) ALARM_ID_T alarmEscalatesTo; // ID of alarm that this alarm will escalate to (ALARM_ID_NO_ALARM indicates no esclation) @@ -56,33 +42,41 @@ BOOL alarmNoNewTreatment; // alarm prevents any new treatments BOOL alarmDialyzerBypass; // alarm activation should cause dialyzer bypass until cleared } ALARM_T; - -typedef struct -{ - BOOL alarmActive; // alarm is currently active? - U32 alarmStart; // time stamp for when alarm was activated -} ALARM_STATUS_T; #pragma pack(pop) -const ALARM_T alarmTable[NUM_OF_ALARM_IDS] = -{ - { ALARM_PRIORITY_NONE, 0, ALARM_ID_NO_ALARM, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_NO_ALARM - { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE } // ALARM_ID_SOFTWARE_FAULT +const ALARM_T alarmTable[ NUM_OF_ALARM_IDS ] = +{ // Priority Esc Escalate To Fault Stops NoClr NoRes NoRin NoEnd NoNew Bypass + { ALARM_PRIORITY_NONE, 0, ALARM_ID_NO_ALARM, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_NO_ALARM + { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_SOFTWARE_FAULT + { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_STUCK_BUTTON_TEST_FAILED + { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_FPGA_POST_TEST_FAILED + { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_WATCHDOG_POST_TEST_FAILED + { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_UI_COMM_POST_FAILED + { ALARM_PRIORITY_MEDIUM, 0, ALARM_ID_NO_ALARM, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_BLOOD_PUMP_MC_CURRENT_CHECK + { ALARM_PRIORITY_MEDIUM, 0, ALARM_ID_NO_ALARM, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_BLOOD_PUMP_MC_SPEED_CHECK + { ALARM_PRIORITY_MEDIUM, 0, ALARM_ID_NO_ALARM, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_BLOOD_PUMP_MC_DIRECTION_CHECK + { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE } // ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_CHECK }; +const ALARM_DATA_T blankAlarmData = { ALARM_DATA_TYPE_NONE, 0 }; + // ********** private data ********** -static ALARM_STATUS_T alarmStatusTable[NUM_OF_ALARM_IDS] = -{ - { FALSE, 0 }, // ALARM_ID_NO_ALARM - { FALSE, 0 } // ALARM_ID_SOFTWARE_FAULT -}; +static U32 alarmStatusPublicationTimerCounter = 0; // used to schedule alarm status publication to CAN bus +// 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 ); + +DATA_ARRAY_DECL( BOOL, AlarmStates, NUM_OF_ALARM_IDS, alarmIsActive ); +DATA_ARRAY_DECL( U32, AlarmStarts, NUM_OF_ALARM_IDS, alarmStartedAt ); + static COMP_ALARM_STATUS_T alarmStatus; -static ALARM_ID_T alarmPriorityFIFO[NUM_OF_ALARM_PRIORITIES]; +static ALARM_ID_T alarmPriorityFIFO[ NUM_OF_ALARM_PRIORITIES ]; // ********** private function prototypes ********** +static void activateAlarm( ALARM_ID_T alarm ); + static void updateAlarmsState( void ); static void setAlarmLampAndAudio( void ); static void updateAlarmsSilenceStatus( void ); @@ -91,6 +85,10 @@ static void resetAlarmPriorityFIFO( ALARM_PRIORITY_T priority ); +static DATA_ARRAY_GET_PROTOTYPE( BOOL, getAlarmActive, alarmID ); +static DATA_ARRAY_GET_PROTOTYPE( U32, getAlarmStartTime, alarmID ); +static DATA_GET_PROTOTYPE( U32, getPublishAlarmStatusInterval ); + /************************************************************************* * @brief initAlarmMgmt * The initAlarmMgmt function initializes the AlarmMgmt module. @@ -103,11 +101,26 @@ void initAlarmMgmt( void ) { ALARM_PRIORITY_T p; + ALARM_ID_T a; + // initialize alarm states and start time stamps + for ( a = ALARM_ID_NO_ALARM; a < NUM_OF_ALARM_IDS; a++ ) + { + alarmIsActive[ a ].data = FALSE; + alarmIsActive[ a ].ovData = FALSE; + alarmIsActive[ a ].ovInitData = TRUE; + alarmIsActive[ a ].override = OVERRIDE_RESET; + alarmStartedAt[ a ].data = 0; + alarmStartedAt[ a ].ovData = 0; + alarmStartedAt[ a ].ovInitData = 0; + alarmStartedAt[ a ].override = OVERRIDE_RESET; + } + // initialize alarm FIFOs for ( p = ALARM_PRIORITY_NONE; p < NUM_OF_ALARM_PRIORITIES; p++ ) { - alarmPriorityFIFO[p] = ALARM_ID_NO_ALARM; + alarmPriorityFIFO[ p ] = ALARM_ID_NO_ALARM; } + // initialize composite alarm state alarmStatus.alarmsState = ALARM_PRIORITY_NONE; alarmStatus.alarmsSilenced = FALSE; alarmStatus.alarmsSilenceStart = 0; @@ -142,87 +155,120 @@ updateAlarmsFlags(); updateAlarmsSilenceStatus(); setAlarmLampAndAudio(); - // TODO - publish alarms status record to rest of system + // publish alarm status at interval + if ( ++alarmStatusPublicationTimerCounter > getPublishAlarmStatusInterval() ) + { + broadcastAlarmStatus( alarmStatus ); + alarmStatusPublicationTimerCounter = 0; + } } /************************************************************************* * @brief activateAlarm - * The activateAlarm function activates a given alarm. Also, an alarm \n - * message is broadcast to the rest of the system. + * The activateAlarm function activates a given alarm. * @details * Inputs : none - * Outputs : AlarmStatusTable[] + * Outputs : alarmIsActive[], alarmStartedAt[] * @param alarm : ID of alarm to activate * @return none *************************************************************************/ -void activateAlarm( ALARM_ID_T alarm ) +static void activateAlarm( ALARM_ID_T alarm ) { // verify given alarm if ( ( alarm > ALARM_ID_NO_ALARM ) && ( alarm < NUM_OF_ALARM_IDS ) ) { - alarmStatusTable[alarm].alarmActive = TRUE; - alarmStatusTable[alarm].alarmStart = getMSTimerCount(); - // TODO - send alarm broadcast msg + // no need to do anything if alarm is already active + if ( FALSE == getAlarmActive( alarm ) ) + { + // if alarm is a fault, request transition to fault mode + if ( TRUE == alarmTable[ alarm ].alarmIsFault ) + { + requestNewOperationMode( MODE_FAUL ); + } + // activate alarm + alarmIsActive[ alarm ].data = TRUE; + alarmStartedAt[ alarm ].data = getMSTimerCount(); +#ifdef DEBUG_ENABLED + { + // TODO - temporary debug code - remove later + char debugStr[ 256 ]; + sprintf( debugStr, "ALARM triggered:%5d \n", alarm ); + sendDebugData( (U08*)debugStr, strlen(debugStr) ); + } +#endif + } } else { - // TODO - s/w fault + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_ACTIVATE, alarm ) } } /************************************************************************* + * @brief activateAlarmNoData + * The activateAlarmNoData function activates a given alarm. Also, an alarm \n + * message is broadcast to the rest of the system. This function will \n + * include given data in the broadcast message for logging. + * @details + * Inputs : none + * Outputs : alarm triggered message sent, alarm activated + * @param alarm : ID of alarm to activate + * @param alarmData : supporting data to include in alarm msg + * @return none + *************************************************************************/ +void activateAlarmNoData( ALARM_ID_T alarm ) +{ + // broadcast alarm and data if alarm not already active + if ( FALSE == alarmIsActive[ alarm ].data ) + { + broadcastAlarmTriggered( alarm, blankAlarmData, blankAlarmData ); + } + activateAlarm( alarm ); +} + +/************************************************************************* * @brief activateAlarm1Data - * The activateAlarm function activates a given alarm. Also, an alarm \n + * The activateAlarm1Data function activates a given alarm. Also, an alarm \n * message is broadcast to the rest of the system. This function will \n * include given data in the broadcast message for logging. * @details * Inputs : none - * Outputs : AlarmStatusTable[] + * Outputs : alarm triggered message sent, alarm activated * @param alarm : ID of alarm to activate * @param alarmData : supporting data to include in alarm msg * @return none *************************************************************************/ void activateAlarm1Data( ALARM_ID_T alarm, ALARM_DATA_T alarmData ) { - // verify given alarm - if ( ( alarm > ALARM_ID_NO_ALARM ) && ( alarm < NUM_OF_ALARM_IDS ) ) + // broadcast alarm and data if alarm not already active + if ( FALSE == alarmIsActive[ alarm ].data ) { - alarmStatusTable[alarm].alarmActive = TRUE; - alarmStatusTable[alarm].alarmStart = getMSTimerCount(); - // TODO - send alarm broadcast msg w/ alarm data + broadcastAlarmTriggered( alarm, alarmData, blankAlarmData ); } - else - { - // TODO - s/w fault - } + activateAlarm( alarm ); } /************************************************************************* * @brief activateAlarm1Data - * The activateAlarm function activates a given alarm. Also, an alarm \n + * The activateAlarm2Data function activates a given alarm. Also, an alarm \n * message is broadcast to the rest of the system. This function will \n * include two given data in the broadcast message for logging. * @details * Inputs : none - * Outputs : AlarmStatusTable[] + * Outputs : alarm triggered message sent, alarm activated * @param alarm : ID of alarm to activate * @param alarmData1 : supporting data to include in alarm msg * @param alarmData2 : supporting data to include in alarm msg * @return none *************************************************************************/ void activateAlarm2Data( ALARM_ID_T alarm, ALARM_DATA_T alarmData1, ALARM_DATA_T alarmData2 ) { - // verify given alarm - if ( ( alarm > ALARM_ID_NO_ALARM ) && ( alarm < NUM_OF_ALARM_IDS ) ) + // broadcast alarm and data if alarm not already active + if ( FALSE == alarmIsActive[ alarm ].data ) { - alarmStatusTable[alarm].alarmActive = TRUE; - alarmStatusTable[alarm].alarmStart = getMSTimerCount(); - // TODO - send alarm broadcast msg w/ alarm data + broadcastAlarmTriggered( alarm, alarmData1, alarmData2 ); } - else - { - // TODO - s/w fault - } + activateAlarm( alarm ); } /************************************************************************* @@ -241,25 +287,68 @@ if ( ( alarm > ALARM_ID_NO_ALARM ) && ( alarm < NUM_OF_ALARM_IDS ) ) { // verify alarm can be cleared - if ( FALSE == alarmTable[alarm].alarmNoClear ) + if ( FALSE == alarmTable[ alarm ].alarmNoClear ) { - alarmStatusTable[alarm].alarmActive = TRUE; - alarmStatusTable[alarm].alarmStart = getMSTimerCount(); - // clear FIFO if this alarm was in it - if ( alarmPriorityFIFO[alarmTable[alarm].alarmPriority] == alarm ) + // clear alarm and broadcast alarm clear if not already cleared + if ( TRUE == alarmIsActive[ alarm ].data ) { - resetAlarmPriorityFIFO( alarmTable[alarm].alarmPriority ); + broadcastAlarmCleared( alarm ); + alarmIsActive[ alarm ].data = FALSE; + alarmStartedAt[ alarm ].data = 0; + // clear FIFO if this alarm was in it + if ( alarmPriorityFIFO[ alarmTable[ alarm ].alarmPriority ] == alarm ) + { + resetAlarmPriorityFIFO( alarmTable[ alarm ].alarmPriority ); + } } - // TODO - send alarm broadcast msg w/ alarm data } } else { - // TODO - s/w fault + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_CLEAR, alarm ) } } /************************************************************************* + * @brief isAlarmActive + * The isAlarmActive function determines whether a given alarm is currently \n + * active. + * @details + * Inputs : alarmIsActive[] + * Outputs : none + * @param alarmID : ID of alarm to check + * @return TRUE if given alarm is active, FALSE if not + *************************************************************************/ +BOOL isAlarmActive( ALARM_ID_T alarm ) +{ + BOOL result = getAlarmActive( alarm ); + + return result; +} + +/************************************************************************* + * @brief getAlarmActive + * The getAlarmActive function gets the active state of a given alarm. + * @details + * Inputs : alarmIsActive[] + * Outputs : none + * @param alarmID : ID of alarm to check + * @return TRUE if given alarm is active, FALSE if not + *************************************************************************/ +static DATA_ARRAY_GET( BOOL, getAlarmActive, alarmID, NUM_OF_ALARM_IDS-1, alarmIsActive, TRUE ) + +/************************************************************************* + * @brief getAlarmStartTime + * The getAlarmStartTime function gets the active state of a given alarm. + * @details + * Inputs : alarmStartedAt[] + * Outputs : none + * @param alarmID : ID of alarm to check + * @return The start time stamp of given alarm ID + *************************************************************************/ +static DATA_ARRAY_GET( U32, getAlarmStartTime, alarmID, NUM_OF_ALARM_IDS-1, alarmStartedAt, 0 ) + +/************************************************************************* * @brief updateAlarmsState * The updateAlarmsState function updates the alarms state and alarm to \n * display. @@ -271,31 +360,32 @@ *************************************************************************/ static void updateAlarmsState( void ) { - ALARM_ID_T tempDisp = ALARM_ID_NO_ALARM; - ALARM_PRIORITY_T tempState = ALARM_PRIORITY_NONE; + ALARM_PRIORITY_T highestPriority = ALARM_PRIORITY_NONE; ALARM_ID_T a; - ALARM_PRIORITY_T p; + BOOL faultsActive = FALSE; // update FIFOs per alarm status table for ( a = ALARM_ID_NO_ALARM; a < NUM_OF_ALARM_IDS; a++ ) { - if ( TRUE == alarmStatusTable[a].alarmActive ) + if ( TRUE == getAlarmActive(a) ) { - if ( ALARM_ID_NO_ALARM == alarmPriorityFIFO[alarmTable[a].alarmPriority] ) + ALARM_PRIORITY_T almPriority = alarmTable[ a ].alarmPriority; + if ( ALARM_ID_NO_ALARM == alarmPriorityFIFO[ almPriority ] ) { - alarmPriorityFIFO[alarmTable[a].alarmPriority] = a; + alarmPriorityFIFO[ almPriority ] = a; } + highestPriority = MAX( almPriority, highestPriority ); + if ( TRUE == alarmTable[ a ].alarmIsFault ) + { + faultsActive = TRUE; + } } } - // update alarms status and alarm to display per highest priority FIFO - for ( p = ALARM_PRIORITY_LOW; p < NUM_OF_ALARM_PRIORITIES; p++ ) - { - tempState = p; - tempDisp = alarmPriorityFIFO[p]; - } - alarmStatus.alarmsState = tempState; - alarmStatus.alarmTop = tempDisp; + // update alarm to display per highest priority FIFO + alarmStatus.alarmsState = highestPriority; + alarmStatus.alarmTop = alarmPriorityFIFO[ highestPriority ]; + alarmStatus.systemFault = faultsActive; } /************************************************************************* @@ -304,44 +394,47 @@ * according to the current state of alarms. * @details * Inputs : none - * Outputs : none + * Outputs : Alarm lamp patter set according to current alarms status. * @param none * @return none *************************************************************************/ static void setAlarmLampAndAudio( void ) { - switch ( alarmStatus.alarmsState ) + if ( getCurrentAlarmLampPattern() != LAMP_PATTERN_MANUAL ) { - case ALARM_PRIORITY_NONE: - requestAlarmLampPattern( LAMP_PATTERN_OK ); - // TODO - no audio - break; + switch ( alarmStatus.alarmsState ) + { + case ALARM_PRIORITY_NONE: + requestAlarmLampPattern( LAMP_PATTERN_OK ); + // TODO - no audio + break; - case ALARM_PRIORITY_LOW: - requestAlarmLampPattern( LAMP_PATTERN_LOW_ALARM ); - // TODO - low priority audio - break; + case ALARM_PRIORITY_LOW: + requestAlarmLampPattern( LAMP_PATTERN_LOW_ALARM ); + // TODO - low priority audio + break; - case ALARM_PRIORITY_MEDIUM: - requestAlarmLampPattern( LAMP_PATTERN_MED_ALARM ); - // TODO - medium priority audio - break; + case ALARM_PRIORITY_MEDIUM: + requestAlarmLampPattern( LAMP_PATTERN_MED_ALARM ); + // TODO - medium priority audio + break; - case ALARM_PRIORITY_HIGH: - if ( TRUE == alarmTable[alarmStatus.alarmTop].alarmIsFault ) - { - requestAlarmLampPattern( LAMP_PATTERN_FAULT ); - } - else - { - requestAlarmLampPattern( LAMP_PATTERN_HIGH_ALARM ); - } - // TODO - high priority audio - break; + case ALARM_PRIORITY_HIGH: + if ( TRUE == alarmTable[ alarmStatus.alarmTop ].alarmIsFault ) + { + requestAlarmLampPattern( LAMP_PATTERN_FAULT ); + } + else + { + requestAlarmLampPattern( LAMP_PATTERN_HIGH_ALARM ); + } + // TODO - high priority audio + break; - default: - // TODO - s/w fault - break; + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_LAMP_INVALID_ALARM_STATE, alarmStatus.alarmsState ) + break; + } } } @@ -403,7 +496,155 @@ // verify priority if ( priority < NUM_OF_ALARM_PRIORITIES ) { - alarmPriorityFIFO[priority] = ALARM_ID_NO_ALARM; + alarmPriorityFIFO[ priority ] = ALARM_ID_NO_ALARM; } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_FIFO_TO_RESET, priority ) + } } +/************************************************************************* + * @brief getPublishAlarmStatusInterval + * The getPublishAlarmStatusInterval function gets the alarm status \n + * publication interval. + * @details + * Inputs : alarmStatusPublishInterval + * Outputs : none + * @param none + * @return the current alarm status publication interval (in ms). + *************************************************************************/ +DATA_GET( U32, getPublishAlarmStatusInterval, alarmStatusPublishInterval ) + + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/************************************************************************* + * @brief testSetAlarmStatusPublishIntervalOverride + * The testSetAlarmStatusPublishIntervalOverride function overrides the \n + * alarm status publish interval. + * @details + * Inputs : none + * 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; + + if ( TRUE == isTestingActivated() ) + { + U32 intvl = value / TASK_GENERAL_INTERVAL; + + result = TRUE; + alarmStatusPublishInterval.ovData = intvl; + alarmStatusPublishInterval.override = OVERRIDE_KEY; + } + + return result; +} + +/************************************************************************* + * @brief testResetAlarmStatusPublishIntervalOverride + * The testResetAlarmStatusPublishIntervalOverride function resets the override \n + * of the alarm status publish interval. + * @details + * Inputs : none + * Outputs : alarmStatusPublishInterval + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetAlarmStatusPublishIntervalOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + alarmStatusPublishInterval.override = OVERRIDE_RESET; + alarmStatusPublishInterval.ovData = alarmStatusPublishInterval.ovInitData; + } + + return result; +} + +/************************************************************************* + * @brief testSetAlarmStateOverride and testResetAlarmStateOverride + * The testSetAlarmStateOverride function overrides the state of the \n + * alarm active state for a given alarm with the alarm management with \n + * a given active state. + * The testResetAlarmStateOverride function resets the override of the \n + * state of the active state for a given alarm with the alarm management. + * @details + * Inputs : none + * Outputs : alarmIsActive[] + * @param alarmID : ID of alarm to override active state for + * @param value : override state for the given alarm ID + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +DATA_ARRAY_OVERRIDE_FUNC( BOOL, testSetAlarmStateOverride, testResetAlarmStateOverride, alarmIsActive, alarmID, NUM_OF_ALARM_IDS-1 ) + +/************************************************************************* + * @brief testSetAlarmStartOverride + * The testSetAlarmStartOverride function overrides the start time \n + * for a given alarm with the alarm management with a given start time. \n + * @details + * Inputs : none + * Outputs : alarmStartedAt[] + * @param alarmID : ID of alarm to override start time for + * @param value : override time since start (in ms) for the given alarm ID + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetAlarmStartOverride( U32 alarmID, U32 value ) +{ + BOOL result = FALSE; + + if ( alarmID < NUM_OF_ALARM_IDS ) + { + if ( TRUE == isTestingActivated() ) + { + U32 tim = getMSTimerCount(); + + if ( tim > value ) + { + result = TRUE; + alarmStartedAt[ alarmID ].ovData = ( tim - value ); + alarmStartedAt[ alarmID ].override = OVERRIDE_KEY; + } + } + } + + return result; +} + +/************************************************************************* + * @brief testResetAlarmStartOverride + * The testResetAlarmStartOverride function resets the override of the \n + * start time for a given alarm with the alarm management. + * @details + * Inputs : none + * Outputs : alarmStartedAt[] + * @param alarmID : ID of alarm to reset override of start time for + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetAlarmStartOverride( U32 alarmID ) +{ + BOOL result = FALSE; + + if ( alarmID < NUM_OF_ALARM_IDS ) + { + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + alarmStartedAt[ alarmID ].override = OVERRIDE_RESET; + alarmStartedAt[ alarmID ].ovData = alarmStartedAt[ alarmID ].ovInitData; + } + } + + return result; +} + +