altos/telefire: Add siren/strobe support
[fw/altos] / src / cc1111 / ao_adc.c
index 6aa6e0185675ae2bf03ad2e82182bb871b1cda0e..f80004104130c324c19cd4e68884edc4b5a208a4 100644 (file)
  */
 
 #include "ao.h"
-#include "ao_pins.h"
 
-volatile __xdata struct ao_adc ao_adc_ring[AO_ADC_RING];
-#if HAS_ACCEL_REF
-volatile __xdata uint16_t      ao_accel_ref[AO_ADC_RING];
+volatile __xdata struct ao_data        ao_data_ring[AO_DATA_RING];
+volatile __data uint8_t                ao_data_head;
+
+#ifndef AO_ADC_FIRST_PIN
+#define AO_ADC_FIRST_PIN       0
 #endif
-volatile __data uint8_t                ao_adc_head;
 
 void
 ao_adc_poll(void)
@@ -33,20 +33,20 @@ ao_adc_poll(void)
 # ifdef TELENANO_V_0_1
        ADCCON3 = ADCCON3_EREF_VDD | ADCCON3_EDIV_512 | 1;
 # else
-       ADCCON3 = ADCCON3_EREF_VDD | ADCCON3_EDIV_512 | 0;
+       ADCCON3 = ADCCON3_EREF_VDD | ADCCON3_EDIV_512 | AO_ADC_FIRST_PIN;
 # endif
 #endif
 }
 
 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
-       memcpy(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 +56,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
        /* 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
@@ -85,10 +85,10 @@ ao_adc_isr(void) __interrupt 1
        }
 #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 */
@@ -142,27 +142,41 @@ ao_adc_isr(void) __interrupt 1
                /* Start next conversion */
                ADCCON3 = sequence;
        }
-#endif
+#endif /* telemini || telenano */
+
+#ifdef TELEFIRE_V_0_1
+       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);
+#define GOT_ADC
+#endif /* TELEFIRE_V_0_1 */
+
 #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));
+               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 +187,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 +212,8 @@ ao_adc_init(void)
                  (1 << 3));    /* battery voltage */
 #endif
 
+#endif /* else AO_ADC_PINS */
+
        /* enable interrupts */
        ADCIF = 0;
        IEN0 |= IEN0_ADCIE;