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