summaryrefslogtreecommitdiff
path: root/altoslib
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2018-10-19 13:19:03 -0700
committerKeith Packard <keithp@keithp.com>2018-10-19 13:19:03 -0700
commit1e4b8674d874a190eca1a98a397aaf0a9d15bda1 (patch)
tree3f10859630950bca4a6caa0209da54aaa8b20be9 /altoslib
parent3fd320ea38f2945f5611a09a0e48d16db467d105 (diff)
altoslib: Add ADXL375 support and EasyMega v2.0 support
EasyMega v2.0 replaces the MMA655X with an ADXL375 part. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'altoslib')
-rw-r--r--altoslib/AltosAdxl375.java93
-rw-r--r--altoslib/AltosCalData.java26
-rw-r--r--altoslib/AltosConfigData.java16
-rw-r--r--altoslib/AltosIdleFetch.java12
-rw-r--r--altoslib/Makefile.am1
5 files changed, 145 insertions, 3 deletions
diff --git a/altoslib/AltosAdxl375.java b/altoslib/AltosAdxl375.java
new file mode 100644
index 00000000..2129ed6e
--- /dev/null
+++ b/altoslib/AltosAdxl375.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright © 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+package org.altusmetrum.altoslib_13;
+
+import java.util.concurrent.*;
+
+public class AltosAdxl375 implements Cloneable {
+
+ private int accel;
+ private int axis;
+
+ public static final int X_AXIS = 0;
+ public static final int Y_AXIS = 1;
+ public static final int Z_AXIS = 2;
+
+ public boolean parse_line(String line) throws NumberFormatException {
+ if (line.startsWith("ADXL375 value")) {
+ System.out.printf("adxl parse line %s\n", line);
+ String[] items = line.split("\\s+");
+ if (axis == AltosLib.MISSING)
+ throw new NumberFormatException("No ADXL375 axis specified");
+ if (items.length >= 3) {
+ accel = Integer.parseInt(items[2 + axis]);
+ System.out.printf("accel %d\n", accel);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public AltosAdxl375 clone() {
+ AltosAdxl375 n = new AltosAdxl375(axis);
+
+ n.accel = accel;
+ return n;
+ }
+
+ static public void provide_data(AltosDataListener listener, AltosLink link) throws InterruptedException, AltosUnknownProduct {
+ try {
+ AltosCalData cal_data = listener.cal_data();
+ AltosAdxl375 adxl375 = new AltosAdxl375(link, cal_data.adxl375_axis);
+
+ if (adxl375 != null) {
+ int accel = adxl375.accel;
+ if (cal_data.adxl375_inverted)
+ accel = -accel;
+ if (cal_data.pad_orientation == 1)
+ accel = -accel;
+ listener.set_acceleration(cal_data.acceleration(accel));
+ }
+ } catch (TimeoutException te) {
+ } catch (NumberFormatException ne) {
+ }
+ }
+
+ public AltosAdxl375() {
+ accel = AltosLib.MISSING;
+ axis = AltosLib.MISSING;
+ }
+
+ public AltosAdxl375(int axis) {
+ this();
+ this.axis = axis;
+ }
+
+ public AltosAdxl375(AltosLink link, int axis) throws InterruptedException, TimeoutException, NumberFormatException {
+ this(axis);
+ link.printf("A\n");
+ for (;;) {
+ String line = link.get_reply_no_dialog(5000);
+ if (line == null)
+ throw new TimeoutException();
+ if (parse_line(line))
+ break;
+ }
+ }
+}
diff --git a/altoslib/AltosCalData.java b/altoslib/AltosCalData.java
index d448fdfe..c3d79250 100644
--- a/altoslib/AltosCalData.java
+++ b/altoslib/AltosCalData.java
@@ -133,6 +133,18 @@ public class AltosCalData {
mma655x_inverted = inverted;
}
+ public boolean adxl375_inverted = false;
+
+ public void set_adxl375_inverted(boolean inverted) {
+ adxl375_inverted = inverted;
+ }
+
+ public int adxl375_axis = AltosLib.MISSING;
+
+ public void set_adxl375_axis(int axis) {
+ adxl375_axis = axis;
+ }
+
public int pad_orientation = AltosLib.MISSING;
public void set_pad_orientation(int orientation) {
@@ -142,7 +154,11 @@ public class AltosCalData {
/* Compute acceleration */
public double acceleration(double sensor) {
- return AltosConvert.acceleration_from_sensor(sensor, accel_plus_g, accel_minus_g, ground_accel);
+ double accel;
+ accel = AltosConvert.acceleration_from_sensor(sensor, accel_plus_g, accel_minus_g, ground_accel);
+ System.out.printf("acceleration %g (+ %g - %g g %g) -> %g\n",
+ sensor, accel_plus_g, accel_minus_g, ground_accel, accel);
+ return accel;
}
public AltosMs5607 ms5607 = null;
@@ -404,6 +420,14 @@ public class AltosCalData {
set_mma655x_inverted(config_data.mma655x_inverted());
} catch (AltosUnknownProduct up) {
}
+ try {
+ set_adxl375_inverted(config_data.adxl375_inverted());
+ } catch (AltosUnknownProduct up) {
+ }
+ try {
+ set_adxl375_axis(config_data.adxl375_axis());
+ } catch (AltosUnknownProduct up) {
+ }
set_pad_orientation(config_data.pad_orientation);
}
}
diff --git a/altoslib/AltosConfigData.java b/altoslib/AltosConfigData.java
index 48dab421..29ce033d 100644
--- a/altoslib/AltosConfigData.java
+++ b/altoslib/AltosConfigData.java
@@ -581,6 +581,22 @@ public class AltosConfigData {
throw new AltosUnknownProduct(product);
}
+ public boolean adxl375_inverted() throws AltosUnknownProduct {
+ if (product != null) {
+ if (product.startsWith("EasyMega-v2"))
+ return true;
+ }
+ throw new AltosUnknownProduct(product);
+ }
+
+ public int adxl375_axis() throws AltosUnknownProduct {
+ if (product != null) {
+ if (product.startsWith("EasyMega-v2"))
+ return AltosAdxl375.X_AXIS;
+ }
+ throw new AltosUnknownProduct(product);
+ }
+
public void get_values(AltosConfigValues source) throws AltosConfigDataException {
/* HAS_FLIGHT */
diff --git a/altoslib/AltosIdleFetch.java b/altoslib/AltosIdleFetch.java
index 88a65e63..884d8761 100644
--- a/altoslib/AltosIdleFetch.java
+++ b/altoslib/AltosIdleFetch.java
@@ -32,7 +32,7 @@ class AltosIdler {
static final int idle_mag = 2;
static final int idle_mma655x = 4;
static final int idle_ms5607 = 5;
-
+ static final int idle_adxl375 = 6;
static final int idle_sensor_tm = 10;
static final int idle_sensor_metrum = 11;
@@ -58,6 +58,9 @@ class AltosIdler {
case idle_mma655x:
AltosMma655x.provide_data(listener, link);
break;
+ case idle_adxl375:
+ AltosAdxl375.provide_data(listener, link);
+ break;
case idle_ms5607:
AltosMs5607.provide_data(listener, link);
break;
@@ -157,11 +160,16 @@ public class AltosIdleFetch implements AltosDataProvider {
AltosIdler.idle_ms5607,
AltosIdler.idle_imu,
AltosIdler.idle_sensor_mega),
- new AltosIdler("EasyMega",
+ new AltosIdler("EasyMega-v1",
AltosIdler.idle_mma655x,
AltosIdler.idle_ms5607,
AltosIdler.idle_imu, AltosIdler.idle_mag,
AltosIdler.idle_sensor_mega),
+ new AltosIdler("EasyMega-v2",
+ AltosIdler.idle_adxl375,
+ AltosIdler.idle_ms5607,
+ AltosIdler.idle_imu,
+ AltosIdler.idle_sensor_mega),
new AltosIdler("TeleGPS",
AltosIdler.idle_gps,
AltosIdler.idle_sensor_tgps),
diff --git a/altoslib/Makefile.am b/altoslib/Makefile.am
index 92976332..2f4e5959 100644
--- a/altoslib/Makefile.am
+++ b/altoslib/Makefile.am
@@ -28,6 +28,7 @@ altoslib_JAVA = \
AltosLib.java \
AltosAccelCal.java \
AltosAccelCalListener.java \
+ AltosAdxl375.java \
AltosCalData.java \
AltosCompanion.java \
AltosConfigData.java \