From: Keith Packard Date: Fri, 19 Oct 2018 20:19:03 +0000 (-0700) Subject: altoslib: Add ADXL375 support and EasyMega v2.0 support X-Git-Tag: 1.9~27^2~1 X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=commitdiff_plain;h=1e4b8674d874a190eca1a98a397aaf0a9d15bda1 altoslib: Add ADXL375 support and EasyMega v2.0 support EasyMega v2.0 replaces the MMA655X with an ADXL375 part. Signed-off-by: Keith Packard --- 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 + * + * 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 \