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/inspect-current-escape.py
from route_geometry import *
from shapely.strtree import STRtree
c=load_circuit('routing/review-placement.circuit.json');root=connectivity(c)
m=json.loads(Path('routing/net-map.json').read_text())['roots']
parts={e['source_component_id']:e['name'] for e in c if e['type']=='source_component'}
pc={e['pcb_component_id']:parts[e['source_component_id']] for e in c if e['type']=='pcb_component'}
pp={e['pcb_port_id']:e for e in c if e['type']=='pcb_port'}
objects=[]
for e in c:
if e['type'] in ['pcb_smtpad','pcb_plated_hole']:
p=pp.get(e.get('pcb_port_id'));n=m.get(root(p['source_port_id'])) if p else None
objects.append(dict(net=n,layers=e.get('layers',[e.get('layer')]),shape=geometry(e,'outer_' if e['type']=='pcb_plated_hole' else ''),name=pc[e['pcb_component_id']],kind='pad'))
cu=json.loads(Path('routing/software-current-partial-physical-candidate.json').read_text())
for w in cu['wires']:objects.append(dict(net=w['net'],layers=[w['layer']],shape=LineString(w['points']).buffer(w['width']/2),name=str(w['points']),kind='wire'))
for v in cu['vias']:objects.append(dict(net=v['net'],layers=LAYERS,shape=Point(v['x'],v['y']),name=str((v['x'],v['y'])),kind='via'))
import sys
point=Point(float(sys.argv[1]),float(sys.argv[2])) if len(sys.argv)>2 else Point(9.05,-13.9)
near=[]
for o in objects:
d=o['shape'].distance(point)
need=.554 if o['kind']=='via' else .354
if d<need:near.append(dict(net=o['net'],name=o['name'],kind=o['kind'],layers=o['layers'],distance=d))
print(json.dumps(dict(point=list(point.coords),blockers=near),indent=2))
if len(sys.argv)>2:raise SystemExit(0)
legal=[]
for ix in range(175,191):
for iy in range(-293,-253):
p=Point(ix*.05,iy*.05)
if all(o['shape'].distance(p)>=(.554 if o['kind']=='via' else .354) for o in objects if o['kind']=='pad' or o['net']!='N215'):
legal.append(list(p.coords)[0])
print(json.dumps(dict(legalVias=legal[:50],count=len(legal))))