This commit is contained in:
Bane Stojkovic
2026-08-26 15:39:34 +02:00
parent 4f0e75f768
commit b02345e219
14 changed files with 302 additions and 9 deletions
@@ -44,6 +44,7 @@ import org.diylc.core.IDrawingObserver;
import org.diylc.core.Project;
import org.diylc.core.annotations.BomPolicy;
import org.diylc.core.annotations.ComponentDescriptor;
import org.diylc.core.annotations.EditableProperty;
import org.diylc.core.annotations.KeywordPolicy;
import org.diylc.core.measures.Size;
import org.diylc.core.measures.SizeUnit;
@@ -74,12 +75,24 @@ public class ArduinoNano extends AbstractMakerBoard {
"MISO", "5V_ICSP", "SCK", "MOSI", "RST_ICSP", "GND_ICSP"
};
protected boolean headers = false;
public ArduinoNano() {
super();
this.bodyColor = ARDUINO_BLUE;
updateControlPoints();
}
@EditableProperty(name = "Headers")
public boolean getHeaders() {
return headers;
}
public void setHeaders(boolean headers) {
this.headers = headers;
invalidateCache();
}
@Override
public String getControlPointNodeName(int index) {
if (index >= 0 && index < PIN_NAMES.length) {
@@ -248,8 +261,12 @@ public class ArduinoNano extends AbstractMakerBoard {
g2d.setTransform(oldTx);
// Draw pins
drawPinHeader(g2d, 0, controlPoints.length, false, outlineMode, drawingObserver);
// Draw pins or solder pads
if (headers) {
drawPinHeader(g2d, 0, controlPoints.length, false, outlineMode, drawingObserver);
} else {
drawPcbSolderPads(g2d, 0, controlPoints.length, true, outlineMode, drawingObserver);
}
g2d.setComposite(oldComposite);
}
@@ -122,6 +122,7 @@ public class ESP32DevKit extends AbstractMakerBoard {
};
private DevKitVersion version = DevKitVersion.DevKit_V1_30Pin;
protected boolean headers = false;
public ESP32DevKit() {
super();
@@ -140,6 +141,16 @@ public class ESP32DevKit extends AbstractMakerBoard {
invalidateCache();
}
@EditableProperty(name = "Headers")
public boolean getHeaders() {
return headers;
}
public void setHeaders(boolean headers) {
this.headers = headers;
invalidateCache();
}
@Override
public String getControlPointNodeName(int index) {
if (version == DevKitVersion.DevKit_V1_30Pin) {
@@ -367,7 +378,11 @@ public class ESP32DevKit extends AbstractMakerBoard {
g2d.setTransform(oldTx);
drawPins(g2d, 0, controlPoints.length, false, outlineMode, drawingObserver);
if (headers) {
drawPins(g2d, 0, controlPoints.length, false, outlineMode, drawingObserver);
} else {
drawPcbSolderPads(g2d, 0, controlPoints.length, true, outlineMode, drawingObserver);
}
g2d.setComposite(oldComposite);
}
@@ -44,6 +44,7 @@ import org.diylc.core.IDrawingObserver;
import org.diylc.core.Project;
import org.diylc.core.annotations.BomPolicy;
import org.diylc.core.annotations.ComponentDescriptor;
import org.diylc.core.annotations.EditableProperty;
import org.diylc.core.annotations.KeywordPolicy;
import org.diylc.core.measures.Size;
import org.diylc.core.measures.SizeUnit;
@@ -84,12 +85,24 @@ public class ESP8266NodeMCU extends AbstractMakerBoard {
"D0 (GPIO16)", "D1 (GPIO5)", "D2 (GPIO4)", "D3 (GPIO0)", "D4 (GPIO2)", "3V3_2", "GND3", "D5 (GPIO14)", "D6 (GPIO12)", "D7 (GPIO13)", "D8 (GPIO15)", "RX (GPIO3)", "TX (GPIO1)", "GND4", "3V3_3"
};
protected boolean headers = false;
public ESP8266NodeMCU() {
super();
this.bodyColor = NODEMCU_BLACK;
updateControlPoints();
}
@EditableProperty(name = "Headers")
public boolean getHeaders() {
return headers;
}
public void setHeaders(boolean headers) {
this.headers = headers;
invalidateCache();
}
@Override
public String getControlPointNodeName(int index) {
if (index >= 0 && index < PIN_NAMES.length) {
@@ -238,7 +251,11 @@ public class ESP8266NodeMCU extends AbstractMakerBoard {
g2d.setTransform(oldTx);
drawPins(g2d, 0, controlPoints.length, false, outlineMode, drawingObserver);
if (headers) {
drawPins(g2d, 0, controlPoints.length, false, outlineMode, drawingObserver);
} else {
drawPcbSolderPads(g2d, 0, controlPoints.length, true, outlineMode, drawingObserver);
}
g2d.setComposite(oldComposite);
}
@@ -45,6 +45,7 @@ import org.diylc.core.IDrawingObserver;
import org.diylc.core.Project;
import org.diylc.core.annotations.BomPolicy;
import org.diylc.core.annotations.ComponentDescriptor;
import org.diylc.core.annotations.EditableProperty;
import org.diylc.core.annotations.KeywordPolicy;
import org.diylc.core.measures.Size;
import org.diylc.core.measures.SizeUnit;
@@ -79,12 +80,24 @@ public class RaspberryPiPico extends AbstractMakerBoard {
"SWCLK", "GND_SWD", "SWDIO"
};
protected boolean headers = false;
public RaspberryPiPico() {
super();
this.bodyColor = RPI_GREEN;
updateControlPoints();
}
@EditableProperty(name = "Headers")
public boolean getHeaders() {
return headers;
}
public void setHeaders(boolean headers) {
this.headers = headers;
invalidateCache();
}
@Override
public String getControlPointNodeName(int index) {
if (index >= 0 && index < PIN_NAMES.length) {
@@ -230,10 +243,16 @@ public class RaspberryPiPico extends AbstractMakerBoard {
drawingObserver.stopTracking();
drawCastellatedPads(g2d, boardX, boardY, boardW, pin1OffsetX, pin1OffsetY, outlineMode, drawingObserver);
if (!headers) {
drawCastellatedPads(g2d, boardX, boardY, boardW, pin1OffsetX, pin1OffsetY, outlineMode, drawingObserver);
}
g2d.setTransform(oldTx);
if (headers) {
drawPinHeader(g2d, 0, controlPoints.length, false, outlineMode, drawingObserver);
}
g2d.setComposite(oldComposite);
}
@@ -45,6 +45,7 @@ import org.diylc.core.IDrawingObserver;
import org.diylc.core.Project;
import org.diylc.core.annotations.BomPolicy;
import org.diylc.core.annotations.ComponentDescriptor;
import org.diylc.core.annotations.EditableProperty;
import org.diylc.core.annotations.KeywordPolicy;
import org.diylc.core.measures.Size;
import org.diylc.core.measures.SizeUnit;
@@ -74,12 +75,24 @@ public class RaspberryPiZero extends AbstractMakerBoard {
PIN_NAMES[40] = "MIPI (CSI)";
}
protected boolean headers = false;
public RaspberryPiZero() {
super();
this.bodyColor = RPI_GREEN;
updateControlPoints();
}
@EditableProperty(name = "Headers")
public boolean getHeaders() {
return headers;
}
public void setHeaders(boolean headers) {
this.headers = headers;
invalidateCache();
}
@Override
public String getControlPointNodeName(int index) {
if (index >= 0 && index < PIN_NAMES.length) {
@@ -259,7 +272,11 @@ public class RaspberryPiZero extends AbstractMakerBoard {
g2d.setTransform(oldTx);
drawSolderPads(g2d, outlineMode, drawingObserver);
if (headers) {
drawPinHeader(g2d, 0, 40, false, outlineMode, drawingObserver);
} else {
drawSolderPads(g2d, outlineMode, drawingObserver);
}
g2d.setComposite(oldComposite);
}
@@ -153,6 +153,7 @@ public class Teensy extends AbstractMakerBoard {
};
private TeensyVersion version = TeensyVersion.Teensy_4_0;
protected boolean headers = false;
public Teensy() {
super();
@@ -171,6 +172,16 @@ public class Teensy extends AbstractMakerBoard {
invalidateCache();
}
@EditableProperty(name = "Headers")
public boolean getHeaders() {
return headers;
}
public void setHeaders(boolean headers) {
this.headers = headers;
invalidateCache();
}
private String[] getPinNames() {
return (version == TeensyVersion.Teensy_4_0) ? PIN_NAMES_40 : PIN_NAMES_41;
}
@@ -392,8 +403,12 @@ public class Teensy extends AbstractMakerBoard {
g2d.setTransform(oldTx);
// Render gold solder pads with drill holes (square for Pin 1 / GND)
drawSolderPads(g2d, outlineMode, drawingObserver);
// Render pin headers or gold solder pads with drill holes
if (headers) {
drawPinHeader(g2d, 0, controlPoints.length, false, outlineMode, drawingObserver);
} else {
drawSolderPads(g2d, outlineMode, drawingObserver);
}
g2d.setComposite(oldComposite);
}
@@ -44,6 +44,7 @@ import org.diylc.core.IDrawingObserver;
import org.diylc.core.Project;
import org.diylc.core.annotations.BomPolicy;
import org.diylc.core.annotations.ComponentDescriptor;
import org.diylc.core.annotations.EditableProperty;
import org.diylc.core.annotations.KeywordPolicy;
import org.diylc.core.measures.Size;
import org.diylc.core.measures.SizeUnit;
@@ -107,12 +108,24 @@ public class WemosD1Mini extends AbstractMakerBoard {
"TX", "RX", "D1", "D2", "D3", "D4", "G", "5V"
};
protected boolean headers = false;
public WemosD1Mini() {
super();
this.bodyColor = WEMOS_BLUE;
updateControlPoints();
}
@EditableProperty(name = "Headers")
public boolean getHeaders() {
return headers;
}
public void setHeaders(boolean headers) {
this.headers = headers;
invalidateCache();
}
@Override
public String getControlPointNodeName(int index) {
if (index >= 0 && index < PIN_NAMES.length) {
@@ -298,7 +311,11 @@ public class WemosD1Mini extends AbstractMakerBoard {
g2d.setTransform(oldTx);
drawPcbSolderPads(g2d, 0, controlPoints.length, false, outlineMode, drawingObserver);
if (headers) {
drawPinHeader(g2d, 0, controlPoints.length, false, outlineMode, drawingObserver);
} else {
drawPcbSolderPads(g2d, 0, controlPoints.length, false, outlineMode, drawingObserver);
}
g2d.setComposite(oldComposite);
}
@@ -112,4 +112,16 @@ public class ArduinoNanoTest {
Point2D p0 = nano.getControlPoint(0);
Assert.assertEquals(30.0, p0.getY() - bounds.getY(), 0.1);
}
@Test
public void testHeadersProperty() {
ArduinoNano nano = new ArduinoNano();
Assert.assertFalse("Headers should be false by default", nano.getHeaders());
nano.setHeaders(true);
Assert.assertTrue("Headers should be true after setter", nano.getHeaders());
nano.setHeaders(false);
Assert.assertFalse("Headers should be false after setter", nano.getHeaders());
}
}
@@ -219,4 +219,16 @@ public class ESP32DevKitTest {
Assert.assertEquals("3V3", devKit.getControlPointNodeName(14));
Assert.assertEquals("D23", devKit.getControlPointNodeName(29));
}
@Test
public void testHeadersProperty() {
ESP32DevKit devKit = new ESP32DevKit();
Assert.assertFalse("Headers should be false by default", devKit.getHeaders());
devKit.setHeaders(true);
Assert.assertTrue("Headers should be true after setter", devKit.getHeaders());
devKit.setHeaders(false);
Assert.assertFalse("Headers should be false after setter", devKit.getHeaders());
}
}
@@ -102,4 +102,16 @@ public class ESP8266NodeMCUTest {
Point2D p0 = mcu.getControlPoint(0);
Assert.assertEquals(expectedTopMargin, p0.getY() - bounds.getY(), 0.1);
}
@Test
public void testHeadersProperty() {
ESP8266NodeMCU mcu = new ESP8266NodeMCU();
Assert.assertFalse("Headers should be false by default", mcu.getHeaders());
mcu.setHeaders(true);
Assert.assertTrue("Headers should be true after setter", mcu.getHeaders());
mcu.setHeaders(false);
Assert.assertFalse("Headers should be false after setter", mcu.getHeaders());
}
}
@@ -151,4 +151,38 @@ public class RaspberryPiPicoTest {
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();
Assert.assertFalse("Headers should be false by default", pico.getHeaders());
pico.setHeaders(true);
Assert.assertTrue("Headers should be true after setter", pico.getHeaders());
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();
}
}
@@ -166,4 +166,38 @@ public class RaspberryPiZeroTest {
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();
Assert.assertFalse("Headers should be false by default", pi.getHeaders());
pi.setHeaders(true);
Assert.assertTrue("Headers should be true after setter", pi.getHeaders());
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();
}
}
@@ -350,4 +350,42 @@ public class TeensyTest {
// Board should be green (like Pi Zero)
Assert.assertEquals(Teensy.TEENSY_GREEN, teensy.getBodyColor());
}
@Test
public void testHeadersProperty() {
Teensy teensy = new Teensy();
Assert.assertFalse("Headers should be false by default", teensy.getHeaders());
teensy.setHeaders(true);
Assert.assertTrue("Headers should be true after setter", teensy.getHeaders());
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();
}
}
@@ -125,4 +125,38 @@ public class WemosD1MiniTest {
g2d.dispose();
}
@Test
public void testHeadersProperty() {
WemosD1Mini mcu = new WemosD1Mini();
Assert.assertFalse("Headers should be false by default", mcu.getHeaders());
mcu.setHeaders(true);
Assert.assertTrue("Headers should be true after setter", mcu.getHeaders());
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();
}
}