From ec0175910b616b7ae59886520cf5ad2f642ad47a Mon Sep 17 00:00:00 2001 From: Mark Slee Date: Fri, 21 Feb 2014 16:11:25 -0800 Subject: [PATCH] Update PandaDriver for new grizzly strip mapping and 15-strip cubes --- _PandaDriver.pde | 65 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 54 insertions(+), 11 deletions(-) diff --git a/_PandaDriver.pde b/_PandaDriver.pde index 6751102..26ac3d7 100644 --- a/_PandaDriver.pde +++ b/_PandaDriver.pde @@ -28,6 +28,10 @@ public static class PandaDriver { public PandaMapping pm; + private final static int PORT = 779; + + private final DatagramSocket socket; + // Address to send to private final NetAddress address; @@ -179,6 +183,12 @@ public static class PandaDriver { address = new NetAddress(ip, 779); message = new OscMessage("/shady/pointbuffer"); + try { + socket = new DatagramSocket(); + } catch (Exception x) { + throw new RuntimeException(x); + } + // Build the array of points, initialize all to nothing points = new int[PandaMapping.PIXELS_PER_BOARD]; for (int i = 0; i < points.length; ++i) { @@ -220,6 +230,9 @@ public static class PandaDriver { case REAR_RIGHT: stripOrderIndex = 3; break; } + // TODO(mcslee): clean up, ordering always consistent now + stripOrderIndex = 2; + // Iterate through all the strips on the cube and add the points for (int stripIndex : CUBE_STRIP_ORDERINGS[stripOrderIndex]) { // We go backwards here... in the model strips go clockwise, but @@ -279,12 +292,20 @@ public static class PandaDriver { } private int mapStrip(Strip s, int direction, int[] points, int pi) { + return mapStrip(s, direction, points, pi, s.points.size()); + } + + private int mapStrip(Strip s, int direction, int[] points, int pi, int len) { if (direction == FORWARD) { + int i = 0; for (LXPoint p : s.points) { points[pi++] = p.index; + if (++i >= len) { + break; + } } } else if (direction == BACKWARD) { - for (int i = s.points.size()-1; i >= 0; --i) { + for (int i = len-1; i >= 0; --i) { points[pi++] = s.points.get(i).index; } } else { @@ -324,6 +345,8 @@ public static class PandaDriver { setEnabled(!enabled); } + private final int[] GRIZZLY_STRIP_ORDERING = new int[] { 9, 8, 11, 5, 4, 7, 6, 10, 14, 2, 1, 0, 3, 13, 12, 15 }; + public final void send(int[] colors) { if (!enabled) { return; @@ -332,21 +355,38 @@ public static class PandaDriver { int len = 0; int packetNum = 0; for (ChannelMapping channel : pm.channelList) { - for (int j: channel.objectIndices) { - if (j > 0) { - Cube cube = _model.getCubeByRawIndex(j); - for (LXPoint p : cube.points) { - int c = (p.index < 0) ? 0 : colors[p.index]; + for (int rawCubeIndex : channel.objectIndices) { + if (rawCubeIndex > 0) { + Cube cube = _model.getCubeByRawIndex(rawCubeIndex); + + // TODO(mcslee): clean this up, precompute paths + for (int stripIndex : GRIZZLY_STRIP_ORDERING) { + Strip strip = cube.strips.get(stripIndex); + int stripLen = ((stripIndex == 9) || (stripIndex == 16)) ? 15 : 16; + for (int i = stripLen-1; i >= 0; --i) { + int c = colors[strip.points.get(i).index]; byte r = (byte) ((c >> 16) & 0xFF); byte g = (byte) ((c >> 8) & 0xFF); byte b = (byte) ((c) & 0xFF); - packet[len++] = (byte) 0; // alpha channel, unused but makes for 4-byte alignment - packet[len++] = (byte) r; - packet[len++] = (byte) g; - packet[len++] = (byte) b; + packet[len++] = (byte) 0; // alpha channel, unused but makes for 4-byte alignment + packet[len++] = (byte) r; + packet[len++] = (byte) g; + packet[len++] = (byte) b; } } + +// for (LXPoint p : cube.points) { +// int c = (p.index < 0) ? 0 : colors[p.index]; +// byte r = (byte) ((c >> 16) & 0xFF); +// byte g = (byte) ((c >> 8) & 0xFF); +// byte b = (byte) ((c) & 0xFF); +// packet[len++] = (byte) 0; // alpha channel, unused but makes for 4-byte alignment +// packet[len++] = (byte) r; +// packet[len++] = (byte) g; +// packet[len++] = (byte) b; +// } } + } // println("Packet number: " + packetNum); sendPacket(frameNum, packetNum++); len = 0; @@ -387,7 +427,10 @@ public static class PandaDriver { message.add(0xBEFFFFEB); try { - OscP5.flush(message, address); + // OscP5.flush(message, address); // new DatagramSocket every time, no thanks + byte[] bytes = message.getBytes(); + DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address.inetaddress(), PORT); + socket.send(packet); } catch (Exception x) { x.printStackTrace(); } -- 2.34.1