Merge remote-tracking branch 'origin/master'

Conflicts:
	src/de/ctdo/crashtest/BuntiClient.java
	src/de/ctdo/crashtest/Steuerung.java
	src/de/ctdo/crashtest/SteuerungFrame.java
This commit is contained in:
Lucas Pleß 2012-06-06 09:15:25 +02:00
commit cda52cc452
28 changed files with 1293 additions and 454 deletions

View File

@ -13,6 +13,7 @@
<element id="extracted-dir" path="$PROJECT_DIR$/libs/httpcore-4.1.4.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/libs/httpmime-4.1.3.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/libs/javampd-4.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/libs/jerklib.jar" path-in-jar="/" />
</root>
</artifact>
</component>

View File

@ -0,0 +1,16 @@
<component name="libraryTable">
<library name="commons-codec-1.41">
<CLASSES>
<root url="jar://$PROJECT_DIR$/libs/commons-codec-1.4.jar!/" />
<root url="jar://$PROJECT_DIR$/libs/commons-logging-1.1.1.jar!/" />
<root url="jar://$PROJECT_DIR$/libs/httpclient-4.1.3.jar!/" />
<root url="jar://$PROJECT_DIR$/libs/httpclient-cache-4.1.3.jar!/" />
<root url="jar://$PROJECT_DIR$/libs/httpcore-4.1.4.jar!/" />
<root url="jar://$PROJECT_DIR$/libs/httpmime-4.1.3.jar!/" />
<root url="jar://$PROJECT_DIR$/libs/javampd-4.0.jar!/" />
<root url="jar://$PROJECT_DIR$/libs/jerklib.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

View File

@ -0,0 +1,9 @@
<component name="libraryTable">
<library name="jerklib">
<CLASSES>
<root url="jar://$PROJECT_DIR$/libs/jerklib.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

View File

@ -9,6 +9,8 @@
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="commons-codec-1.4" level="project" />
<orderEntry type="library" name="javampd-4.0" level="project" />
<orderEntry type="library" name="jerklib" level="project" />
<orderEntry type="library" name="commons-codec-1.41" level="project" />
</component>
</module>

BIN
libs/jerklib.jar Normal file

Binary file not shown.

View File

