From fcd9bda1916ee874b843ae257ba9ac1a75a63c07 Mon Sep 17 00:00:00 2001
From: Christopher Baines <cbaines8@gmail.com>
Date: Sun, 4 Sep 2011 23:13:39 +0100
Subject: Finished off the listener implementation for the moment. Allowed the
 debug screen to accept button presses and show leds. The Ripple still needs
 more work and more effects need implementing.

---
 PunchingBag/src/Arduino.java        |  1 -
 PunchingBag/src/PunchingBag.java    | 76 ++++++++++++++++++++++++++++---------
 PunchingBag/src/PunchingBagGUI.java | 56 +++++++++++++++++----------
 3 files changed, 94 insertions(+), 39 deletions(-)

(limited to 'PunchingBag')

diff --git a/PunchingBag/src/Arduino.java b/PunchingBag/src/Arduino.java
index aeaa107..5e6e288 100644
--- a/PunchingBag/src/Arduino.java
+++ b/PunchingBag/src/Arduino.java
@@ -9,7 +9,6 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 
-
 import gnu.io.*;
 
 public class Arduino {
diff --git a/PunchingBag/src/PunchingBag.java b/PunchingBag/src/PunchingBag.java
index 00a5866..d09d8e6 100644
--- a/PunchingBag/src/PunchingBag.java
+++ b/PunchingBag/src/PunchingBag.java
@@ -13,11 +13,14 @@ public class PunchingBag implements Runnable {
 	private byte[] rawLeds = new byte[6 * 8];
 	private Colour[][] leds = new Colour[ledWidth][ledHeight];
 	private byte[] ledGridIntensities = new byte[6];
-	private boolean[][] buttons = new boolean[8][19];
+	final public int buttonHeight = 19;
+	final public int buttonWidth = 8;
+	private boolean[][] buttons = new boolean[buttonWidth][buttonHeight];
+	boolean buttonsChanged = false;
 
 	private ArrayList<Effect> runningEffects = new ArrayList<Effect>();
 
-	enum Colour {
+	public enum Colour {
 		None, Red, Yellow, Green
 	};
 
@@ -42,6 +45,10 @@ public class PunchingBag implements Runnable {
 	public void addLEDChangeListener(LEDListener l) {
 		ledListenerList.add(LEDListener.class, l);
 	}
+	
+	public Colour getLED(int x, int y) {
+		return leds[x][y];
+	}
 
 	public boolean setLED(int x, int y, Colour colour) {
 		if (x >= 0 && x < ledWidth && y >= 0 && y < ledHeight) {
@@ -56,12 +63,11 @@ public class PunchingBag implements Runnable {
 		}
 	}
 
-	void CircleExpand(int x, int y, int delay, Colour colour) {
-		// TODO: Adam correct CircleExpand constructor, or this method?
-		// runningEffects.add(new CircleExpand(x,y,delay,colour));
+	void CircleExpand(int x, int y, int intensity) {
+		runningEffects.add(new CircleExpand(x,y,100));
 	}
 
-	class Effect implements Runnable {
+	abstract class Effect implements Runnable {
 		boolean stop = false;
 		int refreshRate = 60; // Times per second to refresh
 
@@ -81,19 +87,18 @@ public class PunchingBag implements Runnable {
 			runningEffects.remove(this);
 		}
 
-		private void draw() {
-		}
+		abstract public void draw();
 	}
 
 	class CircleExpand extends Effect {
-		final byte x;
-		final byte y;
-		byte intensity;
+		final int x;
+		final int y;
+		int intensity;
 		boolean drawnSomething = true;
 
 		float currentRadius = 0;
 
-		public CircleExpand(byte x, byte y, byte intensity) {
+		public CircleExpand(int x, int y, int intensity) {
 			this.x = x;
 			this.y = y;
 			this.intensity = intensity;
@@ -110,12 +115,14 @@ public class PunchingBag implements Runnable {
 			} else {
 				colour = Colour.Green;
 			}
+			
+			intensity -= 5;
 
 			currentRadius += 0.1 + (currentRadius / 10);
 			// longhand: currentRadius = currentRadius + 0.1 + (currentRadius /
 			// 10);
 
-			if (!DrawEllipse(2, 4, (int) currentRadius, (int) currentRadius,
+			if (!DrawEllipse(x, y, (int) currentRadius, (int) currentRadius,
 					colour))
 				stop = true;
 		}
@@ -204,11 +211,16 @@ public class PunchingBag implements Runnable {
 	}
 
 	/* Clears the led grid and stops all running effects */
-	public void clearLEDGrid() {
-		for (Iterator<Effect> iter = runningEffects.iterator(); iter.hasNext();) {
+    void clearLEDGrid() {
+		/*for (Iterator<Effect> iter = runningEffects.iterator(); iter.hasNext();) {
 			((Effect) iter.next()).stop();
+		}*/
+		for (int x=0; x<ledWidth; x++) {
+			for (int y=0; y<ledHeight; y++) {
+				leds[x][y] = Colour.None;
+			}
 		}
-		Arrays.fill(leds, Boolean.FALSE);
+		//Arrays.fill(leds,Colour.None);
 	}
 
 	public void setLEDGridIntensity(byte grid, byte intensity) {
@@ -218,13 +230,41 @@ public class PunchingBag implements Runnable {
 	public void setLEDIntensities(byte intensity) {
 		Arrays.fill(ledGridIntensities, intensity);
 	}
+	
+	public void buttonPressed(int x, int y) {
+		buttons[x][y] = true;
+		buttonsChanged = true;
+	}
 
 	public void run() {
 		while (true) {
 			if (ledsChanged) {
-				//LEDListeners = 
-				//ledListenerList.
+				LEDListener[] LEDListeners = ledListenerList.getListeners(LEDListener.class);
+				for (int i=0; i<ledListenerList.getListenerCount(); i++) {
+					LEDListeners[i].LEDchanged();
+				}
+			}
+			
+			if (buttonsChanged) {
+				ButtonListener[] buttonListeners = buttonListenerList.getListeners(ButtonListener.class);
+				for (int i=0; i<buttonListenerList.getListenerCount(); i++) {
+					for (int x=0; x<buttonWidth; x++) {
+						for (int y=0; y<buttonHeight; y++) {
+							if (buttons[x][y]) buttonListeners[i].buttonPressed(x, y);
+						}
+					}
+				}
+			}
+			
+			// TODO: Hack?
+			for (int x=0; x<buttonWidth; x++) {
+				for (int y=0; y<buttonHeight; y++) {
+					buttons[x][y] = false;
+				}
 			}
+			
+			// TODO: Hack?
+			clearLEDGrid();
 
 			try {
 				Thread.sleep(1000 / 120);
diff --git a/PunchingBag/src/PunchingBagGUI.java b/PunchingBag/src/PunchingBagGUI.java
index a999bad..f3997a8 100644
--- a/PunchingBag/src/PunchingBagGUI.java
+++ b/PunchingBag/src/PunchingBagGUI.java
@@ -1,16 +1,13 @@
 import java.awt.Color;
 import java.awt.Graphics;
-import java.awt.Rectangle;
-import java.awt.Toolkit;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
 import java.awt.event.MouseMotionListener;
-import java.awt.geom.Area;
 
 import javax.swing.JFrame;
-import javax.swing.JPanel;
 
-public class PunchingBagGUI implements MouseListener, MouseMotionListener, ButtonListener, LEDListener {
+public class PunchingBagGUI implements MouseListener, MouseMotionListener,
+		ButtonListener, LEDListener {
 
 	public static enum Mode {
 		Menu, Interactive, Game
@@ -23,7 +20,7 @@ public class PunchingBagGUI implements MouseListener, MouseMotionListener, Butto
 
 	static JFrame frame;
 	static JFrame bagSimFrame;
-	
+
 	static PunchingBag bag = new PunchingBag();
 
 	// Contact
@@ -34,10 +31,10 @@ public class PunchingBagGUI implements MouseListener, MouseMotionListener, Butto
 	final boolean useDebugScreen = true;
 
 	public static void main(String[] args) throws InterruptedException {
-		//SlaveArduino.listPorts();
-		
+		// SlaveArduino.listPorts();
+
 		new PunchingBagGUI();
-		
+
 	}
 
 	PunchingBagGUI() throws InterruptedException {
@@ -56,25 +53,25 @@ public class PunchingBagGUI implements MouseListener, MouseMotionListener, Butto
 
 		System.out.println("Bag X: " + bagSimFrame.getX() + " Bag Y: "
 				+ bagSimFrame.getY());
-		
+
 		bag.addButtonListener(this);
 		bag.addLEDChangeListener(this);
-		
+
 		draw();
 	}
 
 	void draw() throws InterruptedException {
 		bagSimFrame.paintComponents(bagSimFrame.getGraphics());
 		// bagSimFrame.paintAll(bagSimFrame.getGraphics());
-		Thread.sleep(16);
+		Thread.sleep(50);
 		draw();
 	}
 
 	public void runInteractively(Contact contact) {
-
+		System.out.println("Contact");
+		bag.buttonPressed(contact.x, contact.y);
 	}
 
-
 	public void mouseClicked(MouseEvent arg0) {
 		// TODO Auto-generated method stub
 
@@ -92,7 +89,8 @@ public class PunchingBagGUI implements MouseListener, MouseMotionListener, Butto
 
 	public void mousePressed(MouseEvent arg0) {
 		if (currentMode == Mode.Interactive) {
-			runInteractively(new Contact(System.currentTimeMillis(), (arg0.getX() - 4)/ 40 , (arg0.getY() - 30) / 40, 0));
+			runInteractively(new Contact(System.currentTimeMillis(), (arg0
+					.getX() - 4) / 40, (arg0.getY() - 30) / 40, 0));
 		}
 	}
 
@@ -113,19 +111,37 @@ public class PunchingBagGUI implements MouseListener, MouseMotionListener, Butto
 
 	public void contact(Contact c) {
 		// TODO Auto-generated method stub
-		
+
 	}
 
 	@Override
 	public void buttonPressed(int x, int y) {
-		// TODO Auto-generated method stub
-		
+		System.out.println("Button Pressed: " + x + " " + y);
+		bag.CircleExpand(x, y, 16);
+
 	}
 
 	@Override
 	public void LEDchanged() {
-		// TODO Auto-generated method stub
-		
+		for (int x = 0; x < bag.ledWidth; x++) {
+			for (int y = 0; y < bag.ledHeight; y++) {
+				if (useDebugScreen) {
+					Graphics g = bagSimFrame.getGraphics();
+					if (bag.getLED(x, y) == PunchingBag.Colour.Red) {
+						g.setColor(Color.red);
+						g.fillOval(40 * x, 40 * y, 6, 6);
+					} else if (bag.getLED(x, y) == PunchingBag.Colour.Green) {
+						g.setColor(Color.green);
+						g.fillOval(40 * x, 40 * y, 6, 6);
+					}
+					if (bag.getLED(x, y) == PunchingBag.Colour.Yellow) {
+						g.setColor(Color.yellow);
+						g.fillOval(40 * x, 40 * y, 6, 6);
+					}
+				}
+			}
+		}
+
 	}
 
 }
-- 
cgit v1.2.3