Index: leahi_dialin/common/dd_defs.py =================================================================== diff -u -r6d104d3185ac3ed7c18c97ecdc13fd59bf53a8d1 -r27cd8e0e7b47617083e8c12f73306f0ba648e687 --- leahi_dialin/common/dd_defs.py (.../dd_defs.py) (revision 6d104d3185ac3ed7c18c97ecdc13fd59bf53a8d1) +++ leahi_dialin/common/dd_defs.py (.../dd_defs.py) (revision 27cd8e0e7b47617083e8c12f73306f0ba648e687) @@ -321,16 +321,17 @@ DD_EVENT_SUB_MODE_CHANGE = 2 # DD Op sub-mode change event DD_EVENT_OPERATION_STATUS = 3 # DD operation status event DD_EVENT_D6_LEVL_CHANGE = 4 # DD floater level change event - DD_EVENT_D63_LEVL_CHANGE = 5 # DD bicarb level change event - DD_EVENT_D46_LEVL_CHANGE = 6 # DD spent dialysate air seperation level change event - DD_EVENT_TD_COMMUNICATION_LOSS = 7 # DD TD communication loss - DD_EVENT_TEMPERATURE_DRIFT = 8 # DD dialysate temperature drift - DD_EVENT_BLOOD_LEAK_ZEROING_REQUEST = 9 # DD blood leak zeroing request - DD_EVENT_BLOOD_LEAK_ZEROING_REQUIRED = 10 # DD blood leak zeroing required - DD_EVENT_BLOOD_LEAK_NUM_OF_SET_POINT_CHECK_FAILURES = 11 # DD blood leak number of setpoint check failures - DD_EVENT_BLOOD_LEAK_SELF_TEST_RESULT = 12 # DD blood leak self test result - NUM_OF_DD_EVENT_IDS = 13 # Total number of DD events - + DD_EVENT_D63_LEVL_CHANGE = 5 # DD bicarb upper level change event + DD_EVENT_D98_LEVL_CHANGE = 6 # DD bicarb lower level change event + DD_EVENT_D46_LEVL_CHANGE = 7 # DD spent dialysate air seperation level change event + DD_EVENT_TD_COMMUNICATION_LOSS = 8 # DD TD communication loss + DD_EVENT_TEMPERATURE_DRIFT = 9 # DD dialysate temperature drift + DD_EVENT_BLOOD_LEAK_ZEROING_REQUEST = 10 # DD blood leak zeroing request + DD_EVENT_BLOOD_LEAK_ZEROING_REQUIRED = 11 # DD blood leak zeroing required + DD_EVENT_BLOOD_LEAK_NUM_OF_SET_POINT_CHECK_FAILURES = 12 # DD blood leak number of setpoint check failures + DD_EVENT_BLOOD_LEAK_SELF_TEST_RESULT = 13 # DD blood leak self test result + NUM_OF_DD_EVENT_IDS = 14 # Total number of DD events + DDEventList._str_list = { # Official Name : Accepted strings 'DD_EVENT_STARTUP': ['startup'], Index: leahi_dialin/common/fp_defs.py =================================================================== diff -u -r6d104d3185ac3ed7c18c97ecdc13fd59bf53a8d1 -r27cd8e0e7b47617083e8c12f73306f0ba648e687 --- leahi_dialin/common/fp_defs.py (.../fp_defs.py) (revision 6d104d3185ac3ed7c18c97ecdc13fd59bf53a8d1) +++ leahi_dialin/common/fp_defs.py (.../fp_defs.py) (revision 27cd8e0e7b47617083e8c12f73306f0ba648e687) @@ -318,7 +318,8 @@ FP_EVENT_PRE_GEN_DEF_CHANGE = 7 # FP defeatured pre gen state change FP_EVENT_GENP_DEF_CHANGE = 8 # FP defeatured gen permeate state change FP_EVENT_FAULT_ALARM_TRIGGER = 9 # FP event for alarms that would trigger - NUM_OF_FP_EVENT_IDS = 10 # Number of FP events + FP_EVENT_OPERATION_STATUS = 10 # FP operation status event + NUM_OF_FP_EVENT_IDS = 11 # Number of FP events FPEventList._str_list = { # Official Name : Accepted strings @@ -332,6 +333,7 @@ 'FP_EVENT_PRE_GEN_DEF_CHANGE': ['defeatured pre-generate permeate change', 'def pre-genp change'], 'FP_EVENT_GENP_DEF_CHANGE': ['defeatured generate permeate change', 'def genp change'], 'FP_EVENT_FAULT_ALARM_TRIGGER': ['alarm', 'alarm trigger', 'fault alarm trigger'], + 'FP_EVENT_OPERATION_STATUS': ['operation status', 'status', 'op status', 'operation status change', 'status change', 'op status change'], 'NUM_OF_FP_EVENT_IDS': [], } Index: leahi_dialin/common/generic_defs.py =================================================================== diff -u -r75c97894e28b7cc684fcaf8f7ffba3f8c1bb61d8 -r27cd8e0e7b47617083e8c12f73306f0ba648e687 --- leahi_dialin/common/generic_defs.py (.../generic_defs.py) (revision 75c97894e28b7cc684fcaf8f7ffba3f8c1bb61d8) +++ leahi_dialin/common/generic_defs.py (.../generic_defs.py) (revision 27cd8e0e7b47617083e8c12f73306f0ba648e687) @@ -21,15 +21,16 @@ @unique class DataTypes(DialinEnum): - NONE = (0, None, 0) # No Data Type - None - U32 = (1, ' Integer - S32 = (2, ' Integer - F32 = (3, ' Float - BOOL = (4, ' Integer - Could use ' Integer + S32 = (2, ' Integer + F32 = (3, ' Float + BOOL = (4, ' Integer # After this point the Data Types are extra ones used only in Dialin - U08 = (5, ' Integer - U16 = (6, ' Integer - NUM_OF_DATA_TYPES = (7, None, 0) # Number of Data Types - None + U08 = (5, ' Integer + U16 = (6, ' Integer + BOOL_U08 = (7, ' Integer + NUM_OF_DATA_TYPES = (8, None, 0) # Number of Data Types - None def __new__(cls, value, unpack_fmt, unpack_size): obj = object.__new__(cls) @@ -53,5 +54,6 @@ 'BOOL': ['boolean'], 'U08': ['u8'], 'U16': [], + 'BOOL_U08': [], 'NUM_OF_DATA_TYPES': [], } Index: leahi_dialin/common/test_config_defs.py =================================================================== diff -u -r6d104d3185ac3ed7c18c97ecdc13fd59bf53a8d1 -r27cd8e0e7b47617083e8c12f73306f0ba648e687 --- leahi_dialin/common/test_config_defs.py (.../test_config_defs.py) (revision 6d104d3185ac3ed7c18c97ecdc13fd59bf53a8d1) +++ leahi_dialin/common/test_config_defs.py (.../test_config_defs.py) (revision 27cd8e0e7b47617083e8c12f73306f0ba648e687) @@ -44,6 +44,5 @@ TEST_CONFIG_ENABLE_BETA_1_HW = 0 # Test configuration using Beta 1 Hardware TEST_CONFIG_SKIP_BLOOD_PRIME = 1 # Test configuration to skip blood priming TEST_CONFIG_TD_NO_CARTRIDGE = 2 # Test configuration to operate without cartridge - TEST_CONFIG_TD_DISABLE_FAULT_MODE_FROM_DD_FP = 3 # Test configuration to disable TD going to Fault mode because of alarms from other subsystems - NUM_OF_TEST_CONFIGS = 4 # Number of Test Configs + NUM_OF_TEST_CONFIGS = 3 # Number of Test Configs TDTestConfigOptions._str_list = {} Index: leahi_dialin/dd/modules/alarms.py =================================================================== diff -u -r6d104d3185ac3ed7c18c97ecdc13fd59bf53a8d1 -r27cd8e0e7b47617083e8c12f73306f0ba648e687 --- leahi_dialin/dd/modules/alarms.py (.../alarms.py) (revision 6d104d3185ac3ed7c18c97ecdc13fd59bf53a8d1) +++ leahi_dialin/dd/modules/alarms.py (.../alarms.py) (revision 27cd8e0e7b47617083e8c12f73306f0ba648e687) @@ -79,16 +79,7 @@ @param message: published DD alarm activation message @return: none """ - # Local variables - alarm_id:int - data_typ_1:int - data_1:int - data_typ_2:int - data_2:int - priority:int - rank:int - clr_top_only:int - + result = {} msg_list = [] msg_list.append(('alarm_id', DataTypes.U32)) msg_list.append(('data_typ_1', DataTypes.U32)) @@ -106,23 +97,22 @@ if isinstance(msg_detail[1], DataTypes): unpack_attrib = msg_detail[1].unpack_attrib() else: - data_type_val:int - exec(f'data_type_val = {msg_detail[1]}') - unpack_attrib = DataTypes(data_type_val).unpack_attrib() - value = struct.unpack(unpack_attrib,bytearray(message['message'][start_pos:end_pos]))[0] - exec(f'{msg_detail[0]} = {value}') + 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.logger.debug("Alarm ID: %d %d %d" % (alarm_id[0], data_1[0], data_2[0])) - self.alarm_states[alarm_id] = True - self.alarm_conditions[alarm_id] = True - self.alarm_priorities[alarm_id] = priority - self.alarm_ranks[alarm_id] = rank - self.alarm_clear_top_only_flags[alarm_id] = clr_top_only - self.alarm_data[alarm_id] = [data_1, data_2] - self.last_alarm_triggered = alarm_id - self.last_alarm_data_1 = data_1 - self.last_alarm_data_2 = data_2 + 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.dd_alarm_triggered_timestamp = timestamp Index: leahi_dialin/fp/modules/alarms.py =================================================================== diff -u -r34b64ff2d8a64f4b7b60b80bb7cf4c36845e5943 -r27cd8e0e7b47617083e8c12f73306f0ba648e687 --- leahi_dialin/fp/modules/alarms.py (.../alarms.py) (revision 34b64ff2d8a64f4b7b60b80bb7cf4c36845e5943) +++ leahi_dialin/fp/modules/alarms.py (.../alarms.py) (revision 27cd8e0e7b47617083e8c12f73306f0ba648e687) @@ -76,16 +76,8 @@ @return: none """ self.logger.debug("Alarm activated!") - # Local variables - alarm_id:int - data_typ_1:int - data_1:int - data_typ_2:int - data_2:int - priority:int - rank:int - clr_top_only:int + result = {} msg_list = [] msg_list.append(('alarm_id', DataTypes.U32)) msg_list.append(('data_typ_1', DataTypes.U32)) @@ -103,24 +95,23 @@ if isinstance(msg_detail[1], DataTypes): unpack_attrib = msg_detail[1].unpack_attrib() else: - data_type_val:int - exec(f'data_type_val = {msg_detail[1]}') - unpack_attrib = DataTypes(data_type_val).unpack_attrib() - value = struct.unpack(unpack_attrib,bytearray(message['message'][start_pos:end_pos]))[0] - exec(f'{msg_detail[0]} = {value}') + 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.logger.debug("Alarm ID: %d %d %d" % (alarm_id[0], data_1[0], data_2[0])) - self.alarm_states[alarm_id] = True - self.alarm_conditions[alarm_id] = True - self.alarm_priorities[alarm_id] = priority - self.alarm_ranks[alarm_id] = rank - self.alarm_clear_top_only_flags[alarm_id] = clr_top_only - self.alarm_data[alarm_id] = [data_1, data_2] - self.last_alarm_triggered = alarm_id - self.last_alarm_data_1 = data_1 - self.last_alarm_data_2 = data_2 - self.dd_alarm_triggered_timestamp = timestamp + 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.fp_alarm_triggered_timestamp = timestamp def cmd_alarm_state_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: Index: leahi_dialin/fp/modules/events.py =================================================================== diff -u -r75c97894e28b7cc684fcaf8f7ffba3f8c1bb61d8 -r27cd8e0e7b47617083e8c12f73306f0ba648e687 --- leahi_dialin/fp/modules/events.py (.../events.py) (revision 75c97894e28b7cc684fcaf8f7ffba3f8c1bb61d8) +++ leahi_dialin/fp/modules/events.py (.../events.py) (revision 27cd8e0e7b47617083e8c12f73306f0ba648e687) @@ -19,7 +19,7 @@ from datetime import datetime from time import time -from leahi_dialin.common import fp_enum_repository +from leahi_dialin.common import dd_enum_repository, fp_enum_repository from leahi_dialin.common.generic_defs import DataTypes from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.protocols.CAN import DenaliCanMessenger, DenaliChannels, DenaliCanMessenger @@ -151,10 +151,11 @@ event_id = struct.unpack(DataTypes.U32.unpack_attrib(), bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] # Convert the event ID to enum - event_enum = fp_enum_repository.FPEventList(event_id) + compensated_event_id = event_id - dd_enum_repository.DDEventList.NUM_OF_DD_EVENT_IDS.value + event_enum = fp_enum_repository.FPEventList(compensated_event_id) current_timestamp = datetime.now().astimezone().strftime('%Y-%m-%d %H:%M:%S.%f') - if event_id == fp_enum_repository.FPEventList.FP_EVENT_OPERATION_STATUS.value: + if event_enum is fp_enum_repository.FPEventList.FP_EVENT_OPERATION_STATUS: # Get the data type - irrelevant event_data_type_1 = struct.unpack(DataTypes.U32.unpack_attrib(), bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] @@ -195,24 +196,23 @@ event_tuple = (current_timestamp, event_enum.name, event_data_1, event_data_2) # Check if the event state name is sub mode change. - elif event_enum is fp_enum_repository.FPEventList.FP_EVENT_OP_MODE_CHANGE: + elif event_enum is fp_enum_repository.FPEventList.FP_EVENT_SUB_MODE_CHANGE: # Get the length of the list of the op mode list op_list_len = len(self._fp_event_dictionary[fp_enum_repository.FPEventList.FP_EVENT_OP_MODE_CHANGE.name]) # Get the last tuple of the op mode # It is a list of tuples that each tuple is (timestamp, event type, prev op mode, current op mode) if op_list_len != 0: - last_op_tuple = self._fp_event_dictionary[fp_enum_repository.FPEventList.FP_EVENT_OP_MODE_CHANGE.name][op_list_len - 1] - + last_op_tuple = self._fp_event_dictionary[fp_enum_repository.FPEventList.FP_EVENT_OP_MODE_CHANGE.name][-1] else: # No op mode event has been received before the submode event was received. Use broadcast messages to # determine current op mode. Previous mode can not be known last_op_tuple = (current_timestamp, - fp_enum_repository.FPEventList.FP_EVENT_OP_MODE_CHANGE.name, FPEvents.UNKNOWN_STATE, + fp_enum_repository.FPEventList.FP_EVENT_OP_MODE_CHANGE.name, self.UNKNOWN_STATE, fp_enum_repository.FPOpModes(self.fp_event_op_mode).name) # Get the current and previous operation modes of the last tuple in the list of the sub modes # i.e. (timestamp, event type, prev, current) - current_op_mode = last_op_tuple[len(last_op_tuple) - 1] - current_op_mode_timestamp = datetime.strptime(last_op_tuple[0], '%Y-%m-%d %H:%M:%S.%f') + prev_op_mode_name = last_op_tuple[-1] + prev_op_mode_timestamp = datetime.strptime(last_op_tuple[0], '%Y-%m-%d %H:%M:%S.%f') sub_mode_list_len = len(self._fp_event_dictionary[fp_enum_repository.FPEventList.FP_EVENT_SUB_MODE_CHANGE.name]) @@ -226,25 +226,25 @@ current_sub_mode_timestamp = 0 # Get the class of the states enums of the current operation mode that is running - current_sub_mode_enum_class = self._fp_op_mode_2_sub_mode[current_op_mode] + current_sub_mode_enum_class = self._fp_op_mode_2_sub_mode[prev_op_mode_name] # Check if the operation modes of the two tuples match # i.e. last = (timestamp, event type, prev, current) and one before = (timestamp, event type, prev, current) # If the prev and current match respectively, it means the current operation mode has not changed so the # operation mode states can be converted from the current sub mode enum class if current_sub_mode_timestamp != 0: - if current_op_mode_timestamp <= current_sub_mode_timestamp: + if prev_op_mode_timestamp <= current_sub_mode_timestamp: event_data_1 = current_sub_mode_enum_class(event_data_1).name event_data_2 = current_sub_mode_enum_class(event_data_2).name - elif current_op_mode_timestamp > current_sub_mode_timestamp: + elif prev_op_mode_timestamp > current_sub_mode_timestamp: # If the previous and current of the last two tuples do not match, then an operation mode transition # has occurred and the previous state is converted from the previous class and the current op mode # is converted from current operation states enum class. # i.e last = (timestamp, event type, 3, 8) and one before = (timestamp, event type, 8, 3) # previous and current do not match so in the last type (timestamp, event type, 8, 3) the prev state # should be from op mode 8 and the current state should be from op mode 3 - previous_op_mode = last_op_tuple[len(last_op_tuple) - 2] + previous_op_mode = last_op_tuple[-2] if previous_op_mode != FPEvents.UNKNOWN_STATE: previous_sub_mode_enum_class = self._fp_op_mode_2_sub_mode[previous_op_mode] event_data_1 = previous_sub_mode_enum_class(event_data_1).name @@ -253,7 +253,6 @@ event_data_1 = str(event_data_1) event_data_2 = current_sub_mode_enum_class(event_data_2).name else: - if event_data_2 != 0: event_data_1 = current_sub_mode_enum_class(event_data_1).name event_data_2 = current_sub_mode_enum_class(event_data_2).name Index: leahi_dialin/fp/modules/permeate_tank.py =================================================================== diff -u -r34b64ff2d8a64f4b7b60b80bb7cf4c36845e5943 -r27cd8e0e7b47617083e8c12f73306f0ba648e687 --- leahi_dialin/fp/modules/permeate_tank.py (.../permeate_tank.py) (revision 34b64ff2d8a64f4b7b60b80bb7cf4c36845e5943) +++ leahi_dialin/fp/modules/permeate_tank.py (.../permeate_tank.py) (revision 27cd8e0e7b47617083e8c12f73306f0ba648e687) @@ -45,7 +45,7 @@ if self.can_interface is not None: self.can_interface.register_receiving_publication_function(channel_id = DenaliChannels.fp_sync_broadcast_ch_id, # DenaliChannels.dd_sync_broadcast_ch_id ?? - message_id = MsgIds.MsgIds.value, + message_id = MsgIds.MSG_ID_FP_PERMEATE_TANK_DATA.value, function = self._handler_permeate_tank_sync) self.permeate_tank_timestamp = 0.0 #: The timestamp of the last message Index: leahi_dialin/td/modules/alarms.py =================================================================== diff -u -r34b64ff2d8a64f4b7b60b80bb7cf4c36845e5943 -r27cd8e0e7b47617083e8c12f73306f0ba648e687 --- leahi_dialin/td/modules/alarms.py (.../alarms.py) (revision 34b64ff2d8a64f4b7b60b80bb7cf4c36845e5943) +++ leahi_dialin/td/modules/alarms.py (.../alarms.py) (revision 27cd8e0e7b47617083e8c12f73306f0ba648e687) @@ -176,7 +176,6 @@ self.process_into_vars(decoder_list = msg_list, message = message) - self.td_alarm_status_timestamp = timestamp @@ -191,15 +190,8 @@ @return: none """ self.logger.debug("Alarm activated!") - alarm_id:int - data_typ_1:int - data_1:int - data_typ_2:int - data_2:int - priority:int - rank:int - clr_top_only:int + result = {} msg_list = [] msg_list.append(('alarm_id', DataTypes.U32)) msg_list.append(('data_typ_1', DataTypes.U32)) @@ -217,24 +209,23 @@ if isinstance(msg_detail[1], DataTypes): unpack_attrib = msg_detail[1].unpack_attrib() else: - data_type_val:int - exec(f'data_type_val = {msg_detail[1]}') - unpack_attrib = DataTypes(data_type_val).unpack_attrib() - value = struct.unpack(unpack_attrib,bytearray(message['message'][start_pos:end_pos]))[0] - exec(f'{msg_detail[0]} = {value}') + 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.logger.debug("Alarm ID: %d %d %d" % (alarm_id[0], data_1[0], data_2[0])) - self.alarm_states[alarm_id] = True - self.alarm_conditions[alarm_id] = True - self.alarm_priorities[alarm_id] = priority - self.alarm_ranks[alarm_id] = rank - self.alarm_clear_top_only_flags[alarm_id] = clr_top_only - self.alarm_data[alarm_id] = [data_1, data_2] - self.last_alarm_triggered = alarm_id - self.last_alarm_data_1 = data_1 - self.last_alarm_data_2 = data_2 - self.dd_alarm_triggered_timestamp = timestamp + 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.td_alarm_triggered_timestamp = timestamp @publish(["msg_id_td_alarm_cleared", "alarm_states", "alarm_conditions", "TD_alarm_cleared_timestamp"]) @@ -245,15 +236,13 @@ @param message: published TD alarm clear message @return: none """ - alarm_id: int msg_list = [] msg_list.append(('alarm_id', DataTypes.U32)) - self.process_into_vars(decoder_list = msg_list, - message = message) - - self.alarm_states[alarm_id] = False - self.alarm_conditions[alarm_id] = False + result = self.process_into_vars(decoder_list = msg_list, + message = message) + self.alarm_states[result['alarm_id']] = False + self.alarm_conditions[result['alarm_id']] = False self.td_alarm_cleared_timestamp = timestamp @@ -265,14 +254,13 @@ @param message: published TD alarm clear alarm condition message @return: none """ - alarm_id: int msg_list = [] msg_list.append(('alarm_id', DataTypes.U32)) - self.process_into_vars(decoder_list = msg_list, - message = message) + result = self.process_into_vars(decoder_list = msg_list, + message = message) - self.alarm_conditions[alarm_id] = False + self.alarm_conditions[result['alarm_id']] = False self.td_alarm_clr_condition_timestamp = timestamp @@ -295,12 +283,12 @@ msg_list.append(('self.safety_shutdown_active', DataTypes.BOOL)) msg_list.append(('self.ac_power_lost', DataTypes.BOOL)) sensor_list = [] - sensor_list.append((self.AlarmResponseButtons.TD_ALARM_RESPONSE_BUTTON_RESUME.value, DataTypes.BOOL)) - sensor_list.append((self.AlarmResponseButtons.TD_ALARM_RESPONSE_BUTTON_RINSEBACK.value, DataTypes.BOOL)) - sensor_list.append((self.AlarmResponseButtons.TD_ALARM_RESPONSE_BUTTON_END_TREATMENT.value, DataTypes.BOOL)) - sensor_list.append((self.AlarmResponseButtons.TD_ALARM_RESPONSE_BUTTON_RESUME.value, DataTypes.BOOL)) - sensor_list.append((self.AlarmResponseButtons.TD_ALARM_RESPONSE_BUTTON_RINSEBACK.value, DataTypes.BOOL)) - sensor_list.append((self.AlarmResponseButtons.TD_ALARM_RESPONSE_BUTTON_END_TREATMENT.value, DataTypes.BOOL)) + sensor_list.append((self.AlarmResponseButtons.TD_ALARM_RESPONSE_BUTTON_RESUME.value, DataTypes.BOOL_U08)) + sensor_list.append((self.AlarmResponseButtons.TD_ALARM_RESPONSE_BUTTON_RINSEBACK.value, DataTypes.BOOL_U08)) + sensor_list.append((self.AlarmResponseButtons.TD_ALARM_RESPONSE_BUTTON_END_TREATMENT.value, DataTypes.BOOL_U08)) + sensor_list.append((self.AlarmResponseButtons.TD_ALARM_RESPONSE_BUTTON_RESUME.value, DataTypes.BOOL_U08)) + sensor_list.append((self.AlarmResponseButtons.TD_ALARM_RESPONSE_BUTTON_RINSEBACK.value, DataTypes.BOOL_U08)) + sensor_list.append((self.AlarmResponseButtons.TD_ALARM_RESPONSE_BUTTON_END_TREATMENT.value, DataTypes.BOOL_U08)) self.process_into_vars(decoder_list = msg_list, message = message) Index: leahi_dialin/td/modules/events.py =================================================================== diff -u -r75c97894e28b7cc684fcaf8f7ffba3f8c1bb61d8 -r27cd8e0e7b47617083e8c12f73306f0ba648e687 --- leahi_dialin/td/modules/events.py (.../events.py) (revision 75c97894e28b7cc684fcaf8f7ffba3f8c1bb61d8) +++ leahi_dialin/td/modules/events.py (.../events.py) (revision 27cd8e0e7b47617083e8c12f73306f0ba648e687) @@ -155,7 +155,7 @@ event_enum = td_enum_repository.TDEventList(event_id) current_timestamp = datetime.now().astimezone().strftime('%Y-%m-%d %H:%M:%S.%f') - if event_id == td_enum_repository.TDEventList.TD_EVENT_OPERATION_STATUS.value: + if event_enum is td_enum_repository.TDEventList.TD_EVENT_OPERATION_STATUS: # Get the data type - irrelevant event_data_type_1 = struct.unpack(DataTypes.U32.unpack_attrib(), bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] Index: leahi_dialin/td/modules/td_test_configs.py =================================================================== diff -u -r34b64ff2d8a64f4b7b60b80bb7cf4c36845e5943 -r27cd8e0e7b47617083e8c12f73306f0ba648e687 --- leahi_dialin/td/modules/td_test_configs.py (.../td_test_configs.py) (revision 34b64ff2d8a64f4b7b60b80bb7cf4c36845e5943) +++ leahi_dialin/td/modules/td_test_configs.py (.../td_test_configs.py) (revision 27cd8e0e7b47617083e8c12f73306f0ba648e687) @@ -43,7 +43,7 @@ self.logger = logger if self.can_interface is not None: - self.can_interface.register_receiving_publication_function(channel_id = DenaliChannels.td_sync_broadcast_ch_id, + self.can_interface.register_receiving_publication_function(channel_id = DenaliChannels.td_to_dialin_ch_id, message_id = MsgIds.MSG_ID_TD_SEND_TEST_CONFIGURATION.value, function = self._handler_td_test_config_sync) @@ -69,6 +69,7 @@ @param message: published TD test configurations message @return: None """ + print('test config response') payload = message['message'] index = MsgFieldPositions.START_POS_FIELD_1 Index: leahi_dialin/utils/__init__.py =================================================================== diff -u -r8ad78a5baa403afceccf9627478285a2ec742c4a -r27cd8e0e7b47617083e8c12f73306f0ba648e687 --- leahi_dialin/utils/__init__.py (.../__init__.py) (revision 8ad78a5baa403afceccf9627478285a2ec742c4a) +++ leahi_dialin/utils/__init__.py (.../__init__.py) (revision 27cd8e0e7b47617083e8c12f73306f0ba648e687) @@ -1,30 +1,2 @@ -import os -import json - -# mandatory imports from .base import * from .singleton import * - -file_name = "config.json" -sw_key = "SW" -config = {} -ok: bool = False -module_name = os.path.basename(os.path.dirname(__file__)) - -try: - with open(file_name, 'r') as file: config = json.load(file); ok = config[sw_key] -except FileNotFoundError: pass -except KeyError : print(f"Error ({module_name}): The key '{sw_key}' was not found." ) -except Exception as e : print(f"Error ({module_name}): An unexpected error occurred: {e}" ) - -if ok: - print(f"{sw_key} is set to bypass the auto imports in '{module_name}' module.") -else: - from .conversions import * - from .data_logger import DataLogger - from .checks import * - from .helpers import * - from .excel_ops import * - from .nv_ops_utils import * - YES = 1 - NO = 0 Index: leahi_dialin/utils/abstract_classes.py =================================================================== diff -u -r34b64ff2d8a64f4b7b60b80bb7cf4c36845e5943 -r27cd8e0e7b47617083e8c12f73306f0ba648e687 --- leahi_dialin/utils/abstract_classes.py (.../abstract_classes.py) (revision 34b64ff2d8a64f4b7b60b80bb7cf4c36845e5943) +++ leahi_dialin/utils/abstract_classes.py (.../abstract_classes.py) (revision 27cd8e0e7b47617083e8c12f73306f0ba648e687) @@ -66,44 +66,67 @@ self._observers.remove(observer) - def process_into_vars(self, decoder_list: List[Tuple], message, start_from_byte: int=0) -> dict: + def process_into_vars(self, decoder_list: List[Tuple], message, start_from_byte: int=0, debug: bool=False) -> dict: """ - Process the CAN message with the help of the decoder list into variables. + Process the CAN message with the help of the decoder list into variables and a dictionary. + Note: updating variables will only be done when it's class wide one, aka "self.attr_name". + For local attributes to avoid namespace issues use the returned dictionary. Format: {attr_name : value} :param decoder_list: (List[Tuple[String, DataTypes]]) Contains the variable name and DataType pair of the indexed message :param message: (Bytearray) The raw CAN message :param start_from_byte: (Integer) Start from the nth byte after the header + :param debug: (Boolean) Prints for debugging :return: (Dictionary) A dictionary for the variable_name and value pair """ start_pos = MSG_HEADER_SIZE + start_from_byte results = {} + if debug: + print(f'\n\ndecoder_list: {decoder_list}') + print(f'len: {len(decoder_list[0])}') for decode_details in decoder_list: # Content of the decode list variable_name = decode_details[0] datatype: DataTypes = decode_details[-1] - end_pos = start_pos + datatype.size() value = struct.unpack(datatype.unpack_attrib(), bytearray(message['message'][start_pos:end_pos]))[0] + if debug: + print(f'value: {value} ({datatype.name})') + print(f'pos: {start_pos} - {end_pos}') if 'nan' in str(value).lower(): raise ValueError(f'{value} is not an accepted value!') if datatype is DataTypes.BOOL: value = True if value == 1 else False results[variable_name] = value - exec(f'{variable_name} = {value}') + + # If it's a instance variable (self.) then set it's value + if variable_name.startswith('self'): + attr_name = variable_name[5:] + if not attr_name.isidentifier(): + print(f'Invalid attribute name: "{attr_name}"!') + raise ValueError('Invalid attribute name') + setattr(self, attr_name, value) start_pos = end_pos + if debug: + print('Finished cycle\n') + if debug: + print(f'results: {results}\n') return results - def process_into_dict(self, dict_to_update: dict, decoder_list: List[Tuple], message, start_from_byte: int=0) -> dict: + def process_into_dict(self, dict_to_update: dict, decoder_list: List[Tuple], message, start_from_byte: int=0, debug: bool=False): """ Process the CAN message with the help of the decoder list into a dictionary. :param decoder_list: (List[Tuple[DialEnum, DialEnum, DataTypes]]) Contains the dictioarny key names and DataType of the indexed message :param message: (Bytearray) The raw CAN message :param start_from_byte: (Integer) Start from the nth byte after the header + :param debug: (Boolean) Prints for debugging :return: (Dictionary) The updated dictionary """ start_pos = MSG_HEADER_SIZE + start_from_byte + if debug: + print(f'\n\ndecoder_list: {decoder_list}') + print(f'len: {len(decoder_list[0])}') for decode_details in decoder_list: # Content of the decode list key_1 = decode_details[0] @@ -112,17 +135,23 @@ end_pos = start_pos + datatype.size() value = struct.unpack(datatype.unpack_attrib(), bytearray(message['message'][start_pos:end_pos]))[0] + if debug: + print(f'key_1: {key_1}') + print(f'key_2: {key_2}') + print(f'value: {value} ({datatype.name})') + print(f'pos: {start_pos} - {end_pos}') if 'nan' in str(value).lower(): raise ValueError(f'{value} is not an accepted value!') - # If the type is Bool, convert the value from Integer to Boolean if datatype is DataTypes.BOOL: value = True if value == 1 else False - # Save the value into the Dictionary if len(decode_details) == 2: - dict_to_update[key_1.name] = value + dict_to_update[key_1] = value elif len(decode_details) == 3: - dict_to_update[key_1.name][key_2.name] = value + dict_to_update[key_1][key_2] = value start_pos = end_pos - return dict_to_update + if debug: + print('Finished cycle\n') + if debug: + print('done\n') Index: leahi_dialin/utils/enums/__init__.py =================================================================== diff -u -r6d104d3185ac3ed7c18c97ecdc13fd59bf53a8d1 -r27cd8e0e7b47617083e8c12f73306f0ba648e687 --- leahi_dialin/utils/enums/__init__.py (.../__init__.py) (revision 6d104d3185ac3ed7c18c97ecdc13fd59bf53a8d1) +++ leahi_dialin/utils/enums/__init__.py (.../__init__.py) (revision 27cd8e0e7b47617083e8c12f73306f0ba648e687) @@ -1,23 +1,2 @@ -import os -import json - -# mandatory import -# none - -file_name = "config.json" -sw_key = "SW" -config = {} -ok: bool = False -module_name = os.path.basename(os.path.dirname(__file__)) - -try: - with open(file_name, 'r') as file: config = json.load(file); ok = config[sw_key] -except FileNotFoundError: pass -except KeyError : print(f"Error ({module_name}): The key '{sw_key}' was not found." ) -except Exception as e : print(f"Error ({module_name}): An unexpected error occurred: {e}" ) - -if ok: - print(f"{sw_key} is set to bypass the auto imports in '{module_name}' module.") -else: - from .alarm_enum import AlarmEnum - from .dialin_enum import DialinEnum +from .alarm_enum import AlarmEnum +from .dialin_enum import DialinEnum