@ -1,104 +0,0 @@
package de.ctdo.crashtest;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import java.io.*;
import java.net.Socket;
/**
* User: lpless
* Date: 10.05.12
* Time: 11:03
*/
public class BuntiClient {
private String baseAddress;
private HttpClient client = new DefaultHttpClient();
public BuntiClient(String server, int port) {
baseAddress = "http://" + server + ":" + port + "/";
}
public void setPar56(int id, int red, int green, int blue) {
try {
HttpPost post = new HttpPost(baseAddress + "/control/devices");
post.addHeader("Content-Type", "application/json");
StringEntity entity = new StringEntity(
"{ \"timeStamp\": 0, \"updates\": [ {\"deviceId\": "+id+", \"options\": { \"red\": "+
red+", \"green\": "+green+", \"blue\": "+blue+" } } ] }" ,
"UTF-8");
post.setEntity(entity);
HttpResponse response = client.execute(post);
System.out.println(response);
post.abort();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void setLampel(boolean red, boolean yellow, boolean green) {
int value = 0;
if( green ) value |= 0x01;
if( yellow ) value |= 0x02;
if( red ) value |= 0x04;
try {
Socket client = new Socket("lampel.ctdo.de", 2701);
client.setSoTimeout(2000);
DataOutputStream outToServer = new DataOutputStream(client.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(client.getInputStream()));
outToServer.writeBytes("io set port 2 " + Integer.toHexString(value) + '\n');
String result = inFromServer.readLine();
client.close();
} catch (IOException e) {
e.printStackTrace();
}
/* try {
HttpPost post = new HttpPost(baseAddress + "/control/devices");
post.addHeader("Content-Type", "application/json");
StringEntity entity = new StringEntity(
"{ \"timeStamp\": 0, \"updates\": [ {\"deviceId\": 4, \"options\": { \"red\": "+
red+", \"green\": "+green+", \"yellow\": "+yellow+" } } ] }" ,
"UTF-8");
post.setEntity(entity);
HttpResponse response = client.execute(post);
System.out.println(response);
post.abort();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}*/
}
}

View File

@ -1,173 +0,0 @@
package de.ctdo.crashtest;
import java.util.ArrayList;
import java.util.List;
public class Statemachine {
private final char BLUE_BUTTON = 'E';
private final char LIGHT_BARRIER = 'F';
private final char TABLE_ONE = 'G';
private final char TABLE_TWO = 'H';
private final char TABLE_THREE = 'I';
private final char ROKET_INPUT = 'B';
private long lastHandleInput = 0;
private final List<StateChangeListener> stateChangeListenerList = new ArrayList<StateChangeListener>();
private int stateChangeCounter = 0;
public void addStateChangedListener(StateChangeListener listener) {
stateChangeListenerList.add(listener);
}
public enum state {
IDLE,
ENTERED_ROOM,
TABLE_GAME_ONE,
TABLE_GAME_TWO,
TABLE_GAME_THREE,
TABLE_GAME_FOUR,
TABLE_GAME_FIVE,
TABLE_GAME_SIX,
TABLE_GAME_SEVEN,
TABLE_FINISH,
ROKET_DONE
}
private state currentState = state.IDLE;
public state getCurrentState() {
return currentState;
}
public int getStateChangeCounter() {
return stateChangeCounter;
}
public void reset() {
stateChangeCounter = 0;
currentState = state.IDLE;
onStateChanged();
}
public void handleInput(char input) {
if(System.currentTimeMillis() - lastHandleInput < 200 ) return;
state newState = getNewState(input);
if( newState != currentState ) {
stateChangeCounter++;
System.out.println("newState = " + newState);
workForState(newState);
currentState = newState;
onStateChanged();
}
lastHandleInput = System.currentTimeMillis();
}
private void onStateChanged() {
for(StateChangeListener listener: stateChangeListenerList) {
listener.stateChanged(currentState);
}
}
private void workForState(state newState) {
switch (newState) {
case IDLE:
break;
case ENTERED_ROOM:
break;
case TABLE_GAME_ONE:
break;
case TABLE_GAME_TWO:
break;
case TABLE_GAME_THREE:
break;
case TABLE_GAME_FOUR:
break;
case TABLE_GAME_FIVE:
break;
case TABLE_GAME_SIX:
break;
case TABLE_GAME_SEVEN:
break;
}
}
private state getNewState(char input) {
state retVal = currentState;
switch (currentState) {
case IDLE:
if(input == LIGHT_BARRIER) {
retVal = state.ENTERED_ROOM;
}
break;
case ENTERED_ROOM:
if(input == TABLE_ONE) {
retVal = state.TABLE_GAME_ONE;
}
break;
case TABLE_GAME_ONE:
if(input == TABLE_TWO) {
retVal = state.TABLE_GAME_TWO;
}
break;
case TABLE_GAME_TWO:
if(input == TABLE_THREE) {
retVal = state.TABLE_GAME_THREE;
} else if (input == TABLE_ONE) {
retVal = state.TABLE_GAME_ONE;
}
break;
case TABLE_GAME_THREE:
if(input == TABLE_TWO) {
retVal = state.TABLE_GAME_FOUR;
} else if (input == TABLE_ONE) {
retVal = state.TABLE_GAME_ONE;
}
break;
case TABLE_GAME_FOUR:
if(input == TABLE_THREE) {
retVal = state.TABLE_GAME_FIVE;
} else if (input == TABLE_ONE) {
retVal = state.TABLE_GAME_ONE;
}
break;
case TABLE_GAME_FIVE:
if(input == TABLE_ONE) {
retVal = state.TABLE_GAME_SIX;
} else if (input == TABLE_TWO) {
retVal = state.TABLE_GAME_ONE;
}
break;
case TABLE_GAME_SIX:
if(input == TABLE_THREE) {
retVal = state.TABLE_GAME_SEVEN;
} else if (input == TABLE_TWO) {
retVal = state.TABLE_GAME_ONE;
}
break;
case TABLE_GAME_SEVEN:
if(input == BLUE_BUTTON) {
retVal = state.TABLE_FINISH;
}
break;
case TABLE_FINISH:
if(input == ROKET_INPUT) {
retVal = state.ROKET_DONE;
}
}
return retVal;
}
}

View File

@ -0,0 +1,29 @@
package de.ctdo.crashtest;
import de.ctdo.crashtest.game.TheGame;
import de.ctdo.crashtest.gui.IGuiControl;
import de.ctdo.crashtest.gui.MainGui;
public class Steuerung {
private TheGame game;
private IGuiControl gui;
public static void main(String args[]) {
new Steuerung();
}
public Steuerung() {
gui = new MainGui();
game = new TheGame(gui);
}
}

View File

@ -1,175 +0,0 @@
package de.ctdo.crashtest;
import org.bff.javampd.MPD;
import org.bff.javampd.MPDPlayer;
import org.bff.javampd.exception.MPDConnectionException;
import org.bff.javampd.exception.MPDResponseException;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.UnknownHostException;
import java.util.Random;
public class SteuerungFrame extends JFrame implements StateChangeListener {
private JPanel pnlRoot;
private JLabel lblState;
private char lastKey = ' ';
private MPD mpd;
private MPDPlayer player;
Statemachine machine = new Statemachine();
BuntiClient bunti = new BuntiClient("bunti.ctdo.de", 8080);
public static void main(String args[]) {
new SteuerungFrame();
}
public SteuerungFrame() {
//setType(Type.UTILITY);
setBackground(Color.black);
setBounds(200,200, 400, 200);
machine.addStateChangedListener(this);
initGui();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
machine.reset();
try {
mpd = new MPD("dampfradio.raum.chaostreff-dortmund.de", 6600);
player = mpd.getMPDPlayer();
} catch (UnknownHostException e) {
e.printStackTrace();
return;
} catch (MPDConnectionException e) {
e.printStackTrace();
return;
}
addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
lastKey = e.getKeyChar();
if (lastKey == KeyEvent.VK_F) {
Random r = new Random();
setLEDs(r.nextInt(255), r.nextInt(255),r.nextInt(255));
}
if (lastKey == KeyEvent.VK_1) {
machine.reset();
} else {
machine.handleInput(e.getKeyChar());
}
updateGui();
}
});
addWindowStateListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
try {
if(mpd != null) mpd.close();
} catch (MPDConnectionException e1) {
e1.printStackTrace();
} catch (MPDResponseException e1) {
e1.printStackTrace();
}
}
});
}
@Override
public void stateChanged(Statemachine.state newState) {
updateGui();
switch (newState) {
case IDLE:
setLEDs(0x40,0,0xff);
bunti.setLampel(false,false,false);
break;
case ENTERED_ROOM:
bunti.setLampel(false,false,false);
setLEDs(255,0,100);
// start von Mo Do - Eins, Zwei Polizei
break;
case TABLE_GAME_ONE:
bunti.setLampel(true,false,false);
setLEDs(255,0,100);
break;
case TABLE_GAME_TWO:
bunti.setLampel(false,true,false);
setLEDs(255,0,100);
break;
case TABLE_GAME_THREE:
bunti.setLampel(false,true,false);
setLEDs(255,35,0);
break;
case TABLE_GAME_FOUR:
bunti.setLampel(false,true,false);
setLEDs(255,55,0);
break;
case TABLE_GAME_FIVE:
bunti.setLampel(false,true,false);
setLEDs(255,75,0);
break;
case TABLE_GAME_SIX:
bunti.setLampel(false,true,false);
setLEDs(255,100,0);
break;
case TABLE_GAME_SEVEN:
bunti.setLampel(false,false,true);
setLEDs(255,100,0);
break;
case TABLE_FINISH: // und roket muss starten
bunti.setLampel(false,false,true);
setLEDs(0, 255, 0);
break;
case ROKET_DONE:
break;
}
}
private void setLEDs(int red, int green, int blue) {
bunti.setPar56(0,red,green,blue);
bunti.setPar56(1,red,green,blue);
bunti.setPar56(2,red,green,blue);
bunti.setPar56(3,red,green,blue);
}
private void initGui() {
Container pane = getContentPane();
pnlRoot = new JPanel(new FlowLayout());
lblState = new JLabel("", JLabel.LEFT);
pnlRoot.add(lblState);
pane.add(pnlRoot);
updateGui();
}
private void updateGui() {
lblState.setText("<html>LastKey: " + lastKey + "<br>CurrentState: " +
machine.getCurrentState() + "<br>ChangeCounter: " +
machine.getStateChangeCounter() + "</html>");
}
}

