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/draw-current-detail.py
"""Render the real candidate copper around the new DAC bus, for manual review."""
from route_geometry import *
from collections import defaultdict
import html
c=load_circuit('routing/review-placement.circuit.json');root=connectivity(c)
m=json.loads(Path('routing/net-map.json').read_text())['roots']
p=json.loads(Path(os.environ.get('PHYSICAL_INPUT','routing/software-current-partial-physical-candidate.json')).read_text())
ports={e['pcb_port_id']:e for e in c if e['type']=='pcb_port'}
for layer in ['inner1','inner2']:
shapes=defaultdict(list)
for e in c:
if e['type']=='pcb_plated_hole':
q=ports.get(e.get('pcb_port_id'));n=m.get(root(q['source_port_id'])) if q else 'NC'
shapes[n].append(geometry(e,'outer_'))
for w in p['wires']:
if w['layer']==layer:shapes[w['net']].append(LineString(w['points']).buffer(w['width']/2))
for v in p['vias']:shapes[v['net']].append(Point(v['x'],v['y']).buffer(.225))
colors={'N161':'#00cc66','N162':'#ff4455','N168':'#ff9900','N62':'#666666'}
text=['<svg xmlns="http://www.w3.org/2000/svg" width="1400" height="1050" viewBox="0 0 1400 1050"><rect width="1400" height="1050" fill="#fff"/>',
'<g transform="translate(-200,-1200) scale(80,-80)">']
for n,gs in shapes.items():
for g in gs:
if not g.intersects(box(2.5,-26,20,-15)):continue
text.append(g.svg(fill_color=colors.get(n,'#3366aa'),opacity=.8).replace('stroke-width="2.0"','stroke-width="0"'))
text.append('</g>')
for x in range(3,20):text.append(f'<text x="{x*80-200}" y="30" font-size="16">{x}</text>')
for y in range(-25,-14):text.append(f'<text x="5" y="{-y*80-1200}" font-size="16">{y}</text>')
for v in p['vias']:
x,y=v['x'],v['y']
if 2.5<x<20 and -26<y<-15:text.append(f'<text x="{x*80-200}" y="{-y*80-1200}" font-size="11">{v["net"]} {x:.2f},{y:.2f}</text>')
text.append(f'<text x="100" y="60" font-size="24">{layer}: SDA green, SCL red, enable orange</text></svg>')
Path(f'reports/software-current-{layer}-detail.svg').write_text('\n'.join(text))