diff --git a/java/.classpath b/java/.classpath
index da05537..ec1a60f 100644
--- a/java/.classpath
+++ b/java/.classpath
@@ -14,7 +14,6 @@
-
diff --git a/java/lib/TableLayout.jar b/java/lib/TableLayout.jar
deleted file mode 100644
index 23519b0..0000000
Binary files a/java/lib/TableLayout.jar and /dev/null differ
diff --git a/java/resource/M.png b/java/resource/M.png
index 28fdd38..3399be7 100644
Binary files a/java/resource/M.png and b/java/resource/M.png differ
diff --git a/java/src/mimis/Manager.java b/java/src/mimis/Manager.java
index 1ebd8a9..672f633 100644
--- a/java/src/mimis/Manager.java
+++ b/java/src/mimis/Manager.java
@@ -6,6 +6,7 @@ import java.util.Map;
import javax.swing.JToggleButton;
+import mimis.application.cmd.windows.winamp.WinampApplication;
import mimis.exception.worker.DeactivateException;
import mimis.manager.Exitable;
import mimis.manager.ManageButton;
@@ -30,7 +31,9 @@ public class Manager extends Worker {
public void stop() throws DeactivateException {
super.stop();
for (T manageable : manageableArray) {
- manageable.stop();
+ if (!(manageable instanceof WinampApplication)) {
+ manageable.stop();
+ }
}
}
diff --git a/java/src/mimis/application/cmd/CMDApplication.java b/java/src/mimis/application/cmd/CMDApplication.java
index e9d218a..cb1e4ea 100644
--- a/java/src/mimis/application/cmd/CMDApplication.java
+++ b/java/src/mimis/application/cmd/CMDApplication.java
@@ -22,10 +22,14 @@ public abstract class CMDApplication extends Application {
this.title = title;
}
+ public String getPath() {
+ String key = String.format("%s\\%s", REGISTRY, program);
+ return Native.getValue(key);
+ }
+
public void activate() throws ActivateException {
super.activate();
- String key = String.format("%s\\%s", REGISTRY, program);
- String path = Native.getValue(key);
+ String path = getPath();
if (path == null) {
throw new ActivateException();
}
diff --git a/java/src/mimis/application/cmd/windows/gomplayer/GomPlayerApplication.java b/java/src/mimis/application/cmd/windows/gomplayer/GomPlayerApplication.java
index 98e44d3..f1bc489 100644
--- a/java/src/mimis/application/cmd/windows/gomplayer/GomPlayerApplication.java
+++ b/java/src/mimis/application/cmd/windows/gomplayer/GomPlayerApplication.java
@@ -23,6 +23,12 @@ public class GomPlayerApplication extends WindowsApplication {
volumeWorker = new VolumeWorker();
seekWorker = new SeekWorker();
}
+
+ public void stop() throws DeactivateException {
+ super.stop();
+ volumeWorker.stop();
+ seekWorker.stop();
+ }
public void begin(Action action) {
log.trace("GomPlayerApplication begin: " + action);
diff --git a/java/src/mimis/application/mpc/MPCApplication.java b/java/src/mimis/application/mpc/MPCApplication.java
index 040dc2f..70fc821 100644
--- a/java/src/mimis/application/mpc/MPCApplication.java
+++ b/java/src/mimis/application/mpc/MPCApplication.java
@@ -1,6 +1,9 @@
package mimis.application.mpc;
+import mimis.Worker;
import mimis.application.cmd.windows.WindowsApplication;
+import mimis.exception.worker.ActivateException;
+import mimis.exception.worker.DeactivateException;
import mimis.value.Action;
public class MPCApplication extends WindowsApplication {
@@ -8,11 +11,41 @@ public class MPCApplication extends WindowsApplication {
protected final static String TITLE = "Media Player Classic";
protected final static String NAME = "MediaPlayerClassicW";
+ protected static final int VOLUME_SLEEP = 50;
+ protected static final int SEEK_SLEEP = 50;
+
+ protected VolumeWorker volumeWorker;
+ protected SeekWorker seekWorker;
+
public MPCApplication() {
super(PROGRAM, TITLE, NAME);
+ volumeWorker = new VolumeWorker();
+ seekWorker = new SeekWorker();
}
- public void action(Action action) {
+ public void begin(Action action) {
+ log.trace("MPCApplication: " + action);
+ try {
+ switch (action) {
+ case FORWARD:
+ seekWorker.activate(1);
+ break;
+ case REWIND:
+ seekWorker.activate(-1);
+ break;
+ case VOLUME_UP:
+ volumeWorker.activate(1);
+ break;
+ case VOLUME_DOWN:
+ volumeWorker.activate(-1);
+ break;
+ }
+ } catch (ActivateException e) {
+ log.error(e);
+ }
+ }
+
+ public void end(Action action) {
log.trace("MPCApplication: " + action);
switch (action) {
case PLAY:
@@ -25,19 +58,23 @@ public class MPCApplication extends WindowsApplication {
command(920);
break;
case FORWARD:
- command(900);
- break;
case REWIND:
- command(889);
+ try {
+ seekWorker.deactivate();
+ } catch (DeactivateException e) {
+ log.error(e);
+ }
break;
case MUTE:
command(909);
break;
case VOLUME_UP:
- command(907);
- break;
case VOLUME_DOWN:
- command(908);
+ try {
+ volumeWorker.deactivate();
+ } catch (DeactivateException e) {
+ log.error(e);
+ }
break;
case FULLSCREEN:
command(830);
@@ -49,4 +86,31 @@ public class MPCApplication extends WindowsApplication {
return TITLE;
}
+ protected class VolumeWorker extends Worker {
+ protected int volumeChangeSign;
+
+ public void activate(int volumeChangeSign) throws ActivateException {
+ super.activate();
+ this.volumeChangeSign = volumeChangeSign;
+ }
+
+ public void work() {
+ command(volumeChangeSign > 0 ? 907 : 908);
+ sleep(VOLUME_SLEEP);
+ }
+ };
+
+ protected class SeekWorker extends Worker {
+ protected int seekDirection;
+
+ public void activate(int seekDirection) throws ActivateException {
+ super.activate();
+ this.seekDirection = seekDirection;
+ }
+
+ public void work() {
+ command(seekDirection > 0 ? 900 : 889);
+ sleep(SEEK_SLEEP);
+ }
+ };
}
diff --git a/java/src/mimis/application/vlc/VLCApplication.java b/java/src/mimis/application/vlc/VLCApplication.java
index 3498d39..395bc39 100644
--- a/java/src/mimis/application/vlc/VLCApplication.java
+++ b/java/src/mimis/application/vlc/VLCApplication.java
@@ -4,37 +4,56 @@ import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import mimis.Worker;
import mimis.application.cmd.CMDApplication;
+import mimis.exception.worker.ActivateException;
+import mimis.exception.worker.DeactivateException;
+import mimis.util.Native;
import mimis.value.Action;
+import mimis.value.Amount;
public class VLCApplication extends CMDApplication {
+ protected final static String REGISTRY = "HKEY_CLASSES_ROOT\\Applications\\vlc.exe\\shell\\Open\\command";
protected final static String PROGRAM = "vlc.exe";
protected final static String TITLE = "VLC media player";
protected static final int POSTION_CHANGE_RATE = 1;
protected static final int VOLUME_CHANGE_RATE = 20;
- protected static final String HOST = "127.0.0.1"; // localhost
- protected static final int PORT = 1234;
+ protected static final String HOST = "localhost";
+ protected static final int PORT = 8080;
+ protected static final int VOLUME_SLEEP = 100;
+ protected static final int SEEK_SLEEP = 100;
+
+ protected VolumeWorker volumeWorker;
+ protected SeekWorker seekWorker;
+
protected int volume = 255;
protected boolean muted = false;
public VLCApplication() {
super(PROGRAM, TITLE);
+ volumeWorker = new VolumeWorker();
+ seekWorker = new SeekWorker();
+ }
+
+ public String getPath() {
+ Pattern pattern = Pattern.compile("\"([^\"]+)\"");
+ Matcher matcher = pattern.matcher(Native.getValue(REGISTRY));
+ return matcher.find() ? matcher.group(1) : null;
}
public void command(String command) {
- //String request = "http://" + HOST + ":" + PORT + "/requests/status.xml?command=" + command;
String request = String.format("http://%s:%d/requests/status.xml?command=%s", HOST, PORT, command);
try {
- // Todo: check response voor 200, status ok
- //int response = ((HttpURLConnection)(new URL(request)).openConnection()).getResponseCode();
URL url = new URL(request);
HttpURLConnection httpUrlConnection = (HttpURLConnection) url.openConnection();
int response = httpUrlConnection.getResponseCode();
- log.debug("Response: " + response);
+ log.trace("Response: " + response);
} catch (MalformedURLException e) {
log.error(e);
} catch (IOException e) {
@@ -42,6 +61,34 @@ public class VLCApplication extends CMDApplication {
}
}
+ public void stop() throws DeactivateException {
+ super.stop();
+ volumeWorker.stop();
+ seekWorker.stop();
+ }
+
+ public void begin(Action action) {
+ log.trace("VLCApplication begin: " + action);
+ try {
+ switch (action) {
+ case VOLUME_UP:
+ volumeWorker.activate("+");
+ break;
+ case VOLUME_DOWN:
+ volumeWorker.activate("-");
+ break;
+ case FORWARD:
+ seekWorker.activate(Amount.SMALL, "+");
+ break;
+ case REWIND:
+ seekWorker.activate(Amount.SMALL, "-");
+ break;
+ }
+ } catch (ActivateException e) {
+ log.error(e);
+ }
+ }
+
public void end(Action action) {
log.trace("VLCApplication end: " + action);
switch (action) {
@@ -58,19 +105,23 @@ public class VLCApplication extends CMDApplication {
command("pl_previous");
break;
case FORWARD:
- command("command=seek&val=+" + POSTION_CHANGE_RATE);
- break;
case REWIND:
- command("command=seek&val=-" + POSTION_CHANGE_RATE);
+ try {
+ seekWorker.deactivate();
+ } catch (DeactivateException e) {
+ log.error(e);
+ }
break;
case MUTE:
command("volume&val=" + toggleMute());
break;
case VOLUME_UP:
- volumeUp();
- break;
case VOLUME_DOWN:
- volumeDown();
+ try {
+ volumeWorker.deactivate();
+ } catch (DeactivateException e) {
+ log.error(e);
+ }
break;
case SHUFFLE:
command("command=pl_random");
@@ -102,4 +153,45 @@ public class VLCApplication extends CMDApplication {
public String title() {
return TITLE;
}
+
+ protected class VolumeWorker extends Worker {
+ protected String volumeChangeSign;
+
+ public void activate(String volumeChangeSign) throws ActivateException {
+ super.activate();
+ this.volumeChangeSign = volumeChangeSign;
+ }
+
+ public void work() {
+ volume += VOLUME_CHANGE_RATE;
+ command("volume&val=" + volumeChangeSign + VOLUME_CHANGE_RATE);
+ sleep(VOLUME_SLEEP);
+ }
+ };
+
+ protected class SeekWorker extends Worker {
+ protected Amount amount;
+ protected String seekDirection;
+
+ public void activate(Amount amount, String seekDirection) throws ActivateException {
+ super.activate();
+ this.amount = amount;
+ this.seekDirection = seekDirection;
+ }
+
+ public void work() {
+ switch (amount) {
+ case SMALL:
+ command("command=seek&val=" + seekDirection + POSTION_CHANGE_RATE);
+ break;
+ case MEDIUM:
+ command("command=seek&val=" + seekDirection + POSTION_CHANGE_RATE * 2);
+ break;
+ case LARGE:
+ command("command=seek&val=" + seekDirection + POSTION_CHANGE_RATE * 3);
+ break;
+ }
+ sleep(SEEK_SLEEP);
+ }
+ };
}
diff --git a/java/src/mimis/device/javainput/JavaInputDevice.java b/java/src/mimis/device/javainput/JavaInputDevice.java
index ed533a3..949086a 100644
--- a/java/src/mimis/device/javainput/JavaInputDevice.java
+++ b/java/src/mimis/device/javainput/JavaInputDevice.java
@@ -48,9 +48,7 @@ public abstract class JavaInputDevice extends Device {
}
}
- public void processEvent(JXInputAxisEvent event) {
- //log.trace("JXInputAxisEvent: " + event);
- }
+ public void processEvent(JXInputAxisEvent event) {}
public void processEvent(JXInputButtonEvent event) throws ButtonException {
Button button = getButton(event);
diff --git a/java/src/mimis/device/javainput/JavaInputListener.java b/java/src/mimis/device/javainput/JavaInputListener.java
index a59161d..92580f0 100644
--- a/java/src/mimis/device/javainput/JavaInputListener.java
+++ b/java/src/mimis/device/javainput/JavaInputListener.java
@@ -6,8 +6,6 @@ import java.util.Queue;
import mimis.Worker;
import mimis.exception.ButtonException;
-
-import de.hardcode.jxinput.Axis;
import de.hardcode.jxinput.Button;
import de.hardcode.jxinput.Directional;
import de.hardcode.jxinput.JXInputDevice;
@@ -37,12 +35,12 @@ public class JavaInputListener extends Worker implements Runnable, JXInputAxisEv
}
protected void addListeners() {
- for (int i = 0; i < jxinputDevice.getMaxNumberOfAxes(); ++i) {
+ /*for (int i = 0; i < jxinputDevice.getMaxNumberOfAxes(); ++i) {
Axis axis = jxinputDevice.getAxis(i);
if (axis != null) {
JXInputEventManager.addListener(this, axis);
}
- }
+ }*/
for (int i = 0; i < jxinputDevice.getMaxNumberOfButtons(); ++i) {
Button button = jxinputDevice.getButton(i);
if (button != null) {
diff --git a/java/src/mimis/device/javainput/extreme3d/Extreme3DButton.java b/java/src/mimis/device/javainput/extreme3d/Extreme3DButton.java
index aa06f5a..d1ee38a 100644
--- a/java/src/mimis/device/javainput/extreme3d/Extreme3DButton.java
+++ b/java/src/mimis/device/javainput/extreme3d/Extreme3DButton.java
@@ -5,18 +5,18 @@ import mimis.exception.button.UnknownButtonException;
import de.hardcode.jxinput.event.JXInputButtonEvent;
public enum Extreme3DButton implements Button {
- ONE ("ManageButton 0"),
- TWO ("ManageButton 1"),
- THREE ("ManageButton 2"),
- FOUR ("ManageButton 3"),
- FIVE ("ManageButton 4"),
- SIX ("ManageButton 5"),
- SEVEN ("ManageButton 6"),
- EIGHT ("ManageButton 7"),
- NINE ("ManageButton 8"),
- TEN ("ManageButton 9"),
- ELEVEN ("ManageButton 10"),
- TWELVE ("ManageButton 11");
+ ONE ("Button 0"),
+ TWO ("Button 1"),
+ THREE ("Button 2"),
+ FOUR ("Button 3"),
+ FIVE ("Button 4"),
+ SIX ("Button 5"),
+ SEVEN ("Button 6"),
+ EIGHT ("Button 7"),
+ NINE ("Button 8"),
+ TEN ("Button 9"),
+ ELEVEN ("Button 10"),
+ TWELVE ("Button 11");
protected String code;
diff --git a/java/src/mimis/device/wiimote/WiimoteDevice.java b/java/src/mimis/device/wiimote/WiimoteDevice.java
index 66af116..c12d6ca 100644
--- a/java/src/mimis/device/wiimote/WiimoteDevice.java
+++ b/java/src/mimis/device/wiimote/WiimoteDevice.java
@@ -48,9 +48,9 @@ public class WiimoteDevice extends Device implements GestureListener {
/* Worker */
public void activate() throws ActivateException {
- super.activate();
connect();
add(eventMapCycle.player);
+ super.activate();
}
public boolean active() {
@@ -133,7 +133,7 @@ public class WiimoteDevice extends Device implements GestureListener {
}
public void feedback(Feedback feedback) {
- if (active()) {
+ if (wiimote != null && active()) {
log.debug("Wiimote rumble feedback");
wiimote.rumble(RUMBLE);
}