antenna consolidation

This commit is contained in:
Bane Stojkovic
2026-08-25 22:25:33 +02:00
parent e4aa88e4a3
commit e08374fa76
6 changed files with 88 additions and 100 deletions
@@ -73,9 +73,13 @@ public abstract class AbstractMakerBoard extends AbstractTransparentComponent<Vo
public static Color IC_BORDER_COLOR = Color.decode("#333333");
public static Color PIN_MARKER_COLOR = Color.decode("#555555");
public static Color METAL_LABEL_COLOR = Color.decode("#555555");
public static Color ANTENNA_COLOR = Color.decode("#DAA520");
public static Color ANTENNA_BG_COLOR = Color.decode("#1E1E1E");
public static Size PIN_SIZE = new Size(0.04d, SizeUnit.in);
public static Size PIN_SPACING = new Size(0.1d, SizeUnit.in);
public static Size ANTENNA_WIDTH = new Size(15.0d, SizeUnit.mm);
public static Size ANTENNA_LENGTH = new Size(7.0d, SizeUnit.mm);
public static Font SILK_FONT_SMALL = new Font("SansSerif", Font.PLAIN, 10);
public static Font SILK_FONT = new Font("SansSerif", Font.BOLD, 11);
@@ -740,6 +744,48 @@ public abstract class AbstractMakerBoard extends AbstractTransparentComponent<Vo
}
}
/**
* Helper to draw a standard ESP-style PCB meander antenna with a dark (#1E1E1E) substrate rectangle underneath.
*
* @param g2d Graphics2D context
* @param x top-left X coordinate of the antenna substrate rectangle
* @param y top-left Y coordinate of the antenna substrate rectangle
* @param width width of the antenna substrate rectangle (e.g. 15.0mm, matching main chip width)
* @param height height of the antenna substrate rectangle (e.g. 7.0mm)
*/
protected void drawPcbAntenna(Graphics2D g2d, double x, double y, double width, double height) {
// Dark rectangle underneath (#1E1E1E)
g2d.setColor(ANTENNA_BG_COLOR);
g2d.fill(new Rectangle2D.Double(x, y, width, height));
// Serpentine antenna trace (gold/copper)
g2d.setColor(ANTENNA_COLOR);
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1.5f));
Path2D.Double antPath = new Path2D.Double();
double antPadX = x + new Size(1.5d, SizeUnit.mm).convertToPixels();
double antPadW = width - new Size(3.0d, SizeUnit.mm).convertToPixels();
double antTopY = y + new Size(1.3d, SizeUnit.mm).convertToPixels();
double antMidY = y + new Size(5.4d, SizeUnit.mm).convertToPixels();
antPath.moveTo(antPadX, antMidY);
antPath.lineTo(antPadX, antTopY);
antPath.lineTo(antPadX + antPadW * 0.25, antTopY);
antPath.lineTo(antPadX + antPadW * 0.25, antMidY);
antPath.lineTo(antPadX + antPadW * 0.50, antMidY);
antPath.lineTo(antPadX + antPadW * 0.50, antTopY);
antPath.lineTo(antPadX + antPadW * 0.75, antTopY);
antPath.lineTo(antPadX + antPadW * 0.75, antMidY);
antPath.lineTo(antPadX + antPadW, antMidY);
antPath.lineTo(antPadX + antPadW, antTopY);
g2d.draw(antPath);
}
/**
* Helper to draw a standard ESP-style PCB meander antenna using default 15.0mm x 7.0mm dimensions.
*/
protected void drawPcbAntenna(Graphics2D g2d, double x, double y) {
drawPcbAntenna(g2d, x, y, ANTENNA_WIDTH.convertToPixels(), ANTENNA_LENGTH.convertToPixels());
}
/**
* Helper to get outline border color.
*/
@@ -78,17 +78,19 @@ public class ESP32DevKit extends AbstractMakerBoard {
public static Color ESP_BLACK = Color.decode("#3E3E3E");
public static Color ANTENNA_COLOR = Color.decode("#DAA520");
public static Color ANTENNA_BG_COLOR = Color.decode("#1E1E1E");
public static Color BUTTON_BODY_COLOR = Color.decode("#383838");
public static Color BUTTON_BORDER_COLOR = Color.decode("#666666");
public static Color BUTTON_ACTUATOR_COLOR = Color.decode("#A0A0A0");
public static Color SILK_COLOR = Color.WHITE;
// 30-Pin (DOIT V1) Dimensions
public static Size BOARD_WIDTH_30 = new Size(28.2d, SizeUnit.mm);
public static Size BOARD_LENGTH_30 = new Size(51.8d, SizeUnit.mm);
public static Size TOP_MARGIN_30 = new Size(6.7d, SizeUnit.mm);
public static Size ANTENNA_LENGTH_30 = new Size(6.2d, SizeUnit.mm);
public static Size ANTENNA_WIDTH_30 = new Size(20.0d, SizeUnit.mm);
public static Size ANTENNA_LENGTH = new Size(7.0d, SizeUnit.mm);
public static Size ANTENNA_WIDTH = new Size(15.0d, SizeUnit.mm);
public static Size SHIELD_WIDTH = new Size(15.0d, SizeUnit.mm);
public static Size SHIELD_LENGTH = new Size(18.0d, SizeUnit.mm);
public static Size HOLE_DIAMETER_30 = new Size(2.8d, SizeUnit.mm);
public static Size HOLE_EDGE_MARGIN_30 = new Size(0.8d, SizeUnit.mm);
@@ -97,7 +99,6 @@ public class ESP32DevKit extends AbstractMakerBoard {
public static Size BOARD_LENGTH_38 = new Size(54.4d, SizeUnit.mm);
public static Size MAIN_BODY_LENGTH_38 = new Size(48.2d, SizeUnit.mm);
public static Size ANTENNA_LENGTH_38 = new Size(6.2d, SizeUnit.mm);
public static Size ANTENNA_WIDTH_38 = new Size(19.0d, SizeUnit.mm);
// Common Spacing
public static Size ROW_SPACING = new Size(1.0d, SizeUnit.in);
@@ -201,7 +202,7 @@ public class ESP32DevKit extends AbstractMakerBoard {
} else {
double mainW = BOARD_WIDTH_38.convertToPixels();
double mainH = MAIN_BODY_LENGTH_38.convertToPixels();
double antennaW = ANTENNA_WIDTH_38.convertToPixels();
double antennaW = ANTENNA_WIDTH.convertToPixels();
double antennaH = ANTENNA_LENGTH_38.convertToPixels();
double mainX = (x + rowSpacing / 2.0) - mainW / 2.0;
@@ -246,7 +247,7 @@ public class ESP32DevKit extends AbstractMakerBoard {
} else {
double mainW = BOARD_WIDTH_38.convertToPixels();
double mainH = MAIN_BODY_LENGTH_38.convertToPixels();
double antennaW = ANTENNA_WIDTH_38.convertToPixels();
double antennaW = ANTENNA_WIDTH.convertToPixels();
double antennaH = ANTENNA_LENGTH_38.convertToPixels();
double mainX = (x + rowSpacing / 2.0) - mainW / 2.0;
double mainY = (y + 18 * PIN_SPACING.convertToPixels() / 2.0) - mainH / 2.0;
@@ -257,13 +258,8 @@ public class ESP32DevKit extends AbstractMakerBoard {
g2d.setColor(bodyColor);
g2d.fill(new RoundRectangle2D.Double(mainX, mainY, mainW, mainH, 8, 8));
// Antenna tab in slightly lighter color
Color antennaTabColor = new Color(
Math.min(255, bodyColor.getRed() + 32),
Math.min(255, bodyColor.getGreen() + 32),
Math.min(255, bodyColor.getBlue() + 32)
);
g2d.setColor(antennaTabColor);
// Antenna tab in #1e1e1e
g2d.setColor(ANTENNA_BG_COLOR);
g2d.fill(new Rectangle2D.Double(antennaX, antennaY, antennaW, antennaH));
}
}
@@ -274,13 +270,13 @@ public class ESP32DevKit extends AbstractMakerBoard {
g2d.draw(boardShape);
if (!outlineMode) {
double antennaX;
double antennaW = ANTENNA_WIDTH.convertToPixels();
double antennaH = (version == DevKitVersion.DevKit_V1_30Pin) ? ANTENNA_LENGTH.convertToPixels() : ANTENNA_LENGTH_38.convertToPixels();
double antennaX = (x + rowSpacing / 2.0) - antennaW / 2.0;
double antennaY;
double antennaW;
double antennaH;
double shieldY;
double shieldH = new Size(18.0d, SizeUnit.mm).convertToPixels();
double shieldW = new Size(18.0d, SizeUnit.mm).convertToPixels();
double shieldH = SHIELD_LENGTH.convertToPixels();
double shieldW = SHIELD_WIDTH.convertToPixels();
double shieldX = (x + rowSpacing / 2.0) - shieldW / 2.0;
double usbY;
double btnLeftX;
@@ -297,11 +293,8 @@ public class ESP32DevKit extends AbstractMakerBoard {
double boardX = (x + rowSpacing / 2.0) - boardW / 2.0;
double boardY = y - topMargin;
antennaW = ANTENNA_WIDTH_30.convertToPixels();
antennaH = ANTENNA_LENGTH_30.convertToPixels();
antennaX = (x + rowSpacing / 2.0) - antennaW / 2.0;
antennaY = boardY;
shieldY = boardY + antennaH + shift1mm;
shieldY = boardY + antennaH;
usbY = boardY + boardH - 22;
// 4 Corner Mounting Holes (diameter 2.8mm, 0.8mm away from edges in both directions)
@@ -327,11 +320,8 @@ public class ESP32DevKit extends AbstractMakerBoard {
double mainX = (x + rowSpacing / 2.0) - mainW / 2.0;
double mainY = (y + 18 * PIN_SPACING.convertToPixels() / 2.0) - mainH / 2.0;
antennaW = ANTENNA_WIDTH_38.convertToPixels();
antennaH = ANTENNA_LENGTH_38.convertToPixels();
antennaX = (x + rowSpacing / 2.0) - antennaW / 2.0;
antennaY = mainY - antennaH;
shieldY = mainY + 10;
shieldY = mainY + 8;
usbY = mainY + mainH - 22;
btnY = mainY + mainH - 25;
@@ -339,25 +329,8 @@ public class ESP32DevKit extends AbstractMakerBoard {
btnRightX = mainX + mainW - 38 - btnW;
}
// Antenna trace (gold/copper serpentine PCB trace)
g2d.setColor(ANTENNA_COLOR);
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1.5f));
Path2D.Double antPath = new Path2D.Double();
double antPadX = antennaX + 16;
double antPadW = antennaW - 32;
double antTopY = antennaY + 10;
double antMidY = antennaY + antennaH - 12;
antPath.moveTo(antPadX, antMidY);
antPath.lineTo(antPadX, antTopY);
antPath.lineTo(antPadX + antPadW * 0.25, antTopY);
antPath.lineTo(antPadX + antPadW * 0.25, antMidY);
antPath.lineTo(antPadX + antPadW * 0.50, antMidY);
antPath.lineTo(antPadX + antPadW * 0.50, antTopY);
antPath.lineTo(antPadX + antPadW * 0.75, antTopY);
antPath.lineTo(antPadX + antPadW * 0.75, antMidY);
antPath.lineTo(antPadX + antPadW, antMidY);
antPath.lineTo(antPadX + antPadW, antTopY);
g2d.draw(antPath);
// Antenna (dark rectangle underneath + gold serpentine trace)
drawPcbAntenna(g2d, antennaX, antennaY, antennaW, antennaH);
// ESP32-WROOM-32 metal shield module below antenna
drawMetalConnector(g2d, shieldX, shieldY, shieldW, shieldH, "ESP32-WROOM-32");
@@ -29,6 +29,7 @@ import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Path2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.awt.geom.RoundRectangle2D;
import org.diylc.awt.StringUtils;
@@ -59,6 +60,7 @@ public class ESP8266NodeMCU extends AbstractMakerBoard {
public static Color NODEMCU_BLACK = Color.decode("#3E3E3E");
public static Color ANTENNA_COLOR = Color.decode("#DAA520");
public static Color ANTENNA_BG_COLOR = Color.decode("#1E1E1E");
public static Color BUTTON_BODY_COLOR = Color.decode("#383838");
public static Color BUTTON_BORDER_COLOR = Color.decode("#666666");
public static Color BUTTON_ACTUATOR_COLOR = Color.decode("#A0A0A0");
@@ -66,8 +68,10 @@ public class ESP8266NodeMCU extends AbstractMakerBoard {
public static Size BOARD_WIDTH = new Size(25.7d, SizeUnit.mm);
public static Size BOARD_LENGTH = new Size(48.0d, SizeUnit.mm);
public static Size TOP_MARGIN = new Size(6.22d, SizeUnit.mm);
public static Size ANTENNA_LENGTH = new Size(6.0d, SizeUnit.mm);
public static Size ANTENNA_WIDTH = new Size(16.0d, SizeUnit.mm);
public static Size ANTENNA_LENGTH = new Size(7.0d, SizeUnit.mm);
public static Size ANTENNA_WIDTH = new Size(15.0d, SizeUnit.mm);
public static Size SHIELD_WIDTH = new Size(15.0d, SizeUnit.mm);
public static Size SHIELD_LENGTH = new Size(15.0d, SizeUnit.mm);
public static Size ROW_SPACING = new Size(0.9d, SizeUnit.in);
public static Size HOLE_DISTANCE_X = new Size(21.0d, SizeUnit.mm);
public static Size HOLE_DISTANCE_Y = new Size(44.0d, SizeUnit.mm);
@@ -153,7 +157,12 @@ public class ESP8266NodeMCU extends AbstractMakerBoard {
double antennaW = ANTENNA_WIDTH.convertToPixels();
double antennaH = ANTENNA_LENGTH.convertToPixels();
double antennaX = (x + rowSpacing / 2.0) - antennaW / 2.0;
double antennaY = boardY + new Size(1.0d, SizeUnit.mm).convertToPixels();
double antennaY = boardY;
double shieldW = SHIELD_WIDTH.convertToPixels();
double shieldH = SHIELD_LENGTH.convertToPixels();
double shieldX = (x + rowSpacing / 2.0) - shieldW / 2.0;
double shieldY = antennaY + antennaH;
Shape boardShape = getBodyShape();
@@ -183,31 +192,10 @@ public class ESP8266NodeMCU extends AbstractMakerBoard {
drawMountingHole(g2d, leftHoleX, bottomHoleY, holeDiameter);
drawMountingHole(g2d, rightHoleX, bottomHoleY, holeDiameter);
// Antenna trace (gold/copper serpentine PCB trace)
g2d.setColor(ANTENNA_COLOR);
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1.5f));
Path2D.Double antPath = new Path2D.Double();
double antPadX = antennaX + 12;
double antPadW = antennaW - 24;
double antTopY = antennaY + 4;
double antMidY = antennaY + antennaH - 6;
antPath.moveTo(antPadX, antMidY);
antPath.lineTo(antPadX, antTopY);
antPath.lineTo(antPadX + antPadW * 0.25, antTopY);
antPath.lineTo(antPadX + antPadW * 0.25, antMidY);
antPath.lineTo(antPadX + antPadW * 0.50, antMidY);
antPath.lineTo(antPadX + antPadW * 0.50, antTopY);
antPath.lineTo(antPadX + antPadW * 0.75, antTopY);
antPath.lineTo(antPadX + antPadW * 0.75, antMidY);
antPath.lineTo(antPadX + antPadW, antMidY);
antPath.lineTo(antPadX + antPadW, antTopY);
g2d.draw(antPath);
// Antenna (dark rectangle underneath + gold serpentine trace)
drawPcbAntenna(g2d, antennaX, antennaY, antennaW, antennaH);
// ESP-12 Metal shield module below antenna
double shieldW = new Size(16.0d, SizeUnit.mm).convertToPixels();
double shieldH = new Size(15.0d, SizeUnit.mm).convertToPixels();
double shieldX = (x + rowSpacing / 2.0) - shieldW / 2.0;
double shieldY = antennaY + antennaH + 2;
drawMetalConnector(g2d, shieldX, shieldY, shieldW, shieldH, "ESP8266");
// Micro-USB Jack at bottom
@@ -60,6 +60,7 @@ public class WemosD1Mini extends AbstractMakerBoard {
public static Color WEMOS_BLUE = Color.decode("#006699");
public static Color ANTENNA_COLOR = Color.decode("#DAA520");
public static Color ANTENNA_BG_COLOR = Color.decode("#1E1E1E");
public static Color BUTTON_BODY_COLOR = Color.decode("#383838");
public static Color BUTTON_BORDER_COLOR = Color.decode("#666666");
public static Color BUTTON_ACTUATOR_COLOR = Color.decode("#A0A0A0");
@@ -243,29 +244,8 @@ public class WemosD1Mini extends AbstractMakerBoard {
g2d.draw(boardShape);
if (!outlineMode) {
// Black module rectangle going from top of board down to the main chip / shield
g2d.setColor(BUTTON_BODY_COLOR);
g2d.fill(new Rectangle2D.Double(moduleX, boardY, moduleW, shieldY - boardY));
// Antenna trace (gold/copper serpentine PCB trace on top of the black module area)
g2d.setColor(ANTENNA_COLOR);
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1.5f));
Path2D.Double antPath = new Path2D.Double();
double antPadX = moduleX + new Size(1.5d, SizeUnit.mm).convertToPixels();
double antPadW = moduleW - new Size(3.0d, SizeUnit.mm).convertToPixels();
double antTopY = boardY + new Size(0.6d, SizeUnit.mm).convertToPixels();
double antMidY = boardY + ANTENNA_LENGTH.convertToPixels() - new Size(0.8d, SizeUnit.mm).convertToPixels();
antPath.moveTo(antPadX, antMidY);
antPath.lineTo(antPadX, antTopY);
antPath.lineTo(antPadX + antPadW * 0.25, antTopY);
antPath.lineTo(antPadX + antPadW * 0.25, antMidY);
antPath.lineTo(antPadX + antPadW * 0.50, antMidY);
antPath.lineTo(antPadX + antPadW * 0.50, antTopY);
antPath.lineTo(antPadX + antPadW * 0.75, antTopY);
antPath.lineTo(antPadX + antPadW * 0.75, antMidY);
antPath.lineTo(antPadX + antPadW, antMidY);
antPath.lineTo(antPadX + antPadW, antTopY);
g2d.draw(antPath);
// Antenna (dark rectangle underneath + gold serpentine trace)
drawPcbAntenna(g2d, moduleX, boardY, moduleW, moduleH);
// ESP8266 Metal Shield (main chip module)
drawMetalConnector(g2d, shieldX, shieldY, shieldW, shieldH, "ESP8266");
@@ -58,7 +58,7 @@ public class MakerComponentsTest {
}
}
private final List<Class<? extends IDIYComponent<?>>> allMakerComponentClasses = Arrays.asList(
private final List<Class<? extends IDIYComponent<?>>> allMakerComponentClasses = Arrays.<Class<? extends IDIYComponent<?>>>asList(
// Controllers
ArduinoUno.class,
ArduinoNano.class,
@@ -22,6 +22,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.List;
import org.diylc.core.IDIYComponent;
import org.diylc.components.passive.AxialFilmCapacitor;
import org.diylc.components.passive.Resistor;
@@ -377,7 +378,7 @@ public class GuitarDiagramAnalyzerTests {
SingleCoilPickup pickup = new SingleCoilPickup();
pickup.setName("Pickup");
pickup.setPolarity(Polarity.StackedNorth);
Netlist netlist = new Netlist(Arrays.asList(jack, pickup));
Netlist netlist = new Netlist(Arrays.<IDIYComponent<?>>asList(jack, pickup));
Group tipGroup = new Group().connect(jack, 0).connect(pickup, 2);
Group sleeveGroup = new Group().connect(jack, 1).connect(pickup, 1);
netlist.add(tipGroup).add(sleeveGroup);
@@ -399,7 +400,7 @@ public class GuitarDiagramAnalyzerTests {
SingleCoilPickup pickup2 = new SingleCoilPickup();
pickup2.setName("Pickup2");
pickup2.setPolarity(Polarity.StackedSouth);
Netlist netlist = new Netlist(Arrays.asList(jack, pickup1, pickup2));
Netlist netlist = new Netlist(Arrays.<IDIYComponent<?>>asList(jack, pickup1, pickup2));
Group tipGroup = new Group().connect(jack, 0).connect(pickup1, 1).connect(pickup2, 1);
Group sleeveGroup = new Group().connect(jack, 1).connect(pickup1, 2).connect(pickup2, 2);
netlist.add(tipGroup).add(sleeveGroup);
@@ -422,7 +423,7 @@ public class GuitarDiagramAnalyzerTests {
SingleCoilPickup pickup2 = new SingleCoilPickup();
pickup2.setName("Pickup2");
pickup2.setPolarity(Polarity.StackedSouth);
Netlist netlist = new Netlist(Arrays.asList(jack, pickup1, pickup2));
Netlist netlist = new Netlist(Arrays.<IDIYComponent<?>>asList(jack, pickup1, pickup2));
Group tipGroup = new Group().connect(jack, 0).connect(pickup1, 1).connect(pickup2, 2);
Group sleeveGroup = new Group().connect(jack, 1).connect(pickup1, 2).connect(pickup2, 1);
netlist.add(tipGroup).add(sleeveGroup);
@@ -445,7 +446,7 @@ public class GuitarDiagramAnalyzerTests {
SingleCoilPickup pickup2 = new SingleCoilPickup();
pickup2.setName("Pickup2");
pickup2.setPolarity(Polarity.North);
Netlist netlist = new Netlist(Arrays.asList(jack, pickup1, pickup2));
Netlist netlist = new Netlist(Arrays.<IDIYComponent<?>>asList(jack, pickup1, pickup2));
Group tipGroup = new Group().connect(jack, 0).connect(pickup1, 1).connect(pickup2, 1);
Group sleeveGroup = new Group().connect(jack, 1).connect(pickup1, 2).connect(pickup2, 2);
netlist.add(tipGroup).add(sleeveGroup);
@@ -467,7 +468,7 @@ public class GuitarDiagramAnalyzerTests {
pickup1.setPolarity(Polarity.StackedNorth);
HumbuckerPickup pickup2 = new HumbuckerPickup();
pickup2.setName("Pickup2");
Netlist netlist = new Netlist(Arrays.asList(jack, pickup1, pickup2));
Netlist netlist = new Netlist(Arrays.<IDIYComponent<?>>asList(jack, pickup1, pickup2));
Group tipGroup = new Group().connect(jack, 0).connect(pickup1, 1).connect(pickup2, 0);
Group coilTapGroup = new Group().connect(pickup2, 1).connect(pickup2, 2);
Group sleeveGroup = new Group().connect(jack, 1).connect(pickup1, 2).connect(pickup2, 3);