from pathlib import Path
import shutil,json,hashlib
R=Path(__file__).resolve().parent; B=R.parent; D=R/'firmware/固件'
shutil.copytree(B/'mcu_pinmap_A30/firmware/固件/lamp_target',D/'lamp_target',ignore=shutil.ignore_patterns('build','__pycache__'))
S=Path('work/v1.40-integration-2026-10-09/固件/lamp_control')
(D/'lamp_control').mkdir()
for p in S.iterdir():
 if p.suffix in ('.c','.h'): shutil.copy2(p,D/'lamp_control'/p.name)
p=D/'lamp_target/src/main.c'; s=p.read_text(); (R/'original_main.c').write_text(s)
s=s.replace('    (void)RCC->IOPENR;','    (void)RCC->IOPENR;\n    RCC->APBENR2 |= RCC_APBENR2_SYSCFGEN;\n    (void)RCC->APBENR2;')
s=s.replace('(1u << (9u + 16u));\n    GPIOB', '(1u << (9u + 16u)) |\n                  (1u << (11u + 16u));\n    GPIOB')
s=s.replace('gpio_drive(GPIOA, 9u, 0u);  /* WDOG_KICK: no external watchdog kick. */','''/* Stage both pin16 aliases low before restoring the default mapping.
     * DS12991 Rev6 Table12: package pin16=PA11, pin17=PA12.
     * PA9/PA10 reach these pads only with explicit SYSCFG remapping. */
    gpio_drive(GPIOA, 9u, 0u);
    gpio_drive(GPIOA, 11u, 0u); /* WDOG_KICK: no external watchdog kick. */
    gpio_input(GPIOA, 10u, 0u);
    gpio_input(GPIOA, 12u, 0u); /* THERM_OK: open defaults unsafe. */
    SYSCFG->CFGR1 &= ~(SYSCFG_CFGR1_PA11_RMP | SYSCFG_CFGR1_PA12_RMP);
    __DSB();''')
s=s.replace('    gpio_input(GPIOA, 10u, 0u); /* THERM_OK: open defaults unsafe. */','')
p.write_text(s)
pin=Path('work/pcba-v128-current/三款PCBA工程包-v1.28-2026-10-08/硬件/lamp_safety/pinmap.json')
j=json.loads(pin.read_text());j['status']='A36_PCA_BRANCH_FIRMWARE_PINMAP_NOT_FOR_FABRICATION'
for row in j['allocation']:
 if row['package_pin']==16:row['selected_function']='PA11 GPIO output; PA11_RMP cleared'
 if row['package_pin']==17:row['selected_function']='PA12 GPIO input pulldown; PA12_RMP cleared'
j['verification']={'scope':'firmware binding candidate, no new CAD/ERC/DRC claims','physical_tested':False,'IR_GPIO_binding':'UNIMPLEMENTED; pin3 remains NC','branch':'PCA9956B active-high blank/OE_N; do not mix with IS31 SDB polarity'}
(R/'pinmap_A36.json').write_text(json.dumps(j,ensure_ascii=False,indent=2)+'\n')
print('A36 cloned source closure and corrected default physical GPIO mapping')
