#!/bin/python3 from leahi_dialin.ui.utils import singleton_threadsafe from leahi_dialin.utils import conversions from leahi_dialin.protocols import CAN from leahi_dialin.common import msg_ids from leahi_dialin.common.alarm_priorities import AlarmPriority, AlarmDataTypes @singleton_threadsafe class TD_Messaging_Alarms(): def __init__(self): self.can_enabled: bool=False self.can_Channel: str = "can0" class fakeLogger(): def __init__(self): pass def error(a1, a2): pass def info(a1, a2): pass self.can_interface = CAN.DenaliCanMessenger(can_interface=self.can_Channel, logger=fakeLogger() ) self.can_interface.start() if self.can_interface is not None: self.can_enabled = True def cmd_activate_alarm_id(self, state: int = AlarmPriority.ALARM_HIGH, alarm: int = 0, silence_expires: int = 0, flags: int = 0): """ Activates the specified alarm @param state: (int) Alarm priority @param alarm: (int) the alarm id @param silence_expires: (int) seconds until silence expires @param flags: (int) See 'cmd_make_alarm_flags' @return: None """ payload = conversions.integer_to_bytearray (state ) payload += conversions.integer_to_bytearray (alarm ) payload += conversions.integer_to_bytearray (silence_expires) payload += conversions.short_to_bytearray (flags ) message = CAN.DenaliMessage.build_message( channel_id=CAN.DenaliChannels.td_alarm_broadcast_ch_id, message_id=CAN.MsgIds.MSG_ID_ALARM_STATUS_DATA.value, payload=payload) self.can_interface.send(message, 0) def cmd_send_active_list_response(self, accept: bool, reason: int = 0, a0: int = 0, a1: int = 0, a2: int = 0, a3: int = 0, a4: int = 0, a5: int = 0, a6: int = 0, a7: int = 0, a8: int = 0, a9: int = 0) -> None: """ send the list of active alarms @param accept: boolean value true if the request accepted @param reason: the rejection reason @param a0: alarm id 0 in the list - First @param a1: alarm id 1 in the list @param a2: alarm id 2 in the list @param a3: alarm id 3 in the list @param a4: alarm id 4 in the list @param a5: alarm id 5 in the list @param a6: alarm id 6 in the list @param a7: alarm id 7 in the list @param a8: alarm id 8 in the list @param a9: alarm id 9 in the list - Last @return: None """ payload = conversions.integer_to_bytearray(accept) payload += conversions.integer_to_bytearray(reason) payload += conversions.integer_to_bytearray(a0) payload += conversions.integer_to_bytearray(a1) payload += conversions.integer_to_bytearray(a2) payload += conversions.integer_to_bytearray(a3) payload += conversions.integer_to_bytearray(a4) payload += conversions.integer_to_bytearray(a5) payload += conversions.integer_to_bytearray(a6) payload += conversions.integer_to_bytearray(a7) payload += conversions.integer_to_bytearray(a8) payload += conversions.integer_to_bytearray(a9) message = CAN.DenaliMessage.build_message( channel_id=CAN.DenaliChannels.td_to_ui_ch_id, message_id=CAN.MsgIds.MSG_ID_TD_ACTIVE_ALARMS_LIST_REQUEST_RESPONSE.value, payload=payload) self.can_interface.send(message, 0) def cmd_set_alarm_triggered(self, alarm_id, field_descriptor_1 : int, data_field_1 : str, field_descriptor_2 : int, data_field_2 : str, priority : int, rank : int, clear_top : int) -> None: """ Triggers an alarm. | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: | |0x0200| 0x001 | 1 | Event | Y | TD | All | Alarm Triggered | \ref Data::mAlarmID | @param alarm_id: (int) the alarm id to trigger @param field_descriptor_1: (int) alarm data 1 type @param data_field_1: (str) alarm data 1 @param field_descriptor_2: (int) alarm data 2 type @param data_field_2: (str) alarm data 2 @param priority: (int) alarm priority @param rank: (int) alarm rank @param clear_top: (int) clear top only @return: None """ zero = conversions.integer_to_bytearray(0) payload = conversions.integer_to_bytearray(alarm_id) if field_descriptor_1 == AlarmDataTypes.ALARM_DATA_TYPE_NONE: payload += zero payload += zero payload += zero payload += zero else: if field_descriptor_1 == AlarmDataTypes.ALARM_DATA_TYPE_F32: payload += conversions.integer_to_bytearray(field_descriptor_1) payload += conversions.float_to_bytearray(float(data_field_1)) else: # BOOL, S32, U32 payload += conversions.integer_to_bytearray(field_descriptor_1) payload += conversions.integer_to_bytearray(int(data_field_1)) if field_descriptor_2 == AlarmDataTypes.ALARM_DATA_TYPE_NONE: payload += zero payload += zero else: if field_descriptor_2 == AlarmDataTypes.ALARM_DATA_TYPE_F32: payload += conversions.integer_to_bytearray(field_descriptor_2) payload += conversions.float_to_bytearray(float(data_field_2)) else: # BOOL, S32, U32 payload += conversions.integer_to_bytearray(field_descriptor_2) payload += conversions.integer_to_bytearray(int(data_field_2)) payload += conversions.unsigned_integer_to_bytearray(priority) payload += conversions.unsigned_integer_to_bytearray(rank) payload += conversions.unsigned_integer_to_bytearray(clear_top) message = CAN.DenaliMessage.build_message( channel_id=CAN.DenaliChannels.td_alarm_broadcast_ch_id, message_id=CAN.MsgIds.MSG_ID_ALARM_TRIGGERED.value, payload=payload) self.can_interface.send(message, 0) def cmd_set_alarm_cleared(self, alarm_id: int = 0): """ Broadcasts to clear a specific alarm ID the Alarm Cleared message builder method | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: | |0x0300| 0x001 | 1 | Event | Y | TD | All | Alarm Cleared | \ref Data::mAlarmID | @return: None """ payload = conversions.integer_to_bytearray(alarm_id) message = CAN.DenaliMessage.build_message( channel_id=CAN.DenaliChannels.td_alarm_broadcast_ch_id, message_id=CAN.MsgIds.MSG_ID_ALARM_CLEARED.value, payload=payload) self.can_interface.send(message, 0) def cmd_set_alarm_cleared_condition(self, alarm_id: int = 0): """ Broadcasts that the alarm condition has been cleared the Alarm Cleared message builder method | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | |:----:|:---------:|:---:|:------:|:---:|:---:|:---:|:---------------------: |:--: | |0x0400| 0x001,2,4 | 1 | Event | Y | TD | All | Alarm Condition Cleared | \ref Data::mAlarmID | @return: None """ payload = conversions.integer_to_bytearray(alarm_id) message = CAN.DenaliMessage.build_message( channel_id=CAN.DenaliChannels.td_alarm_broadcast_ch_id, message_id=CAN.MsgIds.MSG_ID_ALARM_CONDITION_CLEARED.value, payload=payload) self.can_interface.send(message, 0)