altosui: add monitor idle support for TeleMetrum v3
[fw/altos] / altoslib / AltosIdleFetch.java
index 42943c07c478e7cfb4f1ae426ef8f254d7e0c5a2..4b9a52542241c1cd3a6f1908bb842c80fd97fbe6 100644 (file)
@@ -3,7 +3,8 @@
  *
  * 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; version 2 of the License.
+ * 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
@@ -15,7 +16,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altoslib_2;
+package org.altusmetrum.altoslib_13;
 
 import java.io.*;
 import java.util.*;
@@ -28,50 +29,74 @@ class AltosIdler {
 
        static final int        idle_gps = 0;
        static final int        idle_imu = 1;
-       static final int        idle_mag = 2;
-       static final int        idle_ms5607 = 3;
+       static final int        idle_imu_em_v2 = 2;
+       static final int        idle_mag = 3;
        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;
        static final int        idle_sensor_mega = 12;
-       static final int        idle_sensor_emini = 13;
-
-       public void update_state(AltosState state, AltosLink link, AltosConfigData config_data) throws InterruptedException, TimeoutException {
+       static final int        idle_sensor_emini1 = 13;
+       static final int        idle_sensor_emini2 = 14;
+       static final int        idle_sensor_tmini2 = 15;
+       static final int        idle_sensor_tgps1 = 16;
+       static final int        idle_sensor_tgps2 = 17;
+       static final int        idle_sensor_tmini3 = 18;
+
+       public void provide_data(AltosDataListener listener, AltosLink link) throws InterruptedException, TimeoutException, AltosUnknownProduct {
                for (int idler : idlers) {
-                       AltosIdle idle = null;
                        switch (idler) {
                        case idle_gps:
-                               AltosGPS.update_state(state, link, config_data);
+                               AltosGPS.provide_data(listener, link);
                                break;
                        case idle_imu:
-                               AltosIMU.update_state(state, link, config_data);
+                               AltosIMU.provide_data(listener, link, AltosIMU.orient_telemega);
                                break;
-                       case idle_mag:
-                               AltosMag.update_state(state, link, config_data);
+                       case idle_imu_em_v2:
+                               AltosIMU.provide_data(listener, link, AltosIMU.orient_easymega_v2);
                                break;
-                       case idle_ms5607:
-                               AltosMs5607.update_state(state, link, config_data);
+                       case idle_mag:
+                               AltosMag.provide_data(listener, link);
                                break;
                        case idle_mma655x:
-                               AltosMma655x.update_state(state, link, config_data);
+                               AltosMma655x.provide_data(listener, link);
+                               break;
+                       case idle_adxl375:
+                               AltosAdxl375.provide_data(listener, link);
+                               break;
+                       case idle_ms5607:
+                               AltosMs5607.provide_data(listener, link);
                                break;
                        case idle_sensor_tm:
-                               AltosSensorTM.update_state(state, link, config_data);
+                               AltosSensorTM.provide_data(listener, link);
                                break;
                        case idle_sensor_metrum:
-                               AltosSensorMetrum.update_state(state, link, config_data);
+                               AltosSensorMetrum.provide_data(listener, link);
                                break;
                        case idle_sensor_mega:
-                               AltosSensorMega.update_state(state, link, config_data);
+                               AltosSensorMega.provide_data(listener, link);
+                               break;
+                       case idle_sensor_emini1:
+                               AltosSensorEMini.provide_data(listener, link, 1);
+                               break;
+                       case idle_sensor_emini2:
+                               AltosSensorEMini.provide_data(listener, link, 2);
+                               break;
+                       case idle_sensor_tmini2:
+                               AltosSensorTMini2.provide_data(listener, link);
                                break;
-                       case idle_sensor_emini:
-                               AltosSensorEMini.update_state(state, link, config_data);
+                       case idle_sensor_tgps1:
+                               AltosSensorTGPS1.provide_data(listener, link);
+                               break;
+                       case idle_sensor_tgps2:
+                               AltosSensorTGPS2.provide_data(listener, link);
+                               break;
+                       case idle_sensor_tmini3:
+                               AltosSensorTMini3.provide_data(listener, link);
                                break;
                        }
-                       if (idle != null)
-                               idle.update_state(state);
                }
        }
 
@@ -86,20 +111,28 @@ class AltosIdler {
 }
 
 
-public class AltosIdleFetch implements AltosStateUpdate {
+public class AltosIdleFetch implements AltosDataProvider {
 
        static final AltosIdler[] idlers = {
 
-               new AltosIdler("EasyMini",
+               new AltosIdler("EasyMini-v1",
+                              AltosIdler.idle_ms5607,
+                              AltosIdler.idle_sensor_emini1),
+
+               new AltosIdler("EasyMini-v2",
                               AltosIdler.idle_ms5607,
-                              AltosIdler.idle_sensor_emini),
+                              AltosIdler.idle_sensor_emini2),
 
                new AltosIdler("TeleMini-v1",
                               AltosIdler.idle_sensor_tm),
 
                new AltosIdler("TeleMini-v2",
                               AltosIdler.idle_ms5607,
-                              AltosIdler.idle_sensor_tm),
+                              AltosIdler.idle_sensor_tmini2),
+
+               new AltosIdler("TeleMini-v3",
+                              AltosIdler.idle_ms5607,
+                              AltosIdler.idle_sensor_tmini3),
 
                new AltosIdler("TeleMetrum-v1",
                               AltosIdler.idle_gps,
@@ -107,40 +140,79 @@ public class AltosIdleFetch implements AltosStateUpdate {
 
                new AltosIdler("TeleMetrum-v2",
                               AltosIdler.idle_gps,
-                              AltosIdler.idle_ms5607, AltosIdler.idle_mma655x,
+                              AltosIdler.idle_mma655x,
+                              AltosIdler.idle_ms5607,
+                              AltosIdler.idle_sensor_metrum),
+
+               new AltosIdler("TeleMetrum-v3",
+                              AltosIdler.idle_gps,
+                              AltosIdler.idle_adxl375,
+                              AltosIdler.idle_ms5607,
                               AltosIdler.idle_sensor_metrum),
 
-               new AltosIdler("TeleMega",
+               new AltosIdler("TeleMega-v0",
+                              AltosIdler.idle_gps,
+                              AltosIdler.idle_mma655x,
+                              AltosIdler.idle_ms5607,
+                              AltosIdler.idle_imu, AltosIdler.idle_mag,
+                              AltosIdler.idle_sensor_mega),
+               new AltosIdler("TeleMega-v1",
+                              AltosIdler.idle_gps,
+                              AltosIdler.idle_mma655x,
+                              AltosIdler.idle_ms5607,
+                              AltosIdler.idle_imu, AltosIdler.idle_mag,
+                              AltosIdler.idle_sensor_mega),
+               new AltosIdler("TeleMega-v2",
+                              AltosIdler.idle_gps,
+                              AltosIdler.idle_mma655x,
+                              AltosIdler.idle_ms5607,
+                              AltosIdler.idle_imu, AltosIdler.idle_mag,
+                              AltosIdler.idle_sensor_mega),
+               new AltosIdler("TeleMega-v3",
                               AltosIdler.idle_gps,
-                              AltosIdler.idle_ms5607, AltosIdler.idle_mma655x,
+                              AltosIdler.idle_mma655x,
+                              AltosIdler.idle_ms5607,
+                              AltosIdler.idle_imu,
+                              AltosIdler.idle_sensor_mega),
+               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_em_v2,
+                              AltosIdler.idle_sensor_mega),
+               new AltosIdler("TeleGPS-v1",
+                              AltosIdler.idle_gps,
+                              AltosIdler.idle_sensor_tgps1),
+               new AltosIdler("TeleGPS-v2",
+                              AltosIdler.idle_gps,
+                              AltosIdler.idle_sensor_tgps2),
        };
 
        AltosLink               link;
 
-       double                  frequency;
-       String                  callsign;
-
-       public void update_state(AltosState state) {
+       public void provide_data(AltosDataListener listener) throws InterruptedException, AltosUnknownProduct {
                try {
+                       boolean matched = false;
+                       /* Fetch config data from remote */
                        AltosConfigData config_data = new AltosConfigData(link);
-                       state.set_state(AltosLib.ao_flight_startup);
-                       state.set_serial(config_data.serial);
-                       state.set_callsign(config_data.callsign);
-                       state.set_ground_accel(config_data.accel_cal_plus);
-                       state.set_accel_g(config_data.accel_cal_plus, config_data.accel_cal_minus);
+                       listener.set_state(AltosLib.ao_flight_stateless);
                        for (AltosIdler idler : idlers) {
                                if (idler.matches(config_data)) {
-                                       idler.update_state(state, link, config_data);
+                                       idler.provide_data(listener, link);
+                                       matched = true;
                                        break;
                                }
                        }
-                       state.set_received_time(System.currentTimeMillis());
-               } catch (InterruptedException ie) {
+                       if (!matched)
+                               throw new AltosUnknownProduct(config_data.product);
+                       listener.set_received_time(System.currentTimeMillis());
                } catch (TimeoutException te) {
                }
-               
+
        }
 
        public AltosIdleFetch(AltosLink link) {