New code for Grizzlies
[SugarCubes.git] / _PandaDriver.pde
index 5d8ad249bbe3171446033c720c1d15f60cfda226..6751102c69a4551e141b22e6ba2cfb9bb579a8b3 100644 (file)
@@ -1,6 +1,7 @@
 import netP5.*;
 import oscP5.*;
 
+
 /**
  *     DOUBLE BLACK DIAMOND        DOUBLE BLACK DIAMOND
  *
@@ -24,12 +25,17 @@ public static class PandaDriver {
   
   // IP address
   public final String ip;
+
+  public PandaMapping pm;
   
   // Address to send to
   private final NetAddress address;
   
   // Whether board output is enabled
   private boolean enabled = false;
+
+  // Frame count for Grizzlies
+  private int frameNum = 1;
   
   // OSC message
   private final OscMessage message;
@@ -38,10 +44,12 @@ public static class PandaDriver {
   private final int[] points;
     
   // Packet data
-  private final byte[] packet = new byte[4*352]; // magic number, our UDP packet size
+  private final byte[] packet = new byte[4*280]; // magic number, our UDP packet size
 
   private static final int NO_POINT = -1;
 
+  private Model _model;
+
   ////////////////////////////////////////////////////////////////
   //
   // READ THIS RIGHT NOW BEFORE YOU MODIFY THE BELOW!!!!!!!!!!!!!
@@ -168,7 +176,7 @@ public static class PandaDriver {
     this.ip = ip;
     
     // Initialize our OSC output stuff
-    address = new NetAddress(ip, 9001);
+    address = new NetAddress(ip, 779);
     message = new OscMessage("/shady/pointbuffer");
     
     // Build the array of points, initialize all to nothing
@@ -178,15 +186,16 @@ public static class PandaDriver {
     }
   }
     
-  public PandaDriver(String ip, Model model, PandaMapping pm) {
+  public PandaDriver(String ip, Model model, PandaMapping _pm) {
     this(ip);
-    
+    pm = _pm;
+    _model = model;
     // Ok, we are initialized, time to build the array if points in order to
     // send out. We start at the head of our point buffer, and work our way
     // down. This is the order in which points will be sent down the wire.
     int ci = -1;
     
-    // Iterate through all our channels
+    // Iterate through all our channels
     for (ChannelMapping channel : pm.channelList) {
       ++ci;
       int pi = ci * ChannelMapping.PIXELS_PER_CHANNEL;
@@ -319,37 +328,64 @@ public static class PandaDriver {
     if (!enabled) {
       return;
     }
+    frameNum++;
     int len = 0;
     int packetNum = 0;
-    for (int index : points) {
-      int c = (index < 0) ? 0 : colors[index];
-      byte r = (byte) ((c >> 16) & 0xFF);
-      byte g = (byte) ((c >> 8) & 0xFF);
-      byte b = (byte) ((c) & 0xFF);
-      packet[len++] = 0; // alpha channel, unused but makes for 4-byte alignment
-      packet[len++] = r;
-      packet[len++] = g;
-      packet[len++] = b;
-
-      // Flush once packet is full buffer size
-      if (len >= packet.length) {
-        sendPacket(packetNum++);
-        len = 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];
+              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;
     }
+    // for (int index : points) {
+    //   int c = (index < 0) ? 0 : colors[index];
+    //   byte r = (byte) ((c >> 16) & 0xFF);
+    //   byte g = (byte) ((c >> 8) & 0xFF);
+    //   byte b = (byte) ((c) & 0xFF);
+    //   packet[len++] = 0; // alpha channel, unused but makes for 4-byte alignment
+    //   packet[len++] = r;
+    //   packet[len++] = g;
+    //   packet[len++] = b;
 
-    // Flush any remaining data
-    if (len > 0) {
-      sendPacket(packetNum++);
-    }
+    //   // Flush once packet is full buffer size
+    //   if (len >= packet.length) {
+    //     sendPacket(packetNum++);
+    //     len = 0;
+    //   }
+    // }
+
+    // // Flush any remaining data
+    // if (len > 0) {
+    //   sendPacket(packetNum++);
+    // }
   }
   
 
-  private void sendPacket(int packetNum) {
+  private void sendPacket(int frameNum, int packetNum) {
+    // println("Sending frame #" + frameNum + ", channel # " + packetNum);
     message.clearArguments();
+    message.add(frameNum);
+    message.add(0xDEADBEEF);
     message.add(packetNum);
+    message.add(0xFEEDBEEF);
     message.add(packet.length);
     message.add(packet);
+    message.add(0xBEFFFFEB);
+
     try {
       OscP5.flush(message, address);
     } catch (Exception x) {