diff --git a/epson_print_conf.py b/epson_print_conf.py index 051a0aa..a0d3d2a 100644 --- a/epson_print_conf.py +++ b/epson_print_conf.py @@ -1699,11 +1699,23 @@ def get_serial_number(self) -> str: return None if "serial_number" not in self.parm: return None - return "".join( - chr(int(value or "0x3f", 16)) # "0x3f" --> "?" - for value in self.read_eeprom_many( - self.parm["serial_number"], label="serial_number") - ) + if isinstance(self.parm["serial_number"], (list, tuple)): + left_val = None + for i in self.parm["serial_number"]: + val = "".join( + chr(int(value or "0x3f", 16)) # "0x3f" --> "?" + for value in self.read_eeprom_many(i, label="serial_number") + ) + if left_val is not None and val != left_val: + return False + left_val = val + return left_val + else: + return "".join( + chr(int(value or "0x3f", 16)) # "0x3f" --> "?" + for value in self.read_eeprom_many( + self.parm["serial_number"], label="serial_number") + ) def get_printer_brand(self) -> str: """Return the producer name of the printer ("EPSON").""" @@ -2076,11 +2088,30 @@ def update_parameter( or not self.parm[parameter] or not value_list or not len(value_list) - or len(self.parm[parameter]) != len(value_list) + or ( + isinstance(self.parm[parameter], (list, tuple)) + and not all( + len(sublist) == len(value_list) + for sublist in self.parm[parameter] + ) + ) + or ( + not isinstance(self.parm[parameter], (list, tuple)) + and len(self.parm[parameter]) != len(value_list) + ) ): return None if dry_run: return True + if isinstance(self.parm[parameter], (list, tuple)): + for i in self.parm[parameter]: + for oid, value in zip(i, value_list): + if not self.write_eeprom( + oid, value, label="update_" + parameter + ): + return False + return True + return False for oid, value in zip(self.parm[parameter], value_list): if not self.write_eeprom(oid, value, label="update_" + parameter): return False diff --git a/ui.py b/ui.py index 940e053..7ca09e1 100644 --- a/ui.py +++ b/ui.py @@ -32,7 +32,7 @@ from find_printers import PrinterScanner -VERSION = "5.0" +VERSION = "5.1" NO_CONF_ERROR = ( "[ERROR] Please select a printer model and a valid IP address," @@ -1318,6 +1318,14 @@ def get_ser_number(self, cursor=True): self.config(cursor="") self.update_idletasks() return + if ser_num is False: + self.status_text.insert( + tk.END, + f"[ERROR]: Improper values in printer serial number.\n", + ) + self.config(cursor="") + self.update_idletasks() + return if not ser_num or "?" in ser_num: self.status_text.insert( tk.END, @@ -1588,19 +1596,22 @@ def set_ser_number(self, cursor=True): self.config(cursor="") self.update_idletasks() return - try: - if not self.get_current_eeprom_values( - self.printer.parm["serial_number"], - "Printer Serial Number" - ): + pr_ser_num = self.printer.parm["serial_number"] + if isinstance(pr_ser_num, (list, tuple)): + list_ser_num = pr_ser_num + else: + list_ser_num = [pr_ser_num] + for i in list_ser_num: + try: + if not self.get_current_eeprom_values(i, "Printer Serial Number"): + self.config(cursor="") + self.update_idletasks() + return + except Exception as e: + self.handle_printer_error(e) self.config(cursor="") self.update_idletasks() return - except Exception as e: - self.handle_printer_error(e) - self.config(cursor="") - self.update_idletasks() - return self.status_text.insert( tk.END, f"[INFO] Set Printer Serial Number: {self.ser_num_var.get()}.\n" @@ -2146,29 +2157,37 @@ def run_detection(): tk.END, f"[ERROR] Cannot detect the serial number.\n" ) - elif len(matches) != 1: - self.status_text.insert( - tk.END, - "[ERROR] More than one pattern appears to be" - " a serial number:\n" - ) + left_ser_num = None + for match in matches: + tmp_ser_num = match.group() + if left_ser_num is not None and tmp_ser_num != left_ser_num: + self.status_text.insert( + tk.END, + "[ERROR] More than one pattern appears to be" + " a serial number with different values:\n" + ) + for match in matches: + self.status_text.insert( + tk.END, + f'[ERROR] - found pattern "{match.group()}"' + f" at address {match.start()}\n" + ) + left_ser_num = None + break + left_ser_num = tmp_ser_num + if left_ser_num: for match in matches: + serial_number = match.group() + serial_number_address = match.start() + serial_number_range = range( + serial_number_address, + serial_number_address + len_ser_num + ) self.status_text.insert( tk.END, - f'[ERROR] - found pattern "{match.group()}"' - f" at address {match.start()}\n" + f'[INFO] Detected serial number "{serial_number}"' + f" at address {serial_number_address}.\n" ) - else: - serial_number = matches[0].group() - serial_number_address = matches[0].start() - serial_number_range = range( - serial_number_address, serial_number_address + len_ser_num - ) - self.status_text.insert( - tk.END, - f'[INFO] Detected serial number "{serial_number}"' - f" at address {serial_number_address}.\n" - ) last_ser_num_addr = serial_number_address + len_ser_num - 1 last_ser_num_value = int(hex_bytes[last_ser_num_addr], 16) self.status_text.insert(