View File

@ -0,0 +1,19 @@
package de.ctdo.crashtest;
import de.ctdo.crashtest.mpd.IMPDController;
import de.ctdo.crashtest.mpd.MPDController;
public class TestClass {
public static void main(String args[]) throws InterruptedException {
}
}

View File

@ -0,0 +1,127 @@
package de.ctdo.crashtest.domotics;
import de.ctdo.crashtest.log.Logger;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import java.io.*;
import java.net.Socket;
public class BuntiClient implements IBuntiClient {
private String baseAddress;
private final HttpClient client = new DefaultHttpClient();
public BuntiClient(String server, int port) {
baseAddress = "http://" + server + ":" + port + "/";
}
@Override
public void setPar56(final int red, final int green, final int blue) {
Runnable r = new Runnable() {
@Override
public void run() {
try {
HttpPost post = new HttpPost(baseAddress + "/control/devices");
post.addHeader("Content-Type", "application/json");
StringBuilder jsonString = new StringBuilder();
jsonString.append("{ \"timeStamp\": 0, \"updates\": [ ");
for(int i = 0; i< 4; i++) {
jsonString.append(" {\"deviceId\": ");
jsonString.append(i);
jsonString.append(", \"options\": { \"red\": ");
jsonString.append(red);
jsonString.append(", \"green\": ");
jsonString.append(green);
jsonString.append(", \"blue\": ");
jsonString.append(blue);
jsonString.append(" } } ");
if(i!=3) jsonString.append(",");
}
jsonString.append("] }");
StringEntity entity = new StringEntity( jsonString.toString(), "UTF-8");
post.setEntity(entity);
client.execute(post);
post.abort();
} catch (UnsupportedEncodingException e) {
Logger.sLog("bunti error: " + e.getMessage());
} catch (ClientProtocolException e) {
Logger.sLog("bunti error: " + e.getMessage());
} catch (IOException e) {
Logger.sLog("bunti error: " + e.getMessage());
}
}
};
new Thread(r).start();
}
@Override
public void setLampel(final boolean red, final boolean yellow, final boolean green) {
Runnable r = new Runnable() {
@Override
public void run() {
int value = 0;
if( green ) value |= 0x01;
if( yellow ) value |= 0x02;
if( red ) value |= 0x04;
try {
Socket client = new Socket("lampel.ctdo.de", 2701);
client.setSoTimeout(800);
DataOutputStream outToServer = new DataOutputStream(client.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(client.getInputStream()));
outToServer.writeBytes("io set port 2 " + Integer.toHexString(value) + '\n');
inFromServer.readLine();
client.close();
} catch (IOException e) {
Logger.sLog("lampel error: " + e.getMessage());
}
}
};
new Thread(r).start();
/* try {
HttpPost post = new HttpPost(baseAddress + "/control/devices");
post.addHeader("Content-Type", "application/json");
StringEntity entity = new StringEntity(
"{ \"timeStamp\": 0, \"updates\": [ {\"deviceId\": 4, \"options\": { \"red\": "+
red+", \"green\": "+green+", \"yellow\": "+yellow+" } } ] }" ,
"UTF-8");
post.setEntity(entity);
HttpResponse response = client.execute(post);
System.out.println(response);
post.abort();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}*/
}
}

View File

