EasyMega v2.0 replaces the MMA655X with an ADXL375 part.
Signed-off-by: Keith Packard <keithp@keithp.com>
--- /dev/null
+/*
+ * 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;
+ }
+ }
+}
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) {
/* 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;
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);
}
}
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 */
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;
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;
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),
AltosLib.java \
AltosAccelCal.java \
AltosAccelCalListener.java \
+ AltosAdxl375.java \
AltosCalData.java \
AltosCompanion.java \
AltosConfigData.java \