From a797d019e913f56021fcc5d2f9ff994e3e1db08b Mon Sep 17 00:00:00 2001 From: Mark Slee Date: Mon, 5 Aug 2013 19:52:44 -0700 Subject: [PATCH] Basic changes to support new layout --- TestPatterns.pde | 12 ++--- _Internals.pde | 5 +- _Mappings.pde | 135 +++++++++++++++++++++++++++++------------------ _PandaDriver.pde | 2 +- code/GLucose.jar | Bin 18737 -> 19179 bytes 5 files changed, 95 insertions(+), 59 deletions(-) diff --git a/TestPatterns.pde b/TestPatterns.pde index 9b46531..87d9ee2 100644 --- a/TestPatterns.pde +++ b/TestPatterns.pde @@ -197,7 +197,7 @@ class MappingTool extends SCPattern { } public void strip(int delta) { - int len = Cube.CLIPS_PER_CUBE * Clip.STRIPS_PER_CLIP; + int len = Cube.FACES_PER_CUBE * Face.STRIPS_PER_FACE; stripIndex = (len + stripIndex + delta) % len; printInfo(); } @@ -236,14 +236,14 @@ class MappingTool extends SCPattern { int si = 0; color sc = off; for (Strip strip : cube.strips) { - int clipI = si / Clip.STRIPS_PER_CLIP; - switch (clipI) { + int faceI = si / Face.STRIPS_PER_FACE; + switch (faceI) { case 0: sc = r; break; case 1: sc = g; break; case 2: sc = b; break; case 3: sc = r|g|b; break; } - if (si % Clip.STRIPS_PER_CLIP == 2) { + if (si % Face.STRIPS_PER_FACE == 2) { sc = r|g; } setColor(strip, sc); @@ -288,12 +288,12 @@ class MappingTool extends SCPattern { } public void incStrip() { - int stripsPerCube = Cube.CLIPS_PER_CUBE * Clip.STRIPS_PER_CLIP; + int stripsPerCube = Cube.FACES_PER_CUBE * Face.STRIPS_PER_FACE; stripIndex = (stripIndex + 1) % stripsPerCube; } public void decStrip() { - int stripsPerCube = Cube.CLIPS_PER_CUBE * Clip.STRIPS_PER_CLIP; + int stripsPerCube = Cube.FACES_PER_CUBE * Face.STRIPS_PER_FACE; --stripIndex; if (stripIndex < 0) { stripIndex += stripsPerCube; diff --git a/_Internals.pde b/_Internals.pde index dab8bdd..88ea2e0 100644 --- a/_Internals.pde +++ b/_Internals.pde @@ -162,7 +162,7 @@ void draw() { ); stroke(#333333); fill(#292929); - float yFloor = -3; + float yFloor = -2; beginShape(); vertex(0, yFloor, 0); vertex(glucose.model.xMax, yFloor, 0); @@ -176,6 +176,7 @@ void draw() { for (Point p : glucose.model.points) { stroke(colors[p.index]); vertex(p.fx, p.fy, p.fz); + // println(p.fx + ":" + p.fy + ":" + p.fz); } endShape(); @@ -190,7 +191,7 @@ void draw() { if (debugMode) { debugUI.draw(); } - + // TODO(mcslee): move into GLucose engine if (pandaBoardsEnabled) { pandaFront.send(colors); diff --git a/_Mappings.pde b/_Mappings.pde index 10c1083..4db2330 100644 --- a/_Mappings.pde +++ b/_Mappings.pde @@ -18,87 +18,112 @@ class SCMapping implements GLucose.Mapping { // serialized in some more neutral form. also figure out what's going on // with the indexing starting at 1 and some indices missing. Cube[] cubes = new Cube[79]; - cubes[1] = new Cube(17.25, 0, 0, 0, 0, 80, true, 2, 3); - cubes[2] = new Cube(50.625, -1.5, 0, 0, 0, 55, false, 4, 0); - cubes[3] = new Cube(70.75, 12.375, 0, 0, 0, 55, false, 4, 0); - cubes[4] = new Cube(49.75, 24.375, 0, 0, 0, 48, false, 0, 0);//dnw - cubes[5] = new Cube(14.25, 32, 0, 0, 0, 80, false, 2, 1); - cubes[6] = new Cube(50.375, 44.375, 0, 0, 0, 0, false, 0, 0);//dnw - cubes[7] = new Cube(67.5, 64.25, 0, 27, 0, 0, false, 0, 0);//dnw - cubes[8] = new Cube(44, 136, 0, 0, 0, 0, false, 1, 2); - cubes[9] = new Cube(39, 162, 0, 0, 0, 0, false, 1, 0); - cubes[10] = new Cube(58, 182, -4, 12, 0, 0, false, 3, 3); - cubes[11] = new Cube(28, 182, -4, 12, 0, 0, false, 0, 0); - cubes[12] = new Cube(0, 182, -4, 12, 0, 0, false, 0, 2); - cubes[13] = new Cube(18.75, 162, 0, 0, 0, 0, false, 0, 0); - cubes[14] = new Cube(13.5, 136, 0, 0, 0, 0, false, 1, 1); - cubes[15] = new Cube(6.5, -8.25, 20, 0, 0, 25, false, 5, 3); - cubes[16] = new Cube(42, 15, 20, 0, 0, 4, true, 2, 2); + + int cubeIndex = 1; + + cubes[cubeIndex++] = new Cube(0, 0, 0, 0, 0, 0); + cubes[cubeIndex++] = new Cube(5, Cube.EDGE_HEIGHT, -10, 0, 20, 0); + cubes[cubeIndex++] = new Cube(0, 2*Cube.EDGE_HEIGHT, -6, 0, 0, 0); + cubes[cubeIndex++] = new Cube(-5, 3*Cube.EDGE_HEIGHT, -2, 0, -20, 0); + + cubes[cubeIndex++] = new Cube(40, 0, 20, 0, 0, 0); + cubes[cubeIndex++] = new Cube(45, Cube.EDGE_HEIGHT, 10, 0, 20, 0); + cubes[cubeIndex++] = new Cube(40, 2*Cube.EDGE_HEIGHT, 14, 0, 0, 0); + cubes[cubeIndex++] = new Cube(35, 3*Cube.EDGE_HEIGHT, 18, 0, -20, 0); + cubes[cubeIndex++] = new Cube(40, 4*Cube.EDGE_HEIGHT, 13, 0, 0, 0); + + + if (true) { + return cubes; + } + + cubes[1] = new Cube(17.25, 0, 0, 0, 0, 80); + cubes[2] = new Cube(50.625, -1.5, 0, 0, 0, 55); + cubes[3] = new Cube(70.75, 12.375, 0, 0, 0, 55); + cubes[4] = new Cube(49.75, 24.375, 0, 0, 0, 48);//dnw + cubes[5] = new Cube(14.25, 32, 0, 0, 0, 80); + cubes[6] = new Cube(50.375, 44.375, 0, 0, 0, 0);//dnw + cubes[7] = new Cube(67.5, 64.25, 0, 27, 0, 0);//dnw + cubes[8] = new Cube(44, 136, 0, 0, 0, 0); + cubes[9] = new Cube(39, 162, 0, 0, 0, 0); + cubes[10] = new Cube(58, 182, -4, 12, 0, 0); + cubes[11] = new Cube(28, 182, -4, 12, 0, 0); + cubes[12] = new Cube(0, 182, -4, 12, 0, 0); + cubes[13] = new Cube(18.75, 162, 0, 0, 0, 0); + cubes[14] = new Cube(13.5, 136, 0, 0, 0, 0); + cubes[15] = new Cube(6.5, -8.25, 20, 0, 0, 25); + cubes[16] = new Cube(42, 15, 20, 0, 0, 4); cubes[17] = new Cube(67, 24, 20, 0, 0, 25); - cubes[18] = new Cube(56, 41, 20, 0, 0, 30, false, 3, 1); - cubes[19] = new Cube(24, 2, 20, 0, 0, 25, true, 0, 3); - cubes[20] = new Cube(26, 26, 20, 0, 0, 70, true, 2, 3); - cubes[21] = new Cube(3.5, 10.5, 20, 0, 0, 35, true, 1, 0); - cubes[22] = new Cube(63, 133, 20, 0, 0, 80, false, 0, 2); + cubes[18] = new Cube(56, 41, 20, 0, 0, 30); + cubes[19] = new Cube(24, 2, 20, 0, 0, 25); + cubes[20] = new Cube(26, 26, 20, 0, 0, 70); + cubes[21] = new Cube(3.5, 10.5, 20, 0, 0, 35); + cubes[22] = new Cube(63, 133, 20, 0, 0, 80); cubes[23] = new Cube(56, 159, 20, 0, 0, 65); cubes[24] = new Cube(68, 194, 20, 0, -45, 0); - cubes[25] = new Cube(34, 194, 20, 20, 0, 35 ); - cubes[26] = new Cube(10, 194, 20, 0, -45, 0 ); // wired a bit funky + cubes[25] = new Cube(34, 194, 20, 20, 0, 35); + cubes[26] = new Cube(10, 194, 20, 0, -45, 0); // wired a bit funky cubes[27] = new Cube(28, 162, 20, 0, 0, 65); cubes[28] = new Cube(15.5, 134, 20, 0, 0, 20); - cubes[29] = new Cube(13, 29, 40, 0, 0, 0, true, 0, 0); - cubes[30] = new Cube(55, 15, 40, 0, 0, 50, false, 0, 2); - cubes[31] = new Cube(78, 9, 40, 0, 0, 60, true, 5, 2); - cubes[32] = new Cube(80, 39, 40, 0, 0, 80, false, 0, 3); - cubes[33] = new Cube(34, 134, 40, 0, 0, 50, false, 0, 3); + cubes[29] = new Cube(13, 29, 40, 0, 0, 0); + cubes[30] = new Cube(55, 15, 40, 0, 0, 50); + cubes[31] = new Cube(78, 9, 40, 0, 0, 60); + cubes[32] = new Cube(80, 39, 40, 0, 0, 80); + cubes[33] = new Cube(34, 134, 40, 0, 0, 50); cubes[34] = new Cube(42, 177, 40, 0, 0, 0); cubes[35] = new Cube(41, 202, 40, 20, 0, 80); cubes[36] = new Cube(21, 178, 40, 0, 0, 35); - cubes[37] = new Cube(18, 32, 60, 0, 0, 65, true, 0, 1); + cubes[37] = new Cube(18, 32, 60, 0, 0, 65); cubes[38] = new Cube(44, 20, 60, 0, 0, 20); //front power cube cubes[39] = new Cube(39, 149, 60, 0, 0, 15); cubes[40] = new Cube(60, 186, 60, 0, 0, 45); cubes[41] = new Cube(48, 213, 56, 20, 0, 25); - cubes[42] = new Cube(22, 222, 60, 10, 10, 15, false, 0, 3); - cubes[43] = new Cube(28, 198, 60, 20, 0, 20, true, 5, 0); - cubes[44] = new Cube(12, 178, 60, 0, 0, 50, false, 4, 1); + cubes[42] = new Cube(22, 222, 60, 10, 10, 15); + cubes[43] = new Cube(28, 198, 60, 20, 0, 20); + cubes[44] = new Cube(12, 178, 60, 0, 0, 50); cubes[45] = new Cube(18, 156, 60, 0, 0, 40); cubes[46] = new Cube(30, 135, 60, 0, 0, 45); - cubes[47] = new Cube(10, 42, 80, 0, 0, 17, true, 0, 2); - cubes[48] = new Cube(34, 23, 80, 0, 0, 45, false, 0, 1); + cubes[47] = new Cube(10, 42, 80, 0, 0, 17); + cubes[48] = new Cube(34, 23, 80, 0, 0, 45); cubes[49] = new Cube(77, 28, 80, 0, 0, 45); cubes[50] = new Cube(53, 22, 80, 0, 0, 45); cubes[51] = new Cube(48, 175, 80, 0, 0, 45); - cubes[52] = new Cube(66, 172, 80, 0, 0, 355, true, 5, 1);// _,195,_ originally - cubes[53] = new Cube(33, 202, 80, 25, 0, 85, false, 1, 3); - cubes[54] = new Cube(32, 176, 100, 0, 0, 20, false, 0, 2); + cubes[52] = new Cube(66, 172, 80, 0, 0, 355);// _,195,_ originally + cubes[53] = new Cube(33, 202, 80, 25, 0, 85); + cubes[54] = new Cube(32, 176, 100, 0, 0, 20); cubes[55] = new Cube(5.75, 69.5, 0, 0, 0, 80); cubes[56] = new Cube(1, 53, 0, 40, 70, 70); cubes[57] = new Cube(-15, 24, 0, 15, 0, 0); //cubes[58] what the heck happened here? never noticed before 4/8/2013 - cubes[59] = new Cube(40, 46, 100, 0, 0, 355, false, 2, 3); // copies from 75 - cubes[60] = new Cube(40, 164, 120, 0, 0, 12.5, false, 4, 3); - cubes[61] = new Cube(32, 148, 100, 0, 0, 3, false, 4, 2); + cubes[59] = new Cube(40, 46, 100, 0, 0, 355); // copies from 75 + cubes[60] = new Cube(40, 164, 120, 0, 0, 12.5); + cubes[61] = new Cube(32, 148, 100, 0, 0, 3); cubes[62] = new Cube(30, 132, 90, 10, 350, 5); - cubes[63] = new Cube(22, 112, 100, 0, 20, 0, false, 4, 0); + cubes[63] = new Cube(22, 112, 100, 0, 20, 0); cubes[64] = new Cube(35, 70, 95, 15, 345, 20); - cubes[65] = new Cube(38, 112, 98, 25, 0, 0, false, 4, 3); + cubes[65] = new Cube(38, 112, 98, 25, 0, 0); cubes[66] = new Cube(70, 164, 100, 0, 0, 22); - cubes[68] = new Cube(29, 94, 105, 15, 20, 10, false, 4, 0); - cubes[69] = new Cube(30, 77, 100, 15, 345, 20, false, 2, 1); + cubes[68] = new Cube(29, 94, 105, 15, 20, 10); + cubes[69] = new Cube(30, 77, 100, 15, 345, 20); cubes[70] = new Cube(38, 96, 95, 30, 0, 355); //cubes[71] = new Cube(38,96,95,30,0,355); //old power cube cubes[72] = new Cube(44, 20, 100, 0, 0, 345); - cubes[73] = new Cube(28, 24, 100, 0, 0, 13, true, 5, 1); - cubes[74] = new Cube(8, 38, 100, 10, 0, 0, true, 5, 1); - cubes[75] = new Cube(20, 58, 100, 0, 0, 355, false, 2, 3); - cubes[76] = new Cube(22, 32, 120, 15, 327, 345, false, 4, 0); - cubes[77] = new Cube(50, 132, 80, 0, 0, 0, false, 0, 2); - cubes[78] = new Cube(20, 140, 80, 0, 0, 0, false, 0, 3); + cubes[73] = new Cube(28, 24, 100, 0, 0, 13); + cubes[74] = new Cube(8, 38, 100, 10, 0, 0); + cubes[75] = new Cube(20, 58, 100, 0, 0, 355); + cubes[76] = new Cube(22, 32, 120, 15, 327, 345); + cubes[77] = new Cube(50, 132, 80, 0, 0, 0); + cubes[78] = new Cube(20, 140, 80, 0, 0, 0); return cubes; } public int[][] buildFrontChannelList() { + if (true) { + return new int[][] { + { 1, 0 }, + }; + } + return new int[][] { { 1, 57, 56, 55, 0 // Pandaboard A, structural channel 1 @@ -135,6 +160,12 @@ class SCMapping implements GLucose.Mapping { } public int[][] buildRearChannelList() { + if (true) { + return new int[][] { + { 1, 0 }, + }; + } + return new int[][] { { 22, 8, 14, 28, 0 // Pandaboard A, structural channel 9 @@ -171,6 +202,10 @@ class SCMapping implements GLucose.Mapping { } public int[][] buildFlippedRGBList() { + if (true) { + return new int[][] {}; + } + // syntax is {cube #, strip #, strip #, . . . } return new int[][] { { diff --git a/_PandaDriver.pde b/_PandaDriver.pde index 6a4a3da..ad870aa 100644 --- a/_PandaDriver.pde +++ b/_PandaDriver.pde @@ -48,7 +48,7 @@ public class PandaDriver { for (int[] channel : channelList) { for (int cubeNumber : channel) { if (cubeNumber == 0) { - for (int i = 0; i < (Cube.CLIPS_PER_CUBE*Clip.STRIPS_PER_CLIP*Strip.POINTS_PER_STRIP); ++i) { + for (int i = 0; i < (Cube.FACES_PER_CUBE*Face.STRIPS_PER_FACE*Strip.POINTS_PER_STRIP); ++i) { points.add(0); } } else { diff --git a/code/GLucose.jar b/code/GLucose.jar index bffecfd5f58bf6d8f8a3ce5fc5996cd21278d41e..52e651b0a1aa363dabb0eccfc7b829acb4adbaf1 100644 GIT binary patch delta 6748 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 SFezauVI&?dk)RTfqyGb$CCvr^ delta 6260 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