MustafaMulla29/rp2040-bldc-motor-controller-new

73×72 mm 4-layer USB‑C PD (5/9/15/20 V) RP2040 controller PCB with protected power switching, MCT8329A sensorless BLDC three-phase MOSFET bridge, USB data/programming, onboard controls, and three motor outputs feeding a 2212 motor through rigid bullet adapters.

Version
0.3.100
License
unset
Stars
0

assembly/vendor/cableprinter-wire-end.patch

--- a/lib/cable-definition.ts
+++ b/lib/cable-definition.ts
@@ -12,6 +12,14 @@
 
 /** Local mating face is at z=0, centered on x/y; the cable exits along +z. */
 export const cableConnectorSchema = z.discriminatedUnion("kind", [
+  // A single permanently attached wire exit, with no housing or contact.
+  z.object({
+    kind: z.literal("wire_end"),
+    bodyWidth: dimension,
+    bodyHeight: dimension,
+    bodyDepth: z.literal(0),
+    pinCount: z.literal(1),
+  }).strict(),
   z
     .object({
       kind: z.literal("bullet_male"),
@@ -90,6 +98,13 @@
   .strict()
   .superRefine((cable, ctx) => {
     const { connectorA, connectorB, crossSection } = cable
+    for (const connector of [connectorA, connectorB]) {
+      if (connector.kind === "wire_end" &&
+        (cable.standard !== "adaptercable" || crossSection.kind !== "round_jacket" ||
+          connector.bodyWidth !== crossSection.diameter || connector.bodyHeight !== crossSection.diameter))
+        ctx.addIssue({ code: z.ZodIssueCode.custom,
+          message: "A wire end must match the single insulated wire diameter" })
+    }
     const expected = {
       usb_c: ["usb_c_plug", "usb_c_plug"],
       jst_sh: ["jst_sh_housing", "jst_sh_housing"],
--- a/lib/parse-connector-string.ts
+++ b/lib/parse-connector-string.ts
@@ -5,6 +5,14 @@
 /** Parse one mating interface, not a cable with two ends. */
 export function parseConnectorString(connectorString: string): CableConnector {
   const name = connectorString.trim().toLowerCase()
+  const wireEnd = /^wire_end_d([0-9]+(?:\.[0-9]+)?)mm$/.exec(name)
+  if (wireEnd) {
+    const diameter = Number(wireEnd[1])
+    if (!Number.isFinite(diameter) || diameter <= 0)
+      throw new Error("Wire end diameter must be finite and positive")
+    return { kind: "wire_end", bodyWidth: diameter, bodyHeight: diameter,
+      bodyDepth: 0, pinCount: 1 }
+  }
   const bullet = /^bullet([1-9][0-9]*)?_(.+)$/.exec(name)
   if (bullet) {
     let diameter: number | undefined
--- a/lib/get-adapter-cable-definition.ts
+++ b/lib/get-adapter-cable-definition.ts
@@ -21,6 +21,7 @@
     ...input,
   })
   const { connectorA, connectorB } = cable
+  const wireEnd = [connectorA, connectorB].find(connector => connector.kind === "wire_end")
   const bundled =
     "pinCount" in connectorA &&
     "pinCount" in connectorB &&
@@ -44,7 +45,7 @@
           }
         : {
             kind: "round_jacket",
-            diameter: Math.min(
+            diameter: wireEnd?.bodyHeight ?? Math.min(
               4,
               connectorA.bodyHeight,
               connectorB.bodyHeight,
--- a/lib/stringify-cable-definition.ts
+++ b/lib/stringify-cable-definition.ts
@@ -3,6 +3,8 @@
 /** Canonical stock connector DSL; custom mesh dimensions are not encoded. */
 export function stringifyConnector(connector: CableConnector): string {
   switch (connector.kind) {
+    case "wire_end":
+      return `wire_end_d${connector.bodyHeight}mm`
     case "bullet_male":
     case "bullet_female":
       return `bullet${connector.pinCount === 1 ? "" : connector.pinCount}_d${connector.diameter}mm_g${connector.kind === "bullet_male" ? "male" : "female"}`
@@ -37,7 +39,7 @@
       return `bullet${a.pinCount === 1 ? "" : a.pinCount}_d${a.diameter}mm_a${a.kind === "bullet_male" ? "male" : "female"}_b${b.kind === "bullet_male" ? "male" : "female"}`
     if (
       !("diameter" in a) &&
-      a.kind === b.kind &&
+      a.kind === b.kind && a.kind !== "wire_end" &&
       (!("pinCount" in a) || !("pinCount" in b) || a.pinCount === b.pinCount)
     )
       return stringifyConnector(a)
--- /dev/null
+++ b/tests/fixed-wire-end.test.ts
@@ -0,0 +1,17 @@
+import { expect, test } from "bun:test"
+import { cableConnectorSchema, cableDefinitionSchema, parseCableString, parseConnectorString } from "../lib"
+
+test("single fixed wire ends preserve diameter and independent bullet genders", () => {
+  for (const gender of ["male", "female"]) {
+    const model = `adaptercable_a(wire_end_d2.4mm)_b(bullet1_d3.5mm_g${gender})`
+    const d = parseCableString(model)
+    expect(d.connectorA).toEqual({kind:"wire_end",bodyWidth:2.4,bodyHeight:2.4,bodyDepth:0,pinCount:1})
+    expect(d.connectorB.kind).toBe(`bullet_${gender}`)
+    expect(d.crossSection).toEqual({kind:"round_jacket",diameter:2.4,color:"#263449"})
+    expect(cableDefinitionSchema.safeParse({...d,crossSection:{...d.crossSection,diameter:2}}).success).toBe(false)
+    expect(cableConnectorSchema.safeParse({...d.connectorA,bodyDepth:1}).success).toBe(false)
+  }
+  expect(() => parseConnectorString("wire_end_d0mm")).toThrow()
+  expect(() => parseCableString("adaptercable_a(wire_end_d2.4mm)_b(bullet3_d3.5mm_gmale)")).toThrow()
+  expect(() => parseCableString("adaptercable_a(wire_end_d8mm)_b(bullet1_d3.5mm_gmale)")).toThrow()
+})