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-usb-vbus-pocket.py
from route_geometry import *
from shapely.ops import unary_union
from shapely.strtree import STRtree
c=load_circuit("routing/placement.json");root=connectivity(c)
m=json.loads(Path("routing/net-map.json").read_text())["roots"]
p={e["pcb_port_id"]:e for e in c if e["type"]=="pcb_port"}
parts={e["source_component_id"]:e["name"] for e in c if e["type"]=="source_component"}
pcs={e["pcb_component_id"]:parts[e["source_component_id"]] for e in c if e["type"]=="pcb_component"}
cu=json.loads(Path("routing/round7-usb-physical-candidate.json").read_text())
n=os.environ.get("DIAG_NET",m[root(p["pcb_port_223"]["source_port_id"])]);obs=[]
for e in c:
if e["type"] in ["pcb_smtpad","pcb_plated_hole"]:
net=m[root(p[e["pcb_port_id"]]["source_port_id"])] if e.get("pcb_port_id") else "NC"
g=geometry(e,"outer_" if e["type"]=="pcb_plated_hole" else "")
obs.append((g.buffer(.331 if net==n else .354),f"{pcs[e['pcb_component_id']]} {e.get('pcb_port_id')}"))
if e["type"]=="pcb_plated_hole":obs.append((geometry(e,"hole_").buffer(.429),"PTH drill"))
elif e["type"]=="pcb_hole":obs.append((geometry(e,"hole_").buffer(.429),"NPTH drill"))
for w in cu["wires"]:
if w["net"]!=n:obs.append((LineString(w["points"]).buffer(w["width"]/2+.354),f"{w['net']} {w['layer']} {w['points']}"))
for v in cu["vias"]:obs.append((Point(v["x"],v["y"]).buffer(.554),f"via {(v['x'],v['y'])}"))
tree=STRtree([g for g,name in obs])
def blockers(xy):
point=Point(xy)
return [obs[int(i)][1] for i in tree.query(point) if obs[int(i)][0].covers(point)]
for xy in [(-11.7,11.1),(-11.65,11.1),(-11.8,11.1),(-11.7,11.2),(-11.55,11.15)]:
print(json.dumps(dict(point=xy,blockers=blockers(xy))),flush=True)
clear=[]
for x in range(-210,-170):
for y in range(235,260):
xy=x*.05,y*.05
if not blockers(xy):clear.append(xy)
print(json.dumps(dict(net=n,clearViaCenters=clear[:100],count=len(clear))))