Merge remote-tracking branch 'origin/telemini'
authorKeith Packard <keithp@keithp.com>
Thu, 29 Aug 2013 04:52:58 +0000 (22:52 -0600)
committerKeith Packard <keithp@keithp.com>
Thu, 29 Aug 2013 04:52:58 +0000 (22:52 -0600)
Signed-off-by: Keith Packard <keithp@keithp.com>
Conflicts:
src/core/ao_telemetry.c
src/core/ao_telemetry.h

Added both Mini and Metrum telemetry defines

1  2 
src/core/ao_data.h
src/core/ao_task.c
src/core/ao_telemetry.c
src/core/ao_telemetry.h

diff --combined src/core/ao_data.h
index c873e9d34d7ebe6ad1b9aaf7912051d3a4099c22,080a534f98d992fa2ccb3e77420278cdb65f69bd..339afe69882602e3730ff66543236b9f17e644b7
@@@ -101,7 -101,7 +101,7 @@@ extern volatile __data uint8_t             ao_data
   * signaled by the timer tick
   */
  #define AO_DATA_WAIT() do {                           \
-               ao_sleep((void *) &ao_data_count);      \
+               ao_sleep(DATA_TO_XDATA ((void *) &ao_data_count));      \
        } while (0)
  
  #endif /* AO_DATA_RING */
@@@ -272,11 -272,7 +272,11 @@@ typedef int16_t accel_t
  /* MMA655X is hooked up so that positive values represent negative acceleration */
  
  #define ao_data_accel(packet)                 ((packet)->mma655x)
 +#if AO_MMA655X_INVERT
 +#define ao_data_accel_cook(packet)            (4095 - (packet)->mma655x)
 +#else
  #define ao_data_accel_cook(packet)            ((packet)->mma655x)
 +#endif
  #define ao_data_set_accel(packet, accel)      ((packet)->mma655x = (accel))
  #define ao_data_accel_invert(accel)           (4095 - (accel))
  
diff --combined src/core/ao_task.c
index 4f48e32dcc4c86679d7a6508188e6bf78a35dd3d,18315b1fddcd625a0cde0de9e6a48156b4d8be2d..bafb49439d4441022be1b9159947f30a9f8d7bff
@@@ -109,8 -109,6 +109,8 @@@ ao_task_validate_alarm_queue(void
                                ao_panic(3);
                }
        }
 +      if (ao_task_alarm_tick != ao_list_first_entry(&alarm_queue, struct ao_task, alarm_queue)->alarm)
 +              ao_panic(4);
  }
  #else
  #define ao_task_validate_alarm_queue()
