gokul/usb-hub-board

A 4-layer 100×66 mm USB 2.0 hub board with a USB‑C upstream port, four protected downstream USB‑C/USB‑A ports, an integrated SD card reader, USB hub controllers, 3.3 V regulation, ESD protection, current-limited power switches, crystal oscillators, and filtering/passive components.

Version
1.0.6
License
unset
Stars
1

scripts/build-local.tsx

import { mkdir, rm, writeFile } from "node:fs/promises"
import { Circuit } from "@tscircuit/core"
import { UsbHubBoard } from "../lib/usb-hub-board"

const routingDisabled = process.argv.includes("--routing-disabled")
const outputDirectory = "dist/local"

await mkdir(outputDirectory, { recursive: true })

const circuit = new Circuit()
circuit.pcbRoutingDisabled = routingDisabled
let lastReportedRoutingPercent = -10
circuit.on("autorouting:start", (event) => {
  console.log(
    `Autorouting ${event.connectionCount ?? "?"} connections with ${event.solverName ?? event.autorouterName ?? "local solver"}...`,
  )
})
circuit.on("autorouting:progress", (event) => {
  const percent = Math.floor(event.progress * 100)
  if (percent >= lastReportedRoutingPercent + 10) {
    lastReportedRoutingPercent = percent
    console.log(`Autorouter progress: ${percent}%`)
  }
})
circuit.on("autorouting:end", () => {
  console.log("Autorouting finished; generating copper pours and output files...")
})
circuit.add(<UsbHubBoard />)

console.log(
  routingDisabled
    ? "Rendering placement and schematic without PCB routing..."
    : "Rendering board with the local autorouter...",
)

await circuit.renderUntilSettled()

const circuitJson = circuit.getCircuitJson()
await writeFile(
  `${outputDirectory}/usb-hub-board.circuit.json`,
  JSON.stringify(circuitJson, null, 2),
)
await writeFile(
  `${outputDirectory}/usb-hub-board-pcb.svg`,
  await circuit.getSvg({ view: "pcb", layer: "top" }),
)
await writeFile(
  `${outputDirectory}/usb-hub-board-schematic.svg`,
  await circuit.getSvg({ view: "schematic" }),
)

const errors = circuitJson.filter((element) => element.type.endsWith("_error"))
console.log(
  `Wrote ${circuitJson.length} Circuit JSON elements with ${errors.length} errors to ${outputDirectory}`,
)

if (errors.length > 0) {
  await writeFile(
    `${outputDirectory}/usb-hub-board-errors.json`,
    JSON.stringify(errors, null, 2),
  )
  const countsByType = Object.entries(
    errors.reduce<Record<string, number>>((counts, error) => {
      counts[error.type] = (counts[error.type] ?? 0) + 1
      return counts
    }, {}),
  )
  console.error(
    `Error summary: ${countsByType.map(([type, count]) => `${type}=${count}`).join(", ")}`,
  )
  process.exitCode = 1
} else {
  await rm(`${outputDirectory}/usb-hub-board-errors.json`, { force: true })
}