summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony Towns <aj@erisian.com.au>2010-11-25 08:47:36 +1000
committerAnthony Towns <aj@erisian.com.au>2010-11-25 08:47:36 +1000
commit7811e6dfa6caf10251da7df7c24b98cdc3787892 (patch)
tree43e9447faf4d5a7e73f71ae4f516f8e830f86758
parent71b1949e50f4533bcf44537da65b19bc67863c8e (diff)
parent7a50837ea0d92db3f469f197ec8210aee22aa143 (diff)
Merge branch 'buttonbox' of git://git.gag.com/fw/altos into buttonbox
-rw-r--r--ao-tools/altosui/AltosConfig.java25
-rw-r--r--ao-tools/altosui/AltosConfigUI.java6
-rw-r--r--ao-tools/altosui/AltosEepromDownload.java7
-rw-r--r--ao-tools/altosui/AltosFlightUI.java1
-rw-r--r--ao-tools/altosui/AltosIgnite.java16
-rw-r--r--ao-tools/altosui/AltosIgniteUI.java6
-rw-r--r--ao-tools/altosui/AltosSerial.java33
-rw-r--r--ao-tools/altosui/AltosTelemetryReader.java6
-rw-r--r--src/ao_ignite.c1
-rw-r--r--src/ao_radio.c14
10 files changed, 72 insertions, 43 deletions
diff --git a/ao-tools/altosui/AltosConfig.java b/ao-tools/altosui/AltosConfig.java
index 6bda20d8..1c42870f 100644
--- a/ao-tools/altosui/AltosConfig.java
+++ b/ao-tools/altosui/AltosConfig.java
@@ -74,7 +74,7 @@ public class AltosConfig implements Runnable, ActionListener {
string_ref product;
string_ref callsign;
AltosConfigUI config_ui;
-
+ boolean serial_started;
boolean get_int(String line, String label, int_ref x) {
if (line.startsWith(label)) {
@@ -108,15 +108,18 @@ public class AltosConfig implements Runnable, ActionListener {
}
void start_serial() throws InterruptedException {
+ serial_started = true;
if (remote) {
- serial_line.set_channel(AltosPreferences.channel(device.getSerial()));
- serial_line.set_callsign(AltosPreferences.callsign());
- serial_line.printf("p\n");
+ serial_line.set_radio();
+ serial_line.printf("p\nE 0\n");
serial_line.flush_input();
}
}
void stop_serial() throws InterruptedException {
+ if (!serial_started)
+ return;
+ serial_started = false;
if (remote) {
serial_line.printf("~");
serial_line.flush_output();
@@ -128,7 +131,7 @@ public class AltosConfig implements Runnable, ActionListener {
start_serial();
serial_line.printf("c s\nv\n");
for (;;) {
- String line = serial_line.get_reply(1000);
+ String line = serial_line.get_reply(5000);
if (line == null)
throw new TimeoutException();
get_int(line, "serial-number", serial);
@@ -150,7 +153,7 @@ public class AltosConfig implements Runnable, ActionListener {
}
void init_ui () throws InterruptedException, TimeoutException {
- config_ui = new AltosConfigUI(owner);
+ config_ui = new AltosConfigUI(owner, remote);
config_ui.addActionListener(this);
set_ui();
}
@@ -161,6 +164,10 @@ public class AltosConfig implements Runnable, ActionListener {
device.toShortString()),
"Connection Failed",
JOptionPane.ERROR_MESSAGE);
+ try {
+ stop_serial();
+ } catch (InterruptedException ie) {
+ }
serial_line.close();
serial_line = null;
}
@@ -192,8 +199,10 @@ public class AltosConfig implements Runnable, ActionListener {
start_serial();
serial_line.printf("c m %d\n", main_deploy.get());
serial_line.printf("c d %d\n", apogee_delay.get());
- serial_line.printf("c r %d\n", radio_channel.get());
- serial_line.printf("c f %d\n", radio_calibration.get());
+ if (!remote) {
+ serial_line.printf("c r %d\n", radio_channel.get());
+ serial_line.printf("c f %d\n", radio_calibration.get());
+ }
serial_line.printf("c c %s\n", callsign.get());
serial_line.printf("c w\n");
} catch (InterruptedException ie) {
diff --git a/ao-tools/altosui/AltosConfigUI.java b/ao-tools/altosui/AltosConfigUI.java
index ca89f58d..cfa5d7b9 100644
--- a/ao-tools/altosui/AltosConfigUI.java
+++ b/ao-tools/altosui/AltosConfigUI.java
@@ -98,7 +98,7 @@ public class AltosConfigUI
}
/* Build the UI using a grid bag */
- public AltosConfigUI(JFrame in_owner) {
+ public AltosConfigUI(JFrame in_owner, boolean remote) {
super (in_owner, "Configure TeleMetrum", false);
owner = in_owner;
@@ -244,6 +244,8 @@ public class AltosConfigUI
radio_channel_value = new JComboBox(radio_channel_values);
radio_channel_value.setEditable(false);
radio_channel_value.addItemListener(this);
+ if (remote)
+ radio_channel_value.setEnabled(false);
pane.add(radio_channel_value, c);
/* Radio Calibration */
@@ -267,6 +269,8 @@ public class AltosConfigUI
c.ipady = 5;
radio_calibration_value = new JTextField(String.format("%d", 1186611));
radio_calibration_value.getDocument().addDocumentListener(this);
+ if (remote)
+ radio_calibration_value.setEnabled(false);
pane.add(radio_calibration_value, c);
/* Callsign */
diff --git a/ao-tools/altosui/AltosEepromDownload.java b/ao-tools/altosui/AltosEepromDownload.java
index fb5dcfc0..02fc36f2 100644
--- a/ao-tools/altosui/AltosEepromDownload.java
+++ b/ao-tools/altosui/AltosEepromDownload.java
@@ -97,7 +97,7 @@ public class AltosEepromDownload implements Runnable {
/* Pull the serial number out of the version information */
for (;;) {
- String line = serial_line.get_reply(1000);
+ String line = serial_line.get_reply(5000);
if (line == null)
throw new TimeoutException();
@@ -127,7 +127,7 @@ public class AltosEepromDownload implements Runnable {
any_valid = false;
monitor.set_value(state_names[state], state, block - state_block);
for (addr = 0; addr < 0x100;) {
- String line = serial_line.get_reply(1000);
+ String line = serial_line.get_reply(5000);
if (line == null)
throw new TimeoutException();
int[] values = ParseHex(line);
@@ -216,8 +216,7 @@ public class AltosEepromDownload implements Runnable {
public void run () {
if (remote) {
- serial_line.set_channel(AltosPreferences.channel(device.getSerial()));
- serial_line.set_callsign(AltosPreferences.callsign());
+ serial_line.set_radio();
serial_line.printf("p\nE 0\n");
serial_line.flush_input();
}
diff --git a/ao-tools/altosui/AltosFlightUI.java b/ao-tools/altosui/AltosFlightUI.java
index b0cc521d..7fcfb8be 100644
--- a/ao-tools/altosui/AltosFlightUI.java
+++ b/ao-tools/altosui/AltosFlightUI.java
@@ -132,7 +132,6 @@ public class AltosFlightUI extends JFrame implements AltosFlightDisplay {
public void actionPerformed(ActionEvent e) {
int channel = channels.getSelectedIndex();
reader.set_channel(channel);
- AltosPreferences.set_channel(serial, channel);
}
});
c.gridx = 0;
diff --git a/ao-tools/altosui/AltosIgnite.java b/ao-tools/altosui/AltosIgnite.java
index 8e92ec1b..3cbd8a75 100644
--- a/ao-tools/altosui/AltosIgnite.java
+++ b/ao-tools/altosui/AltosIgnite.java
@@ -24,6 +24,7 @@ public class AltosIgnite {
AltosDevice device;
AltosSerial serial;
boolean remote;
+ boolean serial_started;
final static int None = 0;
final static int Apogee = 1;
final static int Main = 2;
@@ -34,15 +35,18 @@ public class AltosIgnite {
final static int Open = 3;
private void start_serial() throws InterruptedException {
+ serial_started = true;
if (remote) {
- serial.set_channel(AltosPreferences.channel(device.getSerial()));
- serial.set_callsign(AltosPreferences.callsign());
- serial.printf("~\np\n");
+ serial.set_radio();
+ serial.printf("p\nE 0\n");
serial.flush_input();
}
}
private void stop_serial() throws InterruptedException {
+ if (!serial_started)
+ return;
+ serial_started = false;
if (serial == null)
return;
if (remote) {
@@ -100,7 +104,7 @@ public class AltosIgnite {
start_serial();
serial.printf("t\n");
for (;;) {
- String line = serial.get_reply(1000);
+ String line = serial.get_reply(5000);
if (line == null)
throw new TimeoutException();
if (get_string(line, "Igniter: drogue Status: ", status_name))
@@ -149,6 +153,10 @@ public class AltosIgnite {
}
public void close() {
+ try {
+ stop_serial();
+ } catch (InterruptedException ie) {
+ }
serial.close();
serial = null;
}
diff --git a/ao-tools/altosui/AltosIgniteUI.java b/ao-tools/altosui/AltosIgniteUI.java
index 0207e39f..d542729c 100644
--- a/ao-tools/altosui/AltosIgniteUI.java
+++ b/ao-tools/altosui/AltosIgniteUI.java
@@ -145,13 +145,11 @@ public class AltosIgniteUI
if (cmd.equals("apogee") && apogee.isSelected()) {
main.setSelected(false);
- if (apogee_status == AltosIgnite.Ready)
- arm.setEnabled(true);
+ arm.setEnabled(true);
}
if (cmd.equals("main") && main.isSelected()) {
apogee.setSelected(false);
- if (main_status == AltosIgnite.Ready)
- arm.setEnabled(true);
+ arm.setEnabled(true);
}
if (cmd.equals("arm")) {
diff --git a/ao-tools/altosui/AltosSerial.java b/ao-tools/altosui/AltosSerial.java
index ab74486b..b19143e5 100644
--- a/ao-tools/altosui/AltosSerial.java
+++ b/ao-tools/altosui/AltosSerial.java
@@ -114,16 +114,20 @@ public class AltosSerial implements Runnable {
public void flush_input() {
flush_output();
- try {
- Thread.sleep(200);
- } catch (InterruptedException ie) {
- }
- synchronized(this) {
- if (!"VERSION".startsWith(line) &&
- !line.startsWith("VERSION"))
- line = "";
- reply_queue.clear();
- }
+ boolean got_some;
+ do {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException ie) {
+ }
+ got_some = !reply_queue.isEmpty();
+ synchronized(this) {
+ if (!"VERSION".startsWith(line) &&
+ !line.startsWith("VERSION"))
+ line = "";
+ reply_queue.clear();
+ }
+ } while (got_some);
}
public String get_reply() throws InterruptedException {
@@ -194,13 +198,18 @@ public class AltosSerial implements Runnable {
devices_opened.add(device.getPath());
}
altos = libaltos.altos_open(device);
- if (altos == null)
+ if (altos == null) {
+ close();
throw new FileNotFoundException(device.toShortString());
+ }
input_thread = new Thread(this);
input_thread.start();
print("~\nE 0\n");
+ set_monitor(false);
flush_output();
- set_monitor(monitor_mode);
+ }
+
+ public void set_radio() {
set_channel(AltosPreferences.channel(device.getSerial()));
set_callsign(AltosPreferences.callsign());
}
diff --git a/ao-tools/altosui/AltosTelemetryReader.java b/ao-tools/altosui/AltosTelemetryReader.java
index de5f50e9..6c5a9397 100644
--- a/ao-tools/altosui/AltosTelemetryReader.java
+++ b/ao-tools/altosui/AltosTelemetryReader.java
@@ -44,10 +44,7 @@ class AltosTelemetryReader extends AltosFlightReader {
void set_channel(int channel) {
serial.set_channel(channel);
- }
-
- void set_callsign(String callsign) {
- serial.set_callsign(callsign);
+ AltosPreferences.set_channel(device.getSerial(), channel);
}
public AltosTelemetryReader (AltosDevice in_device)
@@ -58,6 +55,7 @@ class AltosTelemetryReader extends AltosFlightReader {
name = device.toShortString();
telem = new LinkedBlockingQueue<AltosLine>();
+ serial.set_radio();
serial.add_monitor(telem);
}
}
diff --git a/src/ao_ignite.c b/src/ao_ignite.c
index 58d340d9..f2b15dd2 100644
--- a/src/ao_ignite.c
+++ b/src/ao_ignite.c
@@ -101,7 +101,6 @@ void
ao_igniter(void)
{
__xdata enum ao_ignter igniter;
- __xdata enum ao_igniter_status status;
ao_config_get();
for (;;) {
diff --git a/src/ao_radio.c b/src/ao_radio.c
index 3fb4afd7..67d5f6ba 100644
--- a/src/ao_radio.c
+++ b/src/ao_radio.c
@@ -432,8 +432,11 @@ ao_radio_rdf(int ms)
void
ao_radio_abort(void)
{
- ao_dma_abort(ao_radio_dma);
- ao_radio_idle();
+ /* Only abort if a task is waiting to receive data */
+ if (RFST == RFST_SRX) {
+ ao_dma_abort(ao_radio_dma);
+ ao_radio_idle();
+ }
}
void
@@ -449,26 +452,29 @@ void
ao_radio_test(void)
{
uint8_t mode = 2;
+ static __xdata radio_on;
ao_cmd_white();
if (ao_cmd_lex_c != '\n') {
ao_cmd_decimal();
mode = (uint8_t) ao_cmd_lex_u32;
}
mode++;
- if (mode & 2) {
+ if ((mode & 2) && !radio_on) {
ao_set_monitor(0);
ao_packet_slave_stop();
ao_radio_get();
RFST = RFST_STX;
+ radio_on = 1;
}
if (mode == 3) {
printf ("Hit a character to stop..."); flush();
getchar();
putchar('\n');
}
- if (mode & 1) {
+ if ((mode & 1) && radio_on) {
ao_radio_idle();
ao_radio_put();
+ radio_on = 0;
}
}