Merge branch 'buttonbox' of git://git.gag.com/fw/altos into buttonbox
authorAnthony Towns <aj@erisian.com.au>
Wed, 24 Nov 2010 22:47:36 +0000 (08:47 +1000)
committerAnthony Towns <aj@erisian.com.au>
Wed, 24 Nov 2010 22:47:36 +0000 (08:47 +1000)
ao-tools/altosui/AltosConfig.java
ao-tools/altosui/AltosConfigUI.java
ao-tools/altosui/AltosEepromDownload.java
ao-tools/altosui/AltosFlightUI.java
ao-tools/altosui/AltosIgnite.java
ao-tools/altosui/AltosIgniteUI.java
ao-tools/altosui/AltosSerial.java
ao-tools/altosui/AltosTelemetryReader.java
src/ao_ignite.c
src/ao_radio.c

index 6bda20d804135880b7511f8b4e89bba806fa3d42..1c42870f8d7ff61519a2df97b9eb88404cfab6cd 100644 (file)
@@ -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) {
index ca89f58d39de23b6f9becc002336efe0e43639e3..cfa5d7b9ee7b5982d7b497d8aaeeb448ef35f38e 100644 (file)
@@ -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 */
index fb5dcfc0db06574611cc00b4f277f6be6a5c9ca5..02fc36f298cfc6922710aaace084a6fa091e1eb0 100644 (file)
@@ -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();
                }
index b0cc521dbfc86596efa49cbbb017d645b2b30615..7fcfb8be6da68d5f356dd723ea146cf195089127 100644 (file)
@@ -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;
index 8e92ec1b71531df85a3bdb210521a380876338e4..3cbd8a751e1e53af63fa54c4de70ffcc3b0bab80 100644 (file)
@@ -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;
        }
index 0207e39fe182d2519e36b1d0c8fcdcaa1758d864..d542729cd0de5003d2272b5ad902a0d2450472e5 100644 (file)
@@ -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")) {
index ab74486b49904e018beae5ca66df2dd2a02cce8a..b19143e58b7080070457d606a93e8798deaf9a71 100644 (file)
@@ -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());
        }
index de5f50e93052895ac7d7e9aefd06ec48ccdae8c9..6c5a93978c69a4156e0e44fe3b94b3ea7a9c92c0 100644 (file)
@@ -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);
        }
 }
index 58d340d9599f5c655a4a6e098696d6eb9710c107..f2b15dd23e741da0d29df0682d7c02d830717890 100644 (file)
@@ -101,7 +101,6 @@ void
 ao_igniter(void)
 {
        __xdata enum ao_ignter igniter;
-       __xdata enum ao_igniter_status status;
 
        ao_config_get();
        for (;;) {
index 3fb4afd7d4831d87c556a201634655e70ba95b3c..67d5f6bad7e7272190cb2b967c311c69efeb7af4 100644 (file)
@@ -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;
        }
 }