Mapping for Asana hackathon
[SugarCubes.git] / _PandaDriver.pde
index 2c8b96c43653502ed1632cee9a6e73a1989cef7c..5d8ad249bbe3171446033c720c1d15f60cfda226 100644 (file)
@@ -1,11 +1,6 @@
 import netP5.*;
 import oscP5.*;
 
-//import hypermedia.net.*;
-
-
-
-
 /**
  *     DOUBLE BLACK DIAMOND        DOUBLE BLACK DIAMOND
  *
@@ -19,24 +14,14 @@ import oscP5.*;
  * This class implements the output function to the Panda Boards. It
  * will be moved into GLucose once stabilized.
  */
-public static class PandaDriver extends Thread{
-  int lastSeen;
-  void start(){super.start();}
-  void run(){
-    while(true){
-      if(queue.size()>0) {
-        for(int i=0; i<queue.size(); i++){
-          this.sendNow(queue.get(queue.size()-1));
-          queue.clear();
-        }
-      } else {
-        try{sleep(1);} catch(Exception e){}
-      }
-    }
+public static class PandaDriver {
+  
+  interface Listener {
+    public void onToggle(boolean enabled);
   }
-
-  //UDP udp;  // define the UDP object
-
+  
+  private Listener listener = null;
+  
   // IP address
   public final String ip;
   
@@ -57,26 +42,6 @@ public static class PandaDriver extends Thread{
 
   private static final int NO_POINT = -1;
 
-  public PandaDriver(String ip) {
-    this.ip = ip;
-    
-    //udp = new UDP(this, 10000);
-    
-    // Initialize our OSC output stuff
-    address = new NetAddress(ip, 9001);
-    message = new OscMessage("/shady/pointbuffer");
-    
-    // Build the array of points, initialize all to nothing
-    points = new int[PandaMapping.PIXELS_PER_BOARD];
-    for (int i = 0; i < points.length; ++i) {
-      points[i] = NO_POINT;
-    }
-    this.start();
-  }
-
-  private final static int FORWARD = -1;
-  private final static int BACKWARD = -2;
-
   ////////////////////////////////////////////////////////////////
   //
   // READ THIS RIGHT NOW BEFORE YOU MODIFY THE BELOW!!!!!!!!!!!!!
@@ -110,6 +75,8 @@ public static class PandaDriver extends Thread{
   //
   ////////////////////////////////////////////////////////////////
   
+  private final static int FORWARD = -1;
+  private final static int BACKWARD = -2;
 
   /**
    * These constant arrays indicate the order in which the strips of a cube
@@ -117,10 +84,17 @@ public static class PandaDriver extends Thread{
    * corner of the cube the data wire comes in.
    */
   private final static int[][] CUBE_STRIP_ORDERINGS = new int[][] {
+//    {  2,  1,  0,  3, 13, 12, 15, 14,  4,  7,  6,  5, 11, 10,  9,  8 }, // FRONT_LEFT
+//    {  6,  5,  4,  7,  1,  0,  3,  2,  8, 11, 10,  9, 15, 14, 13, 12 }, // FRONT_RIGHT
+//    { 14, 13, 12, 15,  9,  8, 11, 10,  0,  3,  2,  1,  7,  6,  5,  4 }, // REAR_LEFT
+//    { 10,  9,  8, 11,  5,  4,  7,  6, 12, 15, 14, 13,  3,  2,  1,  0 }, // REAR_RIGHT
+
+
     {  2,  1,  0,  3, 13, 12, 15, 14,  4,  7,  6,  5, 11, 10,  9,  8 }, // FRONT_LEFT
     {  6,  5,  4,  7,  1,  0,  3,  2,  8, 11, 10,  9, 15, 14, 13, 12 }, // FRONT_RIGHT
     { 14, 13, 12, 15,  9,  8, 11, 10,  0,  3,  2,  1,  7,  6,  5,  4 }, // REAR_LEFT
-    { 10,  9,  8, 11,  5,  4,  7,  6, 12, 15, 14, 13,  3,  2,  1,  0 }, // REAR_RIGHT
+    {  9,  8, 11,  5,  4,  7,  6, 10, 14,  2,  1,  0,  3, 13, 12, 15 }, // REAR_RIGHT
+
   };
   
   private final static int[][] BASS_STRIP_ORDERING = {
@@ -171,7 +145,7 @@ public static class PandaDriver extends Thread{
   // as cubes with Wiring.FRONT_LEFT. If this needs to be changed,
   // remove this null assignment and change the below to have mappings
   // for the LEFT and RIGHT speaker
-  private final static int[][][] SPEAKER_STRIP_ORDERING = null; /* {
+  private final static int[][][] SPEAKER_STRIP_ORDERING = {
     // Left speaker
     { 
       // Front face, counter-clockwise from bottom left
@@ -188,18 +162,25 @@ public static class PandaDriver extends Thread{
       {0, BACKWARD },
       {3, BACKWARD },
     }
-  };*/
-  
-  private final static int[][] LEFT_SPEAKER_STRIP_ORDERING = {
   };
 
-  ArrayList<int[]> queue;
-  
+  public PandaDriver(String ip) {
+    this.ip = ip;
+    
+    // Initialize our OSC output stuff
+    address = new NetAddress(ip, 9001);
+    message = new OscMessage("/shady/pointbuffer");
+    
+    // Build the array of points, initialize all to nothing
+    points = new int[PandaMapping.PIXELS_PER_BOARD];
+    for (int i = 0; i < points.length; ++i) {
+      points[i] = NO_POINT;
+    }
+  }
+    
   public PandaDriver(String ip, Model model, PandaMapping pm) {
     this(ip);
     
-    queue = new ArrayList<int[]>();
-
     // 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.
@@ -290,7 +271,7 @@ public static class PandaDriver extends Thread{
   
   private int mapStrip(Strip s, int direction, int[] points, int pi) {
     if (direction == FORWARD) {
-      for (Point p : s.points) {
+      for (LXPoint p : s.points) {
         points[pi++] = p.index;
       }
     } else if (direction == BACKWARD) {
@@ -303,38 +284,45 @@ public static class PandaDriver extends Thread{
     return pi;
   }
 
-  public void disable() {
-    if (enabled) {
-      enabled = false;
-      println("PandaBoard/" + ip + ": OFF");
+  public PandaDriver setListener(Listener listener) {
+    this.listener = listener;
+    return this;
+  }
+
+  public void setEnabled(boolean enabled) {
+    if (this.enabled != enabled) {
+      this.enabled = enabled;
+      println("PandaBoard/" + ip + ": " + (enabled ? "ON" : "OFF"));
+      if (listener != null) {
+        listener.onToggle(enabled);
+      }
     }
   }
   
+  public boolean isEnabled() {
+    return this.enabled;
+  }
+
+  public void disable() {
+    setEnabled(false);
+  }
+  
   public void enable() {
-    if (!enabled) {
-      enabled = true;
-      println("PandaBoard/" + ip + ": ON");
-    }
+    setEnabled(true);
   }
 
   public void toggle() {
-    enabled = !enabled;
-    println("PandaBoard/" + ip + ": " + (enabled ? "ON" : "OFF"));    
+    setEnabled(!enabled);
   }
 
   public final void send(int[] colors) {
-     queue.add(colors);
-  }
-  public final void sendNow(int[] colors) {
-    if (!enabled || colors==null) {
+    if (!enabled) {
       return;
     }
     int len = 0;
     int packetNum = 0;
-    if(points==null) { return; }
-    for (int index: points) {
-      int c = 0;
-      if(index>0) { c= colors[index]; }
+    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);
@@ -363,7 +351,6 @@ public static class PandaDriver extends Thread{
     message.add(packet.length);
     message.add(packet);
     try {
-      //udp.send(packet, "10.200.1.29", 9001);
       OscP5.flush(message, address);
     } catch (Exception x) {
       x.printStackTrace();