import javax.swing.event.EventListenerList; import java.util.Arrays; public class PunchingBag implements Runnable { private byte[] rawLeds = new byte[6*8]; private Colour[][] leds = new Colour[9][20]; private byte[] ledGridIntensities = new byte[6]; private boolean[][] buttons = new boolean[8][19]; enum Colour { None, Red, Yellow, Green }; private EventListenerList buttonListenerList = new EventListenerList(); private EventListenerList ledListenerList = new EventListenerList(); public PunchingBag() { new Thread(this).start(); } /** * Adds an ActionListener to the button. * * @param l * the ActionListener to be added */ public void addButtonListener(ButtonListener l) { listenerList.add(ButtonListener.class, l); } public void setLED(byte x, byte y, byte intensity) { } public void drawRipple(byte x, byte y, byte intensity) { new Ripple(x, y, intensity); } class Ripple implements Runnable { double currentWidth; final byte x; final byte y; byte intensity; public Ripple(byte x, byte y, byte intensity) { this.x = x; this.y = y; this.intensity = intensity; new Thread(this).start(); } @Override public void run() { Colour colour; boolean drawnSomething = true; while (drawnSomething) { if (intensity >= 10) { colour = Colour.Red; } else if (intensity >= 5) { colour = Colour.Yellow; } else { colour = Colour.Green; } drawnSomething = false; for (double i = 0; i < 360; i++) { int x = x + (int) Math.round(currentWidth * Math.cos(i)); int y = y + (int) Math.round(currentWidth * Math.sin(i)); if (x >= 0 && x <= 8 && y >= 0 && y <= 19) { // setLED(x, y, colour); drawnSomething = true; } } currentWidth += 0.1 + (currentWidth / 10); try { Thread.sleep(1000/60); } catch (InterruptedException e) { e.printStackTrace(); } } } } } void CirclePulsate (int x, int y) { for ( int i= 0 ; i<= 15 ; i++ ) { matrix. Clear ( ) ; matrix. DrawEllipse ( AS1107:: Maxx / x , y ,i,i ) ; matrix. Update ( ) ; delay ( d ) ; buttonListenerList.add(ButtonListener.class, l); } public void addLEDChangeListener(ButtonListener l) { ledListenerList.add(ButtonListener.class, l); } public void setLED(byte x, byte y, Colour colour) { leds[x][y] = colour; } private void calculateRawLeds() { for (int y = 0; y <= 18; y++) { for (int x = 0; x <= 6; x++) { if ((y % 2) == 0) { if (leds[x][y] == Colour.Green || leds[x][y] == Colour.Yellow) { rawLeds[(int) Math.floor(y / 4)] = (byte) (rawLeds[(int) Math .floor(y / 4)] | (1 << (7 - x))); } } else { if (leds[x][y] == Colour.Red || leds[x][y] == Colour.Yellow) { rawLeds[(int) Math.floor(y / 4)] = (byte) (rawLeds[(int) Math .floor(y / 4)] | (1 << (7 - x))); } } } } int x = 7; // TODO: Complete and test, or rethink the following? for (int startY = 0; startY <= 4; startY++) { for (int y = 0; y <= 3; y++) { if (leds[x][startY + (y * 4)] == Colour.Red || leds[x][startY + (y * 4)] == Colour.Yellow) { rawLeds[(5 * 8) + startY] = (byte) (rawLeds[(int) Math .floor(y / 4)] | (1 << (7 - x))); } if (leds[x][y] == Colour.Green || leds[x][y] == Colour.Yellow) { rawLeds[(int) Math.floor(y / 4)] = (byte) (rawLeds[(int) Math .floor(y / 4)] | (1 << (7 - x))); } } } } public void clearLEDGrid() { Arrays.fill(leds, Boolean.FALSE); } public void setLEDGridIntensity(byte grid, byte intensity) { ledGridIntensities[grid] = intensity; } public void setLEDIntensities(byte intensity) { Arrays.fill(ledGridIntensities, intensity); } public void run() { } }