@ -0,0 +1,11 @@
package de.ctdo.crashtest.domotics;
/**
* @author: lucas
* @date: 01.06.12 14:25
*/
public interface IBuntiClient {
void setPar56(final int red, final int green, final int blue);
void setLampel(final boolean red, final boolean yellow, final boolean green);
}

View File

@ -0,0 +1,7 @@
package de.ctdo.crashtest.domotics;
public interface IRelaisboard {
void setRelais(int relai, boolean state);
}

View File

@ -0,0 +1,12 @@
package de.ctdo.crashtest.domotics;
public class Relaisboard implements IRelaisboard {
@Override
public void setRelais(int relai, boolean state) {
}
}

View File

@ -0,0 +1,16 @@
package de.ctdo.crashtest.game;
public interface IStatemachine {
void addListener(StatemachineListener listener);
void reset();
Statemachine.state getCurrentState();
void setNewState(Statemachine.state newState);
int getStateChangeCounter();
void handleInput(char input);
int getTimerSecondsLast();
void startTimer(int seconds);
void stopTimer();
void pauseTimer(boolean pause);
}

View File

@ -0,0 +1,240 @@
package de.ctdo.crashtest.game;
import de.ctdo.crashtest.log.Logger;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
public class Statemachine implements IStatemachine {
public enum state {
IDLE,
ENTERED_ROOM,
TABLE_GAME_ONE,
TABLE_GAME_TWO,
TABLE_GAME_THREE,
TABLE_GAME_FOUR,
TABLE_GAME_FIVE,
TABLE_GAME_SIX,
TABLE_GAME_DONE,
ROKET_STARTED,
ROKET_DONE
}
private final char RESET = '1';
private final char BLUE_BUTTON = 'E';
private final char LIGHT_BARRIER = 'F';
private final char TABLE_ONE = 'G';
private final char TABLE_TWO = 'H';
private final char TABLE_THREE = 'I';
private final char ROKET_INPUT = 'B';
private final List<StatemachineListener> statemachineListenerList;
private Timer timer;
private long lastHandleInput;
private int stateChangeCounter;
private state currentState;
private int timertSecondsLast;
public Statemachine() {
currentState = state.IDLE;
statemachineListenerList = new ArrayList<StatemachineListener>();
}
@Override
public void addListener(StatemachineListener listener) {
statemachineListenerList.add(listener);
}
@Override
public state getCurrentState() {
return currentState;
}
@Override
public void setNewState(state newState) {
currentState = newState;
stateChangeCounter++;
onStateChanged();
}
@Override
public int getStateChangeCounter() {
return stateChangeCounter;
}
@Override
public void reset() {
stateChangeCounter = 0;
currentState = state.IDLE;
stopTimer();
onStateChanged();
}
@Override
public void handleInput(char input) {
if(System.currentTimeMillis() - lastHandleInput < 200 ) return;
state newState = getNewState(input);
if( newState != currentState ) {
stateChangeCounter++;
Logger.sLog("newState = " + newState);
currentState = newState;
onStateChanged();
}
lastHandleInput = System.currentTimeMillis();
}
@Override
public int getTimerSecondsLast() {
return timertSecondsLast / 10;
}
@Override
public void startTimer(int seconds) {
Logger.sLog("starting timer");
timertSecondsLast = seconds*10;
scheduleTimer();
}
@Override
public void stopTimer() {
Logger.sLog("stopping timer");
if(timer != null) timer.cancel();
timertSecondsLast = 0;
}
@Override
public void pauseTimer(boolean pause) {
Logger.sLog("pausing timer: " + pause);
if(pause) {
if(timer != null) timer.cancel();
} else {
scheduleTimer();
}
}
/**
* notifies all listeners about the changed state
*/
private void onStateChanged() {
for(StatemachineListener listener: statemachineListenerList) {
listener.stateChanged(currentState);
}
}
private void onTimerTick() {
for(StatemachineListener listener: statemachineListenerList) {
listener.timerTick(timertSecondsLast);
}
}
/**
* Calculates the new game state from the current state and new input button
* @param input the char from the input
* @return returns the new state
*/
private state getNewState(char input) {
state retVal = currentState;
if(input == RESET) {
retVal = state.IDLE;
} else {
switch (currentState) {
case IDLE:
if(input == LIGHT_BARRIER) {
retVal = state.ENTERED_ROOM;
}
break;
case ENTERED_ROOM:
if(input == TABLE_ONE) {
retVal = state.TABLE_GAME_ONE;
}
break;
case TABLE_GAME_ONE:
if(input == TABLE_TWO) {
retVal = state.TABLE_GAME_TWO;
}
break;
case TABLE_GAME_TWO:
if(input == TABLE_THREE) {
retVal = state.TABLE_GAME_THREE;
} else if (input == TABLE_ONE) {
retVal = state.TABLE_GAME_ONE;
}
break;
case TABLE_GAME_THREE:
if(input == TABLE_TWO) {
retVal = state.TABLE_GAME_FOUR;
} else if (input == TABLE_ONE) {
retVal = state.TABLE_GAME_ONE;
}
break;
case TABLE_GAME_FOUR:
if(input == TABLE_THREE) {
retVal = state.TABLE_GAME_FIVE;
} else if (input == TABLE_ONE) {
retVal = state.TABLE_GAME_ONE;
}
break;
case TABLE_GAME_FIVE:
if(input == TABLE_ONE) {
retVal = state.TABLE_GAME_SIX;
} else if (input == TABLE_TWO) {
retVal = state.TABLE_GAME_ONE;
}
break;
case TABLE_GAME_SIX:
if(input == TABLE_THREE) {
retVal = state.TABLE_GAME_DONE;
} else if (input == TABLE_TWO) {
retVal = state.TABLE_GAME_ONE;
}
break;
case TABLE_GAME_DONE:
if(input == BLUE_BUTTON) {
retVal = state.ROKET_STARTED;
}
break;
case ROKET_STARTED:
if(input == ROKET_INPUT) {
retVal = state.ROKET_DONE;
}
}
}
return retVal;
}
private void scheduleTimer() {
if(timer != null) timer.cancel();
timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
timertSecondsLast--;
onTimerTick();
if(timertSecondsLast <= 0) {
if(timer != null) timer.cancel();
}
}
};
timer.scheduleAtFixedRate(timerTask, 100, 100);
}
}

