Index: leahi_dialin/dd/modules/alarms.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/dd/modules/alarms.py (.../alarms.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/dd/modules/alarms.py (.../alarms.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -25,7 +25,7 @@ from leahi_dialin.common.msg_ids import MsgIds from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import CanMessenger, CanMessage, CanChannels -from leahi_dialin.utils.abstract_classes import AbstractSubSystem +from leahi_dialin.utils.abstract_classes import AbstractSubSystem, LocalVars from leahi_dialin.utils.base import publish from leahi_dialin.utils.conversions import integer_to_bytearray @@ -51,8 +51,6 @@ message_id = MsgIds.MSG_ID_ALARM_TRIGGERED.value, function = self._handler_alarm_triggered) - self.alarm_safety_shutdown_status = 0.0 #: The Alarm's Safety Shutdown status value - self.dd_alarm_info_timestamp = 0.0 #: The timestamp of the last Alarm Information message self.dd_alarm_triggered_timestamp = 0.0 #: The timestamp of the last Alarm Triggered message self.dd_alarm_cleared_timestamp = 0.0 #: The timestamp of the last Alarm Cleared message @@ -70,6 +68,12 @@ self.last_alarm_data_2 = 0.0 #: The last Alarm's data part 2 + +# ============================================================ Properties ============================================================ + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_dd_alarm_triggered", "alarm_states", "alarm_conditions", "alarm_data", "alarm_priorities", "alarm_ranks", "alarm_clear_top_only_flags", "dd_alarm_triggered_timestamp"]) def _handler_alarm_triggered(self, message, timestamp = 0.0): @@ -79,176 +83,66 @@ @param message: published DD alarm activation message @return: none """ - result = {} + alarm_id = LocalVars('alarm_id') + data_typ_1 = LocalVars('data_typ_1') + data_1 = LocalVars('data_1') + data_typ_2 = LocalVars('data_typ_2') + data_2 = LocalVars('data_2') + priority = LocalVars('priority') + rank = LocalVars('rank') + clr_top_only = LocalVars('clr_top_only') + msg_list = [] - msg_list.append(('alarm_id', DataTypes.U32)) - msg_list.append(('data_typ_1', DataTypes.U32)) - msg_list.append(('data_1', 'data_typ_1')) - msg_list.append(('data_typ_2', DataTypes.U32)) - msg_list.append(('data_2', 'data_typ_2')) - msg_list.append(('priority', DataTypes.U32)) - msg_list.append(('rank', DataTypes.U32)) - msg_list.append(('clr_top_only', DataTypes.U32)) + msg_list.append((alarm_id, DataTypes.U32)) + msg_list.append((data_typ_1, DataTypes.U32)) + msg_list.append((data_1, 'data_typ_1')) + msg_list.append((data_typ_2, DataTypes.U32)) + msg_list.append((data_2, 'data_typ_2')) + msg_list.append((priority, DataTypes.U32)) + msg_list.append((rank, DataTypes.U32)) + msg_list.append((clr_top_only, DataTypes.U32)) - i = 1 - for msg_detail in msg_list: - start_pos = eval(f'MsgFieldPositions.START_POS_FIELD_{i}') - end_pos = eval(f'MsgFieldPositions.END_POS_FIELD_{i}') - if isinstance(msg_detail[1], DataTypes): - unpack_attrib = msg_detail[1].unpack_attrib() - else: - unpack_attrib = DataTypes(result[msg_detail[1]]).unpack_attrib() - - value = struct.unpack(unpack_attrib, bytearray(message['message'][start_pos:end_pos]))[0] - result[msg_detail[0]] = value - i += 1 + self.process_into_vars(decoder_list = msg_list, message = message) - self.logger.debug("Alarm ID: %d %d %d" % (result['alarm_id'], result['data_1'], result['data_2'])) - self.alarm_states[result['alarm_id']] = True - self.alarm_conditions[result['alarm_id']] = True - self.alarm_priorities[result['alarm_id']] = result['priority'] - self.alarm_ranks[result['alarm_id']] = result['rank'] - self.alarm_clear_top_only_flags[result['alarm_id']] = result['clr_top_only'] - self.alarm_data[result['alarm_id']] = [result['data_1'], result['data_2']] - self.last_alarm_triggered = result['alarm_id'] - self.last_alarm_data_1 = result['data_1'] - self.last_alarm_data_2 = result['data_2'] + self.logger.debug("Alarm ID: %d %d %d" % (alarm_id.value, data_1.value, data_2.value)) + self.alarm_states[alarm_id.value] = True + self.alarm_conditions[alarm_id.value] = True + self.alarm_priorities[alarm_id.value] = priority.value + self.alarm_ranks[alarm_id.value] = rank.value + self.alarm_clear_top_only_flags[alarm_id.value] = clr_top_only.value + self.alarm_data[alarm_id.value] = [data_1.value, data_2.value] + self.last_alarm_triggered = alarm_id.value + self.last_alarm_data_1 = data_1.value + self.last_alarm_data_2 = data_2.value self.dd_alarm_triggered_timestamp = timestamp - @publish(["msg_id_dd_alarm_info", "alarm_safety_shutdown_status", "dd_alarm_info_timestamp"]) - def _handler_alarm_info(self, message, timestamp = 0.0): - """ - Handles published DD alarm info messages. - @param message: published DD alarm info message - @return: none +# ============================================================ Support ============================================================ + def clear_dialin_alarms(self): """ - self.alarm_safety_shutdown_status = struct.unpack(DataTypes.U32.unpack_attrib(), bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1])) - - self.dd_alarm_info_timestamp = timestamp + Clears the alarms states in Dialin. - - @publish(["msg_id_dd_alarm_cleared", "dd_alarm_cleared_timestamp"]) - def _handler_alarm_cleared(self, message, timestamp = 0.0): - """ - Handles published DD alarm cleared messages. - - @param message: published DD alarm cleared message @return: none """ - #ToDo - self.dd_alarm_cleared_timestamp = timestamp + for x in range(self.alarm_states): + self.alarm_states[x] = False - @publish(["msg_id_dd_alarm_condition_cleared", "dd_alarm_condition_cleared_timestamp"]) - def _handler_alarm_condition_cleared(self, message, timestamp = 0.0): + def get_dialin_alarms(self): """ - Handles published DD alarm condition cleared messages. + Get the active alarms in Dialin. - @param message: published DD alarm condition cleared message @return: none """ - #ToDo - self.dd_alarm_condition_cleared_timestamp = timestamp + active_alarms = [] + for x in range(self.alarm_states): + if self.alarm_states[x]: + active_alarms.append(AlarmList(x)) + return active_alarms - def cmd_alarm_state_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: - """ - Constructs and sends the alarm state data broadcast interval override command - Constraints: - Must be logged into DD. - Given interval must be non-zero and a multiple of the DD general task interval (50 ms). - - @param ms: integer - interval (in ms) to override with - @param reset: integer - 1 to reset a previous override, 0 to override - @return: 1 if successful, zero otherwise - """ - print('Not implemented in the FW') - return False - - return cmd_generic_broadcast_interval_override( - ms = ms, - reset = reset, - channel_id = CanChannels.dialin_to_dd_ch_id, - msg_id = '', - module_name = 'DD Alarm state', - logger = self.logger, - can_interface = self.can_interface) - - - def cmd_alarm_info_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: - """ - Constructs and sends the alarm info data broadcast interval override command - Constraints: - Must be logged into DD. - Given interval must be non-zero and a multiple of the DD general task interval (50 ms). - - @param ms: integer - interval (in ms) to override with - @param reset: integer - 1 to reset a previous override, 0 to override - @return: 1 if successful, zero otherwise - """ - print('Not implemented in the FW') - return False - - return cmd_generic_broadcast_interval_override( - ms = ms, - reset = reset, - channel_id = CanChannels.dialin_to_dd_ch_id, - msg_id = '', - module_name = 'DD Alarm info', - logger = self.logger, - can_interface = self.can_interface) - - - def cmd_alarm_cleared_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: - """ - Constructs and sends the alarm cleared data broadcast interval override command - Constraints: - Must be logged into DD. - Given interval must be non-zero and a multiple of the DD general task interval (50 ms). - - @param ms: integer - interval (in ms) to override with - @param reset: integer - 1 to reset a previous override, 0 to override - @return: 1 if successful, zero otherwise - """ - print('Not implemented in the FW') - return False - - return cmd_generic_broadcast_interval_override( - ms = ms, - reset = reset, - channel_id = CanChannels.dialin_to_dd_ch_id, - msg_id = '', - module_name = 'DD Alarm cleared', - logger = self.logger, - can_interface = self.can_interface) - - - def cmd_alarm_condition_cleared_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: - """ - Constructs and sends the alarm condition cleared data broadcast interval override command - Constraints: - Must be logged into DD. - Given interval must be non-zero and a multiple of the DD general task interval (50 ms). - - @param ms: integer - interval (in ms) to override with - @param reset: integer - 1 to reset a previous override, 0 to override - @return: 1 if successful, zero otherwise - """ - print('Not implemented in the FW') - return False - - return cmd_generic_broadcast_interval_override( - ms = ms, - reset = reset, - channel_id = CanChannels.dialin_to_dd_ch_id, - msg_id = '', - module_name = 'DD Alarm condition cleared', - logger = self.logger, - can_interface = self.can_interface) - - +# ============================================================ Overrides and Requests ============================================================ def cmd_alarm_state_override(self, alarm: int, state: int, reset: int = NO_RESET) -> int: """ Constructs and sends the alarm state override command