Index: firmware/App/Services/AlarmMgmtDD.c =================================================================== diff -u -r4b09605126f35b80406e95d079f3822c51a3ba25 -r0d45291a1e7fb3fbc67c9159766b99cf0ca6d57d --- firmware/App/Services/AlarmMgmtDD.c (.../AlarmMgmtDD.c) (revision 4b09605126f35b80406e95d079f3822c51a3ba25) +++ firmware/App/Services/AlarmMgmtDD.c (.../AlarmMgmtDD.c) (revision 0d45291a1e7fb3fbc67c9159766b99cf0ca6d57d) @@ -95,18 +95,19 @@ *************************************************************************/ static void activateAlarmDD( ALARM_ID_T alarm ) { + ALARM_T props; // verify given alarm if ( ( alarm > ALARM_ID_NO_ALARM ) && ( alarm < NUM_OF_ALARM_IDS ) ) { - ALARM_T props = getAlarmProperties( alarm ); + props = getAlarmProperties( alarm ); // no need to do anything if alarm is already active if ( FALSE == isAlarmActive( alarm ) ) { // activate alarm activateAlarm( alarm ); - if ( TRUE == props.alarmIsDDFault ) + if ( ( TRUE == props.alarmIsDDFault ) && ( ALM_SRC_DD == props.alarmSource ) ) { // There is a DD fault alarm. isAFaultAlarmActive = TRUE; @@ -118,6 +119,18 @@ //requestNewOperationMode( DD_MODE_FAUL ); } } + if ( ( TRUE == props.alarmIsDDFault ) && ( ALM_SRC_FP == props.alarmSource ) ) + { + // There is a DD fault alarm cause by FP. + isAFaultAlarmActive = TRUE; + + if ( TRUE == isTransitionToFaultRequired() ) + { + // If alarm is a FP fault and the alarm manager can transition to fault immediately, go to fault mode + //TODO : Testing - remove the comment later + //requestNewFPOperationMode( FP_MODE_FAUL ); + } + } } } else @@ -175,7 +188,7 @@ void activateAlarm2Data( ALARM_ID_T alarm, ALARM_DATA_T alarmData1, ALARM_DATA_T alarmData2, BOOL outside ) { TD_MODE_SUB_MODE_T tdModes; - ALARM_T props = getAlarmProperties( alarm ); + ALARM_T props = getAlarmProperties( alarm ); getTDOperationMode( &tdModes ); @@ -186,7 +199,7 @@ // broadcast alarm and data if alarm not already active if ( ( FALSE == isAlarmActive( alarm ) ) && ( TRUE == isTDCommunicating() ) ) { - broadcastAlarmTriggered( alarm, alarmData1, alarmData2 ); + broadcastAlarmTriggered( alarm, alarmData1, alarmData2, props.alarmSource ); } activateAlarmDD( alarm ); } @@ -207,7 +220,7 @@ *************************************************************************/ void clearAlarmDD( ALARM_ID_T alarm ) { - ALARM_T props = getAlarmProperties( alarm ); + ALARM_T props = getAlarmProperties( alarm ); // verify given alarm if ( ( alarm > ALARM_ID_NO_ALARM ) && ( alarm < NUM_OF_ALARM_IDS ) ) @@ -217,7 +230,7 @@ { if ( TRUE == isTDCommunicating() ) { - broadcastAlarmCleared( alarm ); + broadcastAlarmCleared( alarm, props.alarmSource ); } setAlarmActive( alarm, FALSE ); clearAlarmConditionDD( alarm ); @@ -244,6 +257,7 @@ *************************************************************************/ void clearAlarmConditionDD( ALARM_ID_T alarm ) { + ALARM_T props = getAlarmProperties( alarm ); // verify given alarm if ( ( alarm > ALARM_ID_NO_ALARM ) && ( alarm < NUM_OF_ALARM_IDS ) ) { @@ -252,7 +266,7 @@ { if ( TRUE == isTDCommunicating() ) { - broadcastAlarmConditionCleared( alarm ); + broadcastAlarmConditionCleared( alarm, props.alarmSource ); } setAlarmConditionDetected( alarm, FALSE ); } @@ -311,13 +325,15 @@ *************************************************************************/ void handleResendActiveAlarmsRequest( void ) { + ALARM_T props; U32 index; for ( index = 0; index < NUM_OF_ALARM_IDS; index++ ) { if ( TRUE == isAlarmActive( (ALARM_ID_T)index ) ) { - broadcastAlarmTriggered( index, BLANK_ALARM_DATA, BLANK_ALARM_DATA ); + props = getAlarmProperties( (ALARM_ID_T)index ); + broadcastAlarmTriggered( index, BLANK_ALARM_DATA, BLANK_ALARM_DATA, props.alarmSource ); } } } @@ -381,10 +397,61 @@ * TEST SUPPORT FUNCTIONS *************************************************************************/ +/*********************************************************************//** + * @brief + * The testDDClearAllAlarms function clears all active DD alarms, even if they + * are non-recoverable or faults. The caller of this function must provide + * the correct 32-bit key. A Dialin user must also be logged into DD. + * @details \b Inputs: none + * @details \b Outputs: alarmIsActive[], alarmStartedAt[] + * @details \b Message \b Sent: MSG_ID_ALARM_CLEARED to clear all alarms. + * @param key 32-bit supervisor alarm key required to perform this function + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testDDClearAllAlarms( MESSAGE_T *message ) +{ + BOOL result = FALSE; + ALARM_T props; + U32 key; + // Verify tester has logged in with TD + if ( TRUE == isTestingActivated() ) + { + // Verify payload length + if ( sizeof(U32) == message->hdr.payloadLen ) + { + memcpy( &key, message->payload, sizeof(U32) ); + + // Verify key + if ( SUPERVISOR_ALARM_KEY == key ) + { + ALARM_ID_T a; + + // Clear all active alarms + for ( a = ALARM_ID_NO_ALARM; a < NUM_OF_ALARM_IDS; a++ ) + { + props = getAlarmProperties( a ); + if ( TRUE == isAlarmActive( a ) && ( ALM_SRC_DD == props.alarmSource)) + { + ALARM_NAME_DATA_T data; + + data.alarmName = (U32)a; + + broadcastData( MSG_ID_ALARM_CLEARED, COMM_BUFFER_OUT_CAN_DD_ALARM, (U08*)&data, sizeof( ALARM_NAME_DATA_T ) ); + setAlarmActive( a, FALSE ); + } + } + result = TRUE; + } + } + } + + return result; +} + /*********************************************************************//** * @brief - * The testClearAllAlarms function clears all active alarms, even if they + * The testFPClearAllAlarms function clears all active FP alarms, even if they * are non-recoverable or faults. The caller of this function must provide * the correct 32-bit key. A Dialin user must also be logged into DD. * @details \b Inputs: none @@ -393,32 +460,41 @@ * @param key 32-bit supervisor alarm key required to perform this function * @return TRUE if override reset successful, FALSE if not *************************************************************************/ -BOOL testClearAllAlarms( U32 key ) +BOOL testFPClearAllAlarms( MESSAGE_T *message ) { BOOL result = FALSE; + ALARM_T props; + U32 key; - // Verify key - if ( SUPERVISOR_ALARM_KEY == key ) + // Verify tester has logged in with TD + if ( TRUE == isTestingActivated() ) { - // Verify tester has logged in with HD - if ( TRUE == isTestingActivated() ) + // Verify payload length + if ( sizeof(U32) == message->hdr.payloadLen ) { - ALARM_ID_T a; + memcpy( &key, message->payload, sizeof(U32) ); - // Clear all active alarms - for ( a = ALARM_ID_NO_ALARM; a < NUM_OF_ALARM_IDS; a++ ) + // Verify key + if ( SUPERVISOR_ALARM_KEY == key ) { - if ( TRUE == isAlarmActive( a ) ) + ALARM_ID_T a; + + // Clear all active alarms + for ( a = ALARM_ID_NO_ALARM; a < NUM_OF_ALARM_IDS; a++ ) { - ALARM_NAME_DATA_T data; + props = getAlarmProperties( a ); + if ( TRUE == isAlarmActive( a ) && ( ALM_SRC_FP == props.alarmSource)) + { + ALARM_NAME_DATA_T data; - data.alarmName = (U32)a; + data.alarmName = (U32)a; - broadcastData( MSG_ID_ALARM_CLEARED, COMM_BUFFER_OUT_CAN_DD_ALARM, (U08*)&data, sizeof( ALARM_NAME_DATA_T ) ); - setAlarmActive( a, FALSE ); + broadcastData( MSG_ID_ALARM_CLEARED, COMM_BUFFER_OUT_CAN_FP_ALARM, (U08*)&data, sizeof( ALARM_NAME_DATA_T ) ); + setAlarmActive( a, FALSE ); + } } + result = TRUE; } - result = TRUE; } }