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")