diff --git a/src/fn/index.ts b/src/fn/index.ts index 8ec798e..19860af 100644 --- a/src/fn/index.ts +++ b/src/fn/index.ts @@ -34,4 +34,5 @@ export { pad } from "./pad" export { to92 } from "./to92" export { sod523 } from "./sod523" export { sop8 } from "./sop8" +export { sod323 } from "./sod323" export { sod723 } from "./sod723" diff --git a/src/fn/sod323.ts b/src/fn/sod323.ts new file mode 100644 index 0000000..7f7954f --- /dev/null +++ b/src/fn/sod323.ts @@ -0,0 +1,99 @@ +import type { AnySoupElement, PcbSilkscreenPath } from "circuit-json" +import { z } from "zod" +import { rectpad } from "../helpers/rectpad" +import { silkscreenRef, type SilkscreenRef } from "src/helpers/silkscreenRef" +import { length } from "circuit-json" + +export const sod_def = z.object({ + fn: z.string(), + num_pins: z.literal(2).default(2), + w: z.string().default("2.7mm"), + h: z.string().default("1.20mm"), + pl: z.string().default("0.59mm"), + pw: z.string().default("0.45mm"), + pad_spacing: z.string().default("2.2mm"), +}) + +export const sod323 = ( + raw_params: z.input, +): { circuitJson: AnySoupElement[]; parameters: any } => { + const parameters = sod_def.parse(raw_params) + + // Define silkscreen reference text + const silkscreenRefText: SilkscreenRef = silkscreenRef( + 0, + length.parse(parameters.h), + 0.3, + ) + + const silkscreenLine: PcbSilkscreenPath = { + type: "pcb_silkscreen_path", + layer: "top", + pcb_component_id: "", + route: [ + { + x: length.parse(parameters.pad_spacing) / 2, + y: length.parse(parameters.h) / 2, // Reduced offset to bring closer + }, + { + x: -length.parse(parameters.w) / 2 - 0.2, // Slightly reduced x offset + y: length.parse(parameters.h) / 2, // Same y adjustment + }, + { + x: -length.parse(parameters.w) / 2 - 0.2, // Reduced x to bring closer + y: -length.parse(parameters.h) / 2, // Reduced y offset + }, + { + x: length.parse(parameters.pad_spacing) / 2, + y: -length.parse(parameters.h) / 2, // Same y adjustment + }, + ], + stroke_width: 0.1, + pcb_silkscreen_path_id: "", + } + + return { + circuitJson: sodWithoutParsing(parameters).concat( + silkscreenLine as AnySoupElement, + silkscreenRefText as AnySoupElement, + ), + parameters, + } +} + +// Get coordinates for SOD pads +export const getSodCoords = (parameters: { + pn: number + pad_spacing: number +}) => { + const { pn, pad_spacing } = parameters + + if (pn === 1) { + return { x: -pad_spacing / 2, y: 0 } + // biome-ignore lint/style/noUselessElse: + } else { + return { x: pad_spacing / 2, y: 0 } + } +} + +// Function to generate SOD pads +export const sodWithoutParsing = (parameters: z.infer) => { + const pads: AnySoupElement[] = [] + + for (let i = 1; i <= parameters.num_pins; i++) { + const { x, y } = getSodCoords({ + pn: i, + pad_spacing: Number.parseFloat(parameters.pad_spacing), + }) + pads.push( + rectpad( + i, + x, + y, + Number.parseFloat(parameters.pl), + Number.parseFloat(parameters.pw), + ), + ) + } + return pads +} diff --git a/tests/__snapshots__/sod323.snap.svg b/tests/__snapshots__/sod323.snap.svg new file mode 100644 index 0000000..0e7843d --- /dev/null +++ b/tests/__snapshots__/sod323.snap.svg @@ -0,0 +1,13 @@ +{REF} \ No newline at end of file diff --git a/tests/sod323.test.ts b/tests/sod323.test.ts new file mode 100644 index 0000000..244cc1a --- /dev/null +++ b/tests/sod323.test.ts @@ -0,0 +1,9 @@ +import { test, expect } from "bun:test" +import { convertCircuitJsonToPcbSvg } from "circuit-to-svg" +import { fp } from "../src/footprinter" + +test("sod323", () => { + const soup = fp.string("sod323").circuitJson() + const svgContent = convertCircuitJsonToPcbSvg(soup) + expect(svgContent).toMatchSvgSnapshot(import.meta.path, "sod323") +})