Index: dialin/dg/alarms.py =================================================================== diff -u -r9bc00e997e91dab8b404aa877b02ae3d4100d417 -rb88bd81598f55b6fcfac0fd42b2da3754fbf765e --- dialin/dg/alarms.py (.../alarms.py) (revision 9bc00e997e91dab8b404aa877b02ae3d4100d417) +++ dialin/dg/alarms.py (.../alarms.py) (revision b88bd81598f55b6fcfac0fd42b2da3754fbf765e) @@ -18,6 +18,7 @@ from .constants import RESET, NO_RESET from ..common.msg_defs import MsgIds, MsgFieldPositions +from ..common.dg_defs import DGEventDataType from ..utils.checks import check_broadcast_interval_override_ms from ..protocols.CAN import DenaliMessage, DenaliChannels from ..utils.base import AbstractSubSystem, publish @@ -63,7 +64,32 @@ # alarm condition states based on received DG alarm activation and clear condition messages self.alarm_conditions = [False] * self._ALARM_ID_MAX_ALARMS self.safety_shutdown_active = False + self.alarm_data_type = dict() + self.alarm_data = [0, 0] * self._ALARM_ID_MAX_ALARMS + # alarm priorities based on received DG alarm activation messages + self.alarm_priorities = [0] * self._ALARM_ID_MAX_ALARMS + # alarm ranks based on received DG alarm activation messages + self.alarm_ranks = [0] * self._ALARM_ID_MAX_ALARMS + # alarm clear top only flags based on received DG alarm activation messages + self.alarm_clear_top_only_flags = [False] * self._ALARM_ID_MAX_ALARMS + + # Loop through the list of the event data type enum and update the dictionary + for data_type in DGEventDataType: + event_data_type = DGEventDataType(data_type).name + struct_unpack_type = None + + # If U32 is in the data type enum (i.e. EVENT_DATA_TYPE_U32), then the key is the enum and the value is + # the corresponding format in the python struct + if 'U32' in event_data_type or 'BOOL' in event_data_type or 'NONE' in event_data_type: + struct_unpack_type = 'I' + elif 'S32' in event_data_type: + struct_unpack_type = 'i' + elif 'F32' in event_data_type: + struct_unpack_type = 'f' + + self.alarm_data_type[event_data_type] = struct_unpack_type + def get_alarm_states(self): """ Gets all states for all alarms @@ -105,7 +131,16 @@ for x in range(self._ALARM_ID_MAX_ALARMS): self.alarm_states[x] = False - @publish(["dg_alarm_triggered_timestamp","alarm_states"]) + def get_alarm_data(self, alarm_id) -> list: + """ + Gets the alarm data fields for the requested alarm id + + @return: the alarm data fields for the requested alarm id + """ + return self.alarm_data[alarm_id] + + @publish(["dg_alarm_triggered_timestamp", "alarm_states", "alarm_conditions", "alarm_data", + "alarm_priorities", "alarm_ranks", "alarm_clear_top_only_flags"]) def _handler_alarm_triggered(self, message, timestamp = 0.0): """ Handles published DG alarm activation messages. @@ -115,8 +150,30 @@ """ alarm_id = struct.unpack(' list: + """ + Gets the alarm data fields for the requested alarm id + + @return: the alarm data fields for the requested alarm id + """ + return self.alarm_data[alarm_id] + @publish(["hd_alarm_status_timestamp", "alarms_state", "alarm_top", "alarms_silence_expires_in", "alarms_escalates_in", "alarms_flags"]) def _handler_alarms_status_sync(self, message, timestamp=0.0): """ @@ -437,7 +449,8 @@ self.hd_alarm_status_timestamp = timestamp - @publish(["hd_alarm_triggered_timestamp", "alarm_states", "alarm_conditions", "alarm_priorities", "alarm_ranks", "alarm_clear_top_only_flags"]) + @publish(["hd_alarm_triggered_timestamp", "alarm_states", "alarm_conditions", "alarm_data", + "alarm_priorities", "alarm_ranks", "alarm_clear_top_only_flags"]) def _handler_alarm_trigger(self, message, timestamp=0.0): """ Handles published HD alarm activation messages. @@ -470,6 +483,7 @@ self.alarm_priorities[alarm_id[0]] = priority[0] self.alarm_ranks[alarm_id[0]] = rank[0] self.alarm_clear_top_only_flags[alarm_id[0]] = clr_top_only[0] + self.alarm_data[alarm_id[0]] = [data_1[0], data_2[0]] self.hd_alarm_triggered_timestamp = timestamp @publish(["hd_alarm_cleared_timestamp", "alarm_states", "alarm_conditions"])