Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r2fea76e972a450a97c74b2a9f627095032a3b586 -rac55f23681cd3a29ec235265f73c67895e36ada9 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 2fea76e972a450a97c74b2a9f627095032a3b586) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision ac55f23681cd3a29ec235265f73c67895e36ada9) @@ -33,7 +33,8 @@ // ********** private data ********** -static OVERRIDE_U32_T alarmIsActive[ NUM_OF_ALARM_IDS ]; ///< Array of current state of each alarm +static OVERRIDE_U32_T 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 // ********** private function prototypes ********** @@ -57,7 +58,9 @@ alarmIsActive[ a ].data = FALSE; alarmIsActive[ a ].ovData = FALSE; alarmIsActive[ a ].ovInitData = TRUE; - alarmIsActive[ a ].override = OVERRIDE_RESET; + alarmIsActive[ a ].override = OVERRIDE_RESET; + + alarmConditionIsActive[ a ] = FALSE; } } @@ -90,7 +93,8 @@ if ( FALSE == getAlarmActive( alarm ) ) { // activate alarm - alarmIsActive[ alarm ].data = TRUE; + alarmIsActive[ alarm ].data = TRUE; + alarmConditionIsActive[ alarm ] = TRUE; } } else @@ -113,7 +117,7 @@ // broadcast alarm and data if alarm not already active if ( FALSE == alarmIsActive[ alarm ].data ) { - broadcastAlarmTriggered( (U16)alarm, blankAlarmData, blankAlarmData ); + broadcastAlarmTriggered( alarm, blankAlarmData, blankAlarmData ); #ifdef DEBUG_ENABLED #ifdef ALARMS_DEBUG { @@ -146,7 +150,7 @@ // broadcast alarm and data if alarm not already active if ( FALSE == alarmIsActive[ alarm ].data ) { - broadcastAlarmTriggered( (U16)alarm, alarmData, blankAlarmData ); + broadcastAlarmTriggered( alarm, alarmData, blankAlarmData ); #ifdef DEBUG_ENABLED #ifdef ALARMS_DEBUG { @@ -180,7 +184,7 @@ // broadcast alarm and data if alarm not already active if ( FALSE == alarmIsActive[ alarm ].data ) { - broadcastAlarmTriggered( (U16)alarm, alarmData1, alarmData2 ); + broadcastAlarmTriggered( alarm, alarmData1, alarmData2 ); #ifdef DEBUG_ENABLED #ifdef ALARMS_DEBUG { @@ -235,6 +239,33 @@ } } +/*********************************************************************//** + * @brief + * The clearAlarmCondition function clears a given alarm's condition detected + * flag. Also an alarm message is broadcast to the rest of the system. + * @details Inputs: none + * @details Outputs: alarmConditionIsActive[] + * @param alarm ID of alarm to clear condition for + * @return none + *************************************************************************/ +void clearAlarmCondition( ALARM_ID_T alarm ) +{ + // verify given alarm + if ( ( alarm > ALARM_ID_NO_ALARM ) && ( alarm < NUM_OF_ALARM_IDS ) ) + { + // clear alarm and broadcast alarm clear if not already cleared + if ( TRUE == alarmConditionIsActive[ alarm ] ) + { + broadcastAlarmConditionCleared( alarm ); + alarmConditionIsActive[ alarm ] = FALSE; + } + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_ID, alarm ) + } +} + /*********************************************************************//** * @brief * The isAlarmActive function determines whether a given alarm is currently active. Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r2fea76e972a450a97c74b2a9f627095032a3b586 -rac55f23681cd3a29ec235265f73c67895e36ada9 --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 2fea76e972a450a97c74b2a9f627095032a3b586) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision ac55f23681cd3a29ec235265f73c67895e36ada9) @@ -163,6 +163,7 @@ SW_FAULT_ID_DRAIN_PUMP_INVALID_DELTA_PRESSURE_SELECTED, SW_FAULT_ID_INVALID_TEMPERATURE_SENSOR_SELECTED, SW_FAULT_ID_DRAIN_PUMP_INVALID_RPM_SELECTED, + SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_ID, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r3d8b84b8ce7ee9526fbabccb9e51d691a3df6305 -rac55f23681cd3a29ec235265f73c67895e36ada9 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 3d8b84b8ce7ee9526fbabccb9e51d691a3df6305) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision ac55f23681cd3a29ec235265f73c67895e36ada9) @@ -227,7 +227,7 @@ * @param almData2 2nd data associated with alarm * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ -BOOL broadcastAlarmTriggered( U16 alarm, ALARM_DATA_T almData1, ALARM_DATA_T almData2 ) +BOOL broadcastAlarmTriggered( U32 alarm, ALARM_DATA_T almData1, ALARM_DATA_T almData2 ) { BOOL result; MESSAGE_T msg; @@ -236,10 +236,10 @@ // create a message record blankMessage( &msg ); msg.hdr.msgID = MSG_ID_ALARM_TRIGGERED; - msg.hdr.payloadLen = sizeof( U16 ) + sizeof( ALARM_DATA_T ) + sizeof( ALARM_DATA_T ); + msg.hdr.payloadLen = sizeof( U32 ) + sizeof( ALARM_DATA_T ) + sizeof( ALARM_DATA_T ); - memcpy( payloadPtr, &alarm, sizeof( U16 ) ); - payloadPtr += sizeof( U16 ); + memcpy( payloadPtr, &alarm, sizeof( U32 ) ); + payloadPtr += sizeof( U32 ); memcpy( payloadPtr, &almData1, sizeof( ALARM_DATA_T ) ); payloadPtr += sizeof( ALARM_DATA_T ); memcpy( payloadPtr, &almData2, sizeof( ALARM_DATA_T ) ); @@ -259,7 +259,7 @@ * @param alarm ID of alarm cleared * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ -BOOL broadcastAlarmCleared( U16 alarm ) +BOOL broadcastAlarmCleared( U32 alarm ) { BOOL result; MESSAGE_T msg; @@ -268,9 +268,9 @@ // create a message record blankMessage( &msg ); msg.hdr.msgID = MSG_ID_ALARM_CLEARED; - msg.hdr.payloadLen = sizeof( U16 ); + msg.hdr.payloadLen = sizeof( U32 ); - memcpy( payloadPtr, &alarm, sizeof( U16 ) ); + memcpy( payloadPtr, &alarm, sizeof( U32 ) ); // serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_DG_ALARM, ACK_REQUIRED ); @@ -280,6 +280,35 @@ /*********************************************************************//** * @brief + * The broadcastAlarmConditionCleared function constructs an alarm condition + * cleared msg to be broadcast and queues the msg for transmit on the + * appropriate CAN channel. + * @details Inputs: none + * @details Outputs: alarm condition cleared msg constructed and queued. + * @param alarm ID of alarm which alarm condition is cleared + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastAlarmConditionCleared( U32 alarm ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_ALARM_CONDITION_CLEARED; + msg.hdr.payloadLen = sizeof( U32 ); + + memcpy( payloadPtr, &alarm, sizeof( U32 ) ); + + // serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer + result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_DG_ALARM, ACK_REQUIRED ); + + return result; +} + +/*********************************************************************//** + * @brief * The broadcastAccelData function constructs an accelerometer data msg to * be broadcast and queues the msg for transmit on the appropriate CAN channel. * @details Inputs: none Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r00b32a5dad2e136d31cfaf0de16f7767b9920fec -rac55f23681cd3a29ec235265f73c67895e36ada9 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 00b32a5dad2e136d31cfaf0de16f7767b9920fec) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision ac55f23681cd3a29ec235265f73c67895e36ada9) @@ -42,11 +42,14 @@ BOOL sendACKMsg( MESSAGE_T *message ); // MSG_ID_ALARM_TRIGGERED -BOOL broadcastAlarmTriggered( U16 alarm, ALARM_DATA_T almData1, ALARM_DATA_T almData2 ); +BOOL broadcastAlarmTriggered( U32 alarm, ALARM_DATA_T almData1, ALARM_DATA_T almData2 ); // MSG_ID_ALARM_CLEARED -BOOL broadcastAlarmCleared( U16 alarm ); +BOOL broadcastAlarmCleared( U32 alarm ); +// MSG_ID_ALARM_CONDITION_CLEARED +BOOL broadcastAlarmConditionCleared( U32 alarm ); + // MSG_ID_DG_ACCELEROMETER_DATA BOOL broadcastAccelData( F32 x, F32 y, F32 z, F32 xm, F32 ym, F32 zm, F32 xt, F32 yt, F32 zt );