This commit is contained in:
2011-02-26 14:30:14 +00:00
parent 30ebdeb7e3
commit 4c75ba5599
15 changed files with 183 additions and 119 deletions

View File

@@ -117,6 +117,14 @@ public class ITPlaylist extends ITObject {
Dispatch.put(object, "SongRepeat", repeatMode.ordinal()); Dispatch.put(object, "SongRepeat", repeatMode.ordinal());
} }
/**
* Cycle repeat modes.
*/
public void cycleSongRepeat() {
int repeat = Dispatch.get(object, "SongRepeat").getInt();
Dispatch.put(object, "SongRepeat", (repeat + 1) % 3);
}
/** /**
* Returns the playback repeat mode. * Returns the playback repeat mode.
* @return Returns the playback repeat mode. * @return Returns the playback repeat mode.

View File

@@ -499,4 +499,8 @@ public class iTunes {
Dispatch window = iTunes.getProperty("BrowserWindow").toDispatch(); Dispatch window = iTunes.getProperty("BrowserWindow").toDispatch();
return new ITBrowserWindow(window); return new ITBrowserWindow(window);
} }
public void cycleSongRepeat() {
getCurrentPlaylist().cycleSongRepeat();
}
} }

View File

@@ -24,6 +24,7 @@ import pm.exception.application.ApplicationExitException;
import pm.exception.application.ApplicationInitialiseException; import pm.exception.application.ApplicationInitialiseException;
import pm.exception.device.DeviceExitException; import pm.exception.device.DeviceExitException;
import pm.exception.device.DeviceInitialiseException; import pm.exception.device.DeviceInitialiseException;
import pm.macro.Active;
import pm.value.Action; import pm.value.Action;
public class Main extends EventListener { public class Main extends EventListener {
@@ -50,10 +51,37 @@ public class Main extends EventListener {
add(new JIntellitypeDevice()); add(new JIntellitypeDevice());
//add(new PlayerDevice()); //add(new PlayerDevice());
//add(new RumblepadDevice()); //add(new RumblepadDevice());
//add(new WiimoteDevice()); add(new WiimoteDevice());
//add(new GUIDevice()); //add(new GUIDevice());
//add(new TextDevice()); //add(new TextDevice());
//add(new LanTextDevice()); //add(new LanTextDevice());
startDevices();
//add(new ExampleApplication());
//add(new WMPApplication());
//add(new GomPlayerApplication());
//add(new WinampApplication());
add(new iTunesApplication());
startApplications();
}
protected void startApplications() {
ArrayList<Application> removeList = new ArrayList<Application>();
for (Application application : applicationCycle) {
try {
application.initialise();
application.start();
} catch (ApplicationInitialiseException e) {
removeList.add(application);
}
}
for (Application application : removeList) {
remove(application);
}
}
protected void startDevices() {
ArrayList<Device> removeList = new ArrayList<Device>();
for (Device device : deviceList) { for (Device device : deviceList) {
try { try {
device.initialise(); device.initialise();
@@ -63,20 +91,9 @@ public class Main extends EventListener {
remove(device); remove(device);
} }
} }
for (Device device : removeList) {
add(new ExampleApplication()); remove(device);
//add(new WMPApplication()); }
//add(new GomPlayerApplication());
//add(new WinampApplication());
//add(new iTunesApplication());
for (Application application : applicationCycle) {
try {
application.initialise();
application.start();
} catch (ApplicationInitialiseException e) {
remove(application);
}
}
} }
public void exit() { public void exit() {

View File

@@ -5,6 +5,7 @@ import pm.exception.application.ApplicationExitException;
import pm.value.Action; import pm.value.Action;
import com.dt.iTunesController.ITCOMDisabledReason; import com.dt.iTunesController.ITCOMDisabledReason;
import com.dt.iTunesController.ITPlaylistRepeatMode;
import com.dt.iTunesController.ITTrack; import com.dt.iTunesController.ITTrack;
import com.dt.iTunesController.iTunes; import com.dt.iTunesController.iTunes;
import com.dt.iTunesController.iTunesEventsInterface; import com.dt.iTunesController.iTunesEventsInterface;
@@ -65,6 +66,11 @@ public class iTunesApplication extends Application implements iTunesEventsInterf
break; break;
case SHUFFLE: case SHUFFLE:
iTunes.toggleShuffle(); iTunes.toggleShuffle();
//iTunes.fastForward();
break;
case REPEAT:
iTunes.cycleSongRepeat();
//iTunes.resume();
break; break;
} }
} }

View File

@@ -1,50 +1,30 @@
package pm.application.windows; package pm.application.windows;
import java.io.IOException; import java.io.IOException;
import java.util.Map;
import pm.Application; import pm.Application;
import pm.exception.application.ApplicationExitException; import pm.exception.application.ApplicationExitException;
import pm.exception.application.ApplicationInitialiseException; import pm.exception.application.ApplicationInitialiseException;
import pm.exception.application.windows.SendCommandException;
import pm.exception.application.windows.SendKeyException;
import pm.util.Native; import pm.util.Native;
import pm.util.Windows; import pm.util.Windows;
import pm.value.Command; import pm.value.Command;
import pm.value.Key; import pm.value.Key;
import pm.value.Type; import pm.value.Type;
import com.eaio.nativecall.IntCall;
import com.eaio.nativecall.NativeCall;
abstract public class WindowsApplication extends Application { abstract public class WindowsApplication extends Application {
protected final static int TERMINATE_SLEEP = 500; protected final static int TERMINATE_SLEEP = 500;
protected final static int START_SLEEP = 500; protected final static int START_SLEEP = 500;
protected final static String REGISTRY = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths"; protected final static String REGISTRY = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths";
protected final static int WM_COMMAND = 0x0111;
protected final static int WM_APPCOMMAND = 0x0319;
protected String program; protected String program;
protected String title; protected String title;
protected String name; protected String name;
protected String target;
protected Process process; protected Process process;
protected int handle; protected int handle;
protected IntCall sendMessage;
protected IntCall postMessage;
protected IntCall mapVirtualKey;
static {
try {
NativeCall.init();
} catch (Exception e) {
e.printStackTrace();
}
}
public WindowsApplication(String program, String title, String name) { public WindowsApplication(String program, String title, String name) {
this.program = program; this.program = program;
this.title = title; this.title = title;
@@ -53,20 +33,18 @@ abstract public class WindowsApplication extends Application {
} }
public void initialise() throws ApplicationInitialiseException { public void initialise() throws ApplicationInitialiseException {
sendMessage = new IntCall("user32", "SendMessageA");
postMessage = new IntCall("user32", "PostMessageA");
mapVirtualKey = new IntCall("user32", "MapVirtualKeyA");
handle = Windows.findWindow(name, null); handle = Windows.findWindow(name, null);
if (handle < 1) { if (handle < 1) {
String key = String.format("%s\\%s", REGISTRY, program); String key = String.format("%s\\%s", REGISTRY, program);
String path = Native.getValue(key); String path = Native.getValue(key);
try { try {
String command = String.format("\"%s\"", path); String command = String.format("\"%s\"", path);
command = Native.replaceVariables(command);
process = Runtime.getRuntime().exec(command); process = Runtime.getRuntime().exec(command);
sleep(START_SLEEP); sleep(START_SLEEP);
handle = Windows.findWindow(name, null); handle = Windows.findWindow(name, null);
} catch (IOException e) {} System.out.println(handle);
} catch (IOException e) {e.printStackTrace();}
} }
if (handle < 1) { if (handle < 1) {
throw new ApplicationInitialiseException(); throw new ApplicationInitialiseException();
@@ -80,36 +58,28 @@ abstract public class WindowsApplication extends Application {
super.exit(); super.exit();
} }
protected void command(Command command) throws SendCommandException { protected void command(Command command) {
int result = sendMessage.executeCall(new Object[] { Windows.sendMessage(handle, Windows.WM_APPCOMMAND, handle, command.getCode() << 16);
handle, WM_APPCOMMAND, handle, command.getCode() << 16});
if (result < 1 || sendMessage.getLastError() != null) {
throw new SendCommandException();
}
} }
protected void command(int command) throws SendCommandException { protected void command(int command) {
int result = sendMessage.executeCall(new Object[] { Windows.sendMessage(handle, Windows.WM_COMMAND, command, 0);
handle, WM_COMMAND, command});
if (result < 1 || sendMessage.getLastError() != null) {
throw new SendCommandException();
}
} }
protected void key(Type key, int code) throws SendKeyException { protected void user(int code) {
int scanCode = mapVirtualKey.executeCall(new Object[] {code, 0}); Windows.sendMessage(handle, Windows.WM_USER + code, 0, 0);
int result = postMessage.executeCall(new Object[] {
handle, key.getCode(), code, 1 | (scanCode << 16)});
if (result < 1 || postMessage.getLastError() != null) {
throw new SendKeyException();
}
} }
protected void key(Type key, char character) throws SendKeyException { protected void key(Type key, int code) {
int scanCode = Windows.mapVirtualKey(code, Windows.MAPVK_VK_TO_VSC);
Windows.postMessage(handle, key.getCode(), code, 1 | (scanCode << 16));
}
protected void key(Type key, char character) {
key(key, (int) Character.toUpperCase(character)); key(key, (int) Character.toUpperCase(character));
} }
protected void key(Type key, Key virtualKey) throws SendKeyException { protected void key(Type key, Key virtualKey) {
key(key, virtualKey.getCode()); key(key, virtualKey.getCode());
} }
} }

View File

@@ -1,12 +1,7 @@
package pm.application.windows.gomplayer; package pm.application.windows.gomplayer;
import pm.application.windows.WindowsApplication; import pm.application.windows.WindowsApplication;
import pm.exception.application.windows.SendCommandException;
import pm.exception.application.windows.SendKeyException;
import pm.value.Action; import pm.value.Action;
import pm.value.Command;
import pm.value.Key;
import pm.value.Type;
public class GomPlayerApplication extends WindowsApplication { public class GomPlayerApplication extends WindowsApplication {
protected final static String PROGRAM = "GOM.exe"; protected final static String PROGRAM = "GOM.exe";
@@ -18,35 +13,26 @@ public class GomPlayerApplication extends WindowsApplication {
} }
public void action(Action action) { public void action(Action action) {
System.out.println(handle);
System.out.println("GomPlayerApplication: " + action); System.out.println("GomPlayerApplication: " + action);
try { switch (action) {
switch (action) { case PLAY:
case PLAY: command(0x800C);
command(0x800C); break;
break; case FORWARD:
case NEXT: command(0x8009);
command(Command.MEDIA_NEXTTRACK); break;
break; case REWIND:
case PREVIOUS: command(0x8008);
command(Command.MEDIA_PREVIOUSTRACK); break;
break; case MUTE:
case FORWARD: command(0x8016);
command(Command.MEDIA_FAST_FORWARD); break;
break; case VOLUME_UP:
case REWIND: command(0x8014);
command(Command.MEDIA_REWIND); break;
break; case VOLUME_DOWN:
case MUTE: command(0x8013);
key(Type.DOWN, 'm'); break;
break; }
case VOLUME_UP:
key(Type.DOWN, Key.UP);
break;
case VOLUME_DOWN:
key(Type.DOWN, Key.DOWN);
break;
}
} catch (SendCommandException e) {} catch (SendKeyException e) {}
} }
} }

View File

@@ -1,8 +1,6 @@
package pm.application.windows.wmp; package pm.application.windows.wmp;
import pm.application.windows.WindowsApplication; import pm.application.windows.WindowsApplication;
import pm.exception.application.ApplicationInitialiseException;
import pm.exception.application.windows.SendCommandException;
import pm.value.Action; import pm.value.Action;
import pm.value.Command; import pm.value.Command;
@@ -17,15 +15,38 @@ public class WMPApplication extends WindowsApplication {
public void action(Action action) { public void action(Action action) {
System.out.println("WMPApplication: " + action); System.out.println("WMPApplication: " + action);
try { System.out.println(handle);
switch (action) { switch (action) {
case PLAY: case PLAY:
command(Command.MEDIA_PLAY_PAUSE); command(18808);
break; break;
case TEST: case NEXT:
command(Command.VOLUME_MUTE); command(18811);
break; break;
} case PREVIOUS:
} catch (SendCommandException e) {} command(18810);
break;
case FORWARD:
command(18813);
break;
case REWIND:
command(18814);
break;
case MUTE:
command(18817);
break;
case VOLUME_UP:
command(18815);
break;
case VOLUME_DOWN:
command(18816);
break;
case SHUFFLE:
command(18842);
break;
case REPEAT:
command(18843);
break;
}
} }
} }

View File

@@ -11,6 +11,7 @@ import pm.event.Task;
import pm.event.task.Continuous; import pm.event.task.Continuous;
import pm.event.task.Dynamic; import pm.event.task.Dynamic;
import pm.exception.button.UnknownButtonException; import pm.exception.button.UnknownButtonException;
import pm.exception.device.DeviceExitException;
import pm.exception.device.DeviceInitialiseException; import pm.exception.device.DeviceInitialiseException;
import pm.macro.state.Hold; import pm.macro.state.Hold;
import pm.macro.state.Press; import pm.macro.state.Press;
@@ -48,7 +49,7 @@ public class WiimoteDevice extends Device implements GestureListener {
public void initialise() throws DeviceInitialiseException { public void initialise() throws DeviceInitialiseException {
wiimote = wiimoteService.getDevice(this); wiimote = wiimoteService.getDevice(this);
wiimote.activateMotionSensing(); wiimote.activateMotionSensing();
add( /*add(
new Hold(WiimoteButton.A), new Hold(WiimoteButton.A),
new Task(Action.TRAIN), new Task(Action.TRAIN),
new Task(Action.STOP)); new Task(Action.STOP));
@@ -61,7 +62,7 @@ public class WiimoteDevice extends Device implements GestureListener {
add( add(
new Hold(WiimoteButton.HOME), new Hold(WiimoteButton.HOME),
new Task(Action.RECOGNIZE), new Task(Action.RECOGNIZE),
new Task(Action.STOP)); new Task(Action.STOP));*/
add( add(
new Press(WiimoteButton.A), new Press(WiimoteButton.A),
new Task(Action.PLAY, Target.APPLICATION)); new Task(Action.PLAY, Target.APPLICATION));
@@ -73,7 +74,7 @@ public class WiimoteDevice extends Device implements GestureListener {
new Task(Action.SHUFFLE, Target.APPLICATION)); new Task(Action.SHUFFLE, Target.APPLICATION));
add( add(
new Press(WiimoteButton.TWO), new Press(WiimoteButton.TWO),
new Task(Action.NEXT, Target.MAIN)); new Task(Action.REPEAT, Target.APPLICATION));
add( add(
new Press(WiimoteButton.UP), new Press(WiimoteButton.UP),
new Task(Action.NEXT, Target.APPLICATION)); new Task(Action.NEXT, Target.APPLICATION));
@@ -92,9 +93,13 @@ public class WiimoteDevice extends Device implements GestureListener {
add( add(
new Hold(WiimoteButton.PLUS), new Hold(WiimoteButton.PLUS),
new Continuous(Action.VOLUME_UP, Target.APPLICATION, 100)); new Continuous(Action.VOLUME_UP, Target.APPLICATION, 100));
add(
new Press(WiimoteButton.HOME),
new Task(Action.NEXT, Target.MAIN));
} }
public void exit() { public void exit() throws DeviceExitException {
super.exit();
wiimote.deactivateMotionSensing(); wiimote.deactivateMotionSensing();
wiimoteService.exit(); wiimoteService.exit();
} }

View File

@@ -16,6 +16,7 @@ public abstract class EventListener extends Listener implements Runnable {
} }
public final void run() { public final void run() {
System.out.println(this);
while (run) { while (run) {
if (eventQueue.isEmpty()) { if (eventQueue.isEmpty()) {
sleep(); sleep();

View File

@@ -39,7 +39,9 @@ public class EventManager {
self.add(task); self.add(task);
break; break;
case APPLICATION: case APPLICATION:
applicationCycle.current().add(task); if (applicationCycle.size() > 0) {
applicationCycle.current().add(task);
}
break; break;
default: default:
for (EventListener eventListener : taskListenerList) { for (EventListener eventListener : taskListenerList) {

View File

@@ -1,4 +1,6 @@
package pm.exception.application.windows; package pm.exception.util;
import pm.exception.application.windows.WindowsApplicationException;
public class SendCommandException extends WindowsApplicationException { public class SendCommandException extends WindowsApplicationException {
protected static final long serialVersionUID = 1L; protected static final long serialVersionUID = 1L;

View File

@@ -1,4 +1,6 @@
package pm.exception.application.windows; package pm.exception.util;
import pm.exception.application.windows.WindowsApplicationException;
public class SendKeyException extends WindowsApplicationException { public class SendKeyException extends WindowsApplicationException {
protected static final long serialVersionUID = 1L; protected static final long serialVersionUID = 1L;

View File

@@ -4,16 +4,23 @@ package pm.macro;
public class Active { public class Active {
protected Sequence sequence; protected Sequence sequence;
protected int step; protected int step;
//protected long start;
//protected long duration;
public Active(Sequence sequence) { public Active(Sequence sequence) {
this.sequence = sequence; this.sequence = sequence;
step = -1; step = -1;
//start = System.nanoTime();
} }
public Sequence getSequence() { public Sequence getSequence() {
return sequence; return sequence;
} }
/*public long getDuration() {
return duration;
}*/
public boolean next(State state) { public boolean next(State state) {
State next = sequence.get(++step); State next = sequence.get(++step);
return next == null ? false : state.equals(next); return next == null ? false : state.equals(next);
@@ -21,5 +28,10 @@ public class Active {
public boolean last() { public boolean last() {
return step == sequence.count() - 1; return step == sequence.count() - 1;
/*boolean last = step == sequence.count() - 1;
if (last) {
duration = System.nanoTime() - start;
}
return last;*/
} }
} }

View File

@@ -4,6 +4,7 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.InputMismatchException; import java.util.InputMismatchException;
import java.util.Map;
import java.util.NoSuchElementException; import java.util.NoSuchElementException;
import java.util.Scanner; import java.util.Scanner;
@@ -63,4 +64,12 @@ public class Native {
} catch (IOException e) {} } catch (IOException e) {}
return null; return null;
} }
public static String replaceVariables(String string) {
Map<String, String> env = System.getenv();
for (String key : env.keySet()) {
string = string.replace(String.format("%%%s%%", key), env.get(key));
}
return string;
}
} }

View File

@@ -1,18 +1,29 @@
package pm.util; package pm.util;
import com.eaio.nativecall.IntCall; import com.eaio.nativecall.IntCall;
import com.eaio.nativecall.NativeCall;
public class Windows { public class Windows {
public static final int WM_COMMAND = 0x0111;
public static final int WM_APPCOMMAND = 0x0319;
public static final int MAPVK_VK_TO_VSC = 0;
public static final int WM_USER = 0x0400;
protected static IntCall findWindow; protected static IntCall findWindow;
protected static IntCall sendMessage; protected static IntCall sendMessage;
protected static IntCall postMessage; protected static IntCall postMessage;
protected static IntCall mapVirtualKey; protected static IntCall mapVirtualKey;
static { static {
findWindow = new IntCall("user32", "FindWindowA"); try {
sendMessage = new IntCall("user32", "SendMessageA"); NativeCall.init();
postMessage = new IntCall("user32", "PostMessageA"); findWindow = new IntCall("user32", "FindWindowA");
mapVirtualKey = new IntCall("user32", "MapVirtualKeyA"); sendMessage = new IntCall("user32", "SendMessageA");
postMessage = new IntCall("user32", "PostMessageA");
mapVirtualKey = new IntCall("user32", "MapVirtualKeyA");
} catch (Exception e) {
e.printStackTrace();
}
} }
public static int findWindow(String className, String windowName) { public static int findWindow(String className, String windowName) {
@@ -22,4 +33,12 @@ public class Windows {
public static boolean postMessage(int handle, int message, int wParam, int lParam) { public static boolean postMessage(int handle, int message, int wParam, int lParam) {
return postMessage.executeBooleanCall(new Object[] {handle, message, wParam, lParam}); return postMessage.executeBooleanCall(new Object[] {handle, message, wParam, lParam});
} }
public static boolean sendMessage(int handle, int message, int wParam, int lParam) {
return sendMessage.executeBooleanCall(new Object[] {handle, message, wParam, lParam});
}
public static int mapVirtualKey(int code, int mapType) {
return mapVirtualKey.executeCall(new Object[] {code, 0});
}
} }