ShiboSoftwareDev/linux-gameboy-advance
Restores PCB assembly metadata by assigning part numbers and 3D CAD models, removing test-point bodies, and validating top-side SMT solder-paste features without altering copper or pads.
- Version
- 1.0.17
- License
- unset
- Stars
- 0
scripts/create-raised-fpc-routes.mjs
import fs from "node:fs"
const circuit=JSON.parse(fs.readFileSync("dist/index/circuit.json","utf8"))
const cache=JSON.parse(fs.readFileSync("carrier-route-cache.json","utf8"))
const traces=structuredClone(cache.traces)
const source=circuit.find((e)=>e.type==="source_component"&&e.name==="J_LCD")
const component=circuit.find((e)=>e.type==="pcb_component"&&e.source_component_id===source.source_component_id)
const ports=circuit.filter((e)=>e.type==="pcb_port"&&e.pcb_component_id===component.pcb_component_id)
const portMap=new Map(ports.map((port)=>[port.pcb_port_id,port]))
const makeWire=(point,layer)=>({route_type:"wire",x:point.x,y:point.y,width:0.12,layer})
const makeVia=(point,from_layer,to_layer)=>({route_type:"via",x:point.x,y:point.y,
from_layer,to_layer,via_diameter:0.45,via_hole_diameter:0.3})
for(const trace of traces){
const sides=(trace.connectsTo??[]).map((id,index)=>portMap.has(id)?index:-1).filter((index)=>index>=0)
for(const side of sides){
const oldPort=portMap.get(trace.connectsTo[side])
const target={x:oldPort.x,y:oldPort.y+5}
const pinIndex=Math.round((oldPort.x+12.25)*2)
const escape={x:oldPort.x,y:29.4+(Math.abs(pinIndex)%2)*0.8}
if(side===1){
const viaIndex=trace.route.findLastIndex((point)=>point.route_type==="via")
if(viaIndex>=0){
const oldVia=trace.route[viaIndex]
trace.route=[
...trace.route.slice(0,viaIndex-1),
makeWire(escape,oldVia.from_layer),
makeVia(escape,oldVia.from_layer,"top"),
makeWire(escape,"top"),
makeWire(target,"top"),
]
}else Object.assign(trace.route.at(-1),target)
}else{
const viaIndex=trace.route.findIndex((point)=>point.route_type==="via")
if(viaIndex>=0){
const oldVia=trace.route[viaIndex]
trace.route=[
makeWire(target,"top"),
makeWire(escape,"top"),
makeVia(escape,"top",oldVia.to_layer),
makeWire(escape,oldVia.to_layer),
...trace.route.slice(viaIndex+2),
]
}else Object.assign(trace.route[0],target)
}
}
}
fs.writeFileSync("work/raised-fpc-carrier-traces.json",JSON.stringify(traces,null,2)+"\n")