Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r92d1230313c92c7480b9ae80a37b7a594232f59d -r9888b5cfd349830ed220cd1e65c608140c85bd85 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 92d1230313c92c7480b9ae80a37b7a594232f59d) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 9888b5cfd349830ed220cd1e65c608140c85bd85) @@ -20,6 +20,7 @@ #include "AlarmMgmt.h" #include "OperationModes.h" #include "PersistentAlarm.h" +#include "SafetyShutdown.h" #include "SystemComm.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" @@ -32,6 +33,9 @@ // ********** private definitions ********** +/// Interval (ms/task time) at which the alarm information is published on the CAN bus. +#define ALARM_INFO_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) + // *** This declaration will cause a compiler error if ALARM_TABLE does not have same # of alarms as the Alarm_List enumeration. U08 alarmTableSizeAssertion[ ( ( sizeof( ALARM_TABLE ) / sizeof( ALARM_T ) ) == NUM_OF_ALARM_IDS ? 1 : -1 ) ]; @@ -46,10 +50,14 @@ static BOOL alarmIsActive[ NUM_OF_ALARM_IDS ]; ///< Array of current state of each alarm static BOOL alarmConditionIsActive[ NUM_OF_ALARM_IDS ]; ///< Array of flag indicates if an alarm condition is active +static U32 alarmInfoPublicationTimerCounter = 0; ///< Used to schedule alarm information publication to CAN bus. +/// Interval (in task intervals) at which to publish alarm information to CAN bus. +static OVERRIDE_U32_T alarmInfoPublishInterval = { ALARM_INFO_PUB_INTERVAL, ALARM_INFO_PUB_INTERVAL, ALARM_INFO_PUB_INTERVAL, 0 }; // ********** private function prototypes ********** static void activateAlarm( ALARM_ID_T alarm ); +static void publishAlarmInfo( void ); /*********************************************************************//** * @brief @@ -80,6 +88,9 @@ void execAlarmMgmt( void ) { // TODO - any alarm audio or LED/lamp management for DG? + + // Publish alarm information at interval + publishAlarmInfo(); } /*********************************************************************//** @@ -248,6 +259,26 @@ /*********************************************************************//** * @brief + * The publishAlarmInfo function publishes alarm information at the set + * interval. + * @details Inputs: + * @details Outputs: alarm information are published to CAN bus. + * @return none + *************************************************************************/ +static void publishAlarmInfo( void ) +{ + // Publish voltages monitor data on interval + if ( ++alarmInfoPublicationTimerCounter >= getU32OverrideValue( &alarmInfoPublishInterval ) ) + { + BOOL safetyActivated = isSafetyShutdownActivated(); + + broadcastData( MSG_ID_DG_ALARM_INFO, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&safetyActivated, sizeof( BOOL ) ); + alarmInfoPublicationTimerCounter = 0; + } +} + +/*********************************************************************//** + * @brief * The checkPersistentAlarm function triggers/clears an alarm if an alarm condition * has persisted/cleared over given time limit. * @details Inputs: none @@ -375,4 +406,51 @@ return result; } +/*********************************************************************//** + * @brief + * The testSetAlarmInfoPublishIntervalOverride function sets the override of the + * alarm information publication interval. + * @details Inputs: none + * @details Outputs: alarmInfoPublishInterval + * @param ms milliseconds between alarm info broadcasts + * @return TRUE if override set successful, FALSE if not + *************************************************************************/ +BOOL testSetAlarmInfoPublishIntervalOverride( U32 ms ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + U32 intvl = ms / TASK_GENERAL_INTERVAL; + + result = TRUE; + alarmInfoPublishInterval.ovData = intvl; + alarmInfoPublishInterval.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetAlarmInfoPublishIntervalOverride function resets the override of the + * alarm information publication interval. + * @details Inputs: none + * @details Outputs: alarmInfoPublishInterval + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetAlarmInfoPublishIntervalOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + alarmInfoPublishInterval.override = OVERRIDE_RESET; + alarmInfoPublishInterval.ovData = alarmInfoPublishInterval.ovInitData; + } + + return result; +} + /**@}*/ Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r92d1230313c92c7480b9ae80a37b7a594232f59d -r9888b5cfd349830ed220cd1e65c608140c85bd85 --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 92d1230313c92c7480b9ae80a37b7a594232f59d) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 9888b5cfd349830ed220cd1e65c608140c85bd85) @@ -93,6 +93,8 @@ BOOL testSetAlarmStateOverride( U32 alarmID, BOOL value ); BOOL testResetAlarmStateOverride( U32 alarmID ); BOOL testClearAllAlarms( U32 key ); +BOOL testSetAlarmInfoPublishIntervalOverride( U32 ms ); +BOOL testResetAlarmInfoPublishIntervalOverride( void ); /**@}*/ Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r92d1230313c92c7480b9ae80a37b7a594232f59d -r9888b5cfd349830ed220cd1e65c608140c85bd85 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 92d1230313c92c7480b9ae80a37b7a594232f59d) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 9888b5cfd349830ed220cd1e65c608140c85bd85) @@ -1292,6 +1292,10 @@ handleTestSuperClearAlarmsRequest( message ); break; + case MSG_ID_DG_ALARM_INFO_SEND_INTERVAL_OVERRIDE: + handleTestAlarmInfoSendIntervalOverrideRequest( message ); + break; + default: // TODO - unrecognized message ID received - ignore break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r92d1230313c92c7480b9ae80a37b7a594232f59d -r9888b5cfd349830ed220cd1e65c608140c85bd85 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 92d1230313c92c7480b9ae80a37b7a594232f59d) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 9888b5cfd349830ed220cd1e65c608140c85bd85) @@ -3824,6 +3824,38 @@ /*********************************************************************//** * @brief + * The handleTestAlarmInfoSendIntervalOverrideRequest function handles a + * request to override the HD alarm information broadcast interval. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestAlarmInfoSendIntervalOverrideRequest( 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 = testSetAlarmInfoPublishIntervalOverride( payload.state.u32 ); + } + else + { + result = testResetAlarmInfoPublishIntervalOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief * The handleTestSuperClearAlarmsRequest function handles a request to clear * all active alarms on DG. * @details Inputs: none Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r92d1230313c92c7480b9ae80a37b7a594232f59d -r9888b5cfd349830ed220cd1e65c608140c85bd85 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 92d1230313c92c7480b9ae80a37b7a594232f59d) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 9888b5cfd349830ed220cd1e65c608140c85bd85) @@ -413,6 +413,9 @@ // MSG_ID_DG_BLOCK_MESSAGE_TRANSMISSION void handleTestBlockMessagesRequest( MESSAGE_T *message ); +// MSG_ID_DG_ALARM_INFO_SEND_INTERVAL_OVERRIDE +void handleTestAlarmInfoSendIntervalOverrideRequest( MESSAGE_T *message ); + // MSG_ID_DG_SUPER_CLEAR_ALARMS_CMD void handleTestSuperClearAlarmsRequest( MESSAGE_T *message ); Index: firmware/App/Tasks/TaskGeneral.c =================================================================== diff -u -rc55d371408bdf962de525a47bc8541d5b43414a3 -r9888b5cfd349830ed220cd1e65c608140c85bd85 --- firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision c55d371408bdf962de525a47bc8541d5b43414a3) +++ firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 9888b5cfd349830ed220cd1e65c608140c85bd85) @@ -18,6 +18,7 @@ #include "gio.h" #include "lin.h" +#include "AlarmMgmt.h" #include "ConcentratePumps.h" #include "DrainPump.h" #include "Fans.h" @@ -125,7 +126,10 @@ // Run non-volatile data management state machine that sends the data record // to Dialin execNVDataMgmtProcessRecord(); - + + // Run alarm management + execAlarmMgmt(); + // manage data to be transmitted to other sub-systems execSystemCommTx();