* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.AltosLib;
+package org.altusmetrum.altoslib_11;
-public class AltosIMU {
- public int accel_x;
- public int accel_y;
- public int accel_z;
+import java.util.concurrent.*;
+import java.io.*;
- public int gyro_x;
- public int gyro_y;
- public int gyro_z;
+public class AltosIMU implements Cloneable, AltosHashable {
+ public int accel_along;
+ public int accel_across;
+ public int accel_through;
+
+ public int gyro_roll;
+ public int gyro_pitch;
+ public int gyro_yaw;
+
+ public static final double counts_per_g = 2048.0;
+
+ public static double convert_accel(double counts) {
+ return counts / counts_per_g * (-AltosConvert.GRAVITATIONAL_ACCELERATION);
+ }
+
+ public static final double counts_per_degsec = 16.4;
+
+ public static double convert_gyro(double counts) {
+ return counts / counts_per_degsec;
+ }
+
+ public boolean parse_string(String line) {
+ if (!line.startsWith("Accel:"))
+ return false;
+
+ String[] items = line.split("\\s+");
+
+ if (items.length >= 8) {
+ accel_along = Integer.parseInt(items[1]);
+ accel_across = Integer.parseInt(items[2]);
+ accel_through = Integer.parseInt(items[3]);
+ gyro_roll = Integer.parseInt(items[5]);
+ gyro_pitch = Integer.parseInt(items[6]);
+ gyro_yaw = Integer.parseInt(items[7]);
+ }
+ return true;
+ }
+
+ public AltosIMU clone() {
+ AltosIMU n = new AltosIMU();
+
+ n.accel_along = accel_along;
+ n.accel_across = accel_across;
+ n.accel_through = accel_through;
+
+ n.gyro_roll = gyro_roll;
+ n.gyro_pitch = gyro_pitch;
+ n.gyro_yaw = gyro_yaw;
+ return n;
+ }
+
+ static public void update_state(AltosState state, AltosLink link, AltosConfigData config_data) throws InterruptedException {
+ try {
+ AltosIMU imu = new AltosIMU(link);
+
+ if (imu != null)
+ state.set_imu(imu);
+ } catch (TimeoutException te) {
+ }
+ }
+
+ public AltosIMU() {
+ accel_along = AltosLib.MISSING;
+ accel_across = AltosLib.MISSING;
+ accel_through = AltosLib.MISSING;
+
+ gyro_roll = AltosLib.MISSING;
+ gyro_pitch = AltosLib.MISSING;
+ gyro_yaw = AltosLib.MISSING;
+ }
+
+ public AltosIMU(int accel_along, int accel_across, int accel_through,
+ int gyro_roll, int gyro_pitch, int gyro_yaw) {
+
+ this.accel_along = accel_along;
+ this.accel_across = accel_across;
+ this.accel_through = accel_through;
+
+ this.gyro_roll = gyro_roll;
+ this.gyro_pitch = gyro_pitch;
+ this.gyro_yaw = gyro_yaw;
+ }
+
+ public AltosIMU(AltosLink link) throws InterruptedException, TimeoutException {
+ this();
+ link.printf("I\n");
+ for (;;) {
+ String line = link.get_reply_no_dialog(5000);
+ if (line == null) {
+ throw new TimeoutException();
+ }
+ if (parse_string(line))
+ break;
+ }
+ }
+
+ public AltosIMU (AltosHashSet h) {
+ this();
+
+ accel_along = h.getInt("accel_along", accel_along);
+ accel_across = h.getInt("accel_across", accel_across);
+ accel_through = h.getInt("accel_through", accel_through);
+
+ gyro_roll = h.getInt("gyro_roll", gyro_roll);
+ gyro_pitch = h.getInt("gyro_pitch", gyro_pitch);
+ gyro_yaw = h.getInt("gyro_yaw", gyro_yaw);
+ }
+
+ static public AltosIMU fromHashSet(AltosHashSet h, AltosIMU def) {
+ if (h == null)
+ return def;
+ return new AltosIMU(h);
+ }
+
+ public AltosHashSet hashSet() {
+ AltosHashSet h = new AltosHashSet();
+
+ h.putInt("accel_along", accel_along);
+ h.putInt("accel_across", accel_across);
+ h.putInt("accel_through", accel_through);
+
+ h.putInt("gyro_roll", gyro_roll);
+ h.putInt("gyro_pitch", gyro_pitch);
+ h.putInt("gyro_yaw", gyro_yaw);
+ return h;
+ }
}
-
\ No newline at end of file