@@@ -125,7 -123,6 +125,7 @@@ ao_task_to_alarm_queue(struct ao_task *
        ao_list_for_each_entry(alarm, &alarm_queue, struct ao_task, alarm_queue) {
                if ((int16_t) (alarm->alarm - task->alarm) >= 0) {
                        ao_list_insert(&task->alarm_queue, alarm->alarm_queue.prev);
 +                      ao_task_alarm_tick = ao_list_first_entry(&alarm_queue, struct ao_task, alarm_queue)->alarm;
                        ao_task_validate_alarm_queue();
                        return;
                }
@@@ -423,7 -420,7 +423,7 @@@ ao_sleep(__xdata void *wchan
  }
  
  void
- ao_wakeup(__xdata void *wchan)
+ ao_wakeup(__xdata void *wchan) __reentrant
  {
  #if HAS_TASK_QUEUE
        struct ao_task  *sleep, *next;
diff --combined src/core/ao_telemetry.c
index 65d7d08f658e1fdb0787873f71dfaa276defcaa9,9c67303081aeb71e0cda739b9da2800fbf7b8913..cd95aa6bce3d0a995d70b6fd30a90d49a75ca07a
@@@ -40,10 -40,6 +40,10 @@@ static __pdata uint16_t ao_aprs_time
  #define AO_SEND_MEGA  1
  #endif
  
 +#if defined (TELEMETRUM_V_2_0)
 +#define AO_SEND_METRUM        1
 +#endif
 +
  #if defined(TELEMETRUM_V_0_1) || defined(TELEMETRUM_V_0_2) || defined(TELEMETRUM_V_1_0) || defined(TELEMETRUM_V_1_1) || defined(TELEBALLOON_V_1_1) || defined(TELEMETRUM_V_1_2)
  #define AO_TELEMETRY_SENSOR   AO_TELEMETRY_SENSOR_TELEMETRUM
  #endif
@@@ -175,56 -171,35 +175,85 @@@ ao_send_mega_data(void
  }
  #endif /* AO_SEND_MEGA */
  
-                       
-       telemetry.generic.tick = packet->tick;
 +#ifdef AO_SEND_METRUM
 +/* Send telemetrum sensor packet */
 +static void
 +ao_send_metrum_sensor(void)
 +{
 +      __xdata struct ao_data *packet = (__xdata struct ao_data *) &ao_data_ring[ao_data_ring_prev(ao_sample_data)];
-               telemetry.generic.type = AO_TELEMETRY_MEGA_DATA;
++
 +      telemetry.generic.type = AO_TELEMETRY_METRUM_SENSOR;
 +
 +      telemetry.metrum_sensor.state = ao_flight_state;
 +      telemetry.metrum_sensor.accel = ao_data_accel(packet);
 +      telemetry.metrum_sensor.pres = ao_data_pres(packet);
 +      telemetry.metrum_sensor.temp = ao_data_temp(packet);
 +
 +      telemetry.metrum_sensor.acceleration = ao_accel;
 +      telemetry.metrum_sensor.speed = ao_speed;
 +      telemetry.metrum_sensor.height = ao_height;
 +
 +      telemetry.metrum_sensor.v_batt = packet->adc.v_batt;
 +      telemetry.metrum_sensor.sense_a = packet->adc.sense_a;
 +      telemetry.metrum_sensor.sense_m = packet->adc.sense_m;
 +
 +      ao_radio_send(&telemetry, sizeof (telemetry));
 +}
 +
 +static __pdata int8_t ao_telemetry_metrum_data_max;
 +static __pdata int8_t ao_telemetry_metrum_data_cur;
 +
 +/* Send telemetrum data packet */
 +static void
 +ao_send_metrum_data(void)
 +{
 +      if (--ao_telemetry_metrum_data_cur <= 0) {
 +              __xdata struct ao_data *packet = (__xdata struct ao_data *) &ao_data_ring[ao_data_ring_prev(ao_sample_data)];
 +              uint8_t i;
 +
 +              telemetry.generic.tick = packet->tick;
- #endif /* AO_SEND_MEGA */
++              telemetry.generic.type = AO_TELEMETRY_METRUM_DATA;
 +
 +              telemetry.metrum_data.ground_pres = ao_ground_pres;
 +              telemetry.metrum_data.ground_accel = ao_ground_accel;
 +              telemetry.metrum_data.accel_plus_g = ao_config.accel_plus_g;
 +              telemetry.metrum_data.accel_minus_g = ao_config.accel_minus_g;
 +
 +              ao_radio_send(&telemetry, sizeof (telemetry));
 +              ao_telemetry_metrum_data_cur = ao_telemetry_metrum_data_max;
 +      }
 +}
 -#endif
++#endif /* AO_SEND_METRUM */
++
+ #ifdef AO_SEND_MINI
+ static void
+ ao_send_mini(void)
+ {
+       __xdata struct ao_data *packet = (__xdata struct ao_data *) &ao_data_ring[ao_data_ring_prev(ao_sample_data)];
+                       
+       telemetry.generic.tick = packet->tick;
+       telemetry.generic.type = AO_TELEMETRY_MINI;
+       telemetry.mini.state = ao_flight_state;
+       telemetry.mini.v_batt = packet->adc.v_batt;
+       telemetry.mini.sense_a = packet->adc.sense_a;
+       telemetry.mini.sense_m = packet->adc.sense_m;
+       telemetry.mini.pres = ao_data_pres(packet);
+       telemetry.mini.temp = ao_data_temp(packet);
+       telemetry.mini.acceleration = ao_accel;
+       telemetry.mini.speed = ao_speed;
+       telemetry.mini.height = ao_height;
+       telemetry.mini.ground_pres = ao_ground_pres;
+       ao_radio_send(&telemetry, sizeof (telemetry));
+ }
++#endif /* AO_SEND_MINI */
  
  #ifdef AO_SEND_ALL_BARO
  static uint8_t                ao_baro_sample;
@@@ -369,7 -344,7 +398,6 @@@ ao_telemetry(void
                ao_aprs_time = time;
  #endif
                while (ao_telemetry_interval) {
--
  #if HAS_APRS
                        if (!(ao_config.radio_enable & AO_RADIO_DISABLE_TELEMETRY))
  #endif
  #ifdef AO_SEND_ALL_BARO
                                ao_send_baro();
  #endif
++
  #if HAS_FLIGHT
- #ifdef AO_SEND_MEGA
+ # ifdef AO_SEND_MEGA
                                ao_send_mega_sensor();
                                ao_send_mega_data();
- #else
- #ifdef AO_SEND_METRUM
 -# else
 -#  ifdef AO_SEND_MINI
++# endif
++# ifdef AO_SEND_METRUM
 +                              ao_send_metrum_sensor();
 +                              ao_send_metrum_data();
- #else
++# endif
++# ifdef AO_SEND_MINI
+                               ao_send_mini();
 -#  else
++# endif
++# ifdef AO_TELEMETRY_SENSOR
                                ao_send_sensor();
- #endif
- #endif
- #endif
 -#  endif
+ # endif
 -#endif
++#endif /* HAS_FLIGHT */
  
  #if HAS_COMPANION
                                if (ao_companion_running)
                        if (ao_rdf &&
  #if HAS_APRS
                            !(ao_config.radio_enable & AO_RADIO_DISABLE_RDF) &&
--#endif
++#endif /* HAS_APRS */
                            (int16_t) (ao_time() - ao_rdf_time) >= 0)
                        {
  #if HAS_IGNITE_REPORT
                                uint8_t c;
--#endif
++#endif /* HAS_IGNITE_REPORT */
                                ao_rdf_time = ao_time() + AO_RDF_INTERVAL_TICKS;
  #if HAS_IGNITE_REPORT
                                if (ao_flight_state == ao_flight_pad && (c = ao_report_igniter()))
                                        ao_radio_continuity(c);
                                else
--#endif
++#endif /* HAS_IGNITE_REPORT*/
                                        ao_radio_rdf();
                        }
  #endif /* HAS_RDF */
                                ao_aprs_time = ao_time() + AO_SEC_TO_TICKS(ao_config.aprs_interval);
                                ao_aprs_send();
                        }
--#endif
--#endif
++#endif /* HAS_APRS */
++#endif /* !AO_SEND_ALL_BARO */
                        time += ao_telemetry_interval;
                        delay = time - ao_time();
                        if (delay > 0) {
@@@ -459,12 -433,6 +491,12 @@@ ao_telemetry_set_interval(uint16_t inte
                cur++;
        ao_telemetry_mega_data_cur = cur;
  #endif
 +#if AO_SEND_METRUM
 +      ao_telemetry_metrum_data_max = AO_SEC_TO_TICKS(1) / interval;
 +      if (ao_telemetry_metrum_data_max > cur)
 +              cur++;
 +      ao_telemetry_metrum_data_cur = cur;
 +#endif
  
  #if HAS_COMPANION
        if (!ao_companion_setup.update_period)
diff --combined src/core/ao_telemetry.h
index 17dc3e934f669f9ca515a3209d4993ec0f9bffc9,776015291dddde49a3d49adfb1615eb8f0bf5631..fd6b76b37375114519621258642d6a0c4ee25bc1
@@@ -207,47 -207,31 +207,71 @@@ struct ao_telemetry_mega_data 
  };
  
  
 -
 +#define AO_TELEMETRY_METRUM_SENSOR    0x0A
 +
 +struct ao_telemetry_metrum_sensor {
 +      uint16_t        serial;         /*  0 */
 +      uint16_t        tick;           /*  2 */
 +      uint8_t         type;           /*  4 */
 +
 +      uint8_t         state;          /*  5 flight state */
 +      int16_t         accel;          /*  6 Z axis */
 +
 +      int32_t         pres;           /*  8 Pa * 10 */
 +      int16_t         temp;           /* 12 °C * 100 */
 +
 +      int16_t         acceleration;   /* 14 m/s² * 16 */
 +      int16_t         speed;          /* 16 m/s * 16 */
 +      int16_t         height;         /* 18 m */
 +
 +      int16_t         v_batt;         /* 20 battery voltage */
 +      int16_t         sense_a;        /* 22 apogee continuity sense */
 +      int16_t         sense_m;        /* 24 main continuity sense */
 +
 +      uint8_t         pad[6];         /* 26 */
 +      /* 32 */
 +};
 +      
 +#define AO_TELEMETRY_METRUM_DATA      0x0B
 +
 +struct ao_telemetry_metrum_data {
 +      uint16_t        serial;         /*  0 */
 +      uint16_t        tick;           /*  2 */
 +      uint8_t         type;           /*  4 */
 +
 +      int32_t         ground_pres;    /* 8 average pres on pad */
 +      int16_t         ground_accel;   /* 12 average accel on pad */
 +      int16_t         accel_plus_g;   /* 14 accel calibration at +1g */
 +      int16_t         accel_minus_g;  /* 16 accel calibration at -1g */
 +
 +      uint8_t         pad[14];        /* 18 */
 +      /* 32 */
 +};
 +
+ #define AO_TELEMETRY_MINI             0x10
+ struct ao_telemetry_mini {
+       uint16_t        serial;         /*  0 */
+       uint16_t        tick;           /*  2 */
+       uint8_t         type;           /*  4 */
+       uint8_t         state;          /*  5 flight state */
+       int16_t         v_batt;         /*  6 battery voltage */
+       int16_t         sense_a;        /*  8 apogee continuity */
+       int16_t         sense_m;        /* 10 main continuity */
+       int32_t         pres;           /* 12 Pa * 10 */
+       int16_t         temp;           /* 16 °C * 100 */
+       int16_t         acceleration;   /* 18 m/s² * 16 */
+       int16_t         speed;          /* 20 m/s * 16 */
+       int16_t         height;         /* 22 m */
+       int32_t         ground_pres;    /* 24 average pres on pad */
+       int32_t         pad28;          /* 28 */
+       /* 32 */
+ };
  
  /* #define AO_SEND_ALL_BARO */
  
@@@ -282,8 -266,7 +306,9 @@@ union ao_telemetry_all 
        struct ao_telemetry_companion           companion;
        struct ao_telemetry_mega_sensor         mega_sensor;
        struct ao_telemetry_mega_data           mega_data;
 +      struct ao_telemetry_metrum_sensor       metrum_sensor;
 +      struct ao_telemetry_metrum_data         metrum_data;
+       struct ao_telemetry_mini                mini;
        struct ao_telemetry_baro                baro;
  };