View File

@ -1,10 +1,11 @@
package de.ctdo.crashtest;
package de.ctdo.crashtest.game;
/**
* User: lpless
* Date: 10.05.12
* Time: 13:37
*/
public interface StateChangeListener {
public interface StatemachineListener {
void stateChanged(Statemachine.state newState);
void timerTick(int tsecondsLeft);
}

View File

@ -0,0 +1,312 @@
package de.ctdo.crashtest.game;
import de.ctdo.crashtest.domotics.*;
import de.ctdo.crashtest.gui.*;
import de.ctdo.crashtest.irc.*;
import de.ctdo.crashtest.mpd.IMPDController;
import de.ctdo.crashtest.mpd.MPDController;
public class TheGame implements StatemachineListener, GuiEventListener, IRCEventListener {
private IGuiControl guiControl;
private IIrcClient ircClient;
private IStatemachine machine;
private IBuntiClient bunti;
private IMPDController mpdController;
public TheGame(IGuiControl guiControl) {
this.guiControl = guiControl;
this.ircClient = new IrcClient("crashtest", "#crashtest","irc.hackint.eu");
this.bunti = new BuntiClient("bunti.ctdo.de", 8080);
this.mpdController = new MPDController("dampfradio.raum.ctdo.de");
this.machine = new Statemachine();
initGame();
}
private void initGame() {
guiControl.addListener(this);
ircClient.addListener(this);
machine.addListener(this);
machine.reset();
}
/**
* Event listener for state change events from statemachine
* @param newState the new game state from statemachine
*/
@Override
public void stateChanged(Statemachine.state newState) {
ircClient.say("New State: " + newState);
switch (newState) {
case IDLE:
machine.stopTimer();
mpdController.setVolume(45);
mpdController.playSong("start", "mix");
bunti.setPar56(0,0,0);
bunti.setLampel(false,false,false);
guiControl.showCountDown(false);
break;
case ENTERED_ROOM:
mpdController.setVolume(70);
mpdController.playSong("tidirium", "welcome");
bunti.setLampel(false,false,false);
bunti.setPar56(20,0,100);
guiControl.showCountDown(true);
machine.startTimer(60*8);
break;
case TABLE_GAME_ONE:
mpdController.setVolume(70);
mpdController.playSong("K2", "Der Berg Ruft");
bunti.setLampel(true,false,false);
bunti.setPar56(255,0,100);
guiControl.showCountDown(true);
break;
case TABLE_GAME_TWO:
bunti.setLampel(false,true,false);
bunti.setPar56(255,0,100);
guiControl.showCountDown(true);
break;
case TABLE_GAME_THREE:
bunti.setLampel(false,true,false);
bunti.setPar56(255,35,0);
guiControl.showCountDown(true);
break;
case TABLE_GAME_FOUR:
mpdController.setVolume(60);
mpdController.playSong("Mo-Do","9 Eins Zwei Polizei");
bunti.setLampel(false,true,false);
bunti.setPar56(255,55,0);
guiControl.showCountDown(true);
break;
case TABLE_GAME_FIVE:
bunti.setLampel(false,true,false);
bunti.setPar56(255,75,0);
guiControl.showCountDown(true);
break;
case TABLE_GAME_SIX:
mpdController.setVolume(60);
mpdController.playSong("Zlatko & Jürgen","Großer Bruder");
bunti.setLampel(false,true,false);
bunti.setPar56(255,100,0);
guiControl.showCountDown(true);
break;
case TABLE_GAME_DONE:
bunti.setLampel(false,false,true);
bunti.setPar56(255,100,0);
guiControl.showCountDown(true);
machine.pauseTimer(true);
sayScore();
break;
case ROKET_STARTED:
mpdController.setVolume(50);
mpdController.playSong("The Underdog Project", "Summer Jam");
bunti.setLampel(false,false,true);
bunti.setPar56(0, 255, 0);
ircClient.say("table game complete, r0kets now");
guiControl.showCountDown(true);
machine.startTimer(7*60);
break;
case ROKET_DONE:
mpdController.setVolume(50);
mpdController.playSong("Coldplay", "Amsterdam");
bunti.setLampel(true,true,true);
bunti.setPar56(255, 196, 0);
guiControl.showCountDown(true);
machine.pauseTimer(true);
break;
}
}
@Override
public void timerTick(int tsecondsLeft) {
guiControl.setCountDown(tsecondsLeft);
if(tsecondsLeft == 0) ircClient.say("timer expired");
}
/**
* Event listener for keyPress events from the GUI
* @param key the pressed key
*/
@Override
public void keyPress(char key) {
machine.handleInput(key);
guiControl.setExtra("btn: " + key);
}
/**
* Event lister for window closing event from the GUI
*/
@Override
public void windowClosing() {
machine.reset();
bunti.setPar56(0xff,0xff,0xff);
ircClient.say("bye");
}
/**
* Event listener for IRC Messages
* @param message the message from the IRC user
*/
@Override
public void handleMessage(final String message) {
if(message.startsWith("help")) {
handleHelpCommand(message);
} else if(message.equals("reset")) {
machine.reset();
} else if(message.startsWith("state")) {
handleStateCommand(message);
} else if(message.startsWith("timer")) {
handleTimerCommand(message);
} else if(message.startsWith("score")) {
sayScore();
} else if(message.startsWith("wall")) {
guiControl.setWall(message.substring("wall".length()).trim());
} else if(message.startsWith("extra")) {
guiControl.setExtra(message.substring("extra".length()).trim());
} else {
ircClient.say("y u no use valid command?");
}
}
private void handleTimerCommand(final String message) {
String params = message.substring("timer".length()).trim().toLowerCase();
if(params.startsWith("start")) {
String timeStr = params.substring("start".length()).trim();
if(timeStr.length() > 0) {
try {
int time = Integer.parseInt(timeStr);
guiControl.showCountDown(true);
machine.startTimer(time);
ircClient.say("got it, starting with " + time + " seconds");
}
catch (NumberFormatException e) {
ircClient.say("your number looks a bit odd...");
}
} else {
ircClient.say("invalid parameter");
}
} else if(params.startsWith("stop")) {
machine.stopTimer();
guiControl.showCountDown(false);
ircClient.say("timer stopped");
} else if(params.startsWith("pause")) {
machine.pauseTimer(true);
} else if(params.startsWith("resume")) {
machine.pauseTimer(false);
}
}
private void handleStateCommand(final String message) {
if(message.equals("state")) {
ircClient.say(machine.getCurrentState().name());
} else {
String params = message.substring("state".length()).trim().toLowerCase();
Boolean ok = false;
for(Statemachine.state st: Statemachine.state.values()) {
String stateName = st.name().toLowerCase();
if(stateName.equals(params)) {
ok = true;
machine.setNewState(st);
ircClient.say("consider it done, sir!");
break;
}
}
if(!ok) ircClient.say("ehm, impossibruu!");
}
}
private void handleHelpCommand(final String message) {
if(message.equals("help")) {
ircClient.say("commands: help, reset, state, timer, wall, extra, score");
} else if(message.contains("reset")) {
ircClient.say("resets the game to IDLE");
} else if(message.contains("state")) {
ircClient.say("get or set game state");
ircClient.say("> state <NEWSTATE>");
ircClient.say("valid states: ");
int counter = 0;
StringBuilder sb = new StringBuilder();
for(Statemachine.state st: Statemachine.state.values()) {
sb.append(st.name());
sb.append(" ");
if(++counter == 4) {
counter = 0;
ircClient.say(sb.toString());
sb.setLength(0);
}
}
if(sb.length() > 0) {
ircClient.say(sb.toString());
}
} else if(message.contains("timer")) {
ircClient.say("control timer. commands are: start, stop, pause, resume.");
ircClient.say("for start give lenght in seconds as parameter");
ircClient.say("e.g.: timer start 120");
} else if(message.contains("wall")) {
ircClient.say("set text message on the screen");
} else if(message.contains("extra")) {
ircClient.say("set small extra message on the screen");
} else if(message.contains("score")) {
ircClient.say("i will tell you the current game score");
} else {
ircClient.say("dafuq?");
}
}
private void sayScore() {
ircClient.say("stateChangeCounter: " + machine.getStateChangeCounter());
// ircClient.say("timerlast: " + machine.getTimerSecondsLast());
int seconds = machine.getTimerSecondsLast();
int mins = seconds / 60;
int secs = seconds % 60;
ircClient.say(" " + mins + ":" + secs + "");
}
}

View File

@ -0,0 +1,14 @@
package de.ctdo.crashtest.gui;
import java.awt.event.KeyEvent;
/**
* @author: lucas
* @date: 01.06.12 10:29
*/
public interface GuiEventListener {
void keyPress(final char key);
void windowClosing();
}

View File

@ -0,0 +1,17 @@
package de.ctdo.crashtest.gui;
/**
* @author: lucas
* @date: 01.06.12 10:13
*/
public interface IGuiControl {
void setWall(final String message);
void setExtra(final String text);
void setCountDown(final int tseconds);
void showCountDown(final Boolean show);
void addListener(final GuiEventListener listener);
}

View File

@ -0,0 +1,169 @@
package de.ctdo.crashtest.gui;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.List;
public class MainGui extends JFrame implements IGuiControl {
private final JTextArea textWall = new JTextArea();
private final JLabel countDown = new JLabel();
private final JLabel extraField = new JLabel();
private final JPanel lowerPanel = new JPanel();
private final List<GuiEventListener> listenerList = new ArrayList<GuiEventListener>();
public MainGui() {
initGui();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setBounds(0,0, 1280, 1024);
setExtendedState(Frame.MAXIMIZED_BOTH);
setUndecorated(true);
addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
char lastKey = e.getKeyChar();
for(GuiEventListener listener: listenerList) {
listener.keyPress(lastKey);
}
}
});
addWindowStateListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
for(GuiEventListener listener: listenerList) {
listener.windowClosing();
}
}
});
setVisible(true);
}
private void setCountDownText(final int tseconds) {
int mins = tseconds / 600;
int secs = tseconds % 600 / 10 ;
int tsecs = tseconds % 9;
countDown.setText(" " + mins + ":" + secs + "." + tsecs);
if(tseconds < 400) {
double percentile = ((tseconds-100.0)/300.0);
double red = 255.0 - percentile * 255.0;
double green = 255.0 - red;
double blue = percentile * 100.0;
// System.out.println("red= " + red + " green=" + green + " blue="+blue);
if(red > 255) red = 255;
if(red < 0) red = 0;
if(green > 255) green = 255;
if(green < 0) green = 0;
if(blue > 255) blue = 255;
if(blue < 0) blue = 0;
Color fColor = new Color((int)red,(int)green, (int)blue);
countDown.setForeground(fColor);
}
else {
countDown.setForeground(new Color(0x00, 190, 100));
}
}
private void initGui() {
Container container = getContentPane();
container.setLayout(new BorderLayout());
container.add(textWall, BorderLayout.NORTH);
container.add(lowerPanel, BorderLayout.SOUTH);
lowerPanel.setLayout(new BorderLayout());
lowerPanel.add(countDown, BorderLayout.WEST);
lowerPanel.add(extraField, BorderLayout.EAST);
Font wallFont = new Font("Arcade Interlaced", Font.PLAIN, 66);
Font lowerFont = new Font("Arcade Interlaced", Font.PLAIN, 80);
Color fontColor = new Color(0x00, 190, 100);
textWall.setFont(wallFont);
textWall.setForeground(fontColor);
textWall.setBackground(Color.BLACK);
textWall.setText("follow the white rabbit...");
textWall.setLineWrap(true);
textWall.setWrapStyleWord(true);
textWall.setFocusable(false);
countDown.setFont(lowerFont);
countDown.setHorizontalAlignment(SwingConstants.LEFT);
countDown.setForeground(fontColor);
extraField.setFont(lowerFont);
extraField.setHorizontalAlignment(SwingConstants.RIGHT);
extraField.setForeground(fontColor);
lowerPanel.setBackground(Color.BLACK);
container.setBackground(Color.BLACK);
countDown.setText(" 15:00.0");
extraField.setText(" ");
}
@Override
public void setWall(final String message) {
final Runnable runnable = new Runnable() {
@Override
public void run() {
textWall.setText(message);
}
};
SwingUtilities.invokeLater(runnable);
}
@Override
public void setExtra(final String text) {
final Runnable runnable = new Runnable() {
@Override
public void run() {
extraField.setText(text + " ");
}
};
SwingUtilities.invokeLater(runnable);
}
@Override
public void setCountDown(final int tseconds) {
final Runnable runnable = new Runnable() {
@Override
public void run() {
setCountDownText(tseconds);
}
};
SwingUtilities.invokeLater(runnable);
}
@Override
public void showCountDown(final Boolean show) {
final Runnable runnable = new Runnable() {
@Override
public void run() {
countDown.setVisible(show);
}
};
SwingUtilities.invokeLater(runnable);
}
@Override
public void addListener(final GuiEventListener listener) {
listenerList.add(listener);
}
}

