import sys import serial import serial.tools.list_ports import re import tkinter as tk from tkinter import ttk UID_RE = re.compile(r'uid: (.{8})$') def main(): portname = None for p in serial.tools.list_ports.comports(): if 'Bluetooth' in p.name: continue portname = p.device if portname is None: print('no serial port') sys.exit(1) print(f'using serial port: {portname}') ser = serial.Serial(portname, baudrate=115200, timeout=0.1) win = tk.Tk() id = ttk.Label(win, text='ID:') id.pack() id_var = tk.StringVar(win) show_id = ttk.Label(win, textvariable=id_var) show_id.pack() mode = ttk.Label(win, text='Mode:') mode.pack() mode_var = tk.StringVar(win) show_mode = ttk.Label(win, textvariable=mode_var) show_mode.pack() read_button = ttk.Button(win, text='Read', command=lambda: ser.write('read\n'.encode('ascii'))) read_button.pack() clear_button = ttk.Button(win, text='Clear', command=lambda: ser.write('set 00000000\n'.encode('ascii'))) clear_button.pack() write_button = ttk.Button(win, text='Write', command=lambda: ser.write('write\n'.encode('ascii'))) write_button.pack() write_dummy_button = ttk.Button(win, text='Write Dummy', command=lambda: ser.write(b'set a5a5a5a5\nwrite\n')) write_dummy_button.pack() unbrick_button = ttk.Button(win, text='Unbrick', command=lambda: ser.write(b'unbrick\n')) unbrick_button.pack() dat = bytearray() while True: dat.extend(ser.read_until(b'\n')) if dat.endswith(b'\n'): try: elem = bytes(dat).decode('utf-8').strip() print(f'serial: {elem}') except UnicodeDecodeError: print(f'decode failure (serial: {dat})') elem = '' finally: dat.clear() if elem.startswith('read card'): matches = UID_RE.findall(elem) if matches is None: print('bad match') else: print(f'key: {matches[0]}') id_var.set(matches[0]) if elem.startswith('set key: '): id_var.set(elem.removeprefix('set key: ')) if elem.startswith('mode: '): mode_var.set(elem.removeprefix('mode: ')) win.update() if __name__ == '__main__': main()