diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/micro/ArduinoNano.java b/diylc/diylc-library/src/main/java/org/diylc/components/micro/ArduinoNano.java index 81e238d2..784c89a9 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/components/micro/ArduinoNano.java +++ b/diylc/diylc-library/src/main/java/org/diylc/components/micro/ArduinoNano.java @@ -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); } diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/micro/ESP32DevKit.java b/diylc/diylc-library/src/main/java/org/diylc/components/micro/ESP32DevKit.java index 497eb777..8c0d36e4 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/components/micro/ESP32DevKit.java +++ b/diylc/diylc-library/src/main/java/org/diylc/components/micro/ESP32DevKit.java @@ -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); } diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/micro/ESP8266NodeMCU.java b/diylc/diylc-library/src/main/java/org/diylc/components/micro/ESP8266NodeMCU.java index 63b73f49..5993f2c6 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/components/micro/ESP8266NodeMCU.java +++ b/diylc/diylc-library/src/main/java/org/diylc/components/micro/ESP8266NodeMCU.java @@ -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); } diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/micro/RaspberryPiPico.java b/diylc/diylc-library/src/main/java/org/diylc/components/micro/RaspberryPiPico.java index e0313a05..799ec421 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/components/micro/RaspberryPiPico.java +++ b/diylc/diylc-library/src/main/java/org/diylc/components/micro/RaspberryPiPico.java @@ -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); } diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/micro/RaspberryPiZero.java b/diylc/diylc-library/src/main/java/org/diylc/components/micro/RaspberryPiZero.java index 9a061f3c..1ab4ccc5 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/components/micro/RaspberryPiZero.java +++ b/diylc/diylc-library/src/main/java/org/diylc/components/micro/RaspberryPiZero.java @@ -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); } diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/micro/Teensy.java b/diylc/diylc-library/src/main/java/org/diylc/components/micro/Teensy.java index 1fbf2cd5..b8a04385 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/components/micro/Teensy.java +++ b/diylc/diylc-library/src/main/java/org/diylc/components/micro/Teensy.java @@ -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); } diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/micro/WemosD1Mini.java b/diylc/diylc-library/src/main/java/org/diylc/components/micro/WemosD1Mini.java index 07780cae..04072a52 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/components/micro/WemosD1Mini.java +++ b/diylc/diylc-library/src/main/java/org/diylc/components/micro/WemosD1Mini.java @@ -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); } diff --git a/diylc/diylc-library/src/test/java/org/diylc/components/micro/ArduinoNanoTest.java b/diylc/diylc-library/src/test/java/org/diylc/components/micro/ArduinoNanoTest.java index c87c7a8e..9b0852d4 100644 --- a/diylc/diylc-library/src/test/java/org/diylc/components/micro/ArduinoNanoTest.java +++ b/diylc/diylc-library/src/test/java/org/diylc/components/micro/ArduinoNanoTest.java @@ -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()); + } } diff --git a/diylc/diylc-library/src/test/java/org/diylc/components/micro/ESP32DevKitTest.java b/diylc/diylc-library/src/test/java/org/diylc/components/micro/ESP32DevKitTest.java index 69ee2b8e..536f1805 100644 --- a/diylc/diylc-library/src/test/java/org/diylc/components/micro/ESP32DevKitTest.java +++ b/diylc/diylc-library/src/test/java/org/diylc/components/micro/ESP32DevKitTest.java @@ -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()); + } } diff --git a/diylc/diylc-library/src/test/java/org/diylc/components/micro/ESP8266NodeMCUTest.java b/diylc/diylc-library/src/test/java/org/diylc/components/micro/ESP8266NodeMCUTest.java index ec29649b..f81549cd 100644 --- a/diylc/diylc-library/src/test/java/org/diylc/components/micro/ESP8266NodeMCUTest.java +++ b/diylc/diylc-library/src/test/java/org/diylc/components/micro/ESP8266NodeMCUTest.java @@ -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()); + } } diff --git a/diylc/diylc-library/src/test/java/org/diylc/components/micro/RaspberryPiPicoTest.java b/diylc/diylc-library/src/test/java/org/diylc/components/micro/RaspberryPiPicoTest.java index f76e2f1a..4bbd622b 100644 --- a/diylc/diylc-library/src/test/java/org/diylc/components/micro/RaspberryPiPicoTest.java +++ b/diylc/diylc-library/src/test/java/org/diylc/components/micro/RaspberryPiPicoTest.java @@ -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(); + } } diff --git a/diylc/diylc-library/src/test/java/org/diylc/components/micro/RaspberryPiZeroTest.java b/diylc/diylc-library/src/test/java/org/diylc/components/micro/RaspberryPiZeroTest.java index 67cc87e0..b1e72915 100644 --- a/diylc/diylc-library/src/test/java/org/diylc/components/micro/RaspberryPiZeroTest.java +++ b/diylc/diylc-library/src/test/java/org/diylc/components/micro/RaspberryPiZeroTest.java @@ -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(); + } } diff --git a/diylc/diylc-library/src/test/java/org/diylc/components/micro/TeensyTest.java b/diylc/diylc-library/src/test/java/org/diylc/components/micro/TeensyTest.java index fa63252c..3bd8ab21 100644 --- a/diylc/diylc-library/src/test/java/org/diylc/components/micro/TeensyTest.java +++ b/diylc/diylc-library/src/test/java/org/diylc/components/micro/TeensyTest.java @@ -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(); + } } diff --git a/diylc/diylc-library/src/test/java/org/diylc/components/micro/WemosD1MiniTest.java b/diylc/diylc-library/src/test/java/org/diylc/components/micro/WemosD1MiniTest.java index daf8262c..7ba58bd6 100644 --- a/diylc/diylc-library/src/test/java/org/diylc/components/micro/WemosD1MiniTest.java +++ b/diylc/diylc-library/src/test/java/org/diylc/components/micro/WemosD1MiniTest.java @@ -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(); + } }