Index: leahi_dialin/common/generic_defs.py =================================================================== diff -u -ra9a280f1f678c984654c15a827da1bcd4ce0663c -r0bc2d3976315c12417c992717621a0284bbedef4 --- leahi_dialin/common/generic_defs.py (.../generic_defs.py) (revision a9a280f1f678c984654c15a827da1bcd4ce0663c) +++ leahi_dialin/common/generic_defs.py (.../generic_defs.py) (revision 0bc2d3976315c12417c992717621a0284bbedef4) @@ -189,12 +189,14 @@ @unique class SystemRecordFields(RecordsBaseEnum): - TOP_LEVEL_PN = (0, DataTypes.U08, 10) # Top level part number - TOP_LEVEL_SN = (1, DataTypes.U08, 20) # Top level serial number - MFG_LOCATION = (2, DataTypes.U32) # Manufacturing Location - MFG_DATE = (3, DataTypes.U32) # Manufacturing Date - CRC = (4, DataTypes.U16) # CRC - NUM_OF_SYSTEM_RECORD_FIELDS = (5, DataTypes.NONE) # Number of System Record Fields + IS_RO_FEATURED = (0, DataTypes.BOOL) # Is RO featured or defeatured + IS_RO_BOOST_PUMP_ADDED = (1, DataTypes.BOOL) # Is RO have boost pump or not + TOP_LEVEL_PN = (2, DataTypes.U08, 10) # Top level part number + TOP_LEVEL_SN = (3, DataTypes.U08, 20) # Top level serial number + MFG_LOCATION = (4, DataTypes.U32) # Manufacturing Location + MFG_DATE = (5, DataTypes.U32) # Manufacturing Date + CRC = (6, DataTypes.U16) # CRC + NUM_OF_SYSTEM_RECORD_FIELDS = (7, DataTypes.NONE) # Number of System Record Fields SystemRecordFields._str_list = { # Official Name : Accepted strings Index: leahi_dialin/common/msg_ids.py =================================================================== diff -u -r18b2243bcd623987781d4a67fabd4122ebe83ec7 -r0bc2d3976315c12417c992717621a0284bbedef4 --- leahi_dialin/common/msg_ids.py (.../msg_ids.py) (revision 18b2243bcd623987781d4a67fabd4122ebe83ec7) +++ leahi_dialin/common/msg_ids.py (.../msg_ids.py) (revision 0bc2d3976315c12417c992717621a0284bbedef4) @@ -209,34 +209,49 @@ MSG_ID_DD_NVM_SYSTEM_RECORD_RESPONSE = 0xBB MSG_ID_UI_DD_NVM_SET_SYSTEM_RECORD = 0xBC MSG_ID_DD_NVM_SERVICE_RECORD_RESPONSE = 0xBD - MSG_ID_DD_NVM_SET_SERVICE_RECORD = 0xBE + MSG_ID_UI_DD_NVM_SET_SERVICE_RECORD = 0xBE MSG_ID_DD_NVM_INSTITUTIONAL_RECORD_RESPONSE = 0xBF - MSG_ID_DD_NVM_SET_INSTITUTIONAL_RECORD = 0xC0 + MSG_ID_UI_DD_NVM_SET_INSTITUTIONAL_RECORD = 0xC0 MSG_ID_DD_NVM_USAGE_INFO_RECORD_RESPONSE = 0xC1 - MSG_ID_DD_NVM_SET_USAGE_INFO_RECORD = 0xC2 + MSG_ID_UI_DD_NVM_SET_USAGE_INFO_RECORD = 0xC2 MSG_ID_DD_NVM_CAL_PRESSURE_SENSOR_RESPONSE = 0xC3 - MSG_ID_DD_NVM_SET_CAL_PRESSURE_SENSOR = 0xC4 + MSG_ID_UI_DD_NVM_SET_CAL_PRESSURE_SENSOR = 0xC4 MSG_ID_DD_NVM_CAL_TEMP_SENSOR_RESPONSE = 0xC5 - MSG_ID_DD_NVM_SET_CAL_TEMP_SENSOR = 0xC6 + MSG_ID_UI_DD_NVM_SET_CAL_TEMP_SENSOR = 0xC6 MSG_ID_DD_NVM_CAL_CONC_PUMP_RESPONSE = 0xC7 - MSG_ID_DD_NVM_SET_CAL_CONC_PUMP = 0xC8 + MSG_ID_UI_DD_NVM_SET_CAL_CONC_PUMP = 0xC8 MSG_ID_DD_NVM_CAL_D12_PUMP_RESPONSE = 0xC9 - MSG_ID_DD_NVM_SET_CAL_D12_PUMP = 0xCA + MSG_ID_UI_DD_NVM_SET_CAL_D12_PUMP = 0xCA MSG_ID_DD_NVM_CAL_D48_PUMP_RESPONSE = 0xCB - MSG_ID_DD_NVM_SET_CAL_D48_PUMP = 0xCC + MSG_ID_UI_DD_NVM_SET_CAL_D48_PUMP = 0xCC MSG_ID_DD_NVM_CAL_ACID_CONCENTRATE_RESPONSE = 0xCD - MSG_ID_DD_NVM_SET_CAL_ACID_CONCENTRATE = 0xCE + MSG_ID_UI_DD_NVM_SET_CAL_ACID_CONCENTRATE = 0xCE MSG_ID_DD_NVM_CAL_BICARB_CONCENTRATE_RESPONSE = 0xCF - MSG_ID_DD_NVM_SET_CAL_BICARB_CONCENTRATE = 0xD0 + MSG_ID_UI_DD_NVM_SET_CAL_BICARB_CONCENTRATE = 0xD0 MSG_ID_DD_NVM_CAL_ACCEL_SENSOR_RESPONSE = 0xD1 - MSG_ID_DD_NVM_SET_CAL_ACCEL_SENSOR = 0xD2 + MSG_ID_UI_DD_NVM_SET_CAL_ACCEL_SENSOR = 0xD2 MSG_ID_DD_NVM_CAL_BLOOD_LEAK_SENSOR_RESPONSE = 0xD3 - MSG_ID_DD_NVM_SET_CAL_BLOOD_LEAK_SENSOR = 0xD4 + MSG_ID_UI_DD_NVM_SET_CAL_BLOOD_LEAK_SENSOR = 0xD4 MSG_ID_DD_NVM_RECORD_CRC_OVERRIDE_REQUEST = 0xD5 MSG_ID_DD_SUBSTITUTION_PUMP_DATA = 0xD6 MSG_ID_DD_PISTON_PUMP_CONTROL_DATA = 0xF0 + + + MSG_ID_UI_TD_NVM_GET_RECORD_REQUEST = 0x100 + MSG_ID_TD_NVM_SYSTEM_RECORD_RESPONSE = 0x101 + MSG_ID_UI_TD_NVM_SET_SYSTEM_RECORD = 0x102 + MSG_ID_TD_NVM_SERVICE_RECORD_RESPONSE = 0x103 + MSG_ID_UI_TD_NVM_SET_SERVICE_RECORD = 0x104 + MSG_ID_TD_NVM_INSTITUTIONAL_RECORD_RESPONSE = 0x105 + MSG_ID_UI_TD_NVM_SET_INSTITUTIONAL_RECORD = 0x106 + MSG_ID_TD_NVM_USAGE_INFO_RECORD_RESPONSE = 0x107 + MSG_ID_UI_TD_NVM_SET_USAGE_INFO_RECORD = 0x108 + MSG_ID_TD_NVM_CAL_RESPONSE = 0x109 + MSG_ID_UI_TD_NVM_SET_CAL_RECORD = 0x10A + MSG_ID_TD_NVM_RECORD_CRC_OVERRIDE_REQUEST = 0x10B + MSG_ID_TD_TESTER_LOGIN_REQUEST = 0x8000 MSG_ID_TD_SOFTWARE_RESET_REQUEST = 0x8001 MSG_ID_TD_SEND_TEST_CONFIGURATION = 0x8002 Index: leahi_dialin/dd/modules/records.py =================================================================== diff -u -r5ebadf2099b379c5ee6d8417be5e3121c74611cf -r0bc2d3976315c12417c992717621a0284bbedef4 --- leahi_dialin/dd/modules/records.py (.../records.py) (revision 5ebadf2099b379c5ee6d8417be5e3121c74611cf) +++ leahi_dialin/dd/modules/records.py (.../records.py) (revision 0bc2d3976315c12417c992717621a0284bbedef4) @@ -132,58 +132,13 @@ @return: none """ record_list = [] - for service_member in dd_enum_repository.ServiceRecordFields: - record_list.append((service_member.name, service_member.datatype())) + for member in dd_enum_repository.SystemRecordFields: + record_list.append((member.name, member.datatype(), member.multichar_length())) self.process_into_dict(dict_to_update = self.service_records, decoder_list = record_list, message = message) - # Get the payload related values - msg_list =[] - msg_list.append(('current_page', DataTypes.U32)) - msg_list.append(('all_pages', DataTypes.U32)) - msg_list.append(('payload_count', DataTypes.U32)) - result = self.process_into_vars(decoder_list = msg_list, - message = message) - - # Get the record data - record_list = [] - for i in range(0, result['payload_count']): - sys_record = dd_enum_repository.SystemRecordFields(i + self.pager_system_record) - if sys_record.multichar_length > 1: - for j in range(0, sys_record.multichar_length - 1): - name = f'{sys_record.name}_{j}' - record_list.append((name, sys_record.datatype())) - else: - name = sys_record.name - record_list.append((name, sys_record.datatype())) - result_payload = self.process_into_vars(decoder_list = record_list, - message = message, - start_from_byte = len(msg_list) * DataTypes.U32.size()) - - # Saving data into System Records - self.system_records[dd_enum_repository.SystemRecordFields.TOP_LEVEL_PN.name] = '' - self.system_records[dd_enum_repository.SystemRecordFields.TOP_LEVEL_SN.name] = '' - self.system_records[dd_enum_repository.SystemRecordFields.MFG_LOCATION.name] = 0 - self.system_records[dd_enum_repository.SystemRecordFields.MFG_DATE.name] = 0 - self.system_records[dd_enum_repository.SystemRecordFields.CRC.name] = 0 - for key in result_payload: - if key.startswith(dd_enum_repository.SystemRecordFields.TOP_LEVEL_PN.name): - value = result_payload[key] - self.system_records[dd_enum_repository.SystemRecordFields.TOP_LEVEL_PN.name] += value - elif key.startswith(dd_enum_repository.SystemRecordFields.TOP_LEVEL_SN.name): - value = result_payload[key] - self.system_records[dd_enum_repository.SystemRecordFields.TOP_LEVEL_SN.name] += value - else: - self.system_records[key] = result_payload[key] - - # Increase the pager by the payload count to know where the next message should resume, or reset when it's the last message - if result['current_page'] == result['all_pages']: - self.pager_system_record = 0 - else: - self.pager_system_record =+ result['payload_count'] - self.system_records_timestamp = timestamp @@ -663,7 +618,7 @@ payload = payload, reset = None, channel_id = CanChannels.dialin_to_dd_ch_id, - msg_id = MsgIds.MSG_ID_DD_NVM_SET_SERVICE_RECORD, + msg_id = MsgIds.MSG_ID_UI_DD_NVM_SET_SERVICE_RECORD, entity_name = f'New DD Service Record', override_text = 'being set', logger = self.logger, @@ -681,14 +636,14 @@ @return: 1 if successful, zero otherwise """ msg_id_pairing = { - self.CALIB_RECORDS_PRESSURE_SENSORS: MsgIds.MSG_ID_DD_NVM_SET_CAL_PRESSURE_SENSOR, - self.CALIB_RECORDS_TEMPERATURE_SENSORS: MsgIds.MSG_ID_DD_NVM_SET_CAL_TEMP_SENSOR, - self.CALIB_RECORDS_CONCENTRATE_PUMPS: MsgIds.MSG_ID_DD_NVM_SET_CAL_D48_PUMP, - self.CALIB_RECORDS_DIALYSATE_PUMPS: MsgIds.MSG_ID_DD_NVM_SET_CAL_CONC_PUMP, - self.CALIB_RECORDS_ACID_CONCENTRATE: MsgIds.MSG_ID_DD_NVM_SET_CAL_ACID_CONCENTRATE, - self.CALIB_RECORDS_BICARB_CONCENTRATE: MsgIds.MSG_ID_DD_NVM_SET_CAL_BICARB_CONCENTRATE, - self.CALIB_RECORDS_ACCELEROMETER: MsgIds.MSG_ID_DD_NVM_SET_CAL_ACCEL_SENSOR, - self.CALIB_RECORDS_BLOOD_LEAK: MsgIds.MSG_ID_DD_NVM_SET_CAL_BLOOD_LEAK_SENSOR, + self.CALIB_RECORDS_PRESSURE_SENSORS: MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_PRESSURE_SENSOR, + self.CALIB_RECORDS_TEMPERATURE_SENSORS: MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_TEMP_SENSOR, + self.CALIB_RECORDS_CONCENTRATE_PUMPS: MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_D48_PUMP, + self.CALIB_RECORDS_DIALYSATE_PUMPS: MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_CONC_PUMP, + self.CALIB_RECORDS_ACID_CONCENTRATE: MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_ACID_CONCENTRATE, + self.CALIB_RECORDS_BICARB_CONCENTRATE: MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_BICARB_CONCENTRATE, + self.CALIB_RECORDS_ACCELEROMETER: MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_ACCEL_SENSOR, + self.CALIB_RECORDS_BLOOD_LEAK: MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_BLOOD_LEAK_SENSOR, } # Make a dictionary to store all the send functions for later send @@ -700,7 +655,7 @@ if sensor in [dd_enum_repository.DDDialysatePumpNames.D12_PUMP]: # Store the function but do not execute it send_data.append(partial(self.cmd_set_calibration_records_sensor(sensor_enum = sensor, - msg_id = MsgIds.MSG_ID_DD_NVM_SET_CAL_D12_PUMP, + msg_id = MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_D12_PUMP, dialysate_pump_target_speed = calibration_records[key][sensor]['target_speed'], forth_order_coeff = calibration_records[key][sensor]['forth_order_coeff'], third_order_coeff = calibration_records[key][sensor]['third_order_coeff'], @@ -803,7 +758,7 @@ send_data.append(partial(cmd_generic_override(payload = payload, reset = None, channel_id = CanChannels.dialin_to_dd_ch_id, - msg_id = MsgIds.MSG_ID_DD_NVM_SET_INSTITUTIONAL_RECORD, + msg_id = MsgIds.MSG_ID_UI_DD_NVM_SET_INSTITUTIONAL_RECORD, entity_name = f'DD Institutional Record', override_text = 'being set', logger = self.logger, @@ -852,7 +807,7 @@ payload = payload, reset = None, channel_id = CanChannels.dialin_to_dd_ch_id, - msg_id = MsgIds.MSG_ID_DD_NVM_SET_USAGE_INFO_RECORD, + msg_id = MsgIds.MSG_ID_UI_DD_NVM_SET_USAGE_INFO_RECORD, entity_name = f'New DD Usage Information Record', override_text = 'being set', logger = self.logger, Index: leahi_dialin/td/modules/records.py =================================================================== diff -u -r5ebadf2099b379c5ee6d8417be5e3121c74611cf -r0bc2d3976315c12417c992717621a0284bbedef4 --- leahi_dialin/td/modules/records.py (.../records.py) (revision 5ebadf2099b379c5ee6d8417be5e3121c74611cf) +++ leahi_dialin/td/modules/records.py (.../records.py) (revision 0bc2d3976315c12417c992717621a0284bbedef4) @@ -60,33 +60,9 @@ message_id = MsgIds.MSG_ID_TD_NVM_SERVICE_RECORD_RESPONSE.value, function = self._handler_service_record_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.td_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_TD_NVM_CAL_PRESSURE_SENSOR_RESPONSE.value, + message_id = MsgIds.MSG_ID_TD_NVM_CAL_RESPONSE.value, function = self._handler_calibration_record_pres_sensor_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.td_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_TD_NVM_CAL_TEMP_SENSOR_RESPONSE.value, - function = self._handler_calibration_record_temp_sensor_sync) - self.can_interface.register_receiving_publication_function(channel_id = CanChannels.td_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_TD_NVM_CAL_CONC_PUMP_RESPONSE.value, - function = self._handler_calibration_record_conc_pump_sync) - self.can_interface.register_receiving_publication_function(channel_id = CanChannels.td_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_TD_NVM_CAL_D12_PUMP_RESPONSE.value, - function = self._handler_calibration_record_dial_pump_d12_sync) - self.can_interface.register_receiving_publication_function(channel_id = CanChannels.td_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_TD_NVM_CAL_D48_PUMP_RESPONSE.value, - function = self._handler_calibration_record_dial_pump_d48_sync) - self.can_interface.register_receiving_publication_function(channel_id = CanChannels.td_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_TD_NVM_CAL_ACID_CONCENTRATE_RESPONSE.value, - function = self._handler_calibration_record_acid_conc_sync) - self.can_interface.register_receiving_publication_function(channel_id = CanChannels.td_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_TD_NVM_CAL_BICARB_CONCENTRATE_RESPONSE.value, - function = self._handler_calibration_record_bicarb_conc_sync) - self.can_interface.register_receiving_publication_function(channel_id = CanChannels.td_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_TD_NVM_CAL_ACCEL_SENSOR_RESPONSE.value, - function = self._handler_calibration_record_accelerometer_sync) - self.can_interface.register_receiving_publication_function(channel_id = CanChannels.td_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_TD_NVM_CAL_BLOOD_LEAK_SENSOR_RESPONSE.value, - function = self._handler_calibration_record_blood_leak_sync) - self.can_interface.register_receiving_publication_function(channel_id = CanChannels.td_sync_broadcast_ch_id, message_id = MsgIds.MSG_ID_TD_NVM_INSTITUTIONAL_RECORD_RESPONSE.value, function = self._handler_institutional_record_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.td_sync_broadcast_ch_id, Index: leahi_dialin/utils/abstract_classes.py =================================================================== diff -u -r5ebadf2099b379c5ee6d8417be5e3121c74611cf -r0bc2d3976315c12417c992717621a0284bbedef4 --- leahi_dialin/utils/abstract_classes.py (.../abstract_classes.py) (revision 5ebadf2099b379c5ee6d8417be5e3121c74611cf) +++ leahi_dialin/utils/abstract_classes.py (.../abstract_classes.py) (revision 0bc2d3976315c12417c992717621a0284bbedef4) @@ -86,22 +86,37 @@ for decode_details in decoder_list: # Content of the decode list variable_name = decode_details[0] - datatype: DataTypes = decode_details[-1] + + # If last position is multichar length + if isinstance(decode_details[-1], int): + length = decode_details[-1] + datatype: DataTypes = decode_details[-2] + else: + length = 1 + datatype: DataTypes = decode_details[-1] end_pos = start_pos + datatype.size() - try: - value = struct.unpack(datatype.unpack_attrib(), bytearray(message['message'][start_pos:end_pos]))[0] - except Exception as e: - value = None + + for i in range(0, length): + try: + new_value = struct.unpack(datatype.unpack_attrib(), bytearray(message['message'][start_pos:end_pos]))[0] + if i == 0: + value = new_value + else: + value += new_value + except Exception as e: + value = None + break + if debug: print(f'{variable_name}: {value} ({datatype.name})') print(f'pos: {start_pos} - {end_pos}') if 'nan' in str(value).lower(): value = None + break # raise ValueError(f'{value} is not an accepted value!') - if datatype is DataTypes.BOOL: + if datatype in [DataTypes.BOOL, DataTypes.BOOL_U08]: value = True if value == 1 else False results[variable_name] = value - # If it's a instance variable (self.) then set it's value if variable_name.startswith('self'): attr_path = variable_name[5:].split('.') @@ -110,6 +125,7 @@ obj = getattr(obj, attr) setattr(obj, attr_path[-1], value) start_pos = end_pos + if debug: print('Finished cycle\n') if debug: @@ -136,20 +152,39 @@ key_1 = decode_details[0] key_2 = decode_details[1] if len(decode_details) >= 3 else None key_3 = decode_details[2] if len(decode_details) >= 4 else None - datatype: DataTypes = decode_details[-1] + + # If last position is multichar length + if isinstance(decode_details[-1], int): + length = decode_details[-1] + datatype: DataTypes = decode_details[-2] + else: + length = 1 + 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] + + for i in range(0, length): + try: + new_value = struct.unpack(datatype.unpack_attrib(), bytearray(message['message'][start_pos:end_pos]))[0] + if i == 0: + value = new_value + else: + value += new_value + except Exception as e: + value = None + break + 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(): value = None # 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: + if datatype in [DataTypes.BOOL, DataTypes.BOOL_U08]: value = True if value == 1 else False # Save the value into the Dictionary if len(decode_details) == 2: