Action verwerk systeem grotendeels herschreven met als doelen:

- duplicate code vermijden (Main en Application extenden de ActionListener)
- naamgeving duidelijker maken (oude ActionListener heet nu ActionProvider)
- omslachtige gedoe met via reflectie opvragen van methode fixen (switch statements)
- mogelijkheid tot langere dan instantane actions (ActionListener zijn threads)

Het is noodzakelijk om het volgende op orde te brengen:
- omslachtige target systeem
- statussen en logs om debuggen en controle eenvoudig te maken
- mogelijkheid tot repeterende acties
This commit is contained in:
2011-02-11 16:09:29 +00:00
parent 2ae8d8201e
commit c25e293c85
16 changed files with 246 additions and 374 deletions

View File

@@ -334,7 +334,14 @@ public class iTunes {
public boolean getMute() {
return iTunes.getPropertyAsBoolean("Mute");
}
/**
* Toggle the mute state.
*/
public void toggleMute() {
setMute(!getMute());
}
/**
* Returns the current player state.
* @return Returns the current player state.

View File

@@ -1,11 +1,5 @@
package pm;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import pm.exception.ActionException;
import pm.exception.action.InvokeActionException;
import pm.exception.action.NotImplementedActionException;
import pm.exception.action.TargetNotSetException;
public enum Action {
@@ -21,7 +15,7 @@ public enum Action {
REWIND ("rewind"),
MUTE ("mute"),
VOLUME_UP ("volumeUp"),
VULUME_DOWN ("volumeDown");
VOLUME_DOWN ("volumeDown");
protected String action;
@@ -42,27 +36,4 @@ public enum Action {
}
return target;
}
public Method getMethod(Object object) throws NotImplementedActionException {
try {
return object.getClass().getMethod(action);
} catch (SecurityException e) {
} catch (NoSuchMethodException e) {}
throw new NotImplementedActionException();
}
public void invoke(Object object) throws ActionException {
try {
getMethod(object).invoke(object);
return;
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
throw new InvokeActionException();
// Todo: informatie doorgeven over wat er precies is foutgegaan
}
}

View File

@@ -0,0 +1,7 @@
package pm;
import pm.listener.ActionListener;
public abstract class Application extends ActionListener {
public void exit() {}
}

View File

@@ -1,54 +1,26 @@
package pm;
import java.util.ArrayList;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import pm.application.Application;
import pm.application.Winamp.WinampApplication;
import pm.application.example.ExampleApplication;
import pm.application.iTunes.iTunesApplication;
import pm.application.voorbeeld.VoorbeeldApplication;
import pm.device.Device;
import pm.device.javainput.extreme3d.Extreme3DDevice;
import pm.device.javainput.rumblepad.RumblepadDevice;
import pm.device.jintellitype.JIntellitypeDevice;
import pm.device.wiimote.WiimoteDevice;
import pm.exception.ActionException;
import pm.exception.action.NotImplementedActionException;
import pm.exception.action.UnknownTargetException;
import pm.exception.action.TargetNotSetException;
import pm.listener.ActionListener;
import pm.listener.ActionProvider;
import pm.util.ArrayCycle;
public class Main {
protected static final int SLEEP = 100;
public class Main extends ActionListener {
ArrayCycle<Application> applicationCycle;
ArrayList<Device> deviceList;
Queue<Action> actionQueue;
boolean run;
public Main() {
super();
applicationCycle = new ArrayCycle<Application>();
deviceList = new ArrayList<Device>();
actionQueue = new ConcurrentLinkedQueue<Action>();
ActionListener.initialise(actionQueue);
}
public void add(Application application) {
applicationCycle.add(application);
}
public boolean remove(Application application) {
return applicationCycle.remove(application);
}
public void add(Device device) {
deviceList.add(device);
}
public boolean remove(Device device) {
return deviceList.remove(device);
ActionProvider.initialise(actionQueue);
}
public void start() throws Exception {
@@ -60,10 +32,10 @@ public class Main {
for (Device device : deviceList) {
device.start();
}
add(new VoorbeeldApplication());
add(new ExampleApplication());
add(new iTunesApplication());
add(new WinampApplication());
//add(new WinampApplication());
applicationCycle.next();
for (Application application : applicationCycle) {
application.start();
@@ -71,38 +43,6 @@ public class Main {
run();
}
public void run() throws ActionException {
run = true;
while (run) {
if (actionQueue.isEmpty()) {
try {
Thread.sleep(SLEEP);
} catch (InterruptedException e) {}
} else {
Action action = actionQueue.poll();
Object object;
System.out.println("Action: " + action + " Target: " + action.getTarget());
switch (action.getTarget()) {
case MAIN:
object = this;
break;
case APPLICATION:
object = applicationCycle.current();
System.out.println("Current application: " + object.getClass());
break;
default:
throw new UnknownTargetException();
}
try {
action.invoke(object);
} catch (NotImplementedActionException e) {
e.printStackTrace();
// Todo: log.write(...)
}
}
}
}
public void exit() {
run = false;
for (Device device : deviceList) {
@@ -114,6 +54,45 @@ public class Main {
System.out.println("Main exit...");
}
protected void action(Action action) {
try {
System.out.println("Action: " + action + " Target: " + action.getTarget());
switch (action.getTarget()) {
case MAIN:
switch (action) {
case EXIT:
exit();
break;
default:
break;
}
break;
case APPLICATION:
applicationCycle.current().add(action);
break;
default:
//throw new UnknownTargetException();
}
} catch (TargetNotSetException e) {}
}
/* Add / remove methods */
protected void add(Application application) {
applicationCycle.add(application);
}
protected boolean remove(Application application) {
return applicationCycle.remove(application);
}
protected void add(Device device) {
deviceList.add(device);
}
protected boolean remove(Device device) {
return deviceList.remove(device);
}
public static void main(String[] args) {
try {
new Main().start();

View File

@@ -1,17 +0,0 @@
package pm.application;
import java.util.LinkedList;
import java.util.Queue;
import pm.Action;
public abstract class Application { //WinampController.
Queue<Action> actionQueue;
public Application() {
actionQueue = new LinkedList<Action>();
}
public void start() {}
public void exit() {}
}

View File

@@ -1,102 +1,69 @@
package pm.application.Winamp;
import pm.application.Application;
import pm.Action;
import pm.Application;
import pm.exception.ApplicationException;
import pm.exception.application.ApplicationStartException;
import com.qotsa.exception.InvalidHandle;
import com.qotsa.exception.InvalidParameter;
import com.qotsa.jni.controller.WinampController;
public class WinampApplication extends Application {
protected boolean connected;
protected boolean muted;
protected int volume;
public WinampApplication() {
connected = false;
}
public void start() throws Exception {
if (!connected) {
public void start() throws ApplicationException {
try {
WinampController.run();
connected = true;
volume = WinampController.getVolume();
muted = volume == 0;
} catch (Exception e) {
throw new ApplicationStartException();
}
}
public void exit() throws InvalidHandle {
if (connected) {
public void exit() {
try {
WinampController.exit();
connected = false;
}
} catch (InvalidHandle e) {}
}
/* Actions */
public void play() throws InvalidHandle {
if (connected) {
WinampController.play();
}
}
public void pause() throws InvalidHandle {
if (connected) {
WinampController.pause();
}
}
public void resume() throws InvalidHandle {
if (connected) {
WinampController.resume();
}
}
public void next() throws InvalidHandle {
if (connected) {
WinampController.nextTrack();
}
}
public void previous() throws InvalidHandle {
if (connected) {
WinampController.previousTrack();
}
}
public void forward() throws InvalidHandle {
if (connected) {
WinampController.fwd5Secs();
}
}
public void rewind() throws InvalidHandle {
if (connected) {
WinampController.rew5Secs();
}
}
public void mute() throws InvalidHandle, InvalidParameter {
if (connected) {
if(muted) {
WinampController.setVolume(volume);
muted = false;
} else {
volume = WinampController.getVolume();
WinampController.setVolume(0);
muted = true;
protected void action(Action action) {
System.out.println("WinampApplication: " + action);
try {
switch (action) {
case PLAY:
WinampController.play();
case NEXT:
WinampController.nextTrack();
break;
case PREVIOUS:
WinampController.previousTrack();
break;
case FORWARD:
WinampController.fwd5Secs();
break;
case REWIND:
WinampController.rew5Secs();
break;
case MUTE:
if(muted) {
WinampController.setVolume(volume);
} else {
volume = WinampController.getVolume();
WinampController.setVolume(0);
}
muted = !muted;
break;
case VOLUME_UP:
WinampController.increaseVolume();
break;
case VOLUME_DOWN:
WinampController.decreaseVolume();
break;
}
}
}
public void volumeUp() throws InvalidHandle {
if (connected) {
WinampController.increaseVolume();
}
}
public void volumeDown() throws InvalidHandle {
if (connected) {
WinampController.decreaseVolume();
}
} catch (InvalidHandle e) {
} catch (InvalidParameter e) {}
}
}

View File

@@ -0,0 +1,15 @@
package pm.application.example;
import pm.Action;
import pm.Application;
public class ExampleApplication extends Application {
protected void action(Action action) {
System.out.println("ExampleApplication: " + action);
switch (action) {
case TEST:
System.out.println("test");
break;
}
}
}

View File

@@ -1,6 +1,7 @@
package pm.application.iTunes;
import pm.application.Application;
import pm.Action;
import pm.Application;
import com.dt.iTunesController.ITCOMDisabledReason;
import com.dt.iTunesController.ITTrack;
@@ -8,168 +9,68 @@ import com.dt.iTunesController.iTunes;
import com.dt.iTunesController.iTunesEventsInterface;
public class iTunesApplication extends Application implements iTunesEventsInterface {
protected final int VOLUME_CHANGE_RATE = 5;
protected final int SEEK_TIME = 1000;
protected static final int POSTION_CHANGE_RATE = 5;
protected static final int VOLUME_CHANGE_RATE = 5;
protected static final int SEEK_TIME = 1000;
protected iTunes iTunes;
protected boolean connected;
public iTunesApplication() {
super();
iTunes = new iTunes();
connected = false;
}
public void start() {
if (!connected) {
iTunes.connect();
iTunes.addEventHandler(this);
connected = true;
}
public void start() throws Exception {
iTunes.connect();
iTunes.addEventHandler(this);
super.start();
}
public void exit() {
if (connected) {
iTunes.quit();
}
iTunes.quit();
}
protected void action(Action action) {
System.out.println("iTunesApplication: " + action);
switch (action) {
case PLAY:
iTunes.playPause();
case NEXT:
iTunes.nextTrack();
break;
case PREVIOUS:
iTunes.previousTrack();
break;
case FORWARD:
iTunes.setPlayerPosition(iTunes.getPlayerPosition() + POSTION_CHANGE_RATE);
break;
case REWIND:
iTunes.setPlayerPosition(iTunes.getPlayerPosition() - POSTION_CHANGE_RATE);
break;
case MUTE:
iTunes.toggleMute();
break;
case VOLUME_UP:
iTunes.setSoundVolume(getVolume() + VOLUME_CHANGE_RATE);
break;
case VOLUME_DOWN:
iTunes.setSoundVolume(getVolume() - VOLUME_CHANGE_RATE);
break;
}
}
/* Actions */
public void play() {
if (connected) {
iTunes.playPause();
}
protected int getVolume() {
return iTunes.getSoundVolume();
}
public void pause() {
if (connected) {
iTunes.playPause();
}
}
public void resume() {
if (connected) {
iTunes.resume();
}
}
public void next() {
if (connected) {
iTunes.nextTrack();
}
}
public void previous() {
if (connected) {
iTunes.previousTrack();
}
}
public void forward() {
if (connected) {
iTunes.fastForward();
//sleep(SEEK_TIME);
resume();
}
}
public void rewind() {
if (connected) {
iTunes.rewind();
//sleep(SEEK_TIME);
resume();
}
}
protected void sleep(int time) {
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void mute() {
if (connected) {
iTunes.setMute(iTunes.getMute());
}
}
protected int volume() {
if (connected) {
return iTunes.getSoundVolume();
} else {
return 0;
}
}
public void volumeUp() {
if (connected) {
iTunes.setSoundVolume(volume() + VOLUME_CHANGE_RATE);
}
}
public void volumeDown() {
if (connected) {
iTunes.setSoundVolume(volume() - VOLUME_CHANGE_RATE);
}
}
/* iTunesEventInterface => naar eigen class? */
@Override
public void onDatabaseChangedEvent(int[][] deletedObjectIDs,
int[][] changedObjectIDs) {
// TODO Auto-generated method stub
}
@Override
public void onPlayerPlayEvent(ITTrack iTrack) {
// TODO Auto-generated method stub
}
@Override
public void onPlayerStopEvent(ITTrack iTrack) {
// TODO Auto-generated method stub
}
@Override
public void onPlayerPlayingTrackChangedEvent(ITTrack iTrack) {
// TODO Auto-generated method stub
}
@Override
public void onCOMCallsDisabledEvent(ITCOMDisabledReason reason) {
// TODO Auto-generated method stub
}
@Override
public void onCOMCallsEnabledEvent() {
// TODO Auto-generated method stub
}
@Override
public void onQuittingEvent() {
// TODO Auto-generated method stub
}
@Override
public void onAboutToPromptUserToQuitEvent() {
// TODO Auto-generated method stub
}
@Override
public void onSoundVolumeChangedEvent(int newVolume) {
// TODO Auto-generated method stub
}
public void onDatabaseChangedEvent(int[][] deletedObjectIDs, int[][] changedObjectIDs) {}
public void onPlayerPlayEvent(ITTrack iTrack) {}
public void onPlayerStopEvent(ITTrack iTrack) {}
public void onPlayerPlayingTrackChangedEvent(ITTrack iTrack) {}
public void onCOMCallsDisabledEvent(ITCOMDisabledReason reason) {}
public void onCOMCallsEnabledEvent() {}
public void onQuittingEvent() {}
public void onAboutToPromptUserToQuitEvent() {}
public void onSoundVolumeChangedEvent(int newVolume) {}
}

View File

@@ -1,16 +0,0 @@
package pm.application.voorbeeld;
import pm.application.Application;
public class VoorbeeldApplication extends Application {
public void start() {
}
public void stop() {
System.out.println("stop");
}
public void test() {
System.out.println("test");
}
}

View File

@@ -3,11 +3,11 @@ package pm.device;
import pm.Action;
import pm.Macro;
import pm.exception.MacroException;
import pm.listener.ActionListener;
import pm.listener.ActionProvider;
import pm.listener.MacroListener;
import pm.macro.Event;
public abstract class Device extends ActionListener {
public abstract class Device extends ActionProvider {
protected MacroListener macroListener;
public Device() {

View File

@@ -48,7 +48,7 @@ public class RumblepadDevice extends JavaInputDevice {
Action.REWIND.setTarget(Target.APPLICATION));
add(
new Press(RumblepadButton.NINE),
Action.VULUME_DOWN.setTarget(Target.APPLICATION));
Action.VOLUME_DOWN.setTarget(Target.APPLICATION));
add(
new Press(RumblepadButton.TEN),
Action.VOLUME_UP.setTarget(Target.APPLICATION));

View File

@@ -0,0 +1,5 @@
package pm.exception;
public class ApplicationException extends Exception {
protected static final long serialVersionUID = 1L;
}

View File

@@ -0,0 +1,7 @@
package pm.exception.application;
import pm.exception.ApplicationException;
public class ApplicationStartException extends ApplicationException {
protected static final long serialVersionUID = 1L;
}

View File

@@ -1,17 +1,45 @@
package pm.listener;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import pm.Action;
public class ActionListener {
protected static Queue<Action> actionQueue;
public abstract class ActionListener implements Runnable {
protected static final int SLEEP = 100;
public static void initialise(Queue<Action> actionQueue) {
ActionListener.actionQueue = actionQueue;
protected Queue<Action> actionQueue;
protected boolean run;
public ActionListener() {
actionQueue = new ConcurrentLinkedQueue<Action>();
}
public void start() throws Exception {
new Thread(this).start();
}
public void run() {
run = true;
while (run) {
if (actionQueue.isEmpty()) {
sleep(SLEEP);
} else {
Action action = actionQueue.poll();
action(action);
}
}
}
public void add(Action action) {
actionQueue.add(action);
}
protected void sleep(int time) {
try {
Thread.sleep(time);
} catch (InterruptedException e) {}
}
abstract protected void action(Action action);
}

View File

@@ -0,0 +1,18 @@
package pm.listener;
import java.util.Queue;
import pm.Action;
public class ActionProvider {
protected static Queue<Action> actionQueue;
public static void initialise(Queue<Action> actionQueue) {
ActionProvider.actionQueue = actionQueue;
}
public void add(Action action) {
System.out.println(action);
actionQueue.add(action);
}
}

View File

@@ -9,7 +9,7 @@ import pm.exception.MacroException;
import pm.macro.Active;
import pm.macro.Event;
public class MacroListener extends ActionListener {
public class MacroListener extends ActionProvider {
public ArrayList<Macro> macroList;
public HashMap<Macro, Action> actionMap;
public ArrayList<Active> activeList;