View File

@ -0,0 +1,10 @@
package de.ctdo.crashtest.irc;
/**
* @author: lucas
* @date: 01.06.12 10:05
*/
public interface IIrcClient {
void say(String message);
void addListener(IRCEventListener listenerIRC);
}

View File

@ -0,0 +1,10 @@
package de.ctdo.crashtest.irc;
/**
* @author: lucas
* @date: 01.06.12 11:49
*/
public interface IRCEventListener {
void handleMessage(final String message);
}

View File

@ -0,0 +1,81 @@
package de.ctdo.crashtest.irc;
import de.ctdo.crashtest.log.ILogger;
import de.ctdo.crashtest.log.Logger;
import jerklib.Channel;
import jerklib.ConnectionManager;
import jerklib.ProfileImpl;
import jerklib.Session;
import jerklib.events.ChannelMsgEvent;
import jerklib.events.ConnectionCompleteEvent;
import jerklib.events.IRCEvent;
import jerklib.events.JoinCompleteEvent;
import java.util.ArrayList;
import java.util.List;
/**
* IRC Client wrapper
* simplifies communication with the irc channel
*/
public class IrcClient implements IIrcClient, jerklib.events.listeners.IRCEventListener, ILogger {
private final List<IRCEventListener> listenerListIRC = new ArrayList<IRCEventListener>();
private Session ircsession;
private final String channel;
public IrcClient(String nick, String channel, String server) {
this.channel = channel;
ConnectionManager ircConnection = new ConnectionManager(new ProfileImpl(nick,nick, nick+2, nick+3));
ircsession = ircConnection.requestConnection(server);
ircsession.addIRCEventListener(this);
}
@Override
public void recieveEvent(IRCEvent ircEvent) {
if(ircEvent instanceof ConnectionCompleteEvent) {
ircEvent.getSession().joinChannel(channel);
}
else if (ircEvent instanceof JoinCompleteEvent) {
JoinCompleteEvent jce = (JoinCompleteEvent) ircEvent;
jce.getChannel().say("hello master. what's your order?");
Logger logger = Logger.getInstance();
logger.addLogger(this);
}
else if(ircEvent instanceof ChannelMsgEvent) {
ChannelMsgEvent cme = (ChannelMsgEvent)ircEvent;
String message = cme.getMessage();
final String nick = ircsession.getNick();
if(message.contains(nick)) {
message = message.substring(Math.max(nick.length(), message.indexOf(":")+1));
message = message.trim();
for(IRCEventListener listenerIRC : listenerListIRC) {
listenerIRC.handleMessage(message);
}
}
}
}
@Override
public void log(String message) {
say("LOG: " + message);
}
@Override
public void say(String message) {
if(ircsession != null) {
for(Channel chan: ircsession.getChannels()) {
chan.say(message);
}
}
}
@Override
public void addListener(final IRCEventListener listenerIRC) {
listenerListIRC.add(listenerIRC);
}
}

