altos-avr: Add SPI-slave companion support
[fw/altos] / src-avr / ao_log_telescience.c
index ef5a1c97d3e03c386cea94968918e5f126c64028..6022ad21ab66077f453483885c746bb92c98b195 100644 (file)
  */
 
 #include "ao.h"
+#include "ao_product.h"
 
 static struct ao_task ao_log_task;
+static struct ao_task ao_spi_task;
 
 uint8_t        ao_log_running;
 uint8_t                ao_log_mutex;
@@ -231,6 +233,43 @@ ao_log_delete(void)
                printf ("Erased\n");
 }
 
+void
+ao_spi_telescience(void)
+{
+       static union {
+               struct ao_companion_command     command;
+               struct ao_companion_setup       setup;
+               struct ao_adc                   data;
+       } u;
+
+       for (;;) {
+               ao_spi_slave_read((uint8_t *) &u.command, sizeof (struct ao_companion_command));
+               switch (u.command.command) {
+               case AO_COMPANION_SETUP:
+                       u.setup.board_id = AO_idProduct_NUMBER;
+                       u.setup.board_id_inverse = ~AO_idProduct_NUMBER;
+                       u.setup.update_period = 10;
+                       u.setup.channels = NUM_ADC;
+                       ao_spi_slave_write((uint8_t *) &u.setup,
+                                          sizeof (struct ao_companion_setup));
+                       break;
+               case AO_COMPANION_FETCH:
+                       ao_adc_get(&u.data);
+                       ao_spi_slave_write((uint8_t *) &u.data.adc,
+                                          NUM_ADC * sizeof (uint16_t));
+                       if (u.command.flight_state >= ao_flight_boost &&
+                           u.command.flight_state < ao_flight_landed) {
+                               if (!ao_log_running)
+                                       ao_log_start();
+                       } else {
+                               if (ao_log_running)
+                                       ao_log_stop();
+                       }
+                       break;
+               }
+       }
+}
+
 const struct ao_cmds ao_log_cmds[] = {
        { ao_log_set,   "L <0 off, 1 on>\0Set logging mode" },
        { ao_log_list,  "l\0List stored flight logs" },
@@ -238,25 +277,13 @@ const struct ao_cmds ao_log_cmds[] = {
        { 0,    NULL },
 };
 
-ISR(PCINT0_vect)
-{
-       ao_log_check_pin();
-}
-
 void
 ao_log_init(void)
 {
        ao_log_running = 0;
 
-       DDRB &= ~(1 << DDB0);
-
-       PORTB |= (1 << PORTB0);         /* Pull input up; require input to log */
-
-       PCMSK0 |= (1 << PCINT0);        /* Enable PCINT0 pin change */
-
-       PCICR |= (1 << PCIE0);          /* Enable pin change interrupt */
-
        ao_cmd_register(&ao_log_cmds[0]);
 
        ao_add_task(&ao_log_task, ao_log_telescience, "log");
+       ao_add_task(&ao_spi_task, ao_spi_telescience, "spi");
 }