From d8ebb83e64d66fa159e75aa560d39d80bb6d9d04 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Tue, 27 Mar 2012 10:38:32 -0700 Subject: [PATCH] altosui: Configure radio with new direct frequency setting Instead of computing the radio setting in altosui, let the radio do it directly. Signed-off-by: Keith Packard --- altosui/AltosConfig.java | 14 ++++++++++++-- altosui/AltosConfigData.java | 3 +++ altosui/AltosConfigUI.java | 1 + altosui/AltosConvert.java | 16 ++++++++++------ altosui/AltosFrequency.java | 2 +- altosui/AltosSerial.java | 19 +++++++++++++++++-- 6 files changed, 44 insertions(+), 11 deletions(-) diff --git a/altosui/AltosConfig.java b/altosui/AltosConfig.java index 93def70d..84261ec7 100644 --- a/altosui/AltosConfig.java +++ b/altosui/AltosConfig.java @@ -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); diff --git a/altosui/AltosConfigData.java b/altosui/AltosConfigData.java index c14dc5a1..e5c3566b 100644 --- a/altosui/AltosConfigData.java +++ b/altosui/AltosConfigData.java @@ -49,6 +49,7 @@ public class AltosConfigData implements Iterable { 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 { serial_line.printf("c s\nf\nl\nv\n"); lines = new LinkedList(); 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 { 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+"); diff --git a/altosui/AltosConfigUI.java b/altosui/AltosConfigUI.java index 9fef8e3b..c8ec06d2 100644 --- a/altosui/AltosConfigUI.java +++ b/altosui/AltosConfigUI.java @@ -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() { diff --git a/altosui/AltosConvert.java b/altosui/AltosConvert.java index db7039ec..df41a522 100644 --- a/altosui/AltosConvert.java +++ b/altosui/AltosConvert.java @@ -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; } diff --git a/altosui/AltosFrequency.java b/altosui/AltosFrequency.java index 0617ce74..b748e460 100644 --- a/altosui/AltosFrequency.java +++ b/altosui/AltosFrequency.java @@ -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); } diff --git a/altosui/AltosSerial.java b/altosui/AltosSerial.java index 4cf306d0..ff1a91a5 100644 --- a/altosui/AltosSerial.java +++ b/altosui/AltosSerial.java @@ -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); } -- 2.30.2