main
John Lauer Publish independent Astra ESC source and full-pad Kelvin review lesson d057af8 23d ago
from bridge import *
plans=json.loads((D/'live-routes.json').read_text());s=call('kicad_routing_state',{'filePath':B})
assert s['boardPath'].replace('\\','/').lower()==B.lower() and not s['segments'] and not s['vias']
rev=s['revision'];h=json.loads((D/'evidence/open-fallback.json').read_text())['hwnd']
call('desktop_caption',{'id':'astra-independent-esc','text':'Astra ESC | Independent placement | Routing and copper pours','position':'bottom','size':'small','duration':1800000,'reason':'Label the independent ESC routing recording'})
time.sleep(3)
r=call('desktop_record_start',{'monitor':0,'audio':False,'fps':30,'reason':'Astra independent ESC routing and pours','maxDurationMs':1800000});rid=r['recordingId'];(D/'evidence/routing-record-start.json').write_text(json.dumps(r,indent=2))
try:
 time.sleep(5)
 # Reference planes already committed in the preceding recorded stage.
 rev=call('kicad_routing_state',{'filePath':B})['revision']
 for i,p in enumerate(plans):
  call('desktop_caption',{'id':'astra-independent-esc','text':f'Astra ESC | {i+1}/{len(plans)} | {p["net"]} | {p["width"]:.2f} mm','position':'bottom','size':'small','duration':1800000,'reason':'Update the existing caption in place as each net lands'})
  a={k:p[k] for k in ['net','width','paths']};a.update(filePath=B,expectedRevision=rev,viaSize=.8,viaDrill=.4)
  r=call('kicad_route_net',a);rev=r['revision'];print(i+1,p['net'],'accepted',flush=True);time.sleep(1)
 r=call('kicad_routing_validate',{'filePath':B});(D/'evidence/after-routing-validate.json').write_text(json.dumps(r,indent=2));print('VALIDATE',r.get('errors'),r.get('unconnected'),flush=True)
 # Keep recording open for the model's pour review and native additions.
 (D/'evidence/routing-ready-for-pours.json').write_text(json.dumps({'recordingId':rid,'revision':rev}))
 print('READY_FOR_POURS',rid,flush=True)
except Exception:
 r=call('desktop_record_stop',{'recordingId':rid});(D/'evidence/routing-record-failed-stop.json').write_text(json.dumps(r,indent=2));raise