import json,os,re,struct,subprocess,threading,time from pathlib import Path R=Path(__file__).resolve().parent P=R.parents[1] DLL=P/'tmp/can1-test-20261002/pcan-basic/x64' os.environ['PATH']=str(DLL)+os.pathsep+os.environ['PATH'] dh=os.add_dll_directory(str(DLL)) import can,serial 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(P/'firmware/build/Release/AMI_Controller.elf')]).decode().replace('\r','') S={n:int(a,16) for a,k,n in re.findall(r'^(\w+)\s+(\w)\s+(\w+)$',nm,re.M)} (R/'symbols.json').write_text(json.dumps(S,indent=2)) names=['vcu_display_state','vcu_status_last_rx_ms','vcu_status_received','display_state','can_rx_error_count','uart_rx_error_count','screen_tx_busy'] base=min(S[n] for n in names)&~3 length=((max(S[n]+(56 if n=='display_state' else 4) for n in names)-base+3)//4)*4 def memory(name): p=subprocess.run([CLI,'-c','port=SWD','mode=HOTPLUG','freq=1000','-r32',hex(base),str(length)],capture_output=True,timeout=15) (R/f'{name}-ram.log').write_bytes(p.stdout+p.stderr) assert p.returncode==0 mem={} for a,words in re.findall(r'0x([0-9A-Fa-f]+)\s*:\s*((?:[0-9A-Fa-f]{8}\s*)+)',p.stdout.decode(errors='replace')): a=int(a,16) for word in words.split(): for i,b in enumerate(struct.pack(' STM32 RAM plus COM4 capture, not panel display proof','checks':checks,'tx':tx,'errors':errors,'uart_bytes':len(uart),'uart_commands':commands,'physical_task_request':request,'mcu_passed':True} (R/'mcu-results.json').write_text(json.dumps(report,ensure_ascii=False,indent=2),encoding='utf-8') print(json.dumps({'checks':len(checks),'uart_bytes':len(uart),'physical_task_request':request,'mcu_passed':True}),flush=True)