shibosoftwaredev/f1c100s-linux-nema17-stepper-controller
A four-layer NEMA 17 motor-controller PCB combining an Allwinner F1C100S Linux computer, USB‑PD/buck power system, W5500 Ethernet, STM32 real-time motion control, DRV8825 stepper driver, protection/temperature/current telemetry, USB interfaces, and local LED/buzzer diagnostics.
- Version
- 0.4.56
- License
- unset
- Stars
- 0
scripts/resume-review-routing.py
"""Continue a checked partial route without repeating already drawn copper.
Only the design-specific route plan changes. All retained copper remains a
physical obstacle, and the normal independent import/audits still run.
"""
from route_geometry import *
import argparse
parser=argparse.ArgumentParser()
parser.add_argument('--ethernet-layer',choices=['inner1','inner2'])
args=parser.parse_args()
plan=json.loads(Path('routing/bulk-top-closure-plan.json').read_text())
attempt=json.loads(Path('reports/bulk-top-closure-attempt.json').read_text())
assert attempt['complete'] is False
physical=json.loads(Path('routing/bulk-top-closure-partial-physical-candidate.json').read_text())
remaining=plan['jobs'][len(attempt['routes']):]
assert remaining
c=load_circuit(plan['placement']);root=connectivity(c)
mapping=json.loads(Path('routing/net-map.json').read_text())['roots']
sources={}
for s in c:
if s['type']=='source_trace':
n=mapping[root((s.get('connected_source_port_ids',[])+s.get('connected_source_net_ids',[]))[0])]
sources.setdefault(n,s['source_trace_id'])
retained=[]
for i,w in enumerate(physical['wires']):
retained.append(dict(type='pcb_trace',pcb_trace_id=f'review_continued_wire_{i}',source_trace_id=sources[w['net']],
route=[dict(route_type='wire',x=x,y=y,layer=w['layer'],width=w['width']) for x,y in w['points']]))
for i,v in enumerate(physical['vias']):
retained.append(dict(type='pcb_trace',pcb_trace_id=f'review_continued_via_{i}',source_trace_id=sources[v['net']],
route=[dict(route_type='via',x=v['x'],y=v['y'],from_layer='top',to_layer='bottom',via_diameter=.45,via_hole_diameter=.3)]))
if args.ethernet_layer:
assert remaining[0]['source']=='source_trace_381'
remaining[0]['constraints']['allowed_layers']=[args.ethernet_layer]
remaining[0]['target'].update(x=15.9,y=-5.95,layers=LAYERS,connected_tree=False)
Path('routing/bulk-top-continued-retained.json').write_text(json.dumps(retained,indent=2)+'\n')
Path('routing/bulk-top-continued-plan.json').write_text(json.dumps({**plan,'retained':'routing/bulk-top-continued-retained.json','jobs':remaining},indent=2)+'\n')
Path('reports/bulk-top-retained-route-history.json').write_text(json.dumps(attempt,indent=2)+'\n')
print(json.dumps(dict(retainedWires=len(physical['wires']),retainedVias=len(physical['vias']),remainingJobs=len(remaining))))