altosui: Configure radio with new direct frequency setting
authorKeith Packard <keithp@keithp.com>
Tue, 27 Mar 2012 17:38:32 +0000 (10:38 -0700)
committerKeith Packard <keithp@keithp.com>
Tue, 27 Mar 2012 17:45:34 +0000 (10:45 -0700)
Instead of computing the radio setting in altosui, let the radio do it directly.

Signed-off-by: Keith Packard <keithp@keithp.com>
altosui/AltosConfig.java
altosui/AltosConfigData.java
altosui/AltosConfigUI.java
altosui/AltosConvert.java
altosui/AltosFrequency.java
altosui/AltosSerial.java

index 93def70daaad2e527616da648c4384187d152c95..84261ec7a5523753f00387835beadb0da261d719 100644 (file)
@@ -76,6 +76,7 @@ public class AltosConfig implements ActionListener {
        int_ref         ignite_mode;
        int_ref         pad_orientation;
        int_ref         radio_setting;
+       int_ref         radio_frequency;
        int_ref         storage_size;
        int_ref         storage_erase_unit;
        int_ref         stored_flight;
@@ -193,6 +194,7 @@ public class AltosConfig implements ActionListener {
                get_int(line, "Ignite mode:", ignite_mode);
                get_int(line, "Pad orientation:", pad_orientation);
                get_int(line, "Radio setting:", radio_setting);
+               get_int(line, "Frequency:", radio_frequency);
                get_int(line, "Radio enable:", radio_enable);
                get_int(line, "Storage size:", storage_size);
                get_int(line, "Storage erase unit:", storage_erase_unit);
@@ -230,6 +232,7 @@ public class AltosConfig implements ActionListener {
                        apogee_delay.set(0);
                        radio_channel.set(0);
                        radio_setting.set(0);
+                       radio_frequency.set(0);
                        radio_calibration.set(1186611);
                        radio_enable.set(-1);
                        flight_log_max.set(0);
@@ -275,6 +278,7 @@ public class AltosConfig implements ActionListener {
                void save_data() {
                        try {
                                double frequency = frequency();
+                               boolean has_frequency = radio_frequency.get() > 0;
                                boolean has_setting = radio_setting.get() > 0;
                                start_serial();
                                serial_line.printf("c m %d\n", main_deploy.get());
@@ -282,6 +286,7 @@ public class AltosConfig implements ActionListener {
                                if (!remote)
                                        serial_line.printf("c f %d\n", radio_calibration.get());
                                serial_line.set_radio_frequency(frequency,
+                                                               has_frequency,
                                                                has_setting,
                                                                radio_calibration.get());
                                if (remote) {
@@ -378,15 +383,19 @@ public class AltosConfig implements ActionListener {
        }
 
        double frequency() {
-               return AltosConvert.radio_to_frequency(radio_setting.get(),
+               return AltosConvert.radio_to_frequency(radio_frequency.get(),
+                                                      radio_setting.get(),
                                                       radio_calibration.get(),
                                                       radio_channel.get());
        }
 
        void set_frequency(double freq) {
+               int     frequency = radio_frequency.get();
                int     setting = radio_setting.get();
 
-               if (setting > 0) {
+               if (frequency > 0) {
+                       radio_frequency.set((int) Math.floor (freq * 1000 + 0.5));
+               } else if (setting > 0) {
                        radio_setting.set(AltosConvert.radio_frequency_to_setting(freq,
                                                                                  radio_calibration.get()));
                        radio_channel.set(0);
@@ -453,6 +462,7 @@ public class AltosConfig implements ActionListener {
                apogee_delay = new int_ref(0);
                radio_channel = new int_ref(0);
                radio_setting = new int_ref(0);
+               radio_frequency = new int_ref(0);
                radio_calibration = new int_ref(1186611);
                radio_enable = new int_ref(-1);
                flight_log_max = new int_ref(0);
index c14dc5a18a78c186f1d503591d89b6fd8298969a..e5c3566b6c9b4826d54709db35057eb62c07f66b 100644 (file)
@@ -49,6 +49,7 @@ public class AltosConfigData implements Iterable<String> {
        int     apogee_delay;
        int     radio_channel;
        int     radio_setting;
+       int     radio_frequency;
        String  callsign;
        int     accel_cal_plus, accel_cal_minus;
        int     radio_calibration;
@@ -107,6 +108,7 @@ public class AltosConfigData implements Iterable<String> {
                serial_line.printf("c s\nf\nl\nv\n");
                lines = new LinkedList<String>();
                radio_setting = 0;
+               radio_frequency = 0;
                stored_flight = 0;
                for (;;) {
                        String line = serial_line.get_reply();
@@ -121,6 +123,7 @@ public class AltosConfigData implements Iterable<String> {
                        try { apogee_delay = get_int(line, "Apogee delay:"); } catch (Exception e) {}
                        try { radio_channel = get_int(line, "Radio channel:"); } catch (Exception e) {}
                        try { radio_setting = get_int(line, "Radio setting:"); } catch (Exception e) {}
+                       try { radio_frequency = get_int(line, "Frequency:"); } catch (Exception e) {}
                        try {
                                if (line.startsWith("Accel cal")) {
                                        String[] bits = line.split("\\s+");
index 9fef8e3bc47eb8ee97d4969e1532fd75313677f8..c8ec06d26fc18495981735434939f0e75af8cbec 100644 (file)
@@ -638,6 +638,7 @@ public class AltosConfigUI
                AltosFrequency  new_frequency = new AltosFrequency(new_radio_frequency, description);
                AltosPreferences.add_common_frequency(new_frequency);
                radio_frequency_value.insertItemAt(new_frequency, i);
+               radio_frequency_value.setSelectedIndex(i);
        }
 
        public double radio_frequency() {
index db7039ec5294a5dc16b8e99248a6612360fb3a0a..df41a522ad956a967d2d103d65cb95ba8ad26a8f 100644 (file)
@@ -190,14 +190,18 @@ public class AltosConvert {
                return ignite / 32767 * 15.0;
        }
 
-       static double radio_to_frequency(int setting, int cal, int channel) {
+       static double radio_to_frequency(int freq, int setting, int cal, int channel) {
                double  f;
 
-               if (setting <= 0)
-                       setting = cal;
-               f = 434.550 * setting / cal;
-               /* Round to nearest 50KHz */
-               f = Math.floor (20.0 * f + 0.5) / 20.0;
+               if (freq > 0)
+                       f = freq / 1000.0;
+               else {
+                       if (setting <= 0)
+                               setting = cal;
+                       f = 434.550 * setting / cal;
+                       /* Round to nearest 50KHz */
+                       f = Math.floor (20.0 * f + 0.5) / 20.0;
+               }
                return f + channel * 0.100;
        }
 
index 0617ce7429c8ed5293135a7174db3085fe6320a6..b748e460f5ae689f16da07a9d48182fcd47827c6 100644 (file)
@@ -35,7 +35,7 @@ public class AltosFrequency {
        String  description;
 
        public String toString() {
-               return String.format("%7.3f MHz %-20.20s",
+               return String.format("%7.3f MHz %-20s",
                                     frequency, description);
        }
 
index 4cf306d051e478706294010c90c35c6ce7aae104..ff1a91a5dedb1206e95376cff310bbad31b7b7bf 100644 (file)
@@ -363,12 +363,26 @@ public class AltosSerial implements Runnable {
                }
        }
 
+       private void set_radio_freq(int frequency) {
+               if (altos != null) {
+                       if (monitor_mode)
+                               printf("m 0\nc F %d\nm %x\n",
+                                      frequency, telemetry_len());
+                       else
+                               printf("c F %d\n", frequency);
+                       flush_output();
+               }
+       }
+
        public void set_radio_frequency(double frequency,
+                                       boolean has_frequency,
                                        boolean has_setting,
                                        int cal) {
                if (debug)
-                       System.out.printf("set_radio_frequency %7.3f %b %d\n", frequency, has_setting, cal);
-               if (has_setting)
+                       System.out.printf("set_radio_frequency %7.3f (freq %b) (set %b) %d\n", frequency, has_frequency, has_setting, cal);
+               if (has_frequency)
+                       set_radio_freq((int) Math.floor (frequency * 1000));
+               else if (has_setting)
                        set_radio_setting(AltosConvert.radio_frequency_to_setting(frequency, cal));
                else
                        set_channel(AltosConvert.radio_frequency_to_channel(frequency));
@@ -378,6 +392,7 @@ public class AltosSerial implements Runnable {
                frequency = in_frequency;
                config_data();
                set_radio_frequency(frequency,
+                                   config_data.radio_frequency != 0,
                                    config_data.radio_setting != 0,
                                    config_data.radio_calibration);
        }