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;
+ static {
+ System.loadLibrary("altos");
+ libaltos.altos_init();
+ }
+ static altos_device[] list(String product) {
+ SWIGTYPE_p_altos_list list = libaltos.altos_list_start();
+
+ ArrayList<altos_device> device_list = new ArrayList<altos_device>();
+ if (list != null) {
+ SWIGTYPE_p_altos_file file;
+
+ for (;;) {
+ altos_device device = new altos_device();
+ if (libaltos.altos_list_next(list, device) == 0)
+ break;
+ System.out.printf("Found device %s %d %s\n",
+ device.getProduct(), device.getSerial(), device.getPath());
+
+ device_list.add(device);
+ }
+ libaltos.altos_list_finish(list);
+ }
+
+ altos_device[] devices = new altos_device[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
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) {
+ altos_device[] devices = null;
+ devices = AltosDevice.list(product);
if (devices != null & devices.length > 0) {
Object o = JOptionPane.showInputDialog(frame,
"Select a device",
null,
devices,
devices[0]);
- return (AltosDevice) o;
+ return (altos_device) o;
} else {
return null;
}
+++ /dev/null
-/*
- * 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;
- }
-}
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;
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;
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
* threads.
*/
class AltosSerialReader implements Runnable {
- InputStream serial_in;
+ SWIGTYPE_p_altos_file altos;
LinkedList<LinkedBlockingQueue<String>> monitors;
LinkedBlockingQueue<String> reply_queue;
Thread input_thread;
try {
for (;;) {
- c = serial_in.read();
+ c = libaltos.altos_getchar(altos, 0);
if (Thread.interrupted())
break;
if (c == -1)
}
}
}
- } catch (IOException e) {
} catch (InterruptedException e) {
}
}
}
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 {
}
}
- 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 {
+ public void open(altos_device device) throws FileNotFoundException {
close();
- try {
- c.enableReceiveTimeout(1000); /* icky. the read method cannot be interrupted */
- } catch (UnsupportedCommOperationException ee) {
- }
- serial_in = c.getInputStream();
+ altos = libaltos.altos_open(device);
input_thread = new Thread(this);
input_thread.start();
}
public AltosSerialReader () {
- serial_in = null;
+ altos = null;
input_thread = null;
line = "";
monitors = new LinkedList<LinkedBlockingQueue<String>> ();
reply_queue = new LinkedBlockingQueue<String> ();
}
-
}
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 connect(String port_name) throws IOException, NoSuchPortException, PortInUseException {
- comm_port = new RXTXPort(port_name);
- open(comm_port);
+ public void open(altos_device device) throws FileNotFoundException {
+ reader.open(device);
}
void init() {
init();
}
- public AltosSerial(File serial_name) throws FileNotFoundException {
- init();
- open(serial_name);
- }
-
- public AltosSerial(CommPort comm_port) throws IOException {
+ public AltosSerial(altos_device device) throws FileNotFoundException {
init();
- open(comm_port);
+ open(device);
}
}
import java.text.*;
import java.util.prefs.*;
import java.util.concurrent.LinkedBlockingQueue;
-import gnu.io.*;
import altosui.AltosSerial;
import altosui.AltosSerialMonitor;
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 };
}
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);
}
package altosui;
-import com.sun.speech.freetts.Voice;
+/*import com.sun.speech.freetts.Voice;
import com.sun.speech.freetts.VoiceManager;
-import com.sun.speech.freetts.audio.JavaClipAudioPlayer;
+import com.sun.speech.freetts.audio.JavaClipAudioPlayer; */
import java.util.concurrent.LinkedBlockingQueue;
public class AltosVoice implements Runnable {
+/*
VoiceManager voice_manager;
Voice voice;
+*/
LinkedBlockingQueue<String> phrases;
Thread thread;
try {
for (;;) {
String s = phrases.take();
- voice.speak(s);
+/* voice.speak(s); */
}
} catch (InterruptedException e) {
}
}
public void speak(String s) {
try {
- if (voice != null)
+/* if (voice != null) */
phrases.put(s);
} catch (InterruptedException e) {
}
}
public AltosVoice () {
- voice_manager = VoiceManager.getInstance();
+/* voice_manager = VoiceManager.getInstance();
voice = voice_manager.getVoice(voice_name);
- if (voice != null) {
- voice.allocate();
+ if (voice != null) */ {
+/* voice.allocate(); */
phrases = new LinkedBlockingQueue<String> ();
thread = new Thread(this);
thread.start();
speak("Rocket Flight Monitor Ready");
- } else {
+ } /* else {
System.out.printf("Voice manager failed to open %s\n", voice_name);
Voice[] voices = voice_manager.getVoices();
System.out.printf("Available voices:\n");
System.out.println(" " + voices[i].getName()
+ " (" + voices[i].getDomain() + " domain)");
}
- }
+ } */
}
}
.SUFFIXES: .java .class
-CLASSPATH=..:/usr/share/java/*:/home/keithp/src/freetts/freetts-1.2.2
+CLASSPATH=..:../libaltos:/usr/share/java/*:/home/keithp/src/freetts/freetts-1.2.2
CLASSFILES=\
AltosConvert.class \
AltosFile.class \
AltosTelemetry.class \
AltosUI.class \
AltosDevice.class \
- AltosDeviceLinux.class \
AltosDeviceDialog.class \
AltosVoice.class
JAVAFLAGS=-Xlint:unchecked
-all: $(CLASSFILES) altosui altosui.jar
+all: $(CLASSFILES) altosui.jar
.java.class:
javac -cp "$(CLASSPATH)" $(JAVAFLAGS) $*.java
-altosui: Makefile
- (echo '#!/bin/sh'; \
- echo exec java -cp '"$(CLASSPATH)"' altosui/AltosUI) > $@
- chmod +x $@
-
altosui.jar: $(CLASSFILES) Manifest.txt
- cd .. && jar cfm altosui/$@ altosui/Manifest.txt altosui/*.class
+ jar cfm $@ altosui/Manifest.txt altosui/*.class libaltosJNI/*.class
clean:
rm -f *.class