aboutsummaryrefslogtreecommitdiff
path: root/PunchingBag/src
diff options
context:
space:
mode:
Diffstat (limited to 'PunchingBag/src')
-rw-r--r--PunchingBag/src/ButtonArduino.java5
-rw-r--r--PunchingBag/src/PunchingBagGUI.java192
-rw-r--r--PunchingBag/src/SlaveArduino.java169
3 files changed, 366 insertions, 0 deletions
diff --git a/PunchingBag/src/ButtonArduino.java b/PunchingBag/src/ButtonArduino.java
new file mode 100644
index 0000000..415f370
--- /dev/null
+++ b/PunchingBag/src/ButtonArduino.java
@@ -0,0 +1,5 @@
+
+public class ButtonArduino {
+ public boolean[][] buttons = new boolean[4][7];
+
+}
diff --git a/PunchingBag/src/PunchingBagGUI.java b/PunchingBag/src/PunchingBagGUI.java
new file mode 100644
index 0000000..8008c58
--- /dev/null
+++ b/PunchingBag/src/PunchingBagGUI.java
@@ -0,0 +1,192 @@
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Toolkit;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+
+public class PunchingBagGUI implements MouseListener, MouseMotionListener {
+
+ public static enum Mode {
+ Menu, Interactive, Game
+ };
+
+ Mode currentMode = Mode.Interactive;
+
+ final int bagXSize = 360;
+ final int bagYSize = 840;
+
+ static JFrame frame;
+ static JFrame bagSimFrame;
+
+ // Contact
+ public enum Direction {
+ None, Up, Down, Left, Right
+ };
+
+ final boolean useDebugScreen = true;
+
+ public static void main(String[] args) throws InterruptedException {
+ SlaveArduino.listPorts();
+
+ //new PunchingBagGUI();
+ }
+
+ PunchingBagGUI() throws InterruptedException {
+ frame = new JFrame("Punching Bag GUI");
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+ frame.setSize(300, 300);
+ frame.setVisible(true);
+
+ bagSimFrame = new JFrame("Punching Bag Sim");
+ bagSimFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ bagSimFrame.setSize(bagXSize, bagYSize);
+ bagSimFrame.addMouseListener(this);
+ bagSimFrame.addMouseMotionListener(this);
+ bagSimFrame.setVisible(true);
+
+ System.out.println("Bag X: " + bagSimFrame.getX() + " Bag Y: "
+ + bagSimFrame.getY());
+
+ draw();
+ }
+
+ void draw() throws InterruptedException {
+ bagSimFrame.paintComponents(bagSimFrame.getGraphics());
+ // bagSimFrame.paintAll(bagSimFrame.getGraphics());
+ Thread.sleep(16);
+ draw();
+ }
+
+ public void runInteractively(Contact contact) {
+ bagSimFrame.add(new Ripple(contact));
+ }
+
+ class Ripple extends JPanel {
+ final Contact contact;
+ final int width;
+ double currentWidth;
+
+ Ripple(Contact contact) {
+ super();
+ this.contact = contact;
+ if (contact.area.width >= contact.area.height) {
+ width = contact.area.width;
+ } else {
+ width = contact.area.height;
+ }
+ currentWidth = width;
+ if (currentWidth <= 0.5) currentWidth = 0.5;
+ }
+
+ public void paintComponent(Graphics g) {
+ // Max size of ripple is 60cm
+ // Ripple will expand 60cm * strength/100
+
+ SlaveArduino.Colour colour = SlaveArduino.Colour.Red;
+ g.setColor(new Color(255, 0, 0, 255 - width));
+ boolean drawnSomething = false;
+
+ for (double i = 0; i < 360; i++) {
+ int x = contact.area.x
+ + (int) Math.round(currentWidth * Math.cos(i));
+ int y = contact.area.y
+ + (int) Math.round(currentWidth * Math.sin(i));
+
+ if (x >= 0 && x <= 8 && y >= 0 && y <= 19) {
+ SlaveArduino.setLED(colour, x, y);
+ drawnSomething =true;
+ }
+
+ if (useDebugScreen) {
+ g.fillOval(40 * x, 40 * y, 6, 6);
+
+ }
+ }
+ if (!drawnSomething) bagSimFrame.remove(this);
+
+ currentWidth += 0.1 + (currentWidth/10) + (contact.strength/130) ;
+ }
+ }
+
+ class Contact {
+ // Height of bag is
+
+ final long time; // Time of the contact with the bag (in millis)
+ final Area area;
+ final Direction direction;
+ final int strength; // 0 - 100
+
+ Contact(long time, Area area, Direction direction, int strength) {
+ this.time = time;
+ this.area = area;
+ this.direction = direction;
+ this.strength = strength;
+ }
+
+ Contact(long time, Area area) {
+ this(time, area, Direction.None, 50);
+ }
+
+ }
+
+ class Area {
+ public final int x;
+ public final int y;
+ public final int width;
+ public final int height;
+
+ Area(int x, int y, int width, int height) {
+ this.x = x;
+ this.y = y;
+ this.width = width;
+ this.height = height;
+ }
+
+ }
+
+ public void mouseClicked(MouseEvent arg0) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void mouseEntered(MouseEvent arg0) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void mouseExited(MouseEvent arg0) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void mousePressed(MouseEvent arg0) {
+ System.out.println("Mouse moved");
+ if (currentMode == Mode.Interactive) {
+ System.out.println("Button: " + arg0.getButton());
+ runInteractively(new Contact(System.currentTimeMillis(), new Area(
+ (arg0.getX() - 4) / 40, (arg0.getY() - 30) / 40, 0, 0), Direction.None , 30 * arg0.getButton()));
+ }
+ Toolkit.getDefaultToolkit().beep();
+ }
+
+ public void mouseReleased(MouseEvent arg0) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void mouseDragged(MouseEvent arg0) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void mouseMoved(MouseEvent arg0) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/PunchingBag/src/SlaveArduino.java b/PunchingBag/src/SlaveArduino.java
new file mode 100644
index 0000000..e3016c5
--- /dev/null
+++ b/PunchingBag/src/SlaveArduino.java
@@ -0,0 +1,169 @@
+import java.util.Enumeration;
+import java.util.HashSet;
+
+import gnu.io.CommPort;
+import gnu.io.CommPortIdentifier;
+import gnu.io.SerialPort;
+
+import java.io.FileDescriptor;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+
+import gnu.io.*;
+
+public class SlaveArduino {
+
+ enum Colour {None, Red, Yellow, Green};
+
+ static Colour[][] LED = new Colour[9][20];
+
+ public static void setLED(Colour colour, int x, int y) {
+ if (x < 0 || x > 8 || y < 0 || y > 19) return;
+ LED[x][y] = colour;
+ }
+
+
+ static void listPorts()
+ {
+ System.out.println("Listing Comm ports:");
+ java.util.Enumeration<CommPortIdentifier> portEnum = CommPortIdentifier.getPortIdentifiers();
+ while ( portEnum.hasMoreElements() )
+ {
+ CommPortIdentifier portIdentifier = portEnum.nextElement();
+ System.out.println(portIdentifier.getName() + " - " + getPortTypeName(portIdentifier.getPortType()) );
+ }
+ }
+
+ static String getPortTypeName ( int portType )
+ {
+ switch ( portType )
+ {
+ case CommPortIdentifier.PORT_I2C:
+ return "I2C";
+ case CommPortIdentifier.PORT_PARALLEL:
+ return "Parallel";
+ case CommPortIdentifier.PORT_RAW:
+ return "Raw";
+ case CommPortIdentifier.PORT_RS485:
+ return "RS485";
+ case CommPortIdentifier.PORT_SERIAL:
+ return "Serial";
+ default:
+ return "unknown type";
+ }
+ }
+
+ /**
+ * @return A HashSet containing the CommPortIdentifier for all serial ports that are not currently being used.
+ */
+ public static HashSet<CommPortIdentifier> getAvailableSerialPorts() {
+ HashSet<CommPortIdentifier> h = new HashSet<CommPortIdentifier>();
+ Enumeration thePorts = CommPortIdentifier.getPortIdentifiers();
+ while (thePorts.hasMoreElements()) {
+ CommPortIdentifier com = (CommPortIdentifier) thePorts.nextElement();
+ switch (com.getPortType()) {
+ case CommPortIdentifier.PORT_SERIAL:
+ try {
+ CommPort thePort = com.open("CommUtil", 50);
+ thePort.close();
+ h.add(com);
+ System.out.println("Found a port: " + com.getPortType());
+ } catch (PortInUseException e) {
+ System.out.println("Port, " + com.getName() + ", is in use.");
+ } catch (Exception e) {
+ System.err.println("Failed to open port " + com.getName());
+ e.printStackTrace();
+ }
+ }
+ }
+ return h;
+ }
+
+ void connect ( String portName ) throws Exception
+ {
+ CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
+ if ( portIdentifier.isCurrentlyOwned() )
+ {
+ System.out.println("Error: Port is currently in use");
+ }
+ else
+ {
+ CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);
+
+ if ( commPort instanceof SerialPort )
+ {
+ SerialPort serialPort = (SerialPort) commPort;
+ serialPort.setSerialPortParams(57600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
+
+ InputStream in = serialPort.getInputStream();
+ OutputStream out = serialPort.getOutputStream();
+
+ (new Thread(new SerialReader(in))).start();
+ (new Thread(new SerialWriter(out))).start();
+
+ }
+ else
+ {
+ System.out.println("Error: Only serial ports are handled by this example.");
+ }
+ }
+ }
+
+ /** */
+ public static class SerialReader implements Runnable
+ {
+ InputStream in;
+
+ public SerialReader ( InputStream in )
+ {
+ this.in = in;
+ }
+
+ public void run ()
+ {
+ byte[] buffer = new byte[1024];
+ int len = -1;
+ try
+ {
+ while ( ( len = this.in.read(buffer)) > -1 )
+ {
+ System.out.print(new String(buffer,0,len));
+ }
+ }
+ catch ( IOException e )
+ {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /** */
+ public static class SerialWriter implements Runnable
+ {
+ OutputStream out;
+
+ public SerialWriter ( OutputStream out )
+ {
+ this.out = out;
+ }
+
+ public void run ()
+ {
+ try
+ {
+ int c = 0;
+ while ( ( c = System.in.read()) > -1 )
+ {
+ this.out.write(c);
+ }
+ }
+ catch ( IOException e )
+ {
+ e.printStackTrace();
+ }
+ }
+ }
+
+}