summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--altoslib/AltosLib.java3
-rw-r--r--altoslib/AltosRomconfig.java38
-rw-r--r--altoslib/Makefile.am4
-rw-r--r--altosuilib/AltosFlashUI.java11
4 files changed, 54 insertions, 2 deletions
diff --git a/altoslib/AltosLib.java b/altoslib/AltosLib.java
index 254448d0..40d7a27b 100644
--- a/altoslib/AltosLib.java
+++ b/altoslib/AltosLib.java
@@ -230,6 +230,9 @@ public class AltosLib {
public static final String launch_sites_env = "LAUNCH_SITES";
// public static final String launch_sites_url = "file:///home/keithp/misc/text/altusmetrum/AltOS/launch-sites.txt";
+ public static final String unit_info_url = "https://altusmetrum.org/cgi-bin/unitinfo.cgi?sn=%d";
+ public static final String unit_info_env = "UNIT_INFO";
+
public static final int ao_telemetry_standard_len = 32;
public static final int ao_telemetry_0_9_len = 95;
public static final int ao_telemetry_0_8_len = 94;
diff --git a/altoslib/AltosRomconfig.java b/altoslib/AltosRomconfig.java
index ccd01274..ebeb76f3 100644
--- a/altoslib/AltosRomconfig.java
+++ b/altoslib/AltosRomconfig.java
@@ -19,9 +19,11 @@
package org.altusmetrum.altoslib_13;
import java.io.*;
+import java.util.concurrent.*;
-public class AltosRomconfig {
+public class AltosRomconfig implements AltosUnitInfoListener {
public boolean valid;
+ public boolean radio_calibration_broken;
public int version;
public int check;
public int serial_number;
@@ -117,6 +119,29 @@ public class AltosRomconfig {
final static String ao_radio_cal = "ao_radio_cal";
final static String ao_usb_descriptors = "ao_usb_descriptors";
+ Semaphore unit_info_done;
+
+ public void notify_unit_info(AltosUnitInfo unit_info) {
+ unit_info_done.release();
+ }
+
+ private void fetch_radio_cal() {
+ unit_info_done = new Semaphore(0);
+ AltosUnitInfo info = new AltosUnitInfo(serial_number, this);
+
+ /* Block waiting for the rf calibration data */
+ radio_calibration_broken = true;
+ try {
+ unit_info_done.acquire();
+ int new_cal = info.rfcal();
+ if (new_cal != AltosLib.MISSING) {
+ radio_calibration = new_cal;
+ radio_calibration_broken = false;
+ }
+ } catch (InterruptedException ie) {
+ }
+ }
+
public AltosRomconfig(AltosHexfile hexfile) {
try {
version = get_int(hexfile, ao_romconfig_version, 2);
@@ -131,7 +156,18 @@ public class AltosRomconfig {
} catch (AltosNoSymbol missing) {
radio_calibration = 0;
}
+
valid = true;
+
+ /* XXX TeleBT v4.0 units originally shipped without RF calibration programmed. Go fetch
+ * the correct value from the web site
+ */
+ if (serial_number == 2584 ||
+ (3686 <= serial_number && serial_number <= 3938 && radio_calibration == 5695485))
+ {
+ fetch_radio_cal();
+ }
+
break;
}
}
diff --git a/altoslib/Makefile.am b/altoslib/Makefile.am
index 7c5d767d..92976332 100644
--- a/altoslib/Makefile.am
+++ b/altoslib/Makefile.am
@@ -183,7 +183,9 @@ altoslib_JAVA = \
AltosMapLoader.java \
AltosMapTypeListener.java \
AltosJson.java \
- AltosVersion.java
+ AltosVersion.java \
+ AltosUnitInfo.java \
+ AltosUnitInfoListener.java
JAR=altoslib_$(ALTOSLIB_VERSION).jar
diff --git a/altosuilib/AltosFlashUI.java b/altosuilib/AltosFlashUI.java
index 6c9cae52..b91776aa 100644
--- a/altosuilib/AltosFlashUI.java
+++ b/altosuilib/AltosFlashUI.java
@@ -325,6 +325,17 @@ public class AltosFlashUI
return false;
}
+ if (existing_config.radio_calibration_broken) {
+ int ret = JOptionPane.showConfirmDialog(this,
+ String.format("Radio calibration value %d may be incorrect\nFlash anyways?",
+ existing_config.radio_calibration),
+ "Radio Calibration Invalid",
+ JOptionPane.YES_NO_OPTION);
+ if (ret != JOptionPane.YES_OPTION)
+ return false;
+ }
+
+
new_config = AltosRomconfigUI.show(frame, existing_config);
if (new_config == null)
return false;