altos: Oops. Was only filling out part of the TeleMetrum ADC record
[fw/altos] / src / cc1111 / ao_adc.c
index f7b52281ae799855008bdcb1d296779e23e5024e..1689ebef3b1b831b3b653bf5349c234e2cf1104d 100644 (file)
 
 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
+# define AO_ADC_FIRST_PIN      2
+#endif
+
+#ifndef AO_ADC_FIRST_PIN
+# define AO_ADC_FIRST_PIN      0
+#endif
 
 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
@@ -52,7 +59,7 @@ ao_adc_isr(void) __interrupt 1
        uint8_t __xdata *a;
 
        sequence = (ADCCON2 & ADCCON2_SCH_MASK) >> ADCCON2_SCH_SHIFT;
-#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
+#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) {
@@ -78,6 +85,7 @@ ao_adc_isr(void) __interrupt 1
                else
 #endif
                        ADCCON3 = ADCCON3_EREF_VDD | ADCCON3_EDIV_512 | sequence;
+               return;
        }
 #endif
 
@@ -137,28 +145,41 @@ ao_adc_isr(void) __interrupt 1
        if (sequence) {
                /* Start next conversion */
                ADCCON3 = sequence;
+               return;
        }
 #endif /* telemini || telenano */
 
-#ifdef TELEFIRE_V_0_1
-       a = (uint8_t __xdata *) (&ao_data_ring[ao_data_head].adc.sense[0] + sequence);
+#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)
+       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_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));
-       }
+       /* 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