summaryrefslogtreecommitdiff
path: root/altosui/Altos.java
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2011-06-28 01:03:00 -0700
committerKeith Packard <keithp@keithp.com>2011-06-28 01:03:00 -0700
commit7fd9b8f720add559b262e81d61ededc9df16ca94 (patch)
treeae32f830c27c99aacdfd6fb231e70a3ceee0f3ff /altosui/Altos.java
parentcb239b7161feea8646425b1f5788c3c82ae24321 (diff)
altosui: Support raw telemetry from TeleDongle
Use raw telemetry frames when TeleDongle supports them, this involves parsing the hex dump of the packet instead of having teledongle take the packet apart. Only the legacy format is working at this point; the altos bits for the new split telemetry frames is not written yet. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'altosui/Altos.java')
-rw-r--r--altosui/Altos.java68
1 files changed, 66 insertions, 2 deletions
diff --git a/altosui/Altos.java b/altosui/Altos.java
index 6a2d9b9b..25d97bcf 100644
--- a/altosui/Altos.java
+++ b/altosui/Altos.java
@@ -20,6 +20,7 @@ package altosui;
import java.awt.*;
import java.util.*;
import java.text.*;
+import java.nio.charset.Charset;
import libaltosJNI.*;
@@ -69,8 +70,11 @@ public class Altos {
/* Telemetry modes */
static final int ao_telemetry_off = 0;
- static final int ao_telemetry_full = 1;
- static final int ao_telemetry_tiny = 2;
+ static final int ao_telemetry_legacy = 1;
+ static final int ao_telemetry_split = 2;
+
+ static final int ao_telemetry_split_len = 32;
+ static final int ao_telemetry_legacy_len = 95;
static HashMap<String,Integer> string_to_state = new HashMap<String,Integer>();
@@ -201,6 +205,66 @@ public class Altos {
return -1;
}
+ static int int8(int[] bytes, int i) {
+ return (int) (byte) bytes[i];
+ }
+
+ static int uint8(int[] bytes, int i) {
+ return bytes[i];
+ }
+
+ static int int16(int[] bytes, int i) {
+ return (int) (short) (bytes[i] + (bytes[i+1] << 8));
+ }
+
+ static int uint16(int[] bytes, int i) {
+ return bytes[i] + (bytes[i+1] << 8);
+ }
+
+ static int uint32(int[] bytes, int i) {
+ return bytes[i] +
+ (bytes[i+1] << 8) +
+ (bytes[i+2] << 16) +
+ (bytes[i+3] << 24);
+ }
+
+ static final Charset unicode_set = Charset.forName("UTF-8");
+
+ static String string(int[] bytes, int s, int l) {
+ byte[] b = new byte[bytes.length];
+ for (int i = 0; i < l; i++)
+ b[i] = (byte) bytes[s+i];
+ return new String(b, unicode_set);
+ }
+
+ static int hexbyte(String s, int i) {
+ int c0, c1;
+
+ if (s.length() < i + 2)
+ throw new NumberFormatException(String.format("invalid hex \"%s\"", s));
+ c0 = s.charAt(i);
+ if (!Altos.ishex(c0))
+ throw new NumberFormatException(String.format("invalid hex \"%c\"", c0));
+ c1 = s.charAt(i+1);
+ if (!Altos.ishex(c1))
+ throw new NumberFormatException(String.format("invalid hex \"%c\"", c1));
+ return Altos.fromhex(c0) * 16 + Altos.fromhex(c1);
+ }
+
+ static int[] hexbytes(String s) {
+ int n;
+ int[] r;
+ int i;
+
+ if ((s.length() & 1) != 0)
+ throw new NumberFormatException(String.format("invalid line \"%s\"", s));
+ n = s.length() / 2;
+ r = new int[n];
+ for (i = 0; i < n; i++)
+ r[i] = Altos.hexbyte(s, i * 2);
+ return r;
+ }
+
static int fromdec(String s) throws NumberFormatException {
int c, v = 0;
int sign = 1;