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