TeleStern/telegps/TeleGPSConfig.java

299 lines
6.8 KiB
Java

/*
* 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; either version 2 of the License, or
* (at your option) any later version.
*
* 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 org.altusmetrum.telegps;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.concurrent.*;
import java.text.*;
import org.altusmetrum.altoslib_14.*;
import org.altusmetrum.altosuilib_14.*;
public class TeleGPSConfig implements ActionListener {
class int_ref {
int value;
public int get() {
return value;
}
public void set(int i) {
value = i;
}
public int_ref(int i) {
value = i;
}
}
class string_ref {
String value;
public String get() {
return value;
}
public void set(String i) {
value = i;
}
public string_ref(String i) {
value = i;
}
}
JFrame owner;
AltosDevice device;
AltosSerial serial_line;
AltosConfigData data;
TeleGPSConfigUI config_ui;
boolean serial_started;
boolean made_visible;
void start_serial() throws InterruptedException, TimeoutException {
serial_started = true;
}
void stop_serial() throws InterruptedException {
if (!serial_started)
return;
serial_started = false;
}
void update_ui() {
data.set_values(config_ui);
config_ui.set_clean();
if (!made_visible) {
made_visible = true;
config_ui.make_visible();
}
}
int pyro;
final static int serial_mode_read = 0;
final static int serial_mode_save = 1;
final static int serial_mode_reboot = 2;
class SerialData implements Runnable {
TeleGPSConfig config;
int serial_mode;
void callback(String in_cmd) {
final String cmd = in_cmd;
Runnable r = new Runnable() {
public void run() {
if (cmd.equals("abort")) {
abort();
} else if (cmd.equals("all finished")) {
if (serial_line != null)
update_ui();
}
}
};
SwingUtilities.invokeLater(r);
}
void get_data() {
data = null;
try {
start_serial();
data = new AltosConfigData(config.serial_line);
} catch (InterruptedException ie) {
} catch (TimeoutException te) {
try {
stop_serial();
callback("abort");
} catch (InterruptedException ie) {
}
} finally {
try {
stop_serial();
} catch (InterruptedException ie) {
}
}
callback("all finished");
}
void save_data() {
try {
start_serial();
data.save(serial_line, false);
} catch (InterruptedException ie) {
} catch (TimeoutException te) {
} finally {
try {
stop_serial();
} catch (InterruptedException ie) {
}
}
}
void reboot() {
try {
start_serial();
serial_line.printf("r eboot\n");
serial_line.flush_output();
} catch (InterruptedException ie) {
} catch (TimeoutException te) {
} finally {
try {
stop_serial();
serial_line.close();
} catch (InterruptedException ie) {
}
}
}
public void run () {
switch (serial_mode) {
case serial_mode_save:
save_data();
/* fall through ... */
case serial_mode_read:
get_data();
break;
case serial_mode_reboot:
reboot();
break;
}
}
public SerialData(TeleGPSConfig in_config, int in_serial_mode) {
config = in_config;
serial_mode = in_serial_mode;
}
}
void run_serial_thread(int serial_mode) {
SerialData sd = new SerialData(this, serial_mode);
Thread st = new Thread(sd);
st.start();
}
void init_ui () throws InterruptedException, TimeoutException {
config_ui = new TeleGPSConfigUI(owner);
config_ui.addActionListener(this);
serial_line.set_frame(owner);
set_ui();
}
void abort() {
if (serial_line != null) {
serial_line.close();
serial_line = null;
}
JOptionPane.showMessageDialog(owner,
String.format("Connection to \"%s\" failed",
device.toShortString()),
"Connection Failed",
JOptionPane.ERROR_MESSAGE);
config_ui.setVisible(false);
}
void set_ui() throws InterruptedException, TimeoutException {
if (serial_line != null)
run_serial_thread(serial_mode_read);
else
update_ui();
}
double frequency() {
return AltosConvert.radio_to_frequency(data.radio_frequency,
data.radio_setting,
data.radio_calibration,
data.radio_channel);
}
void save_data() {
try {
/* bounds check stuff */
if (config_ui.flight_log_max() > data.log_space()/1024) {
JOptionPane.showMessageDialog(owner,
String.format("Requested flight log, %dk, is larger than the available space, %dk.\n",
config_ui.flight_log_max(),
data.log_space()/1024),
"Maximum Flight Log Too Large",
JOptionPane.ERROR_MESSAGE);
return;
}
/* Pull data out of the UI and stuff back into our local data record */
data.get_values(config_ui);
run_serial_thread(serial_mode_save);
} catch (AltosConfigDataException ae) {
JOptionPane.showMessageDialog(owner,
ae.getMessage(),
"Configuration Data Error",
JOptionPane.ERROR_MESSAGE);
}
}
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
try {
if (cmd.equals("Save")) {
save_data();
} else if (cmd.equals("Reset")) {
set_ui();
} else if (cmd.equals("Reboot")) {
if (serial_line != null)
run_serial_thread(serial_mode_reboot);
} else if (cmd.equals("Close")) {
if (serial_line != null)
serial_line.close();
}
} catch (InterruptedException ie) {
abort();
} catch (TimeoutException te) {
abort();
}
}
public TeleGPSConfig(JFrame given_owner) {
owner = given_owner;
device = AltosDeviceUIDialog.show(owner, AltosLib.product_telegps);
if (device != null) {
try {
serial_line = new AltosSerial(device);
try {
init_ui();
} catch (InterruptedException ie) {
abort();
} catch (TimeoutException te) {
abort();
}
} catch (FileNotFoundException ee) {
JOptionPane.showMessageDialog(owner,
ee.getMessage(),
"Cannot open target device",
JOptionPane.ERROR_MESSAGE);
} catch (AltosSerialInUseException si) {
JOptionPane.showMessageDialog(owner,
String.format("Device \"%s\" already in use",
device.toShortString()),
"Device in use",
JOptionPane.ERROR_MESSAGE);
}
}
}
}