mirror of
https://github.com/bancika/diy-layout-creator
synced 2026-11-07 12:24:58 +10:00
pi pico updates
This commit is contained in:
@@ -26,6 +26,7 @@ import java.awt.Font;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.Shape;
|
||||
import java.awt.geom.AffineTransform;
|
||||
import java.awt.geom.Area;
|
||||
import java.awt.geom.Ellipse2D;
|
||||
import java.awt.geom.Path2D;
|
||||
import java.awt.geom.Point2D;
|
||||
@@ -314,193 +315,223 @@ public abstract class AbstractMakerBoard extends AbstractTransparentComponent<Vo
|
||||
g2d.setTransform(oldTx);
|
||||
}
|
||||
|
||||
private static final Area RASPBERRY_PI_LOGO_AREA = createRaspberryPiLogoArea();
|
||||
|
||||
private static Area createRaspberryPiLogoArea() {
|
||||
Path2D.Double p0 = new Path2D.Double(Path2D.WIND_NON_ZERO);
|
||||
p0.moveTo(19.6295, 0.0014);
|
||||
p0.curveTo(19.1612, 0.0159, 18.6569, 0.1889, 18.0849, 0.6402);
|
||||
p0.curveTo(16.6837, 0.0999, 15.3251, -0.0878, 14.1102, 1.0122);
|
||||
p0.curveTo(12.2342, 0.7689, 11.6245, 1.2710, 11.1626, 1.8572);
|
||||
p0.curveTo(10.7507, 1.8487, 8.0807, 1.4339, 6.8564, 3.2603);
|
||||
p0.curveTo(3.7794, 2.8963, 2.8070, 5.0701, 3.9089, 7.0973);
|
||||
p0.curveTo(3.2805, 8.0702, 2.6293, 9.0313, 4.0989, 10.8859);
|
||||
p0.curveTo(3.5790, 11.9189, 3.9013, 13.0394, 5.1259, 14.3954);
|
||||
p0.curveTo(4.8027, 15.8475, 5.4379, 16.8720, 6.5775, 17.6704);
|
||||
p0.curveTo(6.3644, 19.6575, 8.3997, 20.8128, 9.0075, 21.2245);
|
||||
p0.curveTo(9.2408, 22.3823, 9.7272, 23.4749, 12.0520, 24.0790);
|
||||
p0.curveTo(12.4354, 25.8045, 13.8326, 26.1024, 15.1856, 26.4646);
|
||||
p0.curveTo(10.7138, 29.0639, 6.8789, 32.4840, 6.9049, 40.8755);
|
||||
p0.lineTo(6.2500, 42.0440);
|
||||
p0.curveTo(1.1224, 45.1622, -3.4908, 55.1843, 3.7230, 63.3304);
|
||||
p0.curveTo(4.1942, 65.8804, 4.9845, 67.7119, 5.6881, 69.7390);
|
||||
p0.curveTo(6.7405, 77.9072, 13.6088, 81.7320, 15.4203, 82.1843);
|
||||
p0.curveTo(18.0749, 84.2063, 20.9021, 86.1249, 24.7280, 87.4689);
|
||||
p0.curveTo(28.3346, 91.1885, 32.2420, 92.6062, 36.1706, 92.6039);
|
||||
p0.curveTo(36.2282, 92.6039, 36.2868, 92.6045, 36.3445, 92.6039);
|
||||
p0.curveTo(40.2731, 92.6063, 44.1803, 91.1887, 47.7870, 87.4689);
|
||||
p0.curveTo(51.6128, 86.1249, 54.4401, 84.2063, 57.0947, 82.1843);
|
||||
p0.curveTo(58.9062, 81.7319, 65.7745, 77.9072, 66.8269, 69.7390);
|
||||
p0.curveTo(67.5305, 67.7119, 68.3208, 65.8803, 68.7920, 63.3304);
|
||||
p0.curveTo(76.0057, 55.1837, 71.3926, 45.1609, 66.2650, 42.0427);
|
||||
p0.lineTo(65.6090, 40.8744);
|
||||
p0.curveTo(65.6350, 32.4834, 61.8002, 29.0634, 57.3284, 26.4634);
|
||||
p0.curveTo(58.6814, 26.1014, 60.0786, 25.8034, 60.4619, 24.0779);
|
||||
p0.curveTo(62.7867, 23.4737, 63.2732, 22.3811, 63.5065, 21.2234);
|
||||
p0.curveTo(64.1143, 20.8118, 66.1495, 19.6564, 65.9365, 17.6693);
|
||||
p0.curveTo(67.0759, 16.8708, 67.7113, 15.8463, 67.3880, 14.3943);
|
||||
p0.curveTo(68.6127, 13.0383, 68.9350, 11.9177, 68.4150, 10.8847);
|
||||
p0.curveTo(69.8849, 9.0309, 69.2328, 8.0698, 68.6052, 7.0970);
|
||||
p0.curveTo(69.7063, 5.0698, 68.7346, 2.8959, 65.6566, 3.2600);
|
||||
p0.curveTo(64.4326, 1.4335, 61.7634, 1.8484, 61.3506, 1.8569);
|
||||
p0.curveTo(60.8887, 1.2707, 60.2793, 0.7685, 58.4032, 1.0119);
|
||||
p0.curveTo(57.1883, -0.0882, 55.8298, 0.0995, 54.4285, 0.6399);
|
||||
p0.curveTo(52.7646, -0.6731, 51.6635, 0.3794, 50.4059, 0.7773);
|
||||
p0.curveTo(48.3914, 0.1191, 47.9309, 1.0207, 46.9410, 1.3879);
|
||||
p0.curveTo(44.7440, 0.9236, 44.0764, 1.9344, 43.0232, 3.0012);
|
||||
p0.lineTo(41.7982, 2.9769);
|
||||
p0.curveTo(38.4844, 4.9297, 36.8382, 8.9061, 36.2548, 10.9503);
|
||||
p0.curveTo(35.6710, 8.9057, 34.0286, 4.9293, 30.7155, 2.9769);
|
||||
p0.lineTo(29.4904, 3.0012);
|
||||
p0.curveTo(28.4359, 1.9344, 27.7683, 0.9236, 25.5714, 1.3879);
|
||||
p0.curveTo(24.5815, 1.0207, 24.1222, 0.1191, 22.1064, 0.7773);
|
||||
p0.curveTo(21.2810, 0.5162, 20.5218, -0.0267, 19.6279, 0.0010);
|
||||
p0.closePath();
|
||||
|
||||
Path2D.Double p1 = new Path2D.Double(Path2D.WIND_NON_ZERO);
|
||||
p1.moveTo(13.0322, 8.5925);
|
||||
p1.curveTo(21.8236, 13.1250, 26.9346, 16.7915, 29.7345, 19.9142);
|
||||
p1.curveTo(28.3006, 25.6612, 20.8204, 25.9235, 18.0852, 25.7623);
|
||||
p1.curveTo(18.6452, 25.5016, 19.1125, 25.1894, 19.2782, 24.7097);
|
||||
p1.curveTo(18.5919, 24.2219, 16.1583, 24.6583, 14.4594, 23.7037);
|
||||
p1.curveTo(15.1120, 23.5686, 15.4173, 23.4369, 15.7225, 22.9552);
|
||||
p1.curveTo(14.1174, 22.4433, 12.3885, 22.0022, 11.3715, 21.1541);
|
||||
p1.curveTo(11.9203, 21.1609, 12.4327, 21.2768, 13.1493, 20.7798);
|
||||
p1.curveTo(11.7116, 20.0050, 10.1775, 19.3910, 8.9856, 18.2068);
|
||||
p1.curveTo(9.7289, 18.1885, 10.5303, 18.1994, 10.7633, 17.9260);
|
||||
p1.curveTo(9.4475, 17.1108, 8.3373, 16.2042, 7.4183, 15.2126);
|
||||
p1.curveTo(8.4585, 15.3381, 8.8977, 15.2300, 9.1493, 15.0488);
|
||||
p1.curveTo(8.1546, 14.0300, 6.8956, 13.1698, 6.2954, 11.9143);
|
||||
p1.curveTo(7.0678, 12.1805, 7.7744, 12.2825, 8.2838, 11.8909);
|
||||
p1.curveTo(7.9458, 11.1284, 6.4976, 10.6787, 5.6638, 8.8967);
|
||||
p1.curveTo(6.4770, 8.9756, 7.3394, 9.0741, 7.5119, 8.8967);
|
||||
p1.curveTo(7.1345, 7.3591, 6.4869, 6.4947, 5.8518, 5.5991);
|
||||
p1.curveTo(7.5920, 5.5732, 10.2286, 5.6058, 10.1092, 5.4587);
|
||||
p1.lineTo(9.0332, 4.3593);
|
||||
p1.curveTo(10.7330, 3.9016, 12.4723, 4.4328, 13.7350, 4.8271);
|
||||
p1.curveTo(14.3020, 4.3797, 13.7250, 3.8141, 13.0332, 3.2365);
|
||||
p1.curveTo(14.4778, 3.4293, 15.7832, 3.7615, 16.9630, 4.2189);
|
||||
p1.curveTo(17.5935, 3.6497, 16.5537, 3.0805, 16.0507, 2.5113);
|
||||
p1.curveTo(18.2825, 2.9347, 19.2281, 3.5297, 20.1677, 4.1253);
|
||||
p1.curveTo(20.8496, 3.4719, 20.2068, 2.9165, 19.7467, 2.3476);
|
||||
p1.curveTo(21.4295, 2.9709, 22.2962, 3.7756, 23.2088, 4.5698);
|
||||
p1.curveTo(23.5182, 4.1523, 23.9948, 3.8463, 23.4193, 2.8388);
|
||||
p1.curveTo(24.6141, 3.5275, 25.5139, 4.3390, 26.1796, 5.2482);
|
||||
p1.curveTo(26.9189, 4.7775, 26.6200, 4.1338, 26.6241, 3.5406);
|
||||
p1.curveTo(27.8657, 4.5506, 28.6537, 5.6255, 29.6183, 6.6751);
|
||||
p1.curveTo(29.8126, 6.5336, 29.9827, 6.0538, 30.1329, 5.2949);
|
||||
p1.curveTo(33.0952, 8.1688, 37.2809, 15.4074, 31.2089, 18.2774);
|
||||
p1.curveTo(26.0413, 14.0154, 19.8697, 10.9176, 13.0304, 8.5937);
|
||||
p1.closePath();
|
||||
p1.moveTo(59.6793, 8.5925);
|
||||
p1.curveTo(50.8889, 13.1254, 45.7783, 16.7909, 42.9783, 19.9142);
|
||||
p1.curveTo(44.4122, 25.6612, 51.8924, 25.9235, 54.6276, 25.7623);
|
||||
p1.curveTo(54.0676, 25.5016, 53.6003, 25.1894, 53.4346, 24.7097);
|
||||
p1.curveTo(54.1210, 24.2219, 56.5545, 24.6583, 58.2535, 23.7037);
|
||||
p1.curveTo(57.6008, 23.5686, 57.2955, 23.4369, 56.9903, 22.9552);
|
||||
p1.curveTo(58.5954, 22.4433, 60.3244, 22.0022, 61.3413, 21.1541);
|
||||
p1.curveTo(60.7925, 21.1609, 60.2801, 21.2768, 59.5635, 20.7798);
|
||||
p1.curveTo(61.0012, 20.0050, 62.5353, 19.3910, 63.7272, 18.2068);
|
||||
p1.curveTo(62.9839, 18.1885, 62.1825, 18.1994, 61.9495, 17.9260);
|
||||
p1.curveTo(63.2653, 17.1108, 64.3755, 16.2042, 65.2946, 15.2126);
|
||||
p1.curveTo(64.2543, 15.3381, 63.8151, 15.2300, 63.5636, 15.0488);
|
||||
p1.curveTo(64.5582, 14.0300, 65.8172, 13.1698, 66.4174, 11.9143);
|
||||
p1.curveTo(65.6450, 12.1805, 64.9384, 12.2825, 64.4290, 11.8909);
|
||||
p1.curveTo(64.7670, 11.1284, 66.2152, 10.6787, 67.0490, 8.8967);
|
||||
p1.curveTo(66.2358, 8.9756, 65.3734, 9.0741, 65.2010, 8.8967);
|
||||
p1.curveTo(65.5790, 7.3585, 66.2266, 6.4940, 66.8617, 5.5984);
|
||||
p1.curveTo(65.1215, 5.5726, 62.4849, 5.6052, 62.6043, 5.4581);
|
||||
p1.lineTo(63.6803, 4.3587);
|
||||
p1.curveTo(61.9805, 3.9010, 60.2411, 4.4322, 58.9785, 4.8265);
|
||||
p1.curveTo(58.4115, 4.3791, 58.9885, 3.8135, 59.6802, 3.2358);
|
||||
p1.curveTo(58.2357, 3.4287, 56.9302, 3.7608, 55.7504, 4.2183);
|
||||
p1.curveTo(55.1200, 3.6491, 56.1598, 3.0799, 56.6627, 2.5107);
|
||||
p1.curveTo(54.4310, 2.9341, 53.4854, 3.5290, 52.5457, 4.1247);
|
||||
p1.curveTo(51.8639, 3.4713, 52.5067, 2.9159, 52.9667, 2.3470);
|
||||
p1.curveTo(51.2840, 2.9703, 50.4172, 3.7750, 49.5047, 4.5692);
|
||||
p1.curveTo(49.1953, 4.1517, 48.7187, 3.8456, 49.2941, 2.8382);
|
||||
p1.curveTo(48.0994, 3.5268, 47.1995, 4.3384, 46.5338, 5.2476);
|
||||
p1.curveTo(45.7946, 4.7769, 46.0934, 4.1332, 46.0894, 3.5399);
|
||||
p1.curveTo(44.8477, 4.5499, 44.0597, 5.6249, 43.0952, 6.6744);
|
||||
p1.curveTo(42.9009, 6.5330, 42.7307, 6.0532, 42.5805, 5.2943);
|
||||
p1.curveTo(39.6183, 8.1682, 35.4325, 15.4067, 41.5045, 18.2768);
|
||||
p1.curveTo(46.6695, 14.0139, 52.8407, 10.9163, 59.6805, 8.5924);
|
||||
p1.closePath();
|
||||
|
||||
Path2D.Double p2 = new Path2D.Double(Path2D.WIND_NON_ZERO);
|
||||
p2.moveTo(47.0024, 67.1140);
|
||||
p2.curveTo(47.0188, 70.5889, 45.0112, 73.8170, 41.7504, 75.5588);
|
||||
p2.curveTo(38.4896, 77.3006, 34.4542, 77.3006, 31.1934, 75.5588);
|
||||
p2.curveTo(27.9326, 73.8170, 25.9250, 70.5889, 25.9414, 67.1140);
|
||||
p2.curveTo(25.9250, 63.6391, 27.9326, 60.4110, 31.1934, 58.6692);
|
||||
p2.curveTo(34.4542, 56.9274, 38.4896, 56.9274, 41.7504, 58.6692);
|
||||
p2.curveTo(45.0112, 60.4110, 47.0188, 63.6391, 47.0024, 67.1140);
|
||||
p2.closePath();
|
||||
p2.moveTo(30.3786, 39.3746);
|
||||
p2.curveTo(33.2055, 41.2176, 34.6522, 44.7077, 34.1649, 48.5090);
|
||||
p2.curveTo(33.6776, 52.3102, 31.3275, 55.8665, 28.0144, 57.8164);
|
||||
p2.curveTo(24.7013, 59.7663, 20.9097, 59.8245, 18.0912, 57.9688);
|
||||
p2.curveTo(15.2643, 56.1258, 13.8176, 52.6357, 14.3049, 48.8344);
|
||||
p2.curveTo(14.7922, 45.0332, 17.1423, 41.4769, 20.4554, 39.5270);
|
||||
p2.curveTo(23.7685, 37.5771, 27.5601, 37.5189, 30.3786, 39.3746);
|
||||
p2.closePath();
|
||||
|
||||
Path2D.Double p3 = new Path2D.Double(Path2D.WIND_NON_ZERO);
|
||||
p3.moveTo(42.1557, 38.8570);
|
||||
p3.curveTo(37.8215, 41.6966, 37.0284, 48.2301, 40.3987, 53.3303);
|
||||
p3.curveTo(43.7691, 58.4306, 50.1089, 60.2909, 54.4431, 57.4513);
|
||||
p3.curveTo(58.7773, 54.6117, 59.5704, 48.0782, 56.2001, 42.9780);
|
||||
p3.curveTo(52.8297, 37.8777, 46.4899, 36.0174, 42.1557, 38.8570);
|
||||
p3.closePath();
|
||||
p3.moveTo(8.5710, 44.0484);
|
||||
p3.curveTo(13.2819, 42.7856, 10.1614, 63.5377, 6.3284, 61.8350);
|
||||
p3.curveTo(2.1120, 58.4438, 0.7540, 48.5122, 8.5710, 44.0484);
|
||||
p3.closePath();
|
||||
|
||||
Path2D.Double p4 = new Path2D.Double(Path2D.WIND_NON_ZERO);
|
||||
p4.moveTo(63.0123, 43.7896);
|
||||
p4.curveTo(58.3009, 42.5272, 61.4219, 63.2802, 65.2549, 61.5775);
|
||||
p4.curveTo(69.4712, 58.1859, 70.8292, 48.2535, 63.0123, 43.7896);
|
||||
p4.closePath();
|
||||
p4.moveTo(47.0060, 28.3359);
|
||||
p4.curveTo(55.1360, 26.9631, 61.9009, 31.7933, 61.6279, 40.6091);
|
||||
p4.curveTo(61.3605, 43.9888, 44.0109, 28.8391, 47.0061, 28.3359);
|
||||
p4.closePath();
|
||||
p4.moveTo(24.5436, 28.0771);
|
||||
p4.curveTo(16.4130, 26.7043, 9.6488, 31.5356, 9.9218, 40.3506);
|
||||
p4.curveTo(10.1892, 43.7301, 27.5388, 28.5804, 24.5436, 28.0771);
|
||||
p4.closePath();
|
||||
p4.moveTo(36.2218, 26.0212);
|
||||
p4.curveTo(31.3695, 25.8950, 26.7127, 29.6225, 26.7014, 31.7845);
|
||||
p4.curveTo(26.6879, 34.4115, 30.5378, 37.1013, 36.2548, 37.1695);
|
||||
p4.curveTo(42.0931, 37.2113, 45.8185, 35.0165, 45.8372, 32.3055);
|
||||
p4.curveTo(45.8585, 29.2338, 40.5274, 25.9737, 36.2217, 26.0211);
|
||||
p4.closePath();
|
||||
p4.moveTo(36.5181, 79.8920);
|
||||
p4.curveTo(40.7486, 79.7073, 46.4253, 81.2546, 46.4364, 83.3072);
|
||||
p4.curveTo(46.5066, 85.3003, 41.2882, 89.8037, 36.2375, 89.7166);
|
||||
p4.curveTo(31.0069, 89.9423, 25.8778, 85.4319, 25.9449, 83.8686);
|
||||
p4.curveTo(25.8666, 81.5764, 32.3140, 79.7867, 36.5181, 79.8919);
|
||||
p4.closePath();
|
||||
p4.moveTo(20.8923, 67.7271);
|
||||
p4.curveTo(23.9043, 71.3559, 25.2773, 77.7311, 22.7637, 79.6104);
|
||||
p4.curveTo(20.3857, 81.0450, 14.6109, 80.4542, 10.5063, 74.5576);
|
||||
p4.curveTo(7.7381, 69.6096, 8.0949, 64.5746, 10.0385, 63.0956);
|
||||
p4.curveTo(12.9450, 61.3250, 17.4358, 63.7165, 20.8925, 67.7271);
|
||||
p4.closePath();
|
||||
p4.moveTo(51.5410, 66.5770);
|
||||
p4.curveTo(48.2822, 70.3940, 46.4676, 77.3560, 48.8449, 79.5982);
|
||||
p4.curveTo(51.1179, 81.3402, 57.2199, 81.0967, 61.7272, 74.8425);
|
||||
p4.curveTo(65.0002, 70.6421, 63.9035, 63.6272, 62.0340, 61.7643);
|
||||
p4.curveTo(59.2569, 59.6163, 55.2701, 62.3653, 51.5410, 66.5759);
|
||||
p4.closePath();
|
||||
|
||||
Area area = new Area(p0);
|
||||
area.subtract(new Area(p1));
|
||||
area.subtract(new Area(p2));
|
||||
area.subtract(new Area(p3));
|
||||
area.subtract(new Area(p4));
|
||||
|
||||
return area;
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper to draw the Raspberry Pi logo in white using Path2D vector paths.
|
||||
* Native viewBox is 32 x 32.
|
||||
* Helper to draw the Raspberry Pi logo in white using vector paths.
|
||||
* Native bounding box is 72.51 x 92.60 px.
|
||||
*
|
||||
* @param g2d Graphics2D context
|
||||
* @param x Top-left X coordinate
|
||||
* @param y Top-left Y coordinate
|
||||
* @param size Target width and height in pixels
|
||||
* @param size Target height in pixels
|
||||
*/
|
||||
public static void drawRaspberryPiLogo(Graphics2D g2d, double x, double y, double size) {
|
||||
AffineTransform oldTx = g2d.getTransform();
|
||||
g2d.translate(x, y);
|
||||
double scale = size / 32.0;
|
||||
double scale = size / 92.604;
|
||||
g2d.scale(scale, scale);
|
||||
|
||||
Path2D.Double logoPath = new Path2D.Double(Path2D.WIND_NON_ZERO);
|
||||
logoPath.moveTo(13.8, 6.4);
|
||||
logoPath.curveTo(12.400, 5.300, 10.900, 4.500, 9.200, 3.900);
|
||||
logoPath.curveTo(10.700, 4.800, 12.200, 5.600, 13.400, 6.800);
|
||||
logoPath.curveTo(13.300, 7.900, 11.900, 8.600, 10.300, 8.500);
|
||||
logoPath.curveTo(10.200, 8.400, 10.400, 8.400, 10.400, 8.200);
|
||||
logoPath.curveTo(10.0, 8.1, 9.5, 8.2, 9.2, 8.0);
|
||||
logoPath.curveTo(9.200, 7.900, 9.400, 7.900, 9.300, 7.800);
|
||||
logoPath.curveTo(9.0, 7.6, 8.6, 7.5, 8.3, 7.3);
|
||||
logoPath.curveTo(8.300, 7.200, 8.500, 7.200, 8.600, 7.100);
|
||||
logoPath.curveTo(8.300, 6.900, 7.900, 6.800, 7.600, 6.500);
|
||||
logoPath.curveTo(7.700, 6.400, 7.800, 6.500, 7.900, 6.300);
|
||||
logoPath.curveTo(7.6, 6.1, 7.3, 5.9, 7.1, 5.6);
|
||||
logoPath.curveTo(7.200, 5.500, 7.300, 5.600, 7.400, 5.500);
|
||||
logoPath.curveTo(7.3, 5.2, 6.9, 5.0, 6.8, 4.7);
|
||||
logoPath.curveTo(7.000, 4.700, 7.100, 4.800, 7.300, 4.600);
|
||||
logoPath.curveTo(7.1, 4.3, 6.7, 4.2, 6.6, 3.8);
|
||||
logoPath.curveTo(6.700, 3.700, 6.900, 3.800, 7.000, 3.700);
|
||||
logoPath.curveTo(7.000, 3.400, 6.800, 3.200, 6.700, 2.900);
|
||||
logoPath.curveTo(7.000, 2.800, 7.400, 2.900, 7.700, 2.800);
|
||||
logoPath.curveTo(7.700, 2.700, 7.600, 2.600, 7.600, 2.500);
|
||||
logoPath.curveTo(8.000, 2.300, 8.400, 2.500, 8.800, 2.600);
|
||||
logoPath.curveTo(8.900, 2.400, 8.700, 2.400, 8.800, 2.200);
|
||||
logoPath.curveTo(9.100, 2.200, 9.400, 2.400, 9.800, 2.400);
|
||||
logoPath.curveTo(9.9, 2.2, 9.6, 2.2, 9.6, 2.0);
|
||||
logoPath.curveTo(10.000, 2.000, 10.300, 2.200, 10.600, 2.400);
|
||||
logoPath.curveTo(10.700, 2.300, 10.600, 2.200, 10.700, 2.000);
|
||||
logoPath.curveTo(11.000, 2.100, 11.200, 2.300, 11.500, 2.500);
|
||||
logoPath.curveTo(11.700, 2.500, 11.600, 2.300, 11.700, 2.200);
|
||||
logoPath.curveTo(12.000, 2.300, 12.200, 2.600, 12.400, 2.700);
|
||||
logoPath.curveTo(12.600, 2.700, 12.500, 2.500, 12.600, 2.400);
|
||||
logoPath.curveTo(12.900, 2.600, 13.100, 2.900, 13.300, 3.100);
|
||||
logoPath.curveTo(13.500, 3.100, 13.400, 2.900, 13.600, 2.900);
|
||||
logoPath.curveTo(14.200, 3.600, 14.800, 4.400, 14.700, 5.400);
|
||||
logoPath.curveTo(14.7, 5.9, 14.3, 6.2, 13.8, 6.4);
|
||||
logoPath.lineTo(13.8, 6.4);
|
||||
logoPath.closePath();
|
||||
logoPath.moveTo(23.5, 7.1);
|
||||
logoPath.curveTo(23.600, 7.200, 23.700, 7.200, 23.800, 7.200);
|
||||
logoPath.curveTo(23.500, 7.500, 23.100, 7.500, 22.700, 7.700);
|
||||
logoPath.curveTo(22.700, 7.800, 22.800, 7.800, 22.800, 7.900);
|
||||
logoPath.curveTo(22.500, 8.100, 22.000, 8.000, 21.700, 8.100);
|
||||
logoPath.curveTo(21.600, 8.200, 21.800, 8.300, 21.700, 8.400);
|
||||
logoPath.curveTo(21.300, 8.500, 20.900, 8.400, 20.400, 8.300);
|
||||
logoPath.curveTo(19.500, 8.100, 18.800, 7.700, 18.500, 6.800);
|
||||
logoPath.curveTo(19.700, 5.500, 21.200, 4.700, 22.700, 3.900);
|
||||
logoPath.curveTo(21.000, 4.500, 19.500, 5.300, 18.100, 6.300);
|
||||
logoPath.curveTo(17.500, 6.100, 17.200, 5.600, 17.200, 5.000);
|
||||
logoPath.curveTo(17.200, 4.300, 17.800, 3.200, 18.400, 2.700);
|
||||
logoPath.lineTo(18.6, 3.0);
|
||||
logoPath.curveTo(18.900, 2.800, 19.100, 2.400, 19.400, 2.300);
|
||||
logoPath.curveTo(19.500, 2.400, 19.400, 2.600, 19.600, 2.600);
|
||||
logoPath.curveTo(19.800, 2.500, 20.000, 2.200, 20.300, 2.100);
|
||||
logoPath.curveTo(20.400, 2.200, 20.300, 2.300, 20.500, 2.400);
|
||||
logoPath.curveTo(20.8, 2.4, 21.0, 2.1, 21.4, 2.0);
|
||||
logoPath.curveTo(21.400, 2.100, 21.300, 2.200, 21.400, 2.400);
|
||||
logoPath.curveTo(21.7, 2.2, 22.0, 2.0, 22.4, 2.0);
|
||||
logoPath.curveTo(22.400, 2.100, 22.200, 2.200, 22.300, 2.400);
|
||||
logoPath.curveTo(22.600, 2.400, 22.900, 2.200, 23.300, 2.200);
|
||||
logoPath.curveTo(23.300, 2.300, 23.200, 2.400, 23.300, 2.600);
|
||||
logoPath.curveTo(23.700, 2.500, 24.100, 2.400, 24.500, 2.500);
|
||||
logoPath.curveTo(24.500, 2.600, 24.400, 2.700, 24.400, 2.800);
|
||||
logoPath.curveTo(24.700, 2.900, 25.100, 2.800, 25.400, 2.900);
|
||||
logoPath.curveTo(25.3, 3.2, 25.0, 3.4, 25.0, 3.7);
|
||||
logoPath.curveTo(25.100, 3.800, 25.300, 3.700, 25.400, 3.800);
|
||||
logoPath.curveTo(25.300, 4.200, 24.900, 4.300, 24.800, 4.600);
|
||||
logoPath.curveTo(24.900, 4.800, 25.100, 4.600, 25.200, 4.700);
|
||||
logoPath.curveTo(25.100, 5.000, 24.700, 5.200, 24.500, 5.500);
|
||||
logoPath.curveTo(24.600, 5.700, 24.700, 5.600, 24.800, 5.600);
|
||||
logoPath.curveTo(24.600, 5.900, 24.300, 6.000, 24.100, 6.300);
|
||||
logoPath.curveTo(24.200, 6.400, 24.300, 6.400, 24.400, 6.500);
|
||||
logoPath.curveTo(24.2, 6.8, 23.8, 6.9, 23.5, 7.1);
|
||||
logoPath.lineTo(23.5, 7.1);
|
||||
logoPath.closePath();
|
||||
logoPath.moveTo(15.4, 16.0);
|
||||
logoPath.curveTo(15.400, 17.800, 14.000, 19.600, 12.200, 20.000);
|
||||
logoPath.curveTo(10.400, 20.400, 8.800, 19.100, 8.700, 17.300);
|
||||
logoPath.curveTo(8.600, 15.500, 9.900, 13.700, 11.600, 13.300);
|
||||
logoPath.curveTo(13.7, 12.7, 15.4, 14.0, 15.4, 16.0);
|
||||
logoPath.closePath();
|
||||
logoPath.moveTo(23.4, 16.9);
|
||||
logoPath.curveTo(23.400, 19.000, 21.600, 20.300, 19.600, 19.700);
|
||||
logoPath.curveTo(17.800, 19.100, 16.500, 17.200, 16.800, 15.300);
|
||||
logoPath.curveTo(17.100, 13.500, 18.900, 12.400, 20.700, 13.100);
|
||||
logoPath.curveTo(22.3, 13.7, 23.4, 15.3, 23.4, 16.9);
|
||||
logoPath.lineTo(23.4, 16.9);
|
||||
logoPath.closePath();
|
||||
logoPath.moveTo(16.1, 19.4);
|
||||
logoPath.curveTo(17.100, 19.400, 18.100, 19.800, 18.800, 20.600);
|
||||
logoPath.curveTo(20.000, 21.900, 19.900, 23.800, 18.600, 24.900);
|
||||
logoPath.curveTo(17.300, 26.000, 15.200, 26.100, 13.900, 25.000);
|
||||
logoPath.curveTo(12.900, 24.200, 12.500, 23.200, 12.700, 21.900);
|
||||
logoPath.curveTo(13.000, 20.600, 13.900, 19.900, 15.100, 19.500);
|
||||
logoPath.curveTo(15.4, 19.5, 15.7, 19.4, 16.1, 19.4);
|
||||
logoPath.lineTo(16.1, 19.4);
|
||||
logoPath.closePath();
|
||||
logoPath.moveTo(19.8, 25.3);
|
||||
logoPath.curveTo(19.900, 24.300, 20.300, 23.300, 21.100, 22.400);
|
||||
logoPath.curveTo(21.600, 21.900, 22.100, 21.400, 22.600, 21.000);
|
||||
logoPath.curveTo(22.900, 20.800, 23.200, 20.700, 23.500, 20.600);
|
||||
logoPath.curveTo(24.100, 20.500, 24.600, 20.700, 24.800, 21.300);
|
||||
logoPath.curveTo(25.200, 22.300, 25.300, 23.300, 24.800, 24.300);
|
||||
logoPath.curveTo(24.200, 25.700, 23.100, 26.600, 21.600, 26.900);
|
||||
logoPath.curveTo(21.500, 26.900, 21.300, 26.900, 21.100, 26.900);
|
||||
logoPath.curveTo(20.2, 27.0, 19.8, 26.6, 19.8, 25.3);
|
||||
logoPath.closePath();
|
||||
logoPath.moveTo(6.9, 22.7);
|
||||
logoPath.curveTo(6.900, 22.700, 6.900, 22.500, 6.900, 22.400);
|
||||
logoPath.curveTo(7.000, 21.300, 7.600, 20.900, 8.700, 21.200);
|
||||
logoPath.curveTo(10.400, 21.700, 12.000, 23.700, 12.100, 25.500);
|
||||
logoPath.curveTo(12.100, 26.600, 11.600, 27.100, 10.500, 26.900);
|
||||
logoPath.curveTo(9.000, 26.700, 8.000, 25.900, 7.400, 24.600);
|
||||
logoPath.curveTo(7.0, 24.0, 6.9, 23.4, 6.9, 22.7);
|
||||
logoPath.lineTo(6.9, 22.7);
|
||||
logoPath.closePath();
|
||||
logoPath.moveTo(16.2, 12.8);
|
||||
logoPath.curveTo(15.400, 12.800, 14.600, 12.700, 13.900, 12.300);
|
||||
logoPath.curveTo(12.600, 11.600, 12.600, 10.700, 13.700, 9.900);
|
||||
logoPath.curveTo(15.200, 8.800, 17.200, 8.900, 18.600, 10.100);
|
||||
logoPath.curveTo(18.700, 10.200, 18.800, 10.300, 18.900, 10.400);
|
||||
logoPath.curveTo(19.400, 11.000, 19.300, 11.600, 18.700, 12.100);
|
||||
logoPath.curveTo(18.200, 12.500, 17.600, 12.600, 17.000, 12.700);
|
||||
logoPath.curveTo(16.7, 12.8, 16.4, 12.8, 16.2, 12.8);
|
||||
logoPath.lineTo(16.2, 12.8);
|
||||
logoPath.closePath();
|
||||
logoPath.moveTo(16.0, 30.0);
|
||||
logoPath.curveTo(14.800, 30.000, 13.800, 29.500, 12.900, 28.600);
|
||||
logoPath.curveTo(12.500, 28.200, 12.500, 27.800, 13.000, 27.500);
|
||||
logoPath.curveTo(13.700, 27.100, 14.400, 26.900, 15.200, 26.800);
|
||||
logoPath.curveTo(16.200, 26.700, 17.200, 26.700, 18.200, 27.000);
|
||||
logoPath.curveTo(18.400, 27.100, 18.700, 27.200, 18.900, 27.300);
|
||||
logoPath.curveTo(19.500, 27.600, 19.600, 27.900, 19.100, 28.500);
|
||||
logoPath.curveTo(19.100, 28.500, 19.100, 28.500, 19.000, 28.600);
|
||||
logoPath.curveTo(18.3, 29.5, 17.3, 30.0, 16.0, 30.0);
|
||||
logoPath.closePath();
|
||||
logoPath.moveTo(7.8, 16.8);
|
||||
logoPath.curveTo(7.800, 17.900, 7.600, 18.900, 7.200, 19.900);
|
||||
logoPath.curveTo(7.100, 20.200, 7.000, 20.400, 6.800, 20.600);
|
||||
logoPath.curveTo(6.5, 21.0, 6.3, 21.0, 6.0, 20.7);
|
||||
logoPath.curveTo(4.600, 19.300, 4.800, 16.600, 6.500, 15.400);
|
||||
logoPath.curveTo(7.100, 14.900, 7.500, 15.000, 7.700, 15.800);
|
||||
logoPath.curveTo(7.7, 16.1, 7.8, 16.5, 7.8, 16.8);
|
||||
logoPath.lineTo(7.8, 16.8);
|
||||
logoPath.closePath();
|
||||
logoPath.moveTo(26.9, 18.3);
|
||||
logoPath.curveTo(26.900, 19.100, 26.600, 20.000, 26.000, 20.700);
|
||||
logoPath.curveTo(25.700, 21.000, 25.500, 21.000, 25.200, 20.700);
|
||||
logoPath.curveTo(24.900, 20.300, 24.700, 19.800, 24.600, 19.300);
|
||||
logoPath.curveTo(24.300, 18.300, 24.200, 17.200, 24.300, 16.100);
|
||||
logoPath.curveTo(24.300, 15.900, 24.400, 15.600, 24.500, 15.400);
|
||||
logoPath.curveTo(24.700, 15.000, 24.900, 14.900, 25.300, 15.200);
|
||||
logoPath.curveTo(26.3, 15.8, 26.9, 16.9, 26.9, 18.3);
|
||||
logoPath.closePath();
|
||||
logoPath.moveTo(7.5, 13.9);
|
||||
logoPath.curveTo(7.400, 12.600, 7.800, 11.400, 8.900, 10.600);
|
||||
logoPath.curveTo(10.000, 9.800, 11.200, 9.600, 12.500, 9.800);
|
||||
logoPath.curveTo(12.500, 10.100, 12.300, 10.300, 12.200, 10.500);
|
||||
logoPath.curveTo(11.500, 11.400, 10.600, 12.100, 9.800, 12.800);
|
||||
logoPath.curveTo(9.300, 13.200, 8.800, 13.500, 8.300, 13.800);
|
||||
logoPath.curveTo(7.9, 13.9, 7.7, 14.1, 7.5, 13.9);
|
||||
logoPath.closePath();
|
||||
logoPath.moveTo(24.6, 14.0);
|
||||
logoPath.curveTo(24.400, 14.100, 24.100, 14.000, 23.900, 13.800);
|
||||
logoPath.curveTo(23.200, 13.400, 22.500, 12.900, 21.900, 12.400);
|
||||
logoPath.curveTo(21.200, 11.800, 20.600, 11.200, 20.000, 10.600);
|
||||
logoPath.curveTo(19.900, 10.400, 19.700, 10.200, 19.700, 10.000);
|
||||
logoPath.curveTo(20.300, 9.700, 22.300, 9.800, 23.300, 10.700);
|
||||
logoPath.curveTo(24.3, 11.5, 24.9, 13.1, 24.6, 14.0);
|
||||
logoPath.closePath();
|
||||
|
||||
g2d.setColor(Color.WHITE);
|
||||
g2d.fill(logoPath);
|
||||
g2d.fill(RASPBERRY_PI_LOGO_AREA);
|
||||
g2d.setTransform(oldTx);
|
||||
}
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@ import java.awt.Graphics2D;
|
||||
import java.awt.Shape;
|
||||
import java.awt.geom.AffineTransform;
|
||||
import java.awt.geom.Point2D;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import java.awt.geom.RoundRectangle2D;
|
||||
|
||||
import org.diylc.awt.StringUtils;
|
||||
@@ -103,9 +104,9 @@ public class RaspberryPiPico extends AbstractMakerBoard {
|
||||
relativeOffsets[20 + i][0] = rowSpacing;
|
||||
relativeOffsets[20 + i][1] = i * spacing;
|
||||
}
|
||||
// SWD Debug Header (40..42) at bottom center
|
||||
// SWD Debug Header (40..42) at bottom center, aligned with bottom row of pins
|
||||
double swdX = rowSpacing / 2.0 - spacing;
|
||||
double swdY = 20 * spacing;
|
||||
double swdY = 19 * spacing;
|
||||
for (int i = 0; i < 3; i++) {
|
||||
relativeOffsets[40 + i][0] = swdX + i * spacing;
|
||||
relativeOffsets[40 + i][1] = swdY;
|
||||
@@ -119,12 +120,13 @@ public class RaspberryPiPico extends AbstractMakerBoard {
|
||||
Point2D p0 = controlPoints[0];
|
||||
double x = p0.getX();
|
||||
double y = p0.getY();
|
||||
double rowSpacing = new Size(0.7d, SizeUnit.in).convertToPixels();
|
||||
double boardW = rowSpacing + 26;
|
||||
double boardH = 21 * PIN_SPACING.convertToPixels() + 10;
|
||||
double boardX = x - 13;
|
||||
double boardY = y - 12;
|
||||
return new RoundRectangle2D.Double(boardX, boardY, boardW, boardH, 8, 8);
|
||||
double boardW = BOARD_WIDTH.convertToPixels();
|
||||
double boardH = BOARD_LENGTH.convertToPixels();
|
||||
double pin1OffsetX = new Size(1.61d, SizeUnit.mm).convertToPixels();
|
||||
double pin1OffsetY = new Size(1.37d, SizeUnit.mm).convertToPixels();
|
||||
double boardX = x - pin1OffsetX;
|
||||
double boardY = y - pin1OffsetY;
|
||||
return new Rectangle2D.Double(boardX, boardY, boardW, boardH);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -143,11 +145,12 @@ public class RaspberryPiPico extends AbstractMakerBoard {
|
||||
g2d.rotate(orientation.toRadians(), x, y);
|
||||
}
|
||||
|
||||
double rowSpacing = new Size(0.7d, SizeUnit.in).convertToPixels();
|
||||
double boardW = rowSpacing + 26;
|
||||
double boardH = 21 * PIN_SPACING.convertToPixels() + 10;
|
||||
double boardX = x - 13;
|
||||
double boardY = y - 12;
|
||||
double boardW = BOARD_WIDTH.convertToPixels();
|
||||
double boardH = BOARD_LENGTH.convertToPixels();
|
||||
double pin1OffsetX = new Size(1.61d, SizeUnit.mm).convertToPixels();
|
||||
double pin1OffsetY = new Size(1.37d, SizeUnit.mm).convertToPixels();
|
||||
double boardX = x - pin1OffsetX;
|
||||
double boardY = y - pin1OffsetY;
|
||||
|
||||
Shape boardShape = getBodyShape();
|
||||
|
||||
@@ -163,23 +166,52 @@ public class RaspberryPiPico extends AbstractMakerBoard {
|
||||
g2d.draw(boardShape);
|
||||
|
||||
if (!outlineMode) {
|
||||
// Micro USB
|
||||
drawMetalConnector(g2d, boardX + (boardW - 55) / 2.0, boardY - 8, 55, 40, "USB");
|
||||
// 4 Mounting holes (2.1mm diameter)
|
||||
double holeDiameter = new Size(2.1d, SizeUnit.mm).convertToPixels();
|
||||
double topHoleY = boardY + new Size(2.0d, SizeUnit.mm).convertToPixels();
|
||||
double bottomHoleY = boardY + boardH - new Size(2.4d, SizeUnit.mm).convertToPixels();
|
||||
double leftHoleX = boardX + new Size(4.8d, SizeUnit.mm).convertToPixels();
|
||||
double rightHoleX = boardX + boardW - new Size(4.8d, SizeUnit.mm).convertToPixels();
|
||||
|
||||
drawMountingHole(g2d, leftHoleX, topHoleY, holeDiameter);
|
||||
drawMountingHole(g2d, rightHoleX, topHoleY, holeDiameter);
|
||||
drawMountingHole(g2d, leftHoleX, bottomHoleY, holeDiameter);
|
||||
drawMountingHole(g2d, rightHoleX, bottomHoleY, holeDiameter);
|
||||
|
||||
// Micro USB Connector
|
||||
double usbW = new Size(7.5d, SizeUnit.mm).convertToPixels();
|
||||
double usbH = new Size(5.6d, SizeUnit.mm).convertToPixels();
|
||||
double usbOverhang = new Size(1.3d, SizeUnit.mm).convertToPixels();
|
||||
drawMetalConnector(g2d, boardX + (boardW - usbW) / 2.0, boardY - usbOverhang, usbW, usbH, "USB");
|
||||
|
||||
// BOOTSEL button
|
||||
double btnW = new Size(3.8d, SizeUnit.mm).convertToPixels();
|
||||
double btnH = new Size(3.0d, SizeUnit.mm).convertToPixels();
|
||||
double btnY = boardY + new Size(11.5d, SizeUnit.mm).convertToPixels();
|
||||
g2d.setColor(Color.WHITE);
|
||||
g2d.fill(new RoundRectangle2D.Double(boardX + (boardW - 30) / 2.0, boardY + 45, 30, 20, 3, 3));
|
||||
g2d.fill(new RoundRectangle2D.Double(boardX + (boardW - btnW) / 2.0, btnY, btnW, btnH, 2, 2));
|
||||
g2d.setColor(Color.DARK_GRAY);
|
||||
g2d.setFont(SILK_FONT_SMALL);
|
||||
StringUtils.drawCenteredText(g2d, "BOOT", boardX + boardW / 2.0, boardY + 55, HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
|
||||
StringUtils.drawCenteredText(g2d, "BOOT", boardX + boardW / 2.0, btnY + btnH / 2.0, HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
|
||||
|
||||
// RP2040 chip
|
||||
drawChip(g2d, boardX + (boardW - 60) / 2.0, boardY + 120, 60, 60, "RP2040");
|
||||
double chipSize = new Size(7.0d, SizeUnit.mm).convertToPixels();
|
||||
double chipX = boardX + (boardW - chipSize) / 2.0;
|
||||
double chipY = boardY + new Size(23.0d, SizeUnit.mm).convertToPixels();
|
||||
drawChip(g2d, chipX, chipY, chipSize, chipSize, "RP2040");
|
||||
|
||||
// Silkscreen text
|
||||
// Raspberry Pi Logo at bottom of the board (~9mm height)
|
||||
double logoSize = new Size(9.0d, SizeUnit.mm).convertToPixels();
|
||||
double logoWidth = logoSize * 72.515 / 92.604;
|
||||
double logoX = boardX + (boardW - logoWidth) / 2.0;
|
||||
double logoY = boardY + new Size(35.5d, SizeUnit.mm).convertToPixels();
|
||||
drawRaspberryPiLogo(g2d, logoX, logoY, logoSize);
|
||||
|
||||
// DEBUG silkscreen text above SWD pins
|
||||
g2d.setColor(Color.WHITE);
|
||||
g2d.setFont(SILK_FONT);
|
||||
StringUtils.drawCenteredText(g2d, "PICO", boardX + boardW / 2.0, boardY + 220, HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
|
||||
g2d.setFont(SILK_FONT_SMALL);
|
||||
StringUtils.drawCenteredText(g2d, "DEBUG", boardX + boardW / 2.0, boardY + new Size(46.8d, SizeUnit.mm).convertToPixels(),
|
||||
HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
|
||||
}
|
||||
|
||||
g2d.setTransform(oldTx);
|
||||
|
||||
+154
@@ -0,0 +1,154 @@
|
||||
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;
|
||||
import org.junit.Test;
|
||||
|
||||
public class RaspberryPiPicoTest {
|
||||
|
||||
@Test
|
||||
public void testControlPointCountAndNames() {
|
||||
RaspberryPiPico pico = new RaspberryPiPico();
|
||||
Assert.assertEquals(43, pico.getControlPointCount());
|
||||
|
||||
for (int i = 0; i < pico.getControlPointCount(); i++) {
|
||||
String name = pico.getControlPointNodeName(i);
|
||||
Assert.assertNotNull("Pin " + i + " name should not be null", name);
|
||||
Assert.assertFalse("Pin " + i + " name should not be empty", name.trim().isEmpty());
|
||||
}
|
||||
|
||||
Assert.assertEquals("GP0", pico.getControlPointNodeName(0));
|
||||
Assert.assertEquals("GP1", pico.getControlPointNodeName(1));
|
||||
Assert.assertEquals("GP15", pico.getControlPointNodeName(19));
|
||||
Assert.assertEquals("VBUS", pico.getControlPointNodeName(20));
|
||||
Assert.assertEquals("VSYS", pico.getControlPointNodeName(21));
|
||||
Assert.assertEquals("GP16", pico.getControlPointNodeName(39));
|
||||
Assert.assertEquals("SWCLK", pico.getControlPointNodeName(40));
|
||||
Assert.assertEquals("GND_SWD", pico.getControlPointNodeName(41));
|
||||
Assert.assertEquals("SWDIO", pico.getControlPointNodeName(42));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDimensionsAndPinGeometry() {
|
||||
RaspberryPiPico pico = new RaspberryPiPico();
|
||||
|
||||
// Board dimensions: 21 mm x 51 mm
|
||||
double expectedWidth = new Size(21.0d, SizeUnit.mm).convertToPixels();
|
||||
double expectedHeight = new Size(51.0d, SizeUnit.mm).convertToPixels();
|
||||
|
||||
Shape body = pico.getBodyShape();
|
||||
Assert.assertNotNull(body);
|
||||
Rectangle2D bounds = body.getBounds2D();
|
||||
|
||||
Assert.assertEquals(expectedWidth, bounds.getWidth(), 0.1);
|
||||
Assert.assertEquals(expectedHeight, bounds.getHeight(), 0.1);
|
||||
|
||||
// GP0 (Pin 0) offset relative to board top-left:
|
||||
// X offset: 1.61 mm (symmetrical with right row: (21 - 17.78) / 2 = 1.61 mm)
|
||||
// Y offset: 1.37 mm (symmetrical with bottom row: (51 - 48.26) / 2 = 1.37 mm)
|
||||
double expectedPin0OffsetX = new Size(1.61d, SizeUnit.mm).convertToPixels();
|
||||
double expectedPin0OffsetY = new Size(1.37d, SizeUnit.mm).convertToPixels();
|
||||
|
||||
Point2D p0 = pico.getControlPoint(0); // GP0
|
||||
Assert.assertEquals(expectedPin0OffsetX, p0.getX() - bounds.getX(), 0.1);
|
||||
Assert.assertEquals(expectedPin0OffsetY, p0.getY() - bounds.getY(), 0.1);
|
||||
|
||||
// GP15 (Pin 19, bottom-most left pin)
|
||||
Point2D p19 = pico.getControlPoint(19);
|
||||
double expectedPin19OffsetY = expectedPin0OffsetY + 19 * new Size(0.1d, SizeUnit.in).convertToPixels();
|
||||
Assert.assertEquals(p0.getX(), p19.getX(), 0.01);
|
||||
Assert.assertEquals(expectedPin19OffsetY, p19.getY() - bounds.getY(), 0.1);
|
||||
// Symmetrical distance to bottom edge (1.37 mm)
|
||||
Assert.assertEquals(expectedPin0OffsetY, bounds.getY() + bounds.getHeight() - p19.getY(), 0.1);
|
||||
|
||||
// VBUS (Pin 20, top-right pin)
|
||||
Point2D p20 = pico.getControlPoint(20);
|
||||
double rowSpacing = new Size(0.7d, SizeUnit.in).convertToPixels();
|
||||
Assert.assertEquals(rowSpacing, p20.getX() - p0.getX(), 0.01);
|
||||
Assert.assertEquals(p0.getY(), p20.getY(), 0.01);
|
||||
// Symmetrical distance to right edge (1.61 mm)
|
||||
Assert.assertEquals(expectedPin0OffsetX, bounds.getX() + bounds.getWidth() - p20.getX(), 0.1);
|
||||
|
||||
// GP16 (Pin 39, bottom-right pin)
|
||||
Point2D p39 = pico.getControlPoint(39);
|
||||
Assert.assertEquals(p20.getX(), p39.getX(), 0.01);
|
||||
Assert.assertEquals(p19.getY(), p39.getY(), 0.01);
|
||||
|
||||
// SWD debug pins (40..42) should be vertically in line with bottom pins (p19 & p39)
|
||||
Point2D p40 = pico.getControlPoint(40); // SWCLK
|
||||
Point2D p41 = pico.getControlPoint(41); // GND_SWD
|
||||
Point2D p42 = pico.getControlPoint(42); // SWDIO
|
||||
|
||||
Assert.assertEquals(p19.getY(), p40.getY(), 0.01);
|
||||
Assert.assertEquals(p19.getY(), p41.getY(), 0.01);
|
||||
Assert.assertEquals(p19.getY(), p42.getY(), 0.01);
|
||||
|
||||
// GND_SWD (middle pin) should be dead center of the board
|
||||
double boardCenterX = bounds.getX() + bounds.getWidth() / 2.0;
|
||||
Assert.assertEquals(boardCenterX, p41.getX(), 0.1);
|
||||
|
||||
// SWD pins should have 0.1" spacing
|
||||
double spacing = new Size(0.1d, SizeUnit.in).convertToPixels();
|
||||
Assert.assertEquals(spacing, p41.getX() - p40.getX(), 0.01);
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user