import json import os from pathlib import Path import re import struct import subprocess import time import pyautogui from pywinauto import Desktop ROOT=Path(__file__).resolve().parent PROJECT=ROOT.parents[1] DLL=PROJECT/'tmp/can1-test-20261002/pcan-basic/x64' os.environ['PATH']=str(DLL)+os.pathsep+os.environ['PATH'] handle=os.add_dll_directory(str(DLL)) import can CLI=r'D:\STM32CubeCLT_1.19.0\STM32CubeProgrammer\bin\STM32_Programmer_CLI.exe' NM=r'D:\STM32CubeCLT_1.19.0\GNU-tools-for-STM32\bin\arm-none-eabi-nm.exe' nm=subprocess.check_output([NM,'-n',str(PROJECT/'firmware/build/Release/AMI_Controller.elf')]).decode().replace('\r','') symbols={n:int(a,16) for a,k,n in re.findall(r'^(\w+)\s+(\w)\s+(\w+)$',nm,re.M)} names=['sdc_gpio_state','sdc_gpio_changed','sdc_gpio_timestamp_ms','sdc_gpio_received', 'display_state','can_port_last_rx_ms','can_rx_error_count','uart_rx_error_count'] base=min(symbols[n] for n in names)&~3 length=((symbols['display_state']+56-base+3)//4)*4 def memory(name): result=subprocess.run([CLI,'-c','port=SWD','mode=HOTPLUG','freq=1000','-r32',hex(base),str(length)],capture_output=True,timeout=15) (ROOT/f'gpio_{name}_ram.log').write_bytes(result.stdout+result.stderr) assert result.returncode==0 mem={} for address,words in re.findall(r'0x([0-9A-Fa-f]+)\s*:\s*((?:[0-9A-Fa-f]{8}\s*)+)',result.stdout.decode(errors='replace')): addr=int(address,16) for word in words.split(): for i,b in enumerate(struct.pack('0,(name,values) record={'name':name,'id':'0x6A6','data':data.hex(' '),'extended':extended,'snapshot':values,'pcan_status':hex(bus.status())} shot=ROOT/f'mcu_{name}.png' pyautogui.screenshot(region=(canvas.left,canvas.top,canvas.width(),canvas.height())).save(str(shot)) record['screenshot']=shot.name rows.append(record) (ROOT/'gpio-can-results.json').write_text(json.dumps({'checks':rows},indent=2),encoding='utf-8') print(json.dumps({'name':name,'state':hex(values['state']),'changed':hex(values['changed']),'debug_mapped':False,'pcan_status':hex(bus.status())}),flush=True) return values check('zero',0,0x7fff,1000) for bit in range(15): check(f'PD{bit}_high',1<