Update PandaDriver for new grizzly strip mapping and 15-strip cubes
authorMark Slee <mcslee@gmail.com>
Sat, 22 Feb 2014 00:11:25 +0000 (16:11 -0800)
committerMark Slee <mcslee@gmail.com>
Sat, 22 Feb 2014 00:11:25 +0000 (16:11 -0800)
_PandaDriver.pde

index 6751102c69a4551e141b22e6ba2cfb9bb579a8b3..26ac3d74c49aedfdb306290417044f9119ec7baf 100644 (file)
@@ -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();
     }