mirror of
https://github.com/bancika/diy-layout-creator
synced 2026-11-07 12:24:58 +10:00
teensy fix, test cleanup
This commit is contained in:
@@ -144,8 +144,8 @@ public class Teensy extends AbstractMakerBoard {
|
||||
"34 (RX8)", "33 (MCLK2)",
|
||||
// Middle cluster (48..52, left to right near push button)
|
||||
"VBAT", "3.3V (Mid)", "GND (Mid)", "Program", "On/Off",
|
||||
// Ethernet header (53..58, 2x3)
|
||||
"ETH_Rx+", "ETH_LED", "ETH_Tx-", "ETH_Rx-", "ETH_GND", "ETH_Tx+",
|
||||
// Ethernet header (53..58, 3x2)
|
||||
"ETH_TX-", "ETH_LED", "ETH_RX+", "ETH_TX+", "ETH_GND", "ETH_RX-",
|
||||
// USB Host header (59..63, 1x5)
|
||||
"USB_5V", "USB_D-", "USB_D+", "USB_GND1", "USB_GND2",
|
||||
// VUSB (64)
|
||||
@@ -242,29 +242,32 @@ public class Teensy extends AbstractMakerBoard {
|
||||
relativeOffsets[24 + i][1] = i * spacing;
|
||||
}
|
||||
|
||||
// Middle cluster (48..52): 5 pins near push button at Y=17*spacing
|
||||
// Middle cluster (48..52): 5 pins near SD card / switch at Y=18*spacing (45.72mm)
|
||||
for (int k = 1; k <= 5; k++) {
|
||||
relativeOffsets[48 + k - 1][0] = k * spacing;
|
||||
relativeOffsets[48 + k - 1][1] = 17 * spacing;
|
||||
relativeOffsets[48 + k - 1][1] = 18 * spacing;
|
||||
}
|
||||
|
||||
// Ethernet Header (53..58): 2x3 header (2.0mm pitch)
|
||||
// Ethernet Header (53..58): 3x2 header (2.0mm pitch, rotated 90 degrees)
|
||||
// Center is 4.45mm left of right column, 13.97mm down from first pin
|
||||
double ethPitch = new Size(2.0d, SizeUnit.mm).convertToPixels();
|
||||
double ethCenterX = rowSpacing / 2.0;
|
||||
double ethBaseY = 5 * spacing;
|
||||
// Col 1 (left): Rx+, LED, Tx-
|
||||
relativeOffsets[53] = new double[] {ethCenterX - ethPitch / 2.0, ethBaseY - ethPitch};
|
||||
relativeOffsets[54] = new double[] {ethCenterX - ethPitch / 2.0, ethBaseY};
|
||||
relativeOffsets[55] = new double[] {ethCenterX - ethPitch / 2.0, ethBaseY + ethPitch};
|
||||
// Col 2 (right): Rx-, GND, Tx+
|
||||
relativeOffsets[56] = new double[] {ethCenterX + ethPitch / 2.0, ethBaseY - ethPitch};
|
||||
relativeOffsets[57] = new double[] {ethCenterX + ethPitch / 2.0, ethBaseY};
|
||||
relativeOffsets[58] = new double[] {ethCenterX + ethPitch / 2.0, ethBaseY + ethPitch};
|
||||
double ethCenterX = rowSpacing - new Size(4.45d, SizeUnit.mm).convertToPixels();
|
||||
double ethCenterY = new Size(13.97d, SizeUnit.mm).convertToPixels();
|
||||
// Row 1 (top): TX-, LED, RX+
|
||||
relativeOffsets[53] = new double[] {ethCenterX - ethPitch, ethCenterY - ethPitch / 2.0};
|
||||
relativeOffsets[54] = new double[] {ethCenterX, ethCenterY - ethPitch / 2.0};
|
||||
relativeOffsets[55] = new double[] {ethCenterX + ethPitch, ethCenterY - ethPitch / 2.0};
|
||||
// Row 2 (bottom): TX+, GND, RX-
|
||||
relativeOffsets[56] = new double[] {ethCenterX - ethPitch, ethCenterY + ethPitch / 2.0};
|
||||
relativeOffsets[57] = new double[] {ethCenterX, ethCenterY + ethPitch / 2.0};
|
||||
relativeOffsets[58] = new double[] {ethCenterX + ethPitch, ethCenterY + ethPitch / 2.0};
|
||||
|
||||
// USB Host Header (59..63): 1x5 header (2.54mm pitch)
|
||||
// Spaced 3.05mm center-to-center from left column, Y = (2.5 + i) * spacing
|
||||
double usbHostX = new Size(3.05d, SizeUnit.mm).convertToPixels();
|
||||
for (int i = 0; i < 5; i++) {
|
||||
relativeOffsets[59 + i][0] = spacing;
|
||||
relativeOffsets[59 + i][1] = (4 + i) * spacing;
|
||||
relativeOffsets[59 + i][0] = usbHostX;
|
||||
relativeOffsets[59 + i][1] = (2.5 + i) * spacing;
|
||||
}
|
||||
|
||||
// VUSB (64): near VIN at X=rowSpacing - spacing, Y=spacing
|
||||
@@ -337,21 +340,25 @@ public class Teensy extends AbstractMakerBoard {
|
||||
drawMetalConnector(g2d, usbX, usbY, usbW, usbH, "USB");
|
||||
|
||||
// Main MCU chip (NXP i.MX RT1062 BGA)
|
||||
double chipW = new Size(7.5d, SizeUnit.mm).convertToPixels();
|
||||
double chipH = new Size(7.5d, SizeUnit.mm).convertToPixels();
|
||||
double chipW = (version == TeensyVersion.Teensy_4_0)
|
||||
? new Size(0.4d, SizeUnit.in).convertToPixels()
|
||||
: new Size(12.0d, SizeUnit.mm).convertToPixels();
|
||||
double chipH = (version == TeensyVersion.Teensy_4_0)
|
||||
? new Size(0.4d, SizeUnit.in).convertToPixels()
|
||||
: new Size(12.0d, SizeUnit.mm).convertToPixels();
|
||||
double chipX = centerX - chipW / 2.0;
|
||||
double chipY = (version == TeensyVersion.Teensy_4_0)
|
||||
? boardY + new Size(9.5d, SizeUnit.mm).convertToPixels()
|
||||
: boardY + new Size(19.0d, SizeUnit.mm).convertToPixels();
|
||||
drawChip(g2d, chipX, chipY, chipW, chipH, "");
|
||||
? boardY + new Size(9.5d, SizeUnit.mm).convertToPixels() + new Size(0.1d, SizeUnit.in).convertToPixels()
|
||||
: boardY + new Size(19.0d, SizeUnit.mm).convertToPixels() + new Size(0.15d, SizeUnit.in).convertToPixels();
|
||||
drawChip(g2d, chipX, chipY, chipW, chipH, "iMXRT1062");
|
||||
|
||||
// Pushbutton (Program button)
|
||||
double btnW = new Size(3.5d, SizeUnit.mm).convertToPixels();
|
||||
double btnH = new Size(3.0d, SizeUnit.mm).convertToPixels();
|
||||
double btnX = centerX - btnW / 2.0;
|
||||
double btnY = (version == TeensyVersion.Teensy_4_0)
|
||||
? boardY + new Size(24.5d, SizeUnit.mm).convertToPixels()
|
||||
: boardY + new Size(35.5d, SizeUnit.mm).convertToPixels();
|
||||
? boardY + PIN1_OFFSET_Y.convertToPixels() + 11.5 * PIN_SPACING.convertToPixels() - btnH / 2.0
|
||||
: boardY + new Size(35.5d, SizeUnit.mm).convertToPixels() + new Size(0.25d, SizeUnit.in).convertToPixels();
|
||||
g2d.setColor(BUTTON_BODY_COLOR);
|
||||
g2d.fill(new RoundRectangle2D.Double(btnX, btnY, btnW, btnH, 2, 2));
|
||||
g2d.setColor(BUTTON_BORDER_COLOR);
|
||||
@@ -361,11 +368,11 @@ public class Teensy extends AbstractMakerBoard {
|
||||
|
||||
// Teensy 4.1 extras: Ethernet PHY + SD card slot
|
||||
if (version == TeensyVersion.Teensy_4_1) {
|
||||
// MicroSD card slot at bottom edge
|
||||
// MicroSD card slot at bottom edge (12mm long, flush with bottom edge so it does not stick out)
|
||||
double sdW = new Size(12.0d, SizeUnit.mm).convertToPixels();
|
||||
double sdH = new Size(14.0d, SizeUnit.mm).convertToPixels();
|
||||
double sdH = new Size(12.0d, SizeUnit.mm).convertToPixels();
|
||||
double sdX = centerX - sdW / 2.0;
|
||||
double sdY = boardY + boardH - sdH + new Size(1.0d, SizeUnit.mm).convertToPixels();
|
||||
double sdY = boardY + boardH - sdH;
|
||||
drawMetalConnector(g2d, sdX, sdY, sdW, sdH, "SD");
|
||||
}
|
||||
|
||||
|
||||
@@ -1,18 +1,7 @@
|
||||
package org.diylc.components.micro;
|
||||
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.Shape;
|
||||
import java.awt.geom.Point2D;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.File;
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
import org.diylc.common.Orientation;
|
||||
import org.diylc.core.ComponentState;
|
||||
import org.diylc.core.IDrawingObserver;
|
||||
import org.diylc.core.Project;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
|
||||
@@ -1,16 +1,9 @@
|
||||
package org.diylc.components.micro;
|
||||
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.Shape;
|
||||
import java.awt.geom.Point2D;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import java.awt.image.BufferedImage;
|
||||
|
||||
import org.diylc.common.Orientation;
|
||||
import org.diylc.core.ComponentState;
|
||||
import org.diylc.core.IDrawingObserver;
|
||||
import org.diylc.core.Project;
|
||||
import org.diylc.core.measures.Size;
|
||||
import org.diylc.core.measures.SizeUnit;
|
||||
import org.junit.Assert;
|
||||
@@ -105,53 +98,6 @@ public class RaspberryPiPicoTest {
|
||||
Assert.assertEquals(spacing, p42.getX() - p41.getX(), 0.01);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDrawingAndOutline() {
|
||||
RaspberryPiPico pico = new RaspberryPiPico();
|
||||
pico.setControlPoint(new Point2D.Double(200, 200), 0);
|
||||
|
||||
BufferedImage img = new BufferedImage(600, 600, BufferedImage.TYPE_INT_ARGB);
|
||||
Graphics2D g2d = img.createGraphics();
|
||||
g2d.setClip(new Rectangle(0, 0, 600, 600));
|
||||
|
||||
Project project = new Project();
|
||||
IDrawingObserver observer = new IDrawingObserver() {
|
||||
@Override public void startTracking() {}
|
||||
@Override public void stopTracking() {}
|
||||
@Override public void startTrackingContinuityArea(boolean positive) {}
|
||||
@Override public void stopTrackingContinuityArea() {}
|
||||
@Override public boolean isTrackingContinuityArea() { return false; }
|
||||
@Override public void setContinuityMarker(String marker) {}
|
||||
};
|
||||
|
||||
pico.draw(g2d, ComponentState.NORMAL, false, project, observer);
|
||||
pico.draw(g2d, ComponentState.SELECTED, false, project, observer);
|
||||
pico.draw(g2d, ComponentState.NORMAL, true, project, observer);
|
||||
pico.drawIcon(g2d, 32, 32);
|
||||
|
||||
g2d.dispose();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRotation() {
|
||||
RaspberryPiPico pico = new RaspberryPiPico();
|
||||
pico.setControlPoint(new Point2D.Double(200, 200), 0);
|
||||
|
||||
Point2D p0Initial = pico.getControlPoint(0);
|
||||
Point2D p1Initial = pico.getControlPoint(1);
|
||||
|
||||
pico.setOrientation(Orientation._90);
|
||||
Point2D p0Rot = pico.getControlPoint(0);
|
||||
Point2D p1Rot = pico.getControlPoint(1);
|
||||
|
||||
Assert.assertEquals(p0Initial.getX(), p0Rot.getX(), 0.01);
|
||||
Assert.assertEquals(p0Initial.getY(), p0Rot.getY(), 0.01);
|
||||
// After 90 deg clockwise rotation, p1 (which was at (x, y + spacing)) should be at (x - spacing, y)
|
||||
double spacing = new Size(0.1d, SizeUnit.in).convertToPixels();
|
||||
Assert.assertEquals(p0Rot.getX() - spacing, p1Rot.getX(), 0.01);
|
||||
Assert.assertEquals(p0Rot.getY(), p1Rot.getY(), 0.01);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testHeadersProperty() {
|
||||
RaspberryPiPico pico = new RaspberryPiPico();
|
||||
@@ -162,27 +108,5 @@ public class RaspberryPiPicoTest {
|
||||
|
||||
pico.setHeaders(false);
|
||||
Assert.assertFalse("Headers should be false after setter", pico.getHeaders());
|
||||
|
||||
// Test drawing with headers true and false
|
||||
BufferedImage img = new BufferedImage(600, 600, BufferedImage.TYPE_INT_ARGB);
|
||||
Graphics2D g2d = img.createGraphics();
|
||||
g2d.setClip(new Rectangle(0, 0, 600, 600));
|
||||
Project project = new Project();
|
||||
IDrawingObserver observer = new IDrawingObserver() {
|
||||
@Override public void startTracking() {}
|
||||
@Override public void stopTracking() {}
|
||||
@Override public void startTrackingContinuityArea(boolean positive) {}
|
||||
@Override public void stopTrackingContinuityArea() {}
|
||||
@Override public boolean isTrackingContinuityArea() { return false; }
|
||||
@Override public void setContinuityMarker(String marker) {}
|
||||
};
|
||||
|
||||
pico.setHeaders(false);
|
||||
pico.draw(g2d, ComponentState.NORMAL, false, project, observer);
|
||||
|
||||
pico.setHeaders(true);
|
||||
pico.draw(g2d, ComponentState.NORMAL, false, project, observer);
|
||||
|
||||
g2d.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,16 +1,9 @@
|
||||
package org.diylc.components.micro;
|
||||
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.Shape;
|
||||
import java.awt.geom.Point2D;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import java.awt.image.BufferedImage;
|
||||
|
||||
import org.diylc.common.Orientation;
|
||||
import org.diylc.core.ComponentState;
|
||||
import org.diylc.core.IDrawingObserver;
|
||||
import org.diylc.core.Project;
|
||||
import org.diylc.core.measures.Size;
|
||||
import org.diylc.core.measures.SizeUnit;
|
||||
import org.junit.Assert;
|
||||
@@ -144,51 +137,4 @@ public class RaspberryPiTest {
|
||||
Assert.assertEquals(expectedMipi0CenterX, pMipi0.getX(), 0.1);
|
||||
Assert.assertEquals(expectedMipiCenterY, pMipi0.getY(), 0.1);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDrawingAndOutline() {
|
||||
RaspberryPi pi = new RaspberryPi();
|
||||
pi.setControlPoint(new Point2D.Double(200, 200), 0);
|
||||
|
||||
BufferedImage img = new BufferedImage(600, 600, BufferedImage.TYPE_INT_ARGB);
|
||||
Graphics2D g2d = img.createGraphics();
|
||||
g2d.setClip(new Rectangle(0, 0, 600, 600));
|
||||
|
||||
Project project = new Project();
|
||||
IDrawingObserver observer = new IDrawingObserver() {
|
||||
@Override public void startTracking() {}
|
||||
@Override public void stopTracking() {}
|
||||
@Override public void startTrackingContinuityArea(boolean positive) {}
|
||||
@Override public void stopTrackingContinuityArea() {}
|
||||
@Override public boolean isTrackingContinuityArea() { return false; }
|
||||
@Override public void setContinuityMarker(String marker) {}
|
||||
};
|
||||
|
||||
pi.draw(g2d, ComponentState.NORMAL, false, project, observer);
|
||||
pi.draw(g2d, ComponentState.SELECTED, false, project, observer);
|
||||
pi.draw(g2d, ComponentState.NORMAL, true, project, observer);
|
||||
pi.drawIcon(g2d, 32, 32);
|
||||
|
||||
g2d.dispose();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRotation() {
|
||||
RaspberryPi pi = new RaspberryPi();
|
||||
pi.setControlPoint(new Point2D.Double(200, 200), 0);
|
||||
|
||||
Point2D p0Initial = pi.getControlPoint(0);
|
||||
Point2D p1Initial = pi.getControlPoint(1);
|
||||
|
||||
pi.setOrientation(Orientation._90);
|
||||
Point2D p0Rot = pi.getControlPoint(0);
|
||||
Point2D p1Rot = pi.getControlPoint(1);
|
||||
|
||||
Assert.assertEquals(p0Initial.getX(), p0Rot.getX(), 0.01);
|
||||
Assert.assertEquals(p0Initial.getY(), p0Rot.getY(), 0.01);
|
||||
// After 90 deg clockwise rotation, p1 (which was at (x, y - spacing)) should be at (x + spacing, y)
|
||||
double spacing = new Size(0.1d, SizeUnit.in).convertToPixels();
|
||||
Assert.assertEquals(p0Rot.getX() + spacing, p1Rot.getX(), 0.01);
|
||||
Assert.assertEquals(p0Rot.getY(), p1Rot.getY(), 0.01);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,17 +1,9 @@
|
||||
package org.diylc.components.micro;
|
||||
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.Shape;
|
||||
import java.awt.geom.Point2D;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import org.diylc.common.Orientation;
|
||||
import org.diylc.core.ComponentState;
|
||||
import org.diylc.core.IDrawingObserver;
|
||||
import org.diylc.core.Project;
|
||||
import org.diylc.core.measures.Size;
|
||||
import org.diylc.core.measures.SizeUnit;
|
||||
import org.junit.Assert;
|
||||
@@ -110,63 +102,6 @@ public class RaspberryPiZeroTest {
|
||||
Assert.assertEquals(expectedCsiCenterY, pCsi.getY(), 0.1);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDrawingAndOutline() {
|
||||
RaspberryPiZero pi = new RaspberryPiZero();
|
||||
pi.setControlPoint(new Point2D.Double(200, 200), 0);
|
||||
|
||||
BufferedImage img = new BufferedImage(600, 600, BufferedImage.TYPE_INT_ARGB);
|
||||
Graphics2D g2d = img.createGraphics();
|
||||
g2d.setClip(new Rectangle(0, 0, 600, 600));
|
||||
|
||||
Project project = new Project();
|
||||
final AtomicInteger trackingStartCount = new AtomicInteger(0);
|
||||
final AtomicInteger trackingStopCount = new AtomicInteger(0);
|
||||
|
||||
IDrawingObserver observer = new IDrawingObserver() {
|
||||
@Override public void startTracking() {
|
||||
trackingStartCount.incrementAndGet();
|
||||
}
|
||||
@Override public void stopTracking() {
|
||||
trackingStopCount.incrementAndGet();
|
||||
}
|
||||
@Override public void startTrackingContinuityArea(boolean positive) {}
|
||||
@Override public void stopTrackingContinuityArea() {}
|
||||
@Override public boolean isTrackingContinuityArea() { return false; }
|
||||
@Override public void setContinuityMarker(String marker) {}
|
||||
};
|
||||
|
||||
pi.draw(g2d, ComponentState.NORMAL, false, project, observer);
|
||||
Assert.assertEquals(1, trackingStartCount.get());
|
||||
Assert.assertEquals(1, trackingStopCount.get());
|
||||
|
||||
pi.draw(g2d, ComponentState.SELECTED, false, project, observer);
|
||||
pi.draw(g2d, ComponentState.NORMAL, true, project, observer);
|
||||
pi.drawIcon(g2d, 32, 32);
|
||||
|
||||
g2d.dispose();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRotation() {
|
||||
RaspberryPiZero pi = new RaspberryPiZero();
|
||||
pi.setControlPoint(new Point2D.Double(200, 200), 0);
|
||||
|
||||
Point2D p0Initial = pi.getControlPoint(0);
|
||||
Point2D p1Initial = pi.getControlPoint(1);
|
||||
|
||||
pi.setOrientation(Orientation._90);
|
||||
Point2D p0Rot = pi.getControlPoint(0);
|
||||
Point2D p1Rot = pi.getControlPoint(1);
|
||||
|
||||
Assert.assertEquals(p0Initial.getX(), p0Rot.getX(), 0.01);
|
||||
Assert.assertEquals(p0Initial.getY(), p0Rot.getY(), 0.01);
|
||||
// After 90 deg clockwise rotation, p1 (which was at (x, y - spacing)) should be at (x + spacing, y)
|
||||
double spacing = new Size(0.1d, SizeUnit.in).convertToPixels();
|
||||
Assert.assertEquals(p0Rot.getX() + spacing, p1Rot.getX(), 0.01);
|
||||
Assert.assertEquals(p0Rot.getY(), p1Rot.getY(), 0.01);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testHeadersProperty() {
|
||||
RaspberryPiZero pi = new RaspberryPiZero();
|
||||
@@ -177,27 +112,5 @@ public class RaspberryPiZeroTest {
|
||||
|
||||
pi.setHeaders(false);
|
||||
Assert.assertFalse("Headers should be false after setter", pi.getHeaders());
|
||||
|
||||
// Test drawing with headers true and false
|
||||
BufferedImage img = new BufferedImage(600, 600, BufferedImage.TYPE_INT_ARGB);
|
||||
Graphics2D g2d = img.createGraphics();
|
||||
g2d.setClip(new Rectangle(0, 0, 600, 600));
|
||||
Project project = new Project();
|
||||
IDrawingObserver observer = new IDrawingObserver() {
|
||||
@Override public void startTracking() {}
|
||||
@Override public void stopTracking() {}
|
||||
@Override public void startTrackingContinuityArea(boolean positive) {}
|
||||
@Override public void stopTrackingContinuityArea() {}
|
||||
@Override public boolean isTrackingContinuityArea() { return false; }
|
||||
@Override public void setContinuityMarker(String marker) {}
|
||||
};
|
||||
|
||||
pi.setHeaders(false);
|
||||
pi.draw(g2d, ComponentState.NORMAL, false, project, observer);
|
||||
|
||||
pi.setHeaders(true);
|
||||
pi.draw(g2d, ComponentState.NORMAL, false, project, observer);
|
||||
|
||||
g2d.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,17 +1,9 @@
|
||||
package org.diylc.components.micro;
|
||||
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.Shape;
|
||||
import java.awt.geom.Point2D;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import org.diylc.common.Orientation;
|
||||
import org.diylc.core.ComponentState;
|
||||
import org.diylc.core.IDrawingObserver;
|
||||
import org.diylc.core.Project;
|
||||
import org.diylc.core.measures.Size;
|
||||
import org.diylc.core.measures.SizeUnit;
|
||||
import org.junit.Assert;
|
||||
@@ -90,8 +82,12 @@ public class TeensyTest {
|
||||
Assert.assertEquals("On/Off", teensy.getControlPointNodeName(52));
|
||||
|
||||
// Ethernet Header (53..58)
|
||||
Assert.assertEquals("ETH_Rx+", teensy.getControlPointNodeName(53));
|
||||
Assert.assertEquals("ETH_Tx+", teensy.getControlPointNodeName(58));
|
||||
Assert.assertEquals("ETH_TX-", teensy.getControlPointNodeName(53));
|
||||
Assert.assertEquals("ETH_LED", teensy.getControlPointNodeName(54));
|
||||
Assert.assertEquals("ETH_RX+", teensy.getControlPointNodeName(55));
|
||||
Assert.assertEquals("ETH_TX+", teensy.getControlPointNodeName(56));
|
||||
Assert.assertEquals("ETH_GND", teensy.getControlPointNodeName(57));
|
||||
Assert.assertEquals("ETH_RX-", teensy.getControlPointNodeName(58));
|
||||
|
||||
// USB Host Header (59..63)
|
||||
Assert.assertEquals("USB_5V", teensy.getControlPointNodeName(59));
|
||||
@@ -175,7 +171,34 @@ public class TeensyTest {
|
||||
Assert.assertEquals("Middle pin " + i + " Y alignment", p1.getY(), p2.getY(), 0.01);
|
||||
}
|
||||
|
||||
// USB Host Header: vertical at 0.1" pitch
|
||||
// Ethernet Header: 3x2 at 2.0mm pitch, center is 4.45mm left of right column, 13.97mm down from pin 1
|
||||
double ethPitch = new Size(2.0d, SizeUnit.mm).convertToPixels();
|
||||
double expectedEthCenterX = pRight.getX() - new Size(4.45d, SizeUnit.mm).convertToPixels();
|
||||
double expectedEthCenterY = pLeft.getY() + new Size(13.97d, SizeUnit.mm).convertToPixels();
|
||||
double sumX = 0;
|
||||
double sumY = 0;
|
||||
for (int i = 53; i <= 58; i++) {
|
||||
sumX += teensy.getControlPoint(i).getX();
|
||||
sumY += teensy.getControlPoint(i).getY();
|
||||
}
|
||||
Assert.assertEquals("Ethernet center X", expectedEthCenterX, sumX / 6.0, 0.01);
|
||||
Assert.assertEquals("Ethernet center Y", expectedEthCenterY, sumY / 6.0, 0.01);
|
||||
// Row 1 (53..55) X spacing is ethPitch
|
||||
Assert.assertEquals("ETH Row 1 Col 0-1 X spacing", ethPitch, teensy.getControlPoint(54).getX() - teensy.getControlPoint(53).getX(), 0.01);
|
||||
Assert.assertEquals("ETH Row 1 Col 1-2 X spacing", ethPitch, teensy.getControlPoint(55).getX() - teensy.getControlPoint(54).getX(), 0.01);
|
||||
// Row 2 (56..58) X spacing is ethPitch
|
||||
Assert.assertEquals("ETH Row 2 Col 0-1 X spacing", ethPitch, teensy.getControlPoint(57).getX() - teensy.getControlPoint(56).getX(), 0.01);
|
||||
Assert.assertEquals("ETH Row 2 Col 1-2 X spacing", ethPitch, teensy.getControlPoint(58).getX() - teensy.getControlPoint(57).getX(), 0.01);
|
||||
// Row-to-row Y spacing is ethPitch
|
||||
Assert.assertEquals("ETH Col 0 Y spacing", ethPitch, teensy.getControlPoint(56).getY() - teensy.getControlPoint(53).getY(), 0.01);
|
||||
Assert.assertEquals("ETH Col 1 Y spacing", ethPitch, teensy.getControlPoint(57).getY() - teensy.getControlPoint(54).getY(), 0.01);
|
||||
Assert.assertEquals("ETH Col 2 Y spacing", ethPitch, teensy.getControlPoint(58).getY() - teensy.getControlPoint(55).getY(), 0.01);
|
||||
|
||||
// USB Host Header: vertical at 0.1" pitch, spaced 3.05mm from left column, Y = 2.5 * spacing
|
||||
double expectedUsbHostX = pLeft.getX() + new Size(3.05d, SizeUnit.mm).convertToPixels();
|
||||
double expectedUsbHostY0 = pLeft.getY() + 2.5 * spacing;
|
||||
Assert.assertEquals("USB host pin 0 X offset", expectedUsbHostX, teensy.getControlPoint(59).getX(), 0.01);
|
||||
Assert.assertEquals("USB host pin 0 Y offset", expectedUsbHostY0, teensy.getControlPoint(59).getY(), 0.01);
|
||||
for (int i = 59; i < 63; i++) {
|
||||
Point2D p1 = teensy.getControlPoint(i);
|
||||
Point2D p2 = teensy.getControlPoint(i + 1);
|
||||
@@ -229,38 +252,6 @@ public class TeensyTest {
|
||||
Assert.assertEquals("Pin 1 Y offset from top edge", expectedOffsetY, p0.getY() - bounds.getY(), 0.1);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAllPinsWithinBoardBounds() {
|
||||
// Teensy 4.0: all 34 pins must be within board bounds
|
||||
Teensy teensy40 = new Teensy();
|
||||
Shape body40 = teensy40.getBodyShape();
|
||||
Rectangle2D bounds40 = body40.getBounds2D();
|
||||
for (int i = 0; i < teensy40.getControlPointCount(); i++) {
|
||||
Point2D p = teensy40.getControlPoint(i);
|
||||
Assert.assertTrue("T4.0 Pin " + i + " (" + teensy40.getControlPointNodeName(i) +
|
||||
") X=" + p.getX() + " should be within board X bounds [" + bounds40.getMinX() + ", " + bounds40.getMaxX() + "]",
|
||||
p.getX() >= bounds40.getMinX() - 0.1 && p.getX() <= bounds40.getMaxX() + 0.1);
|
||||
Assert.assertTrue("T4.0 Pin " + i + " (" + teensy40.getControlPointNodeName(i) +
|
||||
") Y=" + p.getY() + " should be within board Y bounds [" + bounds40.getMinY() + ", " + bounds40.getMaxY() + "]",
|
||||
p.getY() >= bounds40.getMinY() - 0.1 && p.getY() <= bounds40.getMaxY() + 0.1);
|
||||
}
|
||||
|
||||
// Teensy 4.1: all 65 pins must be within board bounds
|
||||
Teensy teensy41 = new Teensy();
|
||||
teensy41.setVersion(Teensy.TeensyVersion.Teensy_4_1);
|
||||
Shape body41 = teensy41.getBodyShape();
|
||||
Rectangle2D bounds41 = body41.getBounds2D();
|
||||
for (int i = 0; i < teensy41.getControlPointCount(); i++) {
|
||||
Point2D p = teensy41.getControlPoint(i);
|
||||
Assert.assertTrue("T4.1 Pin " + i + " (" + teensy41.getControlPointNodeName(i) +
|
||||
") X=" + p.getX() + " should be within board X bounds [" + bounds41.getMinX() + ", " + bounds41.getMaxX() + "]",
|
||||
p.getX() >= bounds41.getMinX() - 0.1 && p.getX() <= bounds41.getMaxX() + 0.1);
|
||||
Assert.assertTrue("T4.1 Pin " + i + " (" + teensy41.getControlPointNodeName(i) +
|
||||
") Y=" + p.getY() + " should be within board Y bounds [" + bounds41.getMinY() + ", " + bounds41.getMaxY() + "]",
|
||||
p.getY() >= bounds41.getMinY() - 0.1 && p.getY() <= bounds41.getMaxY() + 0.1);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testVersionSwitching() {
|
||||
Teensy teensy = new Teensy();
|
||||
@@ -277,80 +268,6 @@ public class TeensyTest {
|
||||
Assert.assertEquals("GND", teensy.getControlPointNodeName(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDrawingAndOutline() {
|
||||
Teensy teensy = new Teensy();
|
||||
teensy.setControlPoint(new Point2D.Double(200, 200), 0);
|
||||
|
||||
BufferedImage img = new BufferedImage(600, 600, BufferedImage.TYPE_INT_ARGB);
|
||||
Graphics2D g2d = img.createGraphics();
|
||||
g2d.setClip(new Rectangle(0, 0, 600, 600));
|
||||
|
||||
Project project = new Project();
|
||||
final AtomicInteger trackingStartCount = new AtomicInteger(0);
|
||||
final AtomicInteger trackingStopCount = new AtomicInteger(0);
|
||||
|
||||
IDrawingObserver observer = new IDrawingObserver() {
|
||||
@Override public void startTracking() {
|
||||
trackingStartCount.incrementAndGet();
|
||||
}
|
||||
@Override public void stopTracking() {
|
||||
trackingStopCount.incrementAndGet();
|
||||
}
|
||||
@Override public void startTrackingContinuityArea(boolean positive) {}
|
||||
@Override public void stopTrackingContinuityArea() {}
|
||||
@Override public boolean isTrackingContinuityArea() { return false; }
|
||||
@Override public void setContinuityMarker(String marker) {}
|
||||
};
|
||||
|
||||
// Test normal draw
|
||||
teensy.draw(g2d, ComponentState.NORMAL, false, project, observer);
|
||||
Assert.assertEquals(1, trackingStartCount.get());
|
||||
Assert.assertEquals(1, trackingStopCount.get());
|
||||
|
||||
// Test selected state and outline mode
|
||||
teensy.draw(g2d, ComponentState.SELECTED, false, project, observer);
|
||||
teensy.draw(g2d, ComponentState.NORMAL, true, project, observer);
|
||||
|
||||
// Test icon drawing
|
||||
teensy.drawIcon(g2d, 32, 32);
|
||||
|
||||
// Test Teensy 4.1 draw
|
||||
teensy.setVersion(Teensy.TeensyVersion.Teensy_4_1);
|
||||
teensy.draw(g2d, ComponentState.NORMAL, false, project, observer);
|
||||
|
||||
g2d.dispose();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRotation() {
|
||||
Teensy teensy = new Teensy();
|
||||
teensy.setControlPoint(new Point2D.Double(200, 200), 0);
|
||||
|
||||
Point2D p0Initial = teensy.getControlPoint(0);
|
||||
Point2D p14Initial = teensy.getControlPoint(14); // First right-row pin
|
||||
|
||||
teensy.setOrientation(Orientation._90);
|
||||
Point2D p0Rot = teensy.getControlPoint(0);
|
||||
Point2D p14Rot = teensy.getControlPoint(14);
|
||||
|
||||
// p0 should stay in place
|
||||
Assert.assertEquals(p0Initial.getX(), p0Rot.getX(), 0.01);
|
||||
Assert.assertEquals(p0Initial.getY(), p0Rot.getY(), 0.01);
|
||||
|
||||
// After 90 deg clockwise rotation, right row pin should move from (x + rowSpacing, y) to (x, y + rowSpacing)
|
||||
double rowSpacing = new Size(15.24d, SizeUnit.mm).convertToPixels();
|
||||
Assert.assertEquals(p0Rot.getX(), p14Rot.getX(), 0.01);
|
||||
Assert.assertEquals(p0Rot.getY() + rowSpacing, p14Rot.getY(), 0.01);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBoardColor() {
|
||||
Teensy teensy = new Teensy();
|
||||
// Board should be green (like Pi Zero)
|
||||
Assert.assertEquals(Teensy.TEENSY_GREEN, teensy.getBodyColor());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testHeadersProperty() {
|
||||
Teensy teensy = new Teensy();
|
||||
@@ -361,31 +278,5 @@ public class TeensyTest {
|
||||
|
||||
teensy.setHeaders(false);
|
||||
Assert.assertFalse("Headers should be false after setter", teensy.getHeaders());
|
||||
|
||||
// Test drawing with headers true and false for both 4.0 and 4.1
|
||||
BufferedImage img = new BufferedImage(600, 600, BufferedImage.TYPE_INT_ARGB);
|
||||
Graphics2D g2d = img.createGraphics();
|
||||
g2d.setClip(new Rectangle(0, 0, 600, 600));
|
||||
Project project = new Project();
|
||||
IDrawingObserver observer = new IDrawingObserver() {
|
||||
@Override public void startTracking() {}
|
||||
@Override public void stopTracking() {}
|
||||
@Override public void startTrackingContinuityArea(boolean positive) {}
|
||||
@Override public void stopTrackingContinuityArea() {}
|
||||
@Override public boolean isTrackingContinuityArea() { return false; }
|
||||
@Override public void setContinuityMarker(String marker) {}
|
||||
};
|
||||
|
||||
teensy.setHeaders(false);
|
||||
teensy.draw(g2d, ComponentState.NORMAL, false, project, observer);
|
||||
|
||||
teensy.setHeaders(true);
|
||||
teensy.draw(g2d, ComponentState.NORMAL, false, project, observer);
|
||||
|
||||
teensy.setVersion(Teensy.TeensyVersion.Teensy_4_1);
|
||||
teensy.setHeaders(true);
|
||||
teensy.draw(g2d, ComponentState.NORMAL, false, project, observer);
|
||||
|
||||
g2d.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,15 +1,9 @@
|
||||
package org.diylc.components.micro;
|
||||
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.Shape;
|
||||
import java.awt.geom.Point2D;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import java.awt.image.BufferedImage;
|
||||
|
||||
import org.diylc.core.ComponentState;
|
||||
import org.diylc.core.IDrawingObserver;
|
||||
import org.diylc.core.Project;
|
||||
import org.diylc.core.measures.Size;
|
||||
import org.diylc.core.measures.SizeUnit;
|
||||
import org.junit.Assert;
|
||||
@@ -95,37 +89,6 @@ public class WemosD1MiniTest {
|
||||
Assert.assertEquals(expectedTopMargin, p0.getY() - bounds.getY(), 0.1);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDrawingModes() {
|
||||
WemosD1Mini mcu = new WemosD1Mini();
|
||||
mcu.setControlPoint(new Point2D.Double(100, 100), 0);
|
||||
|
||||
BufferedImage img = new BufferedImage(400, 400, BufferedImage.TYPE_INT_ARGB);
|
||||
Graphics2D g2d = img.createGraphics();
|
||||
g2d.setClip(new Rectangle(0, 0, 400, 400));
|
||||
|
||||
Project project = new Project();
|
||||
IDrawingObserver observer = new IDrawingObserver() {
|
||||
@Override public void startTracking() {}
|
||||
@Override public void stopTracking() {}
|
||||
@Override public void startTrackingContinuityArea(boolean positive) {}
|
||||
@Override public void stopTrackingContinuityArea() {}
|
||||
@Override public boolean isTrackingContinuityArea() { return false; }
|
||||
@Override public void setContinuityMarker(String marker) {}
|
||||
};
|
||||
|
||||
// Normal mode
|
||||
mcu.draw(g2d, ComponentState.NORMAL, false, project, observer);
|
||||
// Selected mode
|
||||
mcu.draw(g2d, ComponentState.SELECTED, false, project, observer);
|
||||
// Outline mode
|
||||
mcu.draw(g2d, ComponentState.NORMAL, true, project, observer);
|
||||
// Icon
|
||||
mcu.drawIcon(g2d, 32, 32);
|
||||
|
||||
g2d.dispose();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testHeadersProperty() {
|
||||
WemosD1Mini mcu = new WemosD1Mini();
|
||||
@@ -136,27 +99,5 @@ public class WemosD1MiniTest {
|
||||
|
||||
mcu.setHeaders(false);
|
||||
Assert.assertFalse("Headers should be false after setter", mcu.getHeaders());
|
||||
|
||||
// Test drawing with headers true and false
|
||||
BufferedImage img = new BufferedImage(400, 400, BufferedImage.TYPE_INT_ARGB);
|
||||
Graphics2D g2d = img.createGraphics();
|
||||
g2d.setClip(new Rectangle(0, 0, 400, 400));
|
||||
Project project = new Project();
|
||||
IDrawingObserver observer = new IDrawingObserver() {
|
||||
@Override public void startTracking() {}
|
||||
@Override public void stopTracking() {}
|
||||
@Override public void startTrackingContinuityArea(boolean positive) {}
|
||||
@Override public void stopTrackingContinuityArea() {}
|
||||
@Override public boolean isTrackingContinuityArea() { return false; }
|
||||
@Override public void setContinuityMarker(String marker) {}
|
||||
};
|
||||
|
||||
mcu.setHeaders(false);
|
||||
mcu.draw(g2d, ComponentState.NORMAL, false, project, observer);
|
||||
|
||||
mcu.setHeaders(true);
|
||||
mcu.draw(g2d, ComponentState.NORMAL, false, project, observer);
|
||||
|
||||
g2d.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user