altos: Oops. Was only filling out part of the TeleMetrum ADC record
[fw/altos] / src / cc1111 / ao_adc.c
index 1688eceb8f6c84e43fad6fa71e4e5784ac2c9def..1689ebef3b1b831b3b653bf5349c234e2cf1104d 100644 (file)
  */
 
 #include "ao.h"
-#include "ao_pins.h"
 
-volatile __xdata struct ao_adc ao_adc_ring[AO_ADC_RING];
+volatile __xdata struct ao_data        ao_data_ring[AO_DATA_RING];
+volatile __data uint8_t                ao_data_head;
+#if (AO_DATA_ALL & ~(AO_DATA_ADC))
+volatile __data uint8_t                ao_data_present;
+#endif
+
+#ifdef TELENANO_V_0_1
+# define AO_ADC_FIRST_PIN      1
+#endif
+
 #if HAS_ACCEL_REF
-volatile __xdata uint16_t      ao_accel_ref[AO_ADC_RING];
+# define AO_ADC_FIRST_PIN      2
+#endif
+
+#ifndef AO_ADC_FIRST_PIN
+# define AO_ADC_FIRST_PIN      0
 #endif
-volatile __data uint8_t                ao_adc_head;
 
 void
 ao_adc_poll(void)
 {
-#if HAS_ACCEL_REF
-       ADCCON3 = ADCCON3_EREF_VDD | ADCCON3_EDIV_512 | 2;
-#else
-# ifdef TELENANO_V_0_1
-       ADCCON3 = ADCCON3_EREF_VDD | ADCCON3_EDIV_512 | 1;
-# else
-       ADCCON3 = ADCCON3_EREF_VDD | ADCCON3_EDIV_512 | 0;
-# endif
-#endif
+       ADCCON3 = ADCCON3_EREF_VDD | ADCCON3_EDIV_512 | AO_ADC_FIRST_PIN;
 }
 
 void
-ao_adc_get(__xdata struct ao_adc *packet)
+ao_data_get(__xdata struct ao_data *packet)
 {
 #if HAS_FLIGHT
-       uint8_t i = ao_adc_ring_prev(ao_sample_adc);
+       uint8_t i = ao_data_ring_prev(ao_sample_data);
 #else
-       uint8_t i = ao_adc_ring_prev(ao_adc_head);
+       uint8_t i = ao_data_ring_prev(ao_data_head);
 #endif
-       ao_xmemcpy(packet, &ao_adc_ring[i], sizeof (struct ao_adc));
+       ao_xmemcpy(packet, (void __xdata *) &ao_data_ring[i], sizeof (struct ao_data));
 }
 
 void
@@ -56,18 +59,18 @@ ao_adc_isr(void) __interrupt 1
        uint8_t __xdata *a;
 
        sequence = (ADCCON2 & ADCCON2_SCH_MASK) >> ADCCON2_SCH_SHIFT;
-#if IGNITE_ON_P2
+#if TELEMETRUM_V_0_1 || TELEMETRUM_V_0_2 || TELEMETRUM_V_1_0 || TELEMETRUM_V_1_1 || TELEMETRUM_V_1_2 || TELELAUNCH_V_0_1 || TELEBALLOON_V_1_1
        /* TeleMetrum readings */
 #if HAS_ACCEL_REF
        if (sequence == 2) {
-               a = (uint8_t __xdata *) (&ao_accel_ref[ao_adc_head]);
+               a = (uint8_t __xdata *) (&ao_data_ring[ao_data_head].adc.accel_ref);
                sequence = 0;
        } else
 #endif
        {
                if (sequence == ADCCON3_ECH_TEMP)
                        sequence = 2;
-               a = (uint8_t __xdata *) (&ao_adc_ring[ao_adc_head].accel + sequence);
+               a = (uint8_t __xdata *) (&ao_data_ring[ao_data_head].adc.accel + sequence);
                sequence++;
        }
 #define GOT_ADC
