Index: leahi_dialin/dd/modules/records.py =================================================================== diff -u -r3cd59165eaecfa53c68486079707e6b3189a36ab -r8e8f0771536848eee49720b72ec44b4bf4eebf80 --- leahi_dialin/dd/modules/records.py (.../records.py) (revision 3cd59165eaecfa53c68486079707e6b3189a36ab) +++ leahi_dialin/dd/modules/records.py (.../records.py) (revision 8e8f0771536848eee49720b72ec44b4bf4eebf80) @@ -27,7 +27,7 @@ from leahi_dialin.utils.abstract_classes import AbstractSubSystem from leahi_dialin.utils.base import publish from leahi_dialin.utils.enums import DialinEnum -from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray, byte_to_bytearray +from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray, byte_to_bytearray, short_to_bytearray class DDRecords(AbstractSubSystem): @@ -382,10 +382,10 @@ # ================================================= Set Records Main Methods ================================================= def cmd_set_system_records(self, - part_number: str, - serial_number: str, - manufacturing_location: int, - manufacturing_date: int) -> int: + part_number: str='0000000000', + serial_number: str='00000000000000000000', + manufacturing_location: int=0, + manufacturing_date: int=0) -> int: """ Constructs and sends a command for setting the System Records. Constraints: @@ -394,13 +394,10 @@ @return: 1 if successful, zero otherwise """ - payload_count = 0 - for e in dd_enum_repository.SystemRecordFields: - if e != dd_enum_repository.SystemRecordFields.NUM_OF_SYSTEM_RECORD_FIELDS: - payload_count += e.datatype().size() * e.multichar_length() - payload_base = integer_to_bytearray(1) # Current Page - payload_base += integer_to_bytearray(1) # All Page Count - payload_base += integer_to_bytearray(payload_count) # Payload count in bytes + if len(part_number) != 10: + raise ValueError("part_number must be 10 characters") + if len(serial_number) != 10: + raise ValueError("serial must be 20 characters") payload = b'' for c in part_number: @@ -409,13 +406,10 @@ payload += byte_to_bytearray(c) payload += integer_to_bytearray(manufacturing_location) payload += integer_to_bytearray(manufacturing_date) - crc = crc16_modbus(payload) - payload += integer_to_bytearray(crc) + payload += short_to_bytearray(crc16_modbus(payload)) - total_payload = payload_base + payload - return cmd_generic_override( - payload = total_payload, + payload = payload, reset = None, channel_id = CanChannels.dialin_to_dd_ch_id, msg_id = MsgIds.MSG_ID_DD_NVM_SET_SYSTEM_RECORD, @@ -426,10 +420,10 @@ def cmd_set_service_records(self, - service_loc: int, - last_service_date: int, - service_interval_sec: int, - last_reset_time: int) -> int: + service_loc: int=0, + last_service_date: int=0, + service_interval_sec: int=0, + last_reset_time: int=0) -> int: """ Constructs and sends a command for setting the Service Records. Constraints: @@ -438,25 +432,14 @@ @return: 1 if successful, zero otherwise """ - payload_count = 0 - for e in dd_enum_repository.ServiceRecordFields: - if e != dd_enum_repository.ServiceRecordFields.NUM_OF_SERVICE_RECORD_FIELDS: - payload_count += e.datatype().size() * e.multichar_length() - payload_base = integer_to_bytearray(1) # Current Page - payload_base += integer_to_bytearray(1) # All Page Count - payload_base += integer_to_bytearray(payload_count) # Payload count in bytes - - payload = b'' - payload += byte_to_bytearray(service_loc) + payload = byte_to_bytearray(service_loc) payload += integer_to_bytearray(last_service_date) payload += integer_to_bytearray(service_interval_sec) payload += integer_to_bytearray(last_reset_time) - crc = crc16_modbus(payload) - payload += integer_to_bytearray(crc) - total_payload = payload_base + payload + payload += short_to_bytearray(crc16_modbus(payload)) return cmd_generic_override( - payload = total_payload, + payload = payload, reset = None, channel_id = CanChannels.dialin_to_dd_ch_id, msg_id = MsgIds.MSG_ID_DD_NVM_SET_SERVICE_RECORD, @@ -473,6 +456,7 @@ Must be logged into DD. Must be in Service mode. + @param calibration_records: (Dictionary) The stored and structured Calibration Records @return: 1 if successful, zero otherwise """ msg_id_pairing = { @@ -550,7 +534,88 @@ retry += 1 + def cmd_set_institutional_records(self, institutional_records: dict) -> int: + """ + Constructs and sends a command for setting the Institutional Records. + Constraints: + Must be logged into DD. + Must be in Service mode. + @param institutional_records: (Dictionary) The stored and structured Institutional Records + @return: 1 if successful, zero otherwise + """ + # Make a dictionary to store all the send functions for later send + send_data = [] + for key in institutional_records: + payload = integer_to_bytearray(key.value) + if key.datatype() in [DataTypes.U32, DataTypes.BOOL, DataTypes.S32]: + payload += integer_to_bytearray(institutional_records[key]) + elif key.datatype() in [DataTypes.F32]: + payload += float_to_bytearray(institutional_records[key]) + elif key.datatype() in [DataTypes.U08, DataTypes.BOOL_U08]: + payload += byte_to_bytearray(institutional_records[key]) + payload += short_to_bytearray(crc16_modbus(payload)) + + 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, + entity_name = f'DD Institutional Record', + override_text = 'being set', + logger = self.logger, + can_interface = self.can_interface))) + + # Execute the stored functions one by one + # Remove the ones that got 1 (successfully recieved) as response + # Retry the ones that are failed 2 more times + retry = 0 + while send_data != [] and retry < 3: + failed = [] + for func in send_data: + resp = func() + if resp == 1: + failed.append(func) + send_data = failed + retry += 1 + + + def cmd_set_usage_info_records(self, + ro_water_gen_total_l: float=0.0, + ro_water_gen_since_last_serv_l: float=0.0, + last_basic_flush_date: int=0, + last_heat_disinfect_date: int=0, + last_heat_active_cool_date: int=0, + last_filter_flush_date: int=0, + last_reset_time: int=0) -> int: + """ + Constructs and sends a command for setting the Usage Information Records. + Constraints: + Must be logged into DD. + Must be in Service mode. + + @return: 1 if successful, zero otherwise + """ + payload = float_to_bytearray(ro_water_gen_total_l) + payload += float_to_bytearray(ro_water_gen_since_last_serv_l) + payload += integer_to_bytearray(last_basic_flush_date) + payload += integer_to_bytearray(last_heat_disinfect_date) + payload += integer_to_bytearray(last_heat_active_cool_date) + payload += integer_to_bytearray(last_filter_flush_date) + payload += integer_to_bytearray(last_reset_time) + payload += short_to_bytearray(crc16_modbus(payload)) + + return cmd_generic_override( + payload = payload, + reset = None, + channel_id = CanChannels.dialin_to_dd_ch_id, + msg_id = MsgIds.MSG_ID_DD_NVM_SET_USAGE_INFO_RECORD, + entity_name = f'New DD Usage Information Record', + override_text = 'being set', + logger = self.logger, + can_interface = self.can_interface) + + + # ================================================= Set Records Support Methods ================================================= def cmd_set_calibration_records_sensor(self, sensor_enum: DialinEnum, @@ -571,7 +636,7 @@ payload += float_to_bytearray(gain) payload += float_to_bytearray(offset) payload += integer_to_bytearray(calibration_time) - payload += integer_to_bytearray(crc16_modbus(payload)) + payload += short_to_bytearray(crc16_modbus(payload)) sensor_type = '' if msg_id == MsgIds.TBD: @@ -606,7 +671,7 @@ payload += float_to_bytearray(conductivity_uspcm) payload += float_to_bytearray(temperature_c) payload += integer_to_bytearray(calibration_time) - payload += integer_to_bytearray(crc16_modbus(payload)) + payload += short_to_bytearray(crc16_modbus(payload)) conc_type = '' if msg_id == MsgIds.TBD: @@ -635,7 +700,7 @@ payload += float_to_bytearray(accel_y_offset) payload += float_to_bytearray(accel_z_offset) payload += integer_to_bytearray(calibration_time) - payload += integer_to_bytearray(crc16_modbus(payload)) + payload += short_to_bytearray(crc16_modbus(payload)) conc_type = '' if msg_id == MsgIds.TBD: @@ -661,7 +726,7 @@ payload = float_to_bytearray(set_point) payload += integer_to_bytearray(calibration_time) - payload += integer_to_bytearray(crc16_modbus(payload)) + payload += short_to_bytearray(crc16_modbus(payload)) return cmd_generic_override(payload = payload, reset = None,