View File

@ -0,0 +1,10 @@
package de.ctdo.crashtest.log;
/**
* @author: lucas
* @date: 01.06.12 16:46
*/
public interface ILogger {
void log(String message);
}

View File

@ -0,0 +1,38 @@
package de.ctdo.crashtest.log;
import java.util.ArrayList;
import java.util.List;
public class Logger {
private final static Logger instance = new Logger();
private final List<ILogger> loggerList = new ArrayList<ILogger>();
public void addLogger(ILogger listener) {
loggerList.add(listener);
}
private Logger() {
}
public static Logger getInstance() {
return instance;
}
public void log(String message) {
System.out.println("LOG: " + message);
for(ILogger logger: loggerList) {
synchronized (this) {
logger.log(message);
}
}
}
public static void sLog(String message) {
getInstance().log(message);
}
}

View File

@ -0,0 +1,10 @@
package de.ctdo.crashtest.mpd;
/**
* @author: lucas
* @date: 01.06.12 10:36
*/
public interface IMPDController {
void playSong(final String artist, final String title);
void setVolume(final int volume);
}

View File

@ -0,0 +1,130 @@
package de.ctdo.crashtest.mpd;
import de.ctdo.crashtest.log.Logger;
import org.bff.javampd.MPD;
import org.bff.javampd.MPDDatabase;
import org.bff.javampd.MPDPlayer;
import org.bff.javampd.MPDPlaylist;
import org.bff.javampd.exception.MPDConnectionException;
import org.bff.javampd.exception.MPDDatabaseException;
import org.bff.javampd.exception.MPDPlayerException;
import org.bff.javampd.exception.MPDPlaylistException;
import org.bff.javampd.objects.MPDSong;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
/**
* A MPD abstraction to the org.bff.javampd library
*/
public class MPDController implements IMPDController {
private MPD mpd;
public MPDController(String host) {
try {
mpd = new MPD(host, 6600);
} catch (UnknownHostException e) {
Logger.sLog("MPD error: " + e.getMessage());
} catch (MPDConnectionException e) {
Logger.sLog("MPD error: " + e.getMessage());
}
}
/**
* Play a song, defined by artist and track title
* Song gets added to current playlist and is played.
* @param artist Artist of the track to play
* @param title Title of the track to play
*/
@Override
public void playSong(final String artist, final String title) {
if(mpd != null) {
Runnable r = new Runnable() {
@Override
public void run() {
addToPlayListIfNeeded(artist, title);
try {
MPDPlaylist playlist = mpd.getMPDPlaylist();
for(MPDSong song: playlist.getSongList()) {
if(song.getArtist() != null && song.getTitle() != null) {
if(song.getArtist().getName().toLowerCase().equals(artist.toLowerCase()) &&
song.getTitle().toLowerCase().equals(title.toLowerCase())) {
MPDPlayer player = mpd.getMPDPlayer();
player.stop();
player.playId(song);
break;
}
}
}
} catch (MPDConnectionException e) {
Logger.sLog("MPD error: " + e.getMessage());
} catch (MPDPlayerException e) {
Logger.sLog("MPD error: " + e.getMessage());
}
}
};
new Thread(r).start();
}
}
private void addToPlayListIfNeeded(final String artist, final String title) {
MPDDatabase db = mpd.getMPDDatabase();
MPDPlaylist playlist = mpd.getMPDPlaylist();
try {
List<MPDSong> tracks = new ArrayList<MPDSong>(db.findArtist(artist));
for(MPDSong song: tracks) {
if(song.getName() != null &&
song.getName().toLowerCase().contains(title.toLowerCase())) {
if(!playlist.getSongList().contains(song)) {
playlist.addSong(song);
}
break;
}
}
} catch (MPDConnectionException e) {
Logger.sLog("MPD error: " + e.getMessage());
} catch (MPDDatabaseException e) {
Logger.sLog("MPD error: " + e.getMessage());
} catch (MPDPlaylistException e) {
Logger.sLog("MPD error: " + e.getMessage());
}
}
/**
* Sets the current mpd volume
* @param volume the volume in percent (0-100)
*/
@Override
public void setVolume(final int volume) {
if(mpd != null) {
Runnable r = new Runnable() {
@Override
public void run() {
try {
mpd.getMPDPlayer().setVolume(volume);
} catch (MPDConnectionException e) {
Logger.sLog("MPD error: " + e.getMessage());
} catch (MPDPlayerException e) {
Logger.sLog("MPD error: " + e.getMessage());
}
}
};
new Thread(r).start();
}
}
}