@@ -82,13 +85,14 @@ ao_adc_isr(void) __interrupt 1
                else
 #endif
                        ADCCON3 = ADCCON3_EREF_VDD | ADCCON3_EDIV_512 | sequence;
+               return;
        }
 #endif
 
-#if IGNITE_ON_P0
+#if TELEMINI_V_1_0 || TELENANO_V_0_1
        /* TeleMini readings */
-       a = (uint8_t __xdata *) (&ao_adc_ring[ao_adc_head].pres);
-#ifdef TELEMINI_V_1_0
+       a = (uint8_t __xdata *) (&ao_data_ring[ao_data_head].adc.pres);
+#if TELEMINI_V_1_0
        switch (sequence) {
        case 0:
                /* pressure */
@@ -141,28 +145,55 @@ ao_adc_isr(void) __interrupt 1
        if (sequence) {
                /* Start next conversion */
                ADCCON3 = sequence;
+               return;
+       }
+#endif /* telemini || telenano */
+
+#if defined(TELEFIRE_V_0_1) || defined(TELEFIRE_V_0_2)
+       a = (uint8_t __xdata *) (&ao_data_ring[ao_data_head].adc.sense[0] + sequence - AO_ADC_FIRST_PIN);
+       a[0] = ADCL;
+       a[1] = ADCH;
+       if (sequence < 5) {
+               ADCCON3 = ADCCON3_EREF_VDD | ADCCON3_EDIV_512 | (sequence + 1);
+               return;
        }
+#define GOT_ADC
+#endif /* TELEFIRE_V_0_1 */
+
+#ifdef TELEBT_V_1_0
+       a = (uint8_t __xdata *) (&ao_data_ring[ao_data_head].adc.batt);
+       a[0] = ADCL;
+       a[1] = ADCH;
+#define GOT_ADC
+#endif 
+
+#ifdef FETCH_ADC
+       FETCH_ADC();
+#define GOT_ADC
 #endif
+
 #ifndef GOT_ADC
 #error No known ADC configuration set
 #endif
 
-       else {
-               /* record this conversion series */
-               ao_adc_ring[ao_adc_head].tick = ao_time();
-               ao_adc_head = ao_adc_ring_next(ao_adc_head);
-               ao_wakeup(DATA_TO_XDATA(&ao_adc_head));
-       }
+       /* record this conversion series */
+       ao_data_ring[ao_data_head].tick = ao_time();
+       ao_data_head = ao_data_ring_next(ao_data_head);
+       ao_wakeup(DATA_TO_XDATA(&ao_data_head));
 }
 
 static void
 ao_adc_dump(void) __reentrant
 {
-       static __xdata struct ao_adc    packet;
-       ao_adc_get(&packet);
+       static __xdata struct ao_data   packet;
+       ao_data_get(&packet);
+#ifndef AO_ADC_DUMP
        printf("tick: %5u accel: %5d pres: %5d temp: %5d batt: %5d drogue: %5d main: %5d\n",
-              packet.tick, packet.accel, packet.pres, packet.temp,
-              packet.v_batt, packet.sense_d, packet.sense_m);
+              packet.tick, packet.adc.accel, packet.adc.pres, packet.adc.temp,
+              packet.adc.v_batt, packet.adc.sense_d, packet.adc.sense_m);
+#else
+       AO_ADC_DUMP(&packet);
+#endif
 }
 
 __code struct ao_cmds ao_adc_cmds[] = {
@@ -173,6 +204,11 @@ __code struct ao_cmds ao_adc_cmds[] = {
 void
 ao_adc_init(void)
 {
+#ifdef AO_ADC_PINS
+       ADCCFG = AO_ADC_PINS;
+
+#else
+
 #if IGNITE_ON_P2
        /* TeleMetrum configuration */
        ADCCFG = ((1 << 0) |    /* acceleration */
@@ -193,6 +229,8 @@ ao_adc_init(void)
                  (1 << 3));    /* battery voltage */
 #endif
 
+#endif /* else AO_ADC_PINS */
+
        /* enable interrupts */
        ADCIF = 0;
        IEN0 |= IEN0_ADCIE;