krishnax12/watchy-eink-smartwatch

Unfinished prototype (not production-ready): 4 native DRC errors, 2 display-flex intersections, and missing antenna radiator copper remain

Version
1.2.7
License
MIT
Stars
1

scripts/display-assembly.test.ts

import { expect, test } from "bun:test";
import type { AnyCircuitElement } from "circuit-json";
import { BOARD_THICKNESS_MM } from "../pcb/board-stackup";

test("display uses the official rear-side planar registration relative to J3", async () => {
	const circuit: AnyCircuitElement[] = await Bun.file(
		"dist/index/circuit.json",
	).json();
	const display = circuit.find(
		(element) =>
			element.type === "cad_component" &&
			element.model_step_url?.endsWith("/Display.step"),
	);
	if (!display || display.type !== "cad_component") {
		throw new Error("Missing display assembly model");
	}
	const connector = circuit.find(
		(element) =>
			element.type === "pcb_component" &&
			element.pcb_component_id === display.pcb_component_id,
	);
	if (!connector || connector.type !== "pcb_component") {
		throw new Error("Missing J3 footprint for display registration");
	}
	// Watchy.kicad_pcb: display (85.59, 93.21), J3 (85.65, 100.27),
	// with model Y offset +0.25. Nominal native PCB surface is used for Z;
	// KiCad's extra copper/solder render offset is not a verified adhesive gap.
	expect(display.position.x - connector.center.x).toBeCloseTo(-0.06, 6);
	expect(display.position.y - connector.center.y).toBeCloseTo(7.31, 6);
	expect(display.position.z).toBeCloseTo(-BOARD_THICKNESS_MM / 2, 6);
	expect(display.rotation).toEqual({ x: 0, y: 180, z: 90 });
	expect(display.model_origin_position).toEqual({ x: 0, y: 0, z: 0 });
});