summaryrefslogtreecommitdiff
path: root/ao-tools/altosui
diff options
context:
space:
mode:
Diffstat (limited to 'ao-tools/altosui')
-rw-r--r--ao-tools/altosui/AltosDevice.java39
-rw-r--r--ao-tools/altosui/AltosDeviceDialog.java14
-rw-r--r--ao-tools/altosui/AltosDeviceLinux.java172
-rw-r--r--ao-tools/altosui/AltosGPS.java4
-rw-r--r--ao-tools/altosui/AltosSerial.java115
-rw-r--r--ao-tools/altosui/AltosUI.java147
-rw-r--r--ao-tools/altosui/AltosUIIcon.icnsbin0 -> 129010 bytes
-rw-r--r--ao-tools/altosui/AltosVoice.java4
-rw-r--r--ao-tools/altosui/Makefile41
-rw-r--r--ao-tools/altosui/Manifest.txt1
-rw-r--r--ao-tools/altosui/voices.txt1
11 files changed, 184 insertions, 354 deletions
diff --git a/ao-tools/altosui/AltosDevice.java b/ao-tools/altosui/AltosDevice.java
index 66800c5c..0e7d01da 100644
--- a/ao-tools/altosui/AltosDevice.java
+++ b/ao-tools/altosui/AltosDevice.java
@@ -18,13 +18,38 @@
package altosui;
import java.lang.*;
import java.util.*;
+import libaltosJNI.*;
-public class AltosDevice {
- String tty; /* suitable to be passed to AltosSerial.connect */
- String manufacturer;
- String product;
- int serial;
- int idProduct;
- int idVendor;
+public class AltosDevice extends altos_device {
+ public String toString() {
+ return String.format("%-20.20s %4d %s",
+ getProduct(), getSerial(), getPath());
+ }
+
+ static {
+ System.loadLibrary("altos");
+ libaltos.altos_init();
+ }
+ static AltosDevice[] list(String product) {
+ SWIGTYPE_p_altos_list list = libaltos.altos_list_start();
+
+ ArrayList<AltosDevice> device_list = new ArrayList<AltosDevice>();
+ if (list != null) {
+ SWIGTYPE_p_altos_file file;
+
+ for (;;) {
+ AltosDevice device = new AltosDevice();
+ if (libaltos.altos_list_next(list, device) == 0)
+ break;
+ device_list.add(device);
+ }
+ libaltos.altos_list_finish(list);
+ }
+
+ AltosDevice[] devices = new AltosDevice[device_list.size()];
+ for (int i = 0; i < device_list.size(); i++)
+ devices[i] = device_list.get(i);
+ return devices;
+ }
} \ No newline at end of file
diff --git a/ao-tools/altosui/AltosDeviceDialog.java b/ao-tools/altosui/AltosDeviceDialog.java
index cb1eef8b..eb70877c 100644
--- a/ao-tools/altosui/AltosDeviceDialog.java
+++ b/ao-tools/altosui/AltosDeviceDialog.java
@@ -20,15 +20,17 @@ package altosui;
import java.lang.*;
import java.util.*;
import javax.swing.*;
+import libaltosJNI.libaltos;
+import libaltosJNI.altos_device;
+import libaltosJNI.SWIGTYPE_p_altos_file;
+import libaltosJNI.SWIGTYPE_p_altos_list;
import altosui.AltosDevice;
-import altosui.AltosDeviceLinux;
public class AltosDeviceDialog {
- static AltosDevice show (JFrame frame, String product) {
- AltosDevice[] devices = null;
- if (System.getProperty("os.name").startsWith("Linux"))
- devices = AltosDeviceLinux.list(product);
+ static altos_device show (JFrame frame, String product) {
+ AltosDevice[] devices;
+ devices = AltosDevice.list(product);
if (devices != null & devices.length > 0) {
Object o = JOptionPane.showInputDialog(frame,
"Select a device",
@@ -37,7 +39,7 @@ public class AltosDeviceDialog {
null,
devices,
devices[0]);
- return (AltosDevice) o;
+ return (altos_device) o;
} else {
return null;
}
diff --git a/ao-tools/altosui/AltosDeviceLinux.java b/ao-tools/altosui/AltosDeviceLinux.java
deleted file mode 100644
index ffc70aff..00000000
--- a/ao-tools/altosui/AltosDeviceLinux.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright © 2010 Keith Packard <keithp@keithp.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- */
-
-package altosui;
-import java.lang.*;
-import java.io.*;
-import java.util.*;
-import altosui.AltosDevice;
-
-public class AltosDeviceLinux extends AltosDevice {
-
- String load_string(File file) {
- try {
- FileInputStream in = new FileInputStream(file);
- String result = "";
- int c;
- try {
- while ((c = in.read()) != -1) {
- if (c == '\n')
- break;
- result = result + (char) c;
- }
- return result;
- } catch (IOException ee) {
- return "";
- }
- } catch (FileNotFoundException ee) {
- return "";
- }
- }
- String load_string(File dir, String name) {
- return load_string(new File(dir, name));
- }
-
- int load_hex(File file) {
- try {
- return Integer.parseInt(load_string(file).trim(), 16);
- } catch (NumberFormatException ee) {
- return -1;
- }
- }
-
- int load_hex(File dir, String name) {
- return load_hex(new File(dir, name));
- }
-
- int load_dec(File file) {
- try {
- return Integer.parseInt(load_string(file).trim());
- } catch (NumberFormatException ee) {
- return -1;
- }
- }
-
- int load_dec(File dir, String name) {
- return load_dec(new File(dir, name));
- }
-
- String usb_tty(File sys_dir) {
- String base = sys_dir.getName();
- int num_configs = load_hex(sys_dir, "bNumConfigurations");
- int num_inters = load_hex(sys_dir, "bNumInterfaces");
- for (int config = 1; config <= num_configs; config++) {
- for (int inter = 0; inter < num_inters; inter++) {
- String endpoint_base = String.format("%s:%d.%d",
- base, config, inter);
- File endpoint_full = new File(sys_dir, endpoint_base);
-
- File[] namelist;
-
- /* Check for tty:ttyACMx style names */
- class tty_colon_filter implements FilenameFilter {
- public boolean accept(File dir, String name) {
- return name.startsWith("tty:");
- }
- }
- namelist = endpoint_full.listFiles(new tty_colon_filter());
- if (namelist != null && namelist.length > 0)
- return new File ("/dev", namelist[0].getName().substring(4)).getPath();
-
- /* Check for tty/ttyACMx style names */
- class tty_filter implements FilenameFilter {
- public boolean accept(File dir, String name) {
- return name.startsWith("tty");
- }
- }
- File tty_dir = new File(endpoint_full, "tty");
- namelist = tty_dir.listFiles(new tty_filter());
- if (namelist != null && namelist.length > 0)
- return new File ("/dev", namelist[0].getName()).getPath();
- }
- }
- return null;
- }
-
- public AltosDeviceLinux (File sys) {
- sys = sys;
- manufacturer = load_string(sys, "manufacturer");
- product = load_string(sys, "product");
- serial = load_dec(sys, "serial");
- idProduct = load_hex(sys, "idProduct");
- idVendor = load_hex(sys, "idVendor");
- tty = usb_tty(sys);
- }
-
- public String toString() {
- return String.format("%-20s %6d %-15s", product, serial, tty == null ? "" : tty);
- }
- static public AltosDeviceLinux[] list() {
- LinkedList<AltosDeviceLinux> devices = new LinkedList<AltosDeviceLinux>();
-
- class dev_filter implements FilenameFilter{
- public boolean accept(File dir, String name) {
- for (int i = 0; i < name.length(); i++) {
- char c = name.charAt(i);
- if (Character.isDigit(c))
- continue;
- if (c == '-')
- continue;
- if (c == '.' && i != 1)
- continue;
- return false;
- }
- return true;
- }
- }
-
- File usb_devices = new File("/sys/bus/usb/devices");
- File[] devs = usb_devices.listFiles(new dev_filter());
- if (devs != null) {
- for (int e = 0; e < devs.length; e++) {
- AltosDeviceLinux dev = new AltosDeviceLinux(devs[e]);
- if (dev.idVendor == 0xfffe && dev.tty != null) {
- devices.add(dev);
- }
- }
- }
- AltosDeviceLinux[] foo = new AltosDeviceLinux[devices.size()];
- for (int e = 0; e < devices.size(); e++)
- foo[e] = devices.get(e);
- return foo;
- }
-
- static public AltosDeviceLinux[] list(String model) {
- AltosDeviceLinux[] devices = list();
- if (model != null) {
- LinkedList<AltosDeviceLinux> subset = new LinkedList<AltosDeviceLinux>();
- for (int i = 0; i < devices.length; i++) {
- if (devices[i].product.startsWith(model))
- subset.add(devices[i]);
- }
- devices = new AltosDeviceLinux[subset.size()];
- for (int e = 0; e < subset.size(); e++)
- devices[e] = subset.get(e);
- }
- return devices;
- }
-}
diff --git a/ao-tools/altosui/AltosGPS.java b/ao-tools/altosui/AltosGPS.java
index c3b368e2..f8eb5f48 100644
--- a/ao-tools/altosui/AltosGPS.java
+++ b/ao-tools/altosui/AltosGPS.java
@@ -90,6 +90,9 @@ public class AltosGPS {
gps_connected = true;
gps_time = new AltosGPSTime();
i++;
+ } else if ((words[i]).equals("not-connected")) {
+ gps_time = new AltosGPSTime();
+ i++;
} else if (words.length >= 40) {
gps_locked = true;
gps_connected = true;
@@ -106,6 +109,7 @@ public class AltosGPS {
v_error = AltosParse.parse_int(AltosParse.strip_suffix(words[i++], "(verr)"));
} else {
gps_time = new AltosGPSTime();
+ i++;
}
AltosParse.word(words[i++], "SAT");
int tracking_channels = 0;
diff --git a/ao-tools/altosui/AltosSerial.java b/ao-tools/altosui/AltosSerial.java
index 03ab28c5..e84f5b63 100644
--- a/ao-tools/altosui/AltosSerial.java
+++ b/ao-tools/altosui/AltosSerial.java
@@ -26,16 +26,21 @@ import java.io.*;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.LinkedList;
import java.util.Iterator;
-import gnu.io.*;
import altosui.AltosSerialMonitor;
+import libaltosJNI.libaltos;
+import libaltosJNI.altos_device;
+import libaltosJNI.SWIGTYPE_p_altos_file;
+import libaltosJNI.SWIGTYPE_p_altos_list;
/*
* This class reads from the serial port and places each received
* line in a queue. Dealing with that queue is left up to other
* threads.
*/
-class AltosSerialReader implements Runnable {
- InputStream serial_in;
+
+public class AltosSerial implements Runnable {
+
+ SWIGTYPE_p_altos_file altos;
LinkedList<LinkedBlockingQueue<String>> monitors;
LinkedBlockingQueue<String> reply_queue;
Thread input_thread;
@@ -46,7 +51,7 @@ class AltosSerialReader implements Runnable {
try {
for (;;) {
- c = serial_in.read();
+ c = libaltos.altos_getchar(altos, 0);
if (Thread.interrupted())
break;
if (c == -1)
@@ -70,7 +75,6 @@ class AltosSerialReader implements Runnable {
}
}
}
- } catch (IOException e) {
} catch (InterruptedException e) {
}
}
@@ -96,16 +100,13 @@ class AltosSerialReader implements Runnable {
}
public boolean opened() {
- return serial_in != null;
+ return altos != null;
}
public void close() {
- if (serial_in != null) {
- try {
- serial_in.close();
- } catch (IOException e) {
- }
- serial_in = null;
+ if (altos != null) {
+ libaltos.altos_close(altos);
+ altos = null;
}
if (input_thread != null) {
try {
@@ -117,87 +118,31 @@ class AltosSerialReader implements Runnable {
}
}
- public void open(File name) throws FileNotFoundException {
- close();
- serial_in = new FileInputStream(name);
- input_thread = new Thread(this);
- input_thread.start();
- }
- public void open(CommPort c) throws IOException {
- close();
- try {
- c.enableReceiveTimeout(1000); /* icky. the read method cannot be interrupted */
- } catch (UnsupportedCommOperationException ee) {
- }
- serial_in = c.getInputStream();
- input_thread = new Thread(this);
- input_thread.start();
- }
- public AltosSerialReader () {
- serial_in = null;
- input_thread = null;
- line = "";
- monitors = new LinkedList<LinkedBlockingQueue<String>> ();
- reply_queue = new LinkedBlockingQueue<String> ();
+ public void putc(char c) {
+ libaltos.altos_putchar(altos, c);
}
-}
-
-public class AltosSerial {
- OutputStream serial_out = null;
- AltosSerialReader reader = null;
-
- CommPort comm_port = null;
-
- public void close() {
- try {
- serial_out.close();
- } catch (IOException ee) {
- }
- reader.close();
- if (comm_port != null) {
- comm_port.close();
- }
- }
-
- public void open(File serial_name) throws FileNotFoundException {
- reader.open(serial_name);
- serial_out = new FileOutputStream(serial_name);
- }
-
- public void open(CommPort c) throws IOException {
- reader.open(c);
- serial_out = c.getOutputStream();
+ public void print(String data) {
+ for (int i = 0; i < data.length(); i++)
+ putc(data.charAt(i));
}
- public void connect(String port_name) throws IOException, NoSuchPortException, PortInUseException {
- comm_port = new RXTXPort(port_name);
- open(comm_port);
+ public void printf(String format, Object ... arguments) {
+ print(String.format(format, arguments));
}
- void init() {
- reader = new AltosSerialReader();
- }
-
- public void add_monitor(LinkedBlockingQueue<String> q) {
- reader.add_monitor(q);
- }
-
- public void remove_monitor(LinkedBlockingQueue<String> q) {
- reader.remove_monitor(q);
+ public void open(altos_device device) throws FileNotFoundException {
+ close();
+ altos = libaltos.altos_open(device);
+ input_thread = new Thread(this);
+ input_thread.start();
}
public AltosSerial() {
- init();
- }
-
- public AltosSerial(File serial_name) throws FileNotFoundException {
- init();
- open(serial_name);
- }
-
- public AltosSerial(CommPort comm_port) throws IOException {
- init();
- open(comm_port);
+ altos = null;
+ input_thread = null;
+ line = "";
+ monitors = new LinkedList<LinkedBlockingQueue<String>> ();
+ reply_queue = new LinkedBlockingQueue<String> ();
}
}
diff --git a/ao-tools/altosui/AltosUI.java b/ao-tools/altosui/AltosUI.java
index 43c40799..3dfc8952 100644
--- a/ao-tools/altosui/AltosUI.java
+++ b/ao-tools/altosui/AltosUI.java
@@ -27,7 +27,6 @@ import java.util.*;
import java.text.*;
import java.util.prefs.*;
import java.util.concurrent.LinkedBlockingQueue;
-import gnu.io.*;
import altosui.AltosSerial;
import altosui.AltosSerialMonitor;
@@ -38,6 +37,8 @@ import altosui.AltosPreferences;
import altosui.AltosLog;
import altosui.AltosVoice;
+import libaltosJNI.*;
+
class AltosFlightStatusTableModel extends AbstractTableModel {
private String[] columnNames = {"Height (m)", "State", "RSSI (dBm)", "Speed (m/s)" };
private Object[] data = { 0, "idle", 0, 0 };
@@ -220,16 +221,8 @@ public class AltosUI extends JFrame {
flightInfoModel[col].addRow(name, value);
}
- public void info_add_row(int col, String name, String format, Object value) {
- flightInfoModel[col].addRow(name, String.format(format, value));
- }
-
- public void info_add_row(int col, String name, String format, Object v1, Object v2) {
- flightInfoModel[col].addRow(name, String.format(format, v1, v2));
- }
-
- public void info_add_row(int col, String name, String format, Object v1, Object v2, Object v3) {
- flightInfoModel[col].addRow(name, String.format(format, v1, v2, v3));
+ public void info_add_row(int col, String name, String format, Object... parameters) {
+ flightInfoModel[col].addRow(name, String.format(format, parameters));
}
public void info_add_deg(int col, String name, double v, int pos, int neg) {
@@ -345,48 +338,57 @@ public class AltosUI extends JFrame {
class IdleThread extends Thread {
private AltosState state;
+ int reported_landing;
+
+ public void report(boolean last) {
+ if (state == null)
+ return;
+
+ /* reset the landing count once we hear about a new flight */
+ if (state.state < AltosTelemetry.ao_flight_drogue)
+ reported_landing = 0;
+
+ /* Shut up once the rocket is on the ground */
+ if (reported_landing > 2) {
+ return;
+ }
+
+ /* If the rocket isn't on the pad, then report height */
+ if (state.state > AltosTelemetry.ao_flight_pad) {
+ voice.speak("%d meters", (int) (state.height + 0.5));
+ } else {
+ reported_landing = 0;
+ }
+
+ /* If the rocket is coming down, check to see if it has landed;
+ * either we've got a landed report or we haven't heard from it in
+ * a long time
+ */
+ if (!state.ascent &&
+ (last ||
+ System.currentTimeMillis() - state.report_time >= 15000 ||
+ state.state == AltosTelemetry.ao_flight_landed))
+ {
+ if (Math.abs(state.baro_speed) < 20 && state.height < 100)
+ voice.speak("rocket landed safely");
+ else
+ voice.speak("rocket may have crashed");
+ if (state.gps != null)
+ voice.speak("bearing %d degrees, range %d meters",
+ (int) (state.from_pad.bearing + 0.5),
+ (int) (state.from_pad.distance + 0.5));
+ ++reported_landing;
+ }
+ }
public void run () {
- int reported_landing = 0;
+ reported_landing = 0;
state = null;
try {
for (;;) {
Thread.sleep(10000);
- if (state == null)
- continue;
-
- /* reset the landing count once we hear about a new flight */
- if (state.state < AltosTelemetry.ao_flight_drogue)
- reported_landing = 0;
-
- /* Shut up once the rocket is on the ground */
- if (reported_landing > 2)
- continue;
-
- /* If the rocket isn't on the pad, then report height */
- if (state.state > AltosTelemetry.ao_flight_pad) {
- voice.speak(String.format("%d meters", (int) (state.height + 0.5)));
- }
-
- /* If the rocket is coming down, check to see if it has landed;
- * either we've got a landed report or we haven't heard from it in
- * a long time
- */
- if (!state.ascent &&
- (System.currentTimeMillis() - state.report_time > 10000 ||
- state.state == AltosTelemetry.ao_flight_landed))
- {
- if (Math.abs(state.baro_speed) < 20 && state.height < 100)
- voice.speak("rocket landed safely");
- else
- voice.speak("rocket may have crashed");
- if (state.gps != null)
- voice.speak(String.format("bearing %d degrees, range %d meters",
- (int) (state.from_pad.bearing + 0.5),
- (int) (state.from_pad.distance + 0.5)));
- ++reported_landing;
- }
+ report(false);
}
} catch (InterruptedException ie) {
}
@@ -400,21 +402,22 @@ public class AltosUI extends JFrame {
private void tell(AltosState state, AltosState old_state) {
if (old_state == null || old_state.state != state.state) {
voice.speak(state.data.state);
- switch (state.state) {
- case AltosTelemetry.ao_flight_fast:
- voice.speak(String.format("max speed %d meters per second",
- (int) (state.max_speed + 0.5)));
- break;
- case AltosTelemetry.ao_flight_drogue:
- voice.speak(String.format("max height %d meters",
- (int) (state.max_height + 0.5)));
- break;
+ if ((old_state == null || old_state.state <= AltosTelemetry.ao_flight_boost) &&
+ state.state > AltosTelemetry.ao_flight_boost) {
+ voice.speak("max speed: %d meters per second.",
+ (int) (state.max_speed + 0.5));
+ } else if ((old_state == null || old_state.state < AltosTelemetry.ao_flight_drogue) &&
+ state.state >= AltosTelemetry.ao_flight_drogue) {
+ voice.speak("max height: %d meters.",
+ (int) (state.max_height + 0.5));
}
}
old_state = state;
}
class DisplayThread extends Thread {
+ IdleThread idle_thread;
+
String read() throws InterruptedException { return null; }
void close() { }
@@ -425,7 +428,8 @@ public class AltosUI extends JFrame {
String line;
AltosState state = null;
AltosState old_state = null;
- IdleThread idle_thread = new IdleThread();
+
+ idle_thread = new IdleThread();
info_reset();
info_finish();
@@ -451,6 +455,11 @@ public class AltosUI extends JFrame {
idle_thread.interrupt();
}
}
+
+ public void report() {
+ if (idle_thread != null)
+ idle_thread.report(true);
+ }
}
class DeviceThread extends DisplayThread {
@@ -475,31 +484,21 @@ public class AltosUI extends JFrame {
}
private void ConnectToDevice() {
- AltosDevice device = AltosDeviceDialog.show(AltosUI.this, "TeleDongle");
+ altos_device device = AltosDeviceDialog.show(AltosUI.this, "TeleDongle");
if (device != null) {
try {
- serial_line.connect(device.tty);
+ serial_line.open(device);
DeviceThread thread = new DeviceThread(serial_line);
run_display(thread);
} catch (FileNotFoundException ee) {
JOptionPane.showMessageDialog(AltosUI.this,
- device.tty,
+ device.getPath(),
"Cannot open serial port",
JOptionPane.ERROR_MESSAGE);
- } catch (NoSuchPortException ee) {
- JOptionPane.showMessageDialog(AltosUI.this,
- device.tty,
- "No such serial port",
- JOptionPane.ERROR_MESSAGE);
- } catch (PortInUseException ee) {
- JOptionPane.showMessageDialog(AltosUI.this,
- device.tty,
- "Port in use",
- JOptionPane.ERROR_MESSAGE);
} catch (IOException ee) {
JOptionPane.showMessageDialog(AltosUI.this,
- device.tty,
+ device.getPath(),
"Unkonwn I/O error",
JOptionPane.ERROR_MESSAGE);
}
@@ -517,8 +516,9 @@ public class AltosUI extends JFrame {
while ((c = s.read()) != -1) {
if (c == '\r')
continue;
- if (c == '\n')
+ if (c == '\n') {
return line;
+ }
line = line + (char) c;
}
return null;
@@ -554,12 +554,13 @@ public class AltosUI extends JFrame {
replay.close();
} catch (IOException ee) {
}
+ report();
}
void update(AltosState state) throws InterruptedException {
/* Make it run in realtime after the rocket leaves the pad */
if (state.state > AltosTelemetry.ao_flight_pad)
- Thread.sleep((int) (state.time_change * 1000));
+ Thread.sleep((int) (Math.min(state.time_change,10) * 1000));
}
}
@@ -600,7 +601,7 @@ public class AltosUI extends JFrame {
} catch (FileNotFoundException ee) {
JOptionPane.showMessageDialog(AltosUI.this,
filename,
- "Cannot open serial port",
+ "Cannot open telemetry file",
JOptionPane.ERROR_MESSAGE);
}
}
diff --git a/ao-tools/altosui/AltosUIIcon.icns b/ao-tools/altosui/AltosUIIcon.icns
new file mode 100644
index 00000000..fe49f362
--- /dev/null
+++ b/ao-tools/altosui/AltosUIIcon.icns
Binary files differ
diff --git a/ao-tools/altosui/AltosVoice.java b/ao-tools/altosui/AltosVoice.java
index e4ea99a2..c39bfb9b 100644
--- a/ao-tools/altosui/AltosVoice.java
+++ b/ao-tools/altosui/AltosVoice.java
@@ -47,6 +47,10 @@ public class AltosVoice implements Runnable {
}
}
+ public void speak(String format, Object... parameters) {
+ speak(String.format(format, parameters));
+ }
+
public AltosVoice () {
voice_manager = VoiceManager.getInstance();
voice = voice_manager.getVoice(voice_name);
diff --git a/ao-tools/altosui/Makefile b/ao-tools/altosui/Makefile
index 57c889b8..cd123023 100644
--- a/ao-tools/altosui/Makefile
+++ b/ao-tools/altosui/Makefile
@@ -1,6 +1,6 @@
.SUFFIXES: .java .class
-CLASSPATH=..:/usr/share/java/*:/home/keithp/src/freetts/freetts-1.2.2
+CLASSPATH=classes:./*
CLASSFILES=\
AltosConvert.class \
AltosFile.class \
@@ -15,24 +15,45 @@ CLASSFILES=\
AltosTelemetry.class \
AltosUI.class \
AltosDevice.class \
- AltosDeviceLinux.class \
AltosDeviceDialog.class \
AltosVoice.class
+FREETTSSRC=/home/keithp/src/freetts/freetts-1.2.2
+FREETTSLIB=$(FREETTSSRC)/lib
+FREETTSJAR= \
+ cmudict04.jar \
+ cmulex.jar \
+ cmu_time_awb.jar \
+ cmutimelex.jar \
+ cmu_us_kal.jar \
+ en_us.jar \
+ freetts.jar \
+ freetts-jsapi10.jar \
+ jsapi.jar
+
JAVAFLAGS=-Xlint:unchecked
-all: $(CLASSFILES) altosui altosui.jar
+all: altosui.jar
+
+$(CLASSFILES):
.java.class:
javac -cp "$(CLASSPATH)" $(JAVAFLAGS) $*.java
-altosui: Makefile
- (echo '#!/bin/sh'; \
- echo exec java -cp '"$(CLASSPATH)"' altosui/AltosUI) > $@
- chmod +x $@
+altosui.jar: classes/altosui classes/libaltosJNI $(FREETTSJAR) $(CLASSFILES) Manifest.txt
+ cd ./classes && jar cfm ../$@ altosui/Manifest.txt altosui/*.class libaltosJNI/*.class
+
+classes/altosui:
+ mkdir -p classes
+ ln -s .. classes/altosui
+
+classes/libaltosJNI:
+ mkdir -p classes
+ ln -s ../../libaltos/libaltosJNI classes/libaltosJNI
-altosui.jar: $(CLASSFILES) Manifest.txt
- cd .. && jar cfm altosui/$@ altosui/Manifest.txt altosui/*.class
+$(FREETTSJAR):
+ ln -s $(FREETTSLIB)/$@ .
clean:
- rm -f *.class
+ rm -f *.class $(FREETTSJAR) altosui.jar
+ rm -rf classes
diff --git a/ao-tools/altosui/Manifest.txt b/ao-tools/altosui/Manifest.txt
index 0305fcfb..251ce2a0 100644
--- a/ao-tools/altosui/Manifest.txt
+++ b/ao-tools/altosui/Manifest.txt
@@ -1 +1,2 @@
Main-Class: altosui.AltosUI
+Class-Path: freetts.jar
diff --git a/ao-tools/altosui/voices.txt b/ao-tools/altosui/voices.txt
deleted file mode 100644
index e8825fc3..00000000
--- a/ao-tools/altosui/voices.txt
+++ /dev/null
@@ -1 +0,0 @@
-com.sun.speech.freetts.en.us.cmu_us_kal.KevinVoiceDirectory