*/
public class PandaDriver {
+ // IP address
+ public final String ip;
+
// Address to send to
private final NetAddress address;
+ // Whether board output is enabled
+ private boolean enabled = false;
+
// OSC message
private final OscMessage message;
// List of point indices on the board
private final int[] points;
+
+ // How many channels are on the panda board
+ private final static int CHANNELS_PER_BOARD = 8;
+
+ // How many cubes per channel xc_PB is configured for
+ private final static int CUBES_PER_CHANNEL = 4;
// Packet data
- private final byte[] packet = new byte[4*352]; // TODO: de-magic-number
+ private final byte[] packet = new byte[4*352]; // TODO: de-magic-number, UDP related?
- public PandaDriver(NetAddress address, Model model, int[][] channelList) {
- this.address = address;
+ public PandaDriver(String ip, Model model, int[][] channelList) {
+ this.ip = ip;
+ this.address = new NetAddress(ip, 9001);
message = new OscMessage("/shady/pointbuffer");
List<Integer> pointList = buildMappedList(model, channelList);
points = new int[pointList.size()];
points[i++] = value;
}
}
+
+ public void toggle() {
+ enabled = !enabled;
+ println("PandaBoard/" + ip + " Output: " + (enabled ? "ON" : "OFF"));
+ }
private ArrayList<Integer> buildMappedList(Model model, int[][] channelList) {
ArrayList<Integer> points = new ArrayList<Integer>();
- for (int[] channel : channelList) {
- for (int cubeNumber : channel) {
+ for (int chi = 0; chi < CHANNELS_PER_BOARD; ++chi) {
+ int[] channel = (chi < channelList.length) ? channelList[chi] : new int[]{};
+ for (int ci = 0; ci < CUBES_PER_CHANNEL; ++ci) {
+ int cubeNumber = (ci < channel.length) ? channel[ci] : 0;
if (cubeNumber == 0) {
- for (int i = 0; i < (Cube.FACES_PER_CUBE*Face.STRIPS_PER_FACE*Strip.POINTS_PER_STRIP); ++i) {
+ for (int i = 0; i < Cube.POINTS_PER_CUBE; ++i) {
points.add(0);
}
} else {
}
public final void send(int[] colors) {
+ if (!enabled) {
+ return;
+ }
int len = 0;
int packetNum = 0;
for (int index : points) {