/** * Copyright 2007 Jeffrey Palm. * * This is GPLed, don't use it to fly airplanes. */ package ams; import java.io.*; import java.util.*; /** * A generic class to use the AMS tracker to control things. */ public class Control { private String ams = "/Applications/AMSTracker"; private float period = .1F; /** * Sets the application name of the ASM Tracker, defaults to /Applications/AMSTracker * * @param ams application path */ public void setAMS(String ams) {this.ams = ams;} /** * @return the current AMS tracker application path */ public String getAMS() {return this.ams;} /** * Sets the period for checking the AMS tracker. defaults to -1. * * @param period fraction of a second to wait before getting new coordinates. */ public void setPeriod(float period) { if (period < 0) { throw new IllegalArgumentException("Period must be > 0"); } this.period = period; } /** * @return the current period */ public float getPeriod() {return this.period;} /** * A simple callback to recieve new coordniates. {@link #process(int,int)} is called * every {@link getPeriod()} seconds. */ public interface Callback { void process(int x, int y, int z); } public static class MultiCallack implements Callback { private final List callbacks = new ArrayList(); public void addCallack(Callback callback) { if (callback == null || callbacks.contains(callback)) return; callbacks.add(callback); } public void removeCallback(Callback callback) { if (callback == null || !callbacks.contains(callback)) return; callbacks.remove(callback); } public final void process(int x, int y, int z) { for (Iterator it = callbacks.iterator(); it.hasNext();) { ((Callback)it.next()).process(x,y,z); } } } private Thread t; /** * starts every off. {@link Callback#process(int,int)} is called * every {@link getPeriod()} seconds on callback. * * @param callback the Callback */ public void start(final Callback callback) throws Exception { // check if we've already started if (t != null) return; // Start the process String[] cmd = {ams, "-u", String.valueOf(period), "-s"}; final Process proc = Runtime.getRuntime().exec(cmd); final BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream())); t = new Thread(new Runnable() { public void run() { boolean going = true; while (going) { try { String line = in.readLine(); if (line.indexOf("AMS") != -1) continue; StringTokenizer st = new StringTokenizer(line," \n\t\r",false); int x = Integer.parseInt(st.nextToken().trim()); int y = Integer.parseInt(st.nextToken().trim()); int z = Integer.parseInt(st.nextToken().trim()); callback.process(-x,y,z); } catch (Exception e) {e.printStackTrace();} } try { System.out.println("trying to kill process"); proc.destroy(); System.out.println("killed process"); } catch (Exception e) {e.printStackTrace();} } }); t.start(); proc.waitFor(); proc.exitValue(); t.join(); } /** * Stops everything */ public void stop() throws Exception { if (t == null) return; t.interrupt(); t = null; } }