altos: Massive product config cleanup
authorKeith Packard <keithp@keithp.com>
Thu, 12 Apr 2012 21:51:07 +0000 (14:51 -0700)
committerKeith Packard <keithp@keithp.com>
Sat, 14 Apr 2012 21:04:29 +0000 (14:04 -0700)
Support multiple serial ports more cleanly

Split out parts of ao.h into separate feature header files

Signed-off-by: Keith Packard <keithp@keithp.com>
49 files changed:
src/avr/ao_arch.h
src/avr/ao_pins.h
src/avr/ao_serial_avr.c
src/avr/ao_usb.h [deleted file]
src/avr/ao_usb_avr.c
src/cc1111/ao_arch.h
src/cc1111/ao_pins.h
src/cc1111/ao_serial.c
src/cc1111/ao_serial0.c [deleted file]
src/cc1111/ao_usb.c
src/cc1111/ao_usb.h [deleted file]
src/core/ao.h
src/core/ao_adc.h [new file with mode: 0644]
src/core/ao_beep.h [new file with mode: 0644]
src/core/ao_dbg.h [new file with mode: 0644]
src/core/ao_flight.h [new file with mode: 0644]
src/core/ao_led.h [new file with mode: 0644]
src/core/ao_log.h [new file with mode: 0644]
src/core/ao_log_telem.c
src/core/ao_product.c
src/core/ao_report.c
src/core/ao_sample.h [new file with mode: 0644]
src/core/ao_serial.h [new file with mode: 0644]
src/core/ao_stdio.c
src/core/ao_storage.c
src/core/ao_storage.h [new file with mode: 0644]
src/core/ao_usb.h [new file with mode: 0644]
src/drivers/ao_btm.c
src/drivers/ao_gps_sirf.c
src/drivers/ao_gps_skytraq.c
src/drivers/ao_science_slave.c
src/megametrum-v0.1/ao_pins.h
src/product/ao_telebt.c
src/product/ao_terraui.c
src/stm/ao_arch.h
src/stm/ao_serial_stm.c
src/stm/ao_usb.h [deleted file]
src/stm/ao_usb_stm.c
src/teleballoon-v1.1/ao_pins.h
src/telepyro-v0.1/Makefile
src/telescience-v0.1/Makefile
src/teleshield-v0.1/Makefile
src/teleshield-v0.1/ao_ardu_serial.c
src/teleshield-v0.1/ao_pins.h
src/teleshield-v0.1/ao_teleshield.c
src/teleterra-v0.1/ao_pins.h
src/teleterra-v0.2/ao_pins.h
src/test/ao_gps_test.c
src/test/ao_gps_test_skytraq.c

index b816279e29f540f14a49f63f41083365ee051f45..c775dab649a7d38068fa88a46f9815f46024a603 100644 (file)
@@ -146,12 +146,5 @@ extern uint8_t     ao_cpu_sleep_disable;
 
 #define AO_TELESCIENCE_NUM_ADC 12
 
 
 #define AO_TELESCIENCE_NUM_ADC 12
 
-struct ao_adc {
-       uint16_t        tick;           /* tick when the sample was read */
-       uint16_t        adc[AO_TELESCIENCE_NUM_ADC];    /* samples */
-};
-
-#define AO_ADC_RING    16
-
 #endif /* _AO_ARCH_H_ */
 
 #endif /* _AO_ARCH_H_ */
 
index 6a63468f84741c43625326553449f0827ef47275..f2b40fb4f19c11e74ac3b6b95b7aef518da34bf4 100644 (file)
@@ -21,7 +21,7 @@
 #ifdef AVR_DEMO
        #define AO_LED_RED              (1<<7)
        #define LEDS_AVAILABLE          (AO_LED_RED)
 #ifdef AVR_DEMO
        #define AO_LED_RED              (1<<7)
        #define LEDS_AVAILABLE          (AO_LED_RED)
-       #define USE_SERIAL_STDIN        1
+       #define USE_SERIAL_1_STDIN      1
        #define HAS_USB                 1
        #define PACKET_HAS_SLAVE        0
        #define HAS_SERIAL_1            1
        #define HAS_USB                 1
        #define PACKET_HAS_SLAVE        0
        #define HAS_SERIAL_1            1
        #define HAS_USB                 1
        #define HAS_LOG                 1
        #define TEENSY                  0
        #define HAS_USB                 1
        #define HAS_LOG                 1
        #define TEENSY                  0
-       #define USE_SERIAL_STDIN        0
        #define HAS_SERIAL_1            0
        #define HAS_ADC                 1
        #define PACKET_HAS_SLAVE        0
        #define HAS_BEEP                0
        #define HAS_SERIAL_1            0
        #define HAS_ADC                 1
        #define PACKET_HAS_SLAVE        0
        #define HAS_BEEP                0
+       #define HAS_EEPROM              1
        #define HAS_STORAGE_DEBUG       0
 
        #define AVR_VCC_5V              0
        #define HAS_STORAGE_DEBUG       0
 
        #define AVR_VCC_5V              0
@@ -66,7 +66,7 @@
        #define HAS_USB                 1
        #define HAS_LOG                 0
        #define TEENSY                  0
        #define HAS_USB                 1
        #define HAS_LOG                 0
        #define TEENSY                  0
-       #define USE_SERIAL_STDIN        1
+       #define USE_SERIAL_1_STDIN      1
        #define HAS_SERIAL_1            1
        #define HAS_USB                 1
        #define HAS_ADC                 1
        #define HAS_SERIAL_1            1
        #define HAS_USB                 1
        #define HAS_ADC                 1
 #define AO_M25_SPI_CS_PORT     SPI_CS_PORT
 #define AO_M25_SPI_CS_MASK     M25_CS_MASK
 
 #define AO_M25_SPI_CS_PORT     SPI_CS_PORT
 #define AO_M25_SPI_CS_MASK     M25_CS_MASK
 
+#define AO_TELESCIENCE_NUM_ADC 12
+
+struct ao_adc {
+       uint16_t        tick;           /* tick when the sample was read */
+       uint16_t        adc[AO_TELESCIENCE_NUM_ADC];    /* samples */
+};
+
+#define AO_ADC_RING    16
+
 #endif /* _AO_PINS_H_ */
 #endif /* _AO_PINS_H_ */
index 6885c339092be28f1cbbf51e3d60b90e3a9f74b4..dcee246ce3eb66191e393708aeee88858dc7ef34 100644 (file)
@@ -17,8 +17,8 @@
 
 #include "ao.h"
 
 
 #include "ao.h"
 
-__xdata struct ao_fifo ao_usart1_rx_fifo;
-__xdata struct ao_fifo ao_usart1_tx_fifo;
+__xdata struct ao_fifo ao_serial1_rx_fifo;
+__xdata struct ao_fifo ao_serial1_tx_fifo;
 
 void
 ao_debug_out(char c)
 
 void
 ao_debug_out(char c)
@@ -31,10 +31,10 @@ ao_debug_out(char c)
 
 ISR(USART1_RX_vect)
 {
 
 ISR(USART1_RX_vect)
 {
-       if (!ao_fifo_full(ao_usart1_rx_fifo))
-               ao_fifo_insert(ao_usart1_rx_fifo, UDR1);
-       ao_wakeup(&ao_usart1_rx_fifo);
-#if USE_SERIAL_STDIN
+       if (!ao_fifo_full(ao_serial1_rx_fifo))
+               ao_fifo_insert(ao_serial1_rx_fifo, UDR1);
+       ao_wakeup(&ao_serial1_rx_fifo);
+#if USE_SERIAL_1_STDIN
        ao_wakeup(&ao_stdin_ready);
 #endif
 }
        ao_wakeup(&ao_stdin_ready);
 #endif
 }
@@ -42,68 +42,68 @@ ISR(USART1_RX_vect)
 static __xdata uint8_t ao_serial_tx1_started;
 
 static void
 static __xdata uint8_t ao_serial_tx1_started;
 
 static void
-ao_serial_tx1_start(void)
+ao_serial1_tx_start(void)
 {
 {
-       if (!ao_fifo_empty(ao_usart1_tx_fifo) &&
+       if (!ao_fifo_empty(ao_serial1_tx_fifo) &&
            !ao_serial_tx1_started)
        {
                ao_serial_tx1_started = 1;
            !ao_serial_tx1_started)
        {
                ao_serial_tx1_started = 1;
-               ao_fifo_remove(ao_usart1_tx_fifo, UDR1);
+               ao_fifo_remove(ao_serial1_tx_fifo, UDR1);
        }
 }
 
 ISR(USART1_UDRE_vect)
 {
        }
 }
 
 ISR(USART1_UDRE_vect)
 {
-       ao_serial_tx1_started = 0;
-       ao_serial_tx1_start();
-       ao_wakeup(&ao_usart1_tx_fifo);
+       ao_serial1_tx_started = 0;
+       ao_serial1_tx_start();
+       ao_wakeup(&ao_serial1_tx_fifo);
 }
 
 char
 }
 
 char
-ao_serial_getchar(void) __critical
+ao_serial1_getchar(void) __critical
 {
        char    c;
        cli();
 {
        char    c;
        cli();
-       while (ao_fifo_empty(ao_usart1_rx_fifo))
-               ao_sleep(&ao_usart1_rx_fifo);
-       ao_fifo_remove(ao_usart1_rx_fifo, c);
+       while (ao_fifo_empty(ao_serial1_rx_fifo))
+               ao_sleep(&ao_serial1_rx_fifo);
+       ao_fifo_remove(ao_serial1_rx_fifo, c);
        sei();
        return c;
 }
 
        sei();
        return c;
 }
 
-#if USE_SERIAL_STDIN
+#if USE_SERIAL_1_STDIN
 char
 char
-ao_serial_pollchar(void) __critical
+ao_serial1_pollchar(void) __critical
 {
        char    c;
        cli();
 {
        char    c;
        cli();
-       if (ao_fifo_empty(ao_usart1_rx_fifo)) {
+       if (ao_fifo_empty(ao_serial1_rx_fifo)) {
                sei();
                return AO_READ_AGAIN;
        }
                sei();
                return AO_READ_AGAIN;
        }
-       ao_fifo_remove(ao_usart1_rx_fifo,c);
+       ao_fifo_remove(ao_serial1_rx_fifo,c);
        sei();
        return c;
 }
 #endif
 
 void
        sei();
        return c;
 }
 #endif
 
 void
-ao_serial_putchar(char c) __critical
+ao_serial1_putchar(char c) __critical
 {
        cli();
 {
        cli();
-       while (ao_fifo_full(ao_usart1_tx_fifo))
-               ao_sleep(&ao_usart1_tx_fifo);
-       ao_fifo_insert(ao_usart1_tx_fifo, c);
+       while (ao_fifo_full(ao_serial1_tx_fifo))
+               ao_sleep(&ao_serial1_tx_fifo);
+       ao_fifo_insert(ao_serial1_tx_fifo, c);
        ao_serial_tx1_start();
        sei();
 }
 
 void
        ao_serial_tx1_start();
        sei();
 }
 
 void
-ao_serial_drain(void) __critical
+ao_serial1_drain(void) __critical
 {
        cli();
 {
        cli();
-       while (!ao_fifo_empty(ao_usart1_tx_fifo))
-               ao_sleep(&ao_usart1_tx_fifo);
+       while (!ao_fifo_empty(ao_serial1_tx_fifo))
+               ao_sleep(&ao_serial1_tx_fifo);
        sei();
 }
 
        sei();
 }
 
@@ -125,7 +125,7 @@ static const struct {
 };
 
 void
 };
 
 void
-ao_serial_set_speed(uint8_t speed)
+ao_serial1_set_speed(uint8_t speed)
 {
        ao_serial_drain();
        if (speed > AO_SERIAL_SPEED_57600)
 {
        ao_serial_drain();
        if (speed > AO_SERIAL_SPEED_57600)
@@ -154,9 +154,9 @@ ao_serial_init(void)
                  (1 << TXEN1) |        /* Enable transmitter */
                  (1 << RXCIE1) |       /* Enable receive interrupts */
                  (1 << UDRIE1));       /* Enable transmit empty interrupts */
                  (1 << TXEN1) |        /* Enable transmitter */
                  (1 << RXCIE1) |       /* Enable receive interrupts */
                  (1 << UDRIE1));       /* Enable transmit empty interrupts */
-#if USE_SERIAL_STDIN
-       ao_add_stdio(ao_serial_pollchar,
-                    ao_serial_putchar,
+#if USE_SERIAL_1_STDIN
+       ao_add_stdio(ao_serial1_pollchar,
+                    ao_serial1_putchar,
                     NULL);
 #endif
 }
                     NULL);
 #endif
 }
diff --git a/src/avr/ao_usb.h b/src/avr/ao_usb.h
deleted file mode 100644 (file)
index 6633daf..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright Â© 2009 Keith Packard <keithp@keithp.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- */
-
-#ifndef _AO_USB_H_
-#define _AO_USB_H_
-
-#define AO_USB_SETUP_DIR_MASK  (0x01 << 7)
-#define AO_USB_SETUP_TYPE_MASK (0x03 << 5)
-#define AO_USB_SETUP_RECIP_MASK        (0x1f)
-
-#define AO_USB_DIR_OUT                 0
-#define AO_USB_DIR_IN                  (1 << 7)
-
-#define AO_USB_TYPE_STANDARD           0
-#define AO_USB_TYPE_CLASS              (1 << 5)
-#define AO_USB_TYPE_VENDOR             (2 << 5)
-#define AO_USB_TYPE_RESERVED           (3 << 5)
-
-#define AO_USB_RECIP_DEVICE            0
-#define AO_USB_RECIP_INTERFACE         1
-#define AO_USB_RECIP_ENDPOINT          2
-#define AO_USB_RECIP_OTHER             3
-
-/* standard requests */
-#define        AO_USB_REQ_GET_STATUS           0x00
-#define AO_USB_REQ_CLEAR_FEATURE       0x01
-#define AO_USB_REQ_SET_FEATURE         0x03
-#define AO_USB_REQ_SET_ADDRESS         0x05
-#define AO_USB_REQ_GET_DESCRIPTOR      0x06
-#define AO_USB_REQ_SET_DESCRIPTOR      0x07
-#define AO_USB_REQ_GET_CONFIGURATION   0x08
-#define AO_USB_REQ_SET_CONFIGURATION   0x09
-#define AO_USB_REQ_GET_INTERFACE       0x0A
-#define AO_USB_REQ_SET_INTERFACE       0x0B
-#define AO_USB_REQ_SYNCH_FRAME         0x0C
-
-#define AO_USB_DESC_DEVICE             1
-#define AO_USB_DESC_CONFIGURATION      2
-#define AO_USB_DESC_STRING             3
-#define AO_USB_DESC_INTERFACE          4
-#define AO_USB_DESC_ENDPOINT           5
-#define AO_USB_DESC_DEVICE_QUALIFIER   6
-#define AO_USB_DESC_OTHER_SPEED                7
-#define AO_USB_DESC_INTERFACE_POWER    8
-
-#define AO_USB_GET_DESC_TYPE(x)                (((x)>>8)&0xFF)
-#define AO_USB_GET_DESC_INDEX(x)       ((x)&0xFF)
-
-#define AO_USB_CONTROL_EP      0
-#define AO_USB_INT_EP          1
-#define AO_USB_OUT_EP          4
-#define AO_USB_IN_EP           5
-#define AO_USB_CONTROL_SIZE    32
-/*
- * Double buffer IN and OUT EPs, so each
- * gets half of the available space
- *
- * Ah, but USB bulk packets can only come in 8, 16, 32 and 64
- * byte sizes, so we'll use 64 for everything
- */
-#define AO_USB_IN_SIZE         64
-#define AO_USB_OUT_SIZE                64
-
-#define AO_USB_EP0_IDLE                0
-#define AO_USB_EP0_DATA_IN     1
-#define AO_USB_EP0_DATA_OUT    2
-
-#define LE_WORD(x)    ((x)&0xFF),((uint8_t) (((uint16_t) (x))>>8))
-
-/* CDC definitions */
-#define CS_INTERFACE      0x24
-#define CS_ENDPOINT       0x25
-
-#define SET_LINE_CODING         0x20
-#define GET_LINE_CODING         0x21
-#define SET_CONTROL_LINE_STATE  0x22
-
-/* Data structure for GET_LINE_CODING / SET_LINE_CODING class requests */
-struct ao_usb_line_coding {
-       uint32_t        rate;
-       uint8_t         char_format;
-       uint8_t         parity;
-       uint8_t         data_bits;
-} ;
-
-#endif /* _AO_USB_H_ */
index fc8899d815c91d8771e12b3ec95a5673fdd5ce09..23a27c73beda83e983414b334a4014196c1d82c6 100644 (file)
@@ -330,17 +330,17 @@ ao_usb_ep0_setup(void)
        case AO_USB_TYPE_CLASS:
                debug ("Class setup packet\n");
                switch (ao_usb_setup.request) {
        case AO_USB_TYPE_CLASS:
                debug ("Class setup packet\n");
                switch (ao_usb_setup.request) {
-               case SET_LINE_CODING:
+               case AO_USB_SET_LINE_CODING:
                        debug ("set line coding\n");
                        ao_usb_ep0_out_len = 7;
                        ao_usb_ep0_out_data = (__xdata uint8_t *) &ao_usb_line_coding;
                        break;
                        debug ("set line coding\n");
                        ao_usb_ep0_out_len = 7;
                        ao_usb_ep0_out_data = (__xdata uint8_t *) &ao_usb_line_coding;
                        break;
-               case GET_LINE_CODING:
+               case AO_USB_GET_LINE_CODING:
                        debug ("get line coding\n");
                        ao_usb_ep0_in_len = 7;
                        ao_usb_ep0_in_data = (uint8_t *) &ao_usb_line_coding;
                        break;
                        debug ("get line coding\n");
                        ao_usb_ep0_in_len = 7;
                        ao_usb_ep0_in_data = (uint8_t *) &ao_usb_line_coding;
                        break;
-               case SET_CONTROL_LINE_STATE:
+               case AO_USB_SET_CONTROL_LINE_STATE:
                        break;
                }
                break;
                        break;
                }
                break;
index 847ac1a65ec1e438df2a884e1c271c1a7cf08346..9d0643b4ba4f0f7d0135b7b81b4a45859d619a60 100644 (file)
@@ -294,4 +294,34 @@ ao_dma_abort(uint8_t id);
 void
 ao_dma_isr(void) ao_arch_interrupt(8);
 
 void
 ao_dma_isr(void) ao_arch_interrupt(8);
 
+/* ao_adc.c */
+
+#if HAS_ADC
+/* The A/D interrupt handler */
+void
+ao_adc_isr(void) ao_arch_interrupt(1);
+#endif
+
+#if HAS_USB
+/* USB interrupt handler */
+void
+ao_usb_isr(void) ao_arch_interrupt(6);
+#endif
+
+#if HAS_SERIAL_0
+void
+ao_serial0_rx_isr(void) ao_arch_interrupt(2);
+
+void
+ao_serial0_tx_isr(void) ao_arch_interrupt(7);
+#endif
+
+#if HAS_SERIAL_1
+void
+ao_serial1_rx_isr(void) ao_arch_interrupt(3);
+
+void
+ao_serial1_tx_isr(void) ao_arch_interrupt(14);
+#endif
+
 #endif /* _AO_ARCH_H_ */
 #endif /* _AO_ARCH_H_ */
index 5c0cb7dfe73e1f5c283c1da10c5a5d429c307fc1..4f6edd373a9a7d91b64a5cd269e26e3d987a0770 100644 (file)
@@ -25,7 +25,6 @@
        #define HAS_GPS                 1
        #define HAS_SERIAL_1            1
        #define HAS_ADC                 1
        #define HAS_GPS                 1
        #define HAS_SERIAL_1            1
        #define HAS_ADC                 1
-       #define USE_SERIAL_STDIN        0
        #define HAS_EEPROM              1
        #define HAS_LOG                 1
        #define USE_INTERNAL_FLASH      0
        #define HAS_EEPROM              1
        #define HAS_LOG                 1
        #define USE_INTERNAL_FLASH      0
@@ -58,7 +57,6 @@
        #define HAS_BEEP                1
        #define HAS_GPS                 1
        #define HAS_SERIAL_1            1
        #define HAS_BEEP                1
        #define HAS_GPS                 1
        #define HAS_SERIAL_1            1
-       #define USE_SERIAL_STDIN        0
        #define HAS_ADC                 1
        #define HAS_EEPROM              1
        #define HAS_LOG                 1
        #define HAS_ADC                 1
        #define HAS_EEPROM              1
        #define HAS_LOG                 1
@@ -95,7 +93,6 @@
        #define HAS_BEEP                1
        #define HAS_GPS                 1
        #define HAS_SERIAL_1            1
        #define HAS_BEEP                1
        #define HAS_GPS                 1
        #define HAS_SERIAL_1            1
-       #define USE_SERIAL_STDIN        0
        #define HAS_ADC                 1
        #define HAS_EEPROM              1
        #define HAS_LOG                 1
        #define HAS_ADC                 1
        #define HAS_EEPROM              1
        #define HAS_LOG                 1
        #define HAS_USB                 1
        #define HAS_BEEP                0
        #define HAS_SERIAL_1            0
        #define HAS_USB                 1
        #define HAS_BEEP                0
        #define HAS_SERIAL_1            0
-       #define USE_SERIAL_STDIN        0
        #define HAS_ADC                 0
        #define HAS_DBG                 1
        #define HAS_EEPROM              0
        #define HAS_ADC                 0
        #define HAS_DBG                 1
        #define HAS_EEPROM              0
        #define HAS_BEEP                0
        #define HAS_GPS                 0
        #define HAS_SERIAL_1            0
        #define HAS_BEEP                0
        #define HAS_GPS                 0
        #define HAS_SERIAL_1            0
-       #define USE_SERIAL_STDIN        0
        #define HAS_ADC                 1
        #define HAS_EEPROM              1
        #define HAS_LOG                 1
        #define HAS_ADC                 1
        #define HAS_EEPROM              1
        #define HAS_LOG                 1
        #define HAS_BEEP                0
        #define HAS_GPS                 0
        #define HAS_SERIAL_1            0
        #define HAS_BEEP                0
        #define HAS_GPS                 0
        #define HAS_SERIAL_1            0
-       #define USE_SERIAL_STDIN        0
        #define HAS_ADC                 1
        #define HAS_EEPROM              1
        #define HAS_LOG                 1
        #define HAS_ADC                 1
        #define HAS_EEPROM              1
        #define HAS_LOG                 1
        #define HAS_BEEP                1
        #define HAS_GPS                 1
        #define HAS_SERIAL_1            1
        #define HAS_BEEP                1
        #define HAS_GPS                 1
        #define HAS_SERIAL_1            1
-       #define USE_SERIAL_STDIN        0
        #define HAS_ADC                 1
        #define HAS_DBG                 0
        #define HAS_EEPROM              1
        #define HAS_ADC                 1
        #define HAS_DBG                 0
        #define HAS_EEPROM              1
        #define HAS_USB                 1
        #define HAS_BEEP                0
        #define HAS_SERIAL_1            0
        #define HAS_USB                 1
        #define HAS_BEEP                0
        #define HAS_SERIAL_1            0
-       #define USE_SERIAL_STDIN        0
        #define HAS_ADC                 0
        #define HAS_DBG                 0
        #define HAS_EEPROM              0
        #define HAS_ADC                 0
        #define HAS_DBG                 0
        #define HAS_EEPROM              0
        #define HAS_USB                 1
        #define HAS_BEEP                0
        #define HAS_SERIAL_1            0
        #define HAS_USB                 1
        #define HAS_BEEP                0
        #define HAS_SERIAL_1            0
-       #define USE_SERIAL_STDIN        0
        #define HAS_ADC                 0
        #define HAS_DBG                 1
        #define HAS_EEPROM              0
        #define HAS_ADC                 0
        #define HAS_DBG                 1
        #define HAS_EEPROM              0
        #define HAS_USB                 1
        #define HAS_BEEP                0
        #define HAS_SERIAL_1            1
        #define HAS_USB                 1
        #define HAS_BEEP                0
        #define HAS_SERIAL_1            1
-       #define USE_SERIAL_STDIN        1
+       #define USE_SERIAL_1_STDIN      1
+       #define DELAY_SERIAL_1_STDIN    1
        #define HAS_ADC                 0
        #define HAS_DBG                 1
        #define HAS_EEPROM              0
        #define HAS_ADC                 0
        #define HAS_DBG                 1
        #define HAS_EEPROM              0
        #define HAS_SERIAL_1_ALT_1      1
        #define HAS_SERIAL_1_ALT_2      0
        #define HAS_SERIAL_1_HW_FLOW    1
        #define HAS_SERIAL_1_ALT_1      1
        #define HAS_SERIAL_1_ALT_2      0
        #define HAS_SERIAL_1_HW_FLOW    1
-       #define USE_SERIAL_STDIN        1
+       #define USE_SERIAL_1_STDIN      1
+       #define DELAY_SERIAL_1_STDIN    1
        #define HAS_ADC                 0
        #define HAS_DBG                 1
        #define HAS_EEPROM              1
        #define HAS_ADC                 0
        #define HAS_DBG                 1
        #define HAS_EEPROM              1
        #define HAS_BEEP                1
        #define HAS_GPS                 0
        #define HAS_SERIAL_1            1
        #define HAS_BEEP                1
        #define HAS_GPS                 0
        #define HAS_SERIAL_1            1
-       #define USE_SERIAL_STDIN        0
        #define HAS_ADC                 1
        #define HAS_DBG                 0
        #define HAS_EEPROM              1
        #define HAS_ADC                 1
        #define HAS_DBG                 0
        #define HAS_EEPROM              1
 #error Please define IGNITE_ON_P0
 #endif
 
 #error Please define IGNITE_ON_P0
 #endif
 
-#ifndef HAS_SERIAL_1
-#error Please define HAS_SERIAL_1
-#endif
-
-#ifndef USE_SERIAL_STDIN
-#error Please define USE_SERIAL_STDIN
-#endif
-
 #ifndef HAS_ADC
 #error Please define HAS_ADC
 #endif
 #ifndef HAS_ADC
 #error Please define HAS_ADC
 #endif
index 4d5b9abd5693c048e61c737944965c42d50bb17b..00c85ff3fa268e7b31caab8fa999a4f665c02cd5 100644 (file)
 
 #include "ao.h"
 
 
 #include "ao.h"
 
-volatile __xdata struct ao_fifo        ao_usart1_rx_fifo;
-volatile __xdata struct ao_fifo        ao_usart1_tx_fifo;
+#if HAS_SERIAL_0
+
+volatile __xdata struct ao_fifo        ao_serial0_rx_fifo;
+volatile __xdata struct ao_fifo        ao_serial0_tx_fifo;
+
+void
+ao_serial0_rx_isr(void) __interrupt 2
+{
+       if (!ao_fifo_full(ao_serial0_rx_fifo))
+               ao_fifo_insert(ao_serial0_rx_fifo, U0DBUF);
+       ao_wakeup(&ao_serial0_rx_fifo);
+#if USE_SERIAL_0_STDIN
+       ao_wakeup(&ao_stdin_ready);
+#endif
+}
+
+static __xdata uint8_t ao_serial0_tx_started;
+
+static void
+ao_serial0_tx_start(void)
+{
+       if (!ao_fifo_empty(ao_serial0_tx_fifo) &&
+           !ao_serial0_tx_started)
+       {
+               ao_serial0_tx_started = 1;
+               ao_fifo_remove(ao_serial0_tx_fifo, U0DBUF);
+       }
+}
+
+void
+ao_serial0_tx_isr(void) __interrupt 7
+{
+       UTX0IF = 0;
+       ao_serial0_tx_started = 0;
+       ao_serial0_tx_start();
+       ao_wakeup(&ao_serial0_tx_fifo);
+}
+
+char
+ao_serial0_getchar(void) __critical
+{
+       char    c;
+       while (ao_fifo_empty(ao_serial0_rx_fifo))
+               ao_sleep(&ao_serial0_rx_fifo);
+       ao_fifo_remove(ao_serial0_rx_fifo, c);
+       return c;
+}
+
+#if USE_SERIAL_0_STDIN
+char
+ao_serial0_pollchar(void) __critical
+{
+       char    c;
+       if (ao_fifo_empty(ao_serial0_rx_fifo))
+               return AO_READ_AGAIN;
+       ao_fifo_remove(ao_serial0_rx_fifo,c);
+       return c;
+}
+#endif
+
+void
+ao_serial0_putchar(char c) __critical
+{
+       while (ao_fifo_full(ao_serial0_tx_fifo))
+               ao_sleep(&ao_serial0_tx_fifo);
+       ao_fifo_insert(ao_serial0_tx_fifo, c);
+       ao_serial0_tx_start();
+}
+
+void
+ao_serial0_drain(void) __critical
+{
+       while (!ao_fifo_empty(ao_serial0_tx_fifo))
+               ao_sleep(&ao_serial0_tx_fifo);
+}
+
+void
+ao_serial0_set_speed(uint8_t speed)
+{
+       ao_serial0_drain();
+       if (speed > AO_SERIAL_SPEED_57600)
+               return;
+       U0UCR |= UxUCR_FLUSH;
+       U0BAUD = ao_serial_speeds[speed].baud;
+       U0GCR = ao_serial_speeds[speed].gcr;
+}
+#endif /* HAS_SERIAL_0 */
+
+#if HAS_SERIAL_1
+
+volatile __xdata struct ao_fifo        ao_serial1_rx_fifo;
+volatile __xdata struct ao_fifo        ao_serial1_tx_fifo;
 
 void
 
 void
-ao_serial_rx1_isr(void) __interrupt 3
+ao_serial1_rx_isr(void) __interrupt 3
 {
 {
-       if (!ao_fifo_full(ao_usart1_rx_fifo))
-               ao_fifo_insert(ao_usart1_rx_fifo, U1DBUF);
-       ao_wakeup(&ao_usart1_rx_fifo);
-#if USE_SERIAL_STDIN
+       if (!ao_fifo_full(ao_serial1_rx_fifo))
+               ao_fifo_insert(ao_serial1_rx_fifo, U1DBUF);
+       ao_wakeup(&ao_serial1_rx_fifo);
+#if USE_SERIAL1_STDIN
        ao_wakeup(&ao_stdin_ready);
 #endif
 }
 
        ao_wakeup(&ao_stdin_ready);
 #endif
 }
 
-static __xdata uint8_t ao_serial_tx1_started;
+static __xdata uint8_t ao_serial1_tx_started;
 
 static void
 
 static void
-ao_serial_tx1_start(void)
+ao_serial1_tx_start(void)
 {
 {
-       if (!ao_fifo_empty(ao_usart1_tx_fifo) &&
-           !ao_serial_tx1_started)
+       if (!ao_fifo_empty(ao_serial1_tx_fifo) &&
+           !ao_serial1_tx_started)
        {
        {
-               ao_serial_tx1_started = 1;
-               ao_fifo_remove(ao_usart1_tx_fifo, U1DBUF);
+               ao_serial1_tx_started = 1;
+               ao_fifo_remove(ao_serial1_tx_fifo, U1DBUF);
        }
 }
 
 void
        }
 }
 
 void
-ao_serial_tx1_isr(void) __interrupt 14
+ao_serial1_tx_isr(void) __interrupt 14
 {
        UTX1IF = 0;
 {
        UTX1IF = 0;
-       ao_serial_tx1_started = 0;
-       ao_serial_tx1_start();
-       ao_wakeup(&ao_usart1_tx_fifo);
+       ao_serial1_tx_started = 0;
+       ao_serial1_tx_start();
+       ao_wakeup(&ao_serial1_tx_fifo);
 }
 
 char
 }
 
 char
-ao_serial_getchar(void) __critical
+ao_serial1_getchar(void) __critical
 {
        char    c;
 {
        char    c;
-       while (ao_fifo_empty(ao_usart1_rx_fifo))
-               ao_sleep(&ao_usart1_rx_fifo);
-       ao_fifo_remove(ao_usart1_rx_fifo, c);
+       while (ao_fifo_empty(ao_serial1_rx_fifo))
+               ao_sleep(&ao_serial1_rx_fifo);
+       ao_fifo_remove(ao_serial1_rx_fifo, c);
        return c;
 }
 
        return c;
 }
 
-#if USE_SERIAL_STDIN
+#if USE_SERIAL_1_STDIN
 char
 char
-ao_serial_pollchar(void) __critical
+ao_serial1_pollchar(void) __critical
 {
        char    c;
 {
        char    c;
-       if (ao_fifo_empty(ao_usart1_rx_fifo))
+       if (ao_fifo_empty(ao_serial1_rx_fifo))
                return AO_READ_AGAIN;
                return AO_READ_AGAIN;
-       ao_fifo_remove(ao_usart1_rx_fifo,c);
+       ao_fifo_remove(ao_serial1_rx_fifo,c);
        return c;
 }
 #endif
 
 void
        return c;
 }
 #endif
 
 void
-ao_serial_putchar(char c) __critical
+ao_serial1_putchar(char c) __critical
 {
 {
-       while (ao_fifo_full(ao_usart1_tx_fifo))
-               ao_sleep(&ao_usart1_tx_fifo);
-       ao_fifo_insert(ao_usart1_tx_fifo, c);
-       ao_serial_tx1_start();
+       while (ao_fifo_full(ao_serial1_tx_fifo))
+               ao_sleep(&ao_serial1_tx_fifo);
+       ao_fifo_insert(ao_serial1_tx_fifo, c);
+       ao_serial1_tx_start();
 }
 
 void
 }
 
 void
-ao_serial_drain(void) __critical
+ao_serial1_drain(void) __critical
 {
 {
-       while (!ao_fifo_empty(ao_usart1_tx_fifo))
-               ao_sleep(&ao_usart1_tx_fifo);
+       while (!ao_fifo_empty(ao_serial1_tx_fifo))
+               ao_sleep(&ao_serial1_tx_fifo);
 }
 
 const __code struct ao_serial_speed ao_serial_speeds[] = {
 }
 
 const __code struct ao_serial_speed ao_serial_speeds[] = {
@@ -111,9 +201,9 @@ const __code struct ao_serial_speed ao_serial_speeds[] = {
 };
 
 void
 };
 
 void
-ao_serial_set_speed(uint8_t speed)
+ao_serial1_set_speed(uint8_t speed)
 {
 {
-       ao_serial_drain();
+       ao_serial1_drain();
        if (speed > AO_SERIAL_SPEED_57600)
                return;
        U1UCR |= UxUCR_FLUSH;
        if (speed > AO_SERIAL_SPEED_57600)
                return;
        U1UCR |= UxUCR_FLUSH;
@@ -121,9 +211,67 @@ ao_serial_set_speed(uint8_t speed)
        U1GCR = ao_serial_speeds[speed].gcr;
 }
 
        U1GCR = ao_serial_speeds[speed].gcr;
 }
 
+#endif /* HAS_SERIAL_1 */
+
 void
 ao_serial_init(void)
 {
 void
 ao_serial_init(void)
 {
+#if HAS_SERIAL_0
+#if HAS_SERIAL_0_ALT_1
+       /* Set up the USART pin assignment */
+       PERCFG = (PERCFG & ~PERCFG_U0CFG_ALT_MASK) | PERCFG_U0CFG_ALT_1;
+
+       P2DIR = (P2DIR & ~P2DIR_PRIP0_MASK) | P2DIR_PRIP0_USART0_USART1;
+
+       /* Make the USART pins be controlled by the USART */
+       P0SEL |= (1 << 2) | (1 << 3);
+#if HAS_SERIAL_0_HW_FLOW
+       P0SEL |= (1 << 4) | (1 << 5);
+#endif
+#else
+       /* Set up the USART pin assignment */
+       PERCFG = (PERCFG & ~PERCFG_U0CFG_ALT_MASK) | PERCFG_U0CFG_ALT_2;
+
+       P2SEL = (P2SEL & ~(P2SEL_PRI3P1_MASK | P2SEL_PRI0P1_MASK)) |
+               (P2SEL_PRI3P1_USART0 | P2SEL_PRI0P1_USART0);
+
+       /* Make the USART pins be controlled by the USART */
+       P1SEL |= (1 << 2) | (1 << 3);
+#if HAS_SERIAL_0_HW_FLOW
+       P1SEL |= (1 << 5) | (1 << 4);
+#endif
+#endif
+
+       /* UART mode with receiver enabled */
+       U0CSR = (UxCSR_MODE_UART | UxCSR_RE);
+
+       /* Pick a 9600 baud rate */
+       ao_serial0_set_speed(AO_SERIAL_SPEED_9600);
+
+       /* Reasonable serial parameters */
+       U0UCR = (UxUCR_FLUSH |
+#if HAS_SERIAL_0_HW_FLOW
+                UxUCR_FLOW_ENABLE |
+#else
+                UxUCR_FLOW_DISABLE |
+#endif
+                UxUCR_D9_EVEN_PARITY |
+                UxUCR_BIT9_8_BITS |
+                UxUCR_PARITY_DISABLE |
+                UxUCR_SPB_1_STOP_BIT |
+                UxUCR_STOP_HIGH |
+                UxUCR_START_LOW);
+
+       IEN0 |= IEN0_URX0IE;
+       IEN2 |= IEN2_UTX0IE;
+#if USE_SERIAL_0_STDIN && !DELAY_SERIAL_0_STDIN
+       ao_add_stdio(ao_serial0_pollchar,
+                    ao_serial0_putchar,
+                    NULL);
+#endif
+#endif /* HAS_SERIAL_0 */
+
+#if HAS_SERIAL_1
 #if HAS_SERIAL_1_ALT_1
        /* Set up the USART pin assignment */
        PERCFG = (PERCFG & ~PERCFG_U1CFG_ALT_MASK) | PERCFG_U1CFG_ALT_1;
 #if HAS_SERIAL_1_ALT_1
        /* Set up the USART pin assignment */
        PERCFG = (PERCFG & ~PERCFG_U1CFG_ALT_MASK) | PERCFG_U1CFG_ALT_1;
@@ -151,7 +299,7 @@ ao_serial_init(void)
        U1CSR = (UxCSR_MODE_UART | UxCSR_RE);
 
        /* Pick a 4800 baud rate */
        U1CSR = (UxCSR_MODE_UART | UxCSR_RE);
 
        /* Pick a 4800 baud rate */
-       ao_serial_set_speed(AO_SERIAL_SPEED_4800);
+       ao_serial1_set_speed(AO_SERIAL_SPEED_4800);
 
        /* Reasonable serial parameters */
        U1UCR = (UxUCR_FLUSH |
 
        /* Reasonable serial parameters */
        U1UCR = (UxUCR_FLUSH |
@@ -169,4 +317,11 @@ ao_serial_init(void)
 
        IEN0 |= IEN0_URX1IE;
        IEN2 |= IEN2_UTX1IE;
 
        IEN0 |= IEN0_URX1IE;
        IEN2 |= IEN2_UTX1IE;
+
+#if USE_SERIAL_1_STDIN && !DELAY_SERIAL_1_STDIN
+       ao_add_stdio(ao_serial1_pollchar,
+                    ao_serial1_putchar,
+                    NULL);
+#endif
+#endif /* HAS_SERIAL_1 */
 }
 }
diff --git a/src/cc1111/ao_serial0.c b/src/cc1111/ao_serial0.c
deleted file mode 100644 (file)
index e8c1eb3..0000000
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright Â© 2009 Keith Packard <keithp@keithp.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- */
-
-#include "ao.h"
-
-volatile __xdata struct ao_fifo        ao_usart0_rx_fifo;
-volatile __xdata struct ao_fifo        ao_usart0_tx_fifo;
-
-void
-ao_serial0_rx0_isr(void) __interrupt 2
-{
-       if (!ao_fifo_full(ao_usart0_rx_fifo))
-               ao_fifo_insert(ao_usart0_rx_fifo, U0DBUF);
-       ao_wakeup(&ao_usart0_rx_fifo);
-}
-
-static __xdata uint8_t ao_serial0_tx0_started;
-
-static void
-ao_serial0_tx0_start(void)
-{
-       if (!ao_fifo_empty(ao_usart0_tx_fifo) &&
-           !ao_serial0_tx0_started)
-       {
-               ao_serial0_tx0_started = 1;
-               ao_fifo_remove(ao_usart0_tx_fifo, U0DBUF);
-       }
-}
-
-void
-ao_serial0_tx0_isr(void) __interrupt 7
-{
-       UTX0IF = 0;
-       ao_serial0_tx0_started = 0;
-       ao_serial0_tx0_start();
-       ao_wakeup(&ao_usart0_tx_fifo);
-}
-
-char
-ao_serial0_getchar(void) __critical
-{
-       char    c;
-       while (ao_fifo_empty(ao_usart0_rx_fifo))
-               ao_sleep(&ao_usart0_rx_fifo);
-       ao_fifo_remove(ao_usart0_rx_fifo, c);
-       return c;
-}
-
-#if USE_SERIAL_STDIN
-char
-ao_serial0_pollchar(void) __critical
-{
-       char    c;
-       if (ao_fifo_empty(ao_usart0_rx_fifo))
-               return AO_READ_AGAIN;
-       ao_fifo_remove(ao_usart0_rx_fifo,c);
-       return c;
-}
-#endif
-
-void
-ao_serial0_putchar(char c) __critical
-{
-       while (ao_fifo_full(ao_usart0_tx_fifo))
-               ao_sleep(&ao_usart0_tx_fifo);
-       ao_fifo_insert(ao_usart0_tx_fifo, c);
-       ao_serial0_tx0_start();
-}
-
-void
-ao_serial0_drain(void) __critical
-{
-       while (!ao_fifo_empty(ao_usart0_tx_fifo))
-               ao_sleep(&ao_usart0_tx_fifo);
-}
-
-void
-ao_serial0_set_speed(uint8_t speed)
-{
-       ao_serial0_drain();
-       if (speed > AO_SERIAL_SPEED_57600)
-               return;
-       U0UCR |= UxUCR_FLUSH;
-       U0BAUD = ao_serial_speeds[speed].baud;
-       U0GCR = ao_serial_speeds[speed].gcr;
-}
-
-void
-ao_serial0_init(void)
-{
-#if HAS_SERIAL_0_ALT_1
-       /* Set up the USART pin assignment */
-       PERCFG = (PERCFG & ~PERCFG_U0CFG_ALT_MASK) | PERCFG_U0CFG_ALT_1;
-
-       P2DIR = (P2DIR & ~P2DIR_PRIP0_MASK) | P2DIR_PRIP0_USART0_USART1;
-
-       /* Make the USART pins be controlled by the USART */
-       P0SEL |= (1 << 2) | (1 << 3);
-#if HAS_SERIAL_0_HW_FLOW
-       P0SEL |= (1 << 4) | (1 << 5);
-#endif
-#else
-       /* Set up the USART pin assignment */
-       PERCFG = (PERCFG & ~PERCFG_U0CFG_ALT_MASK) | PERCFG_U0CFG_ALT_2;
-
-       P2SEL = (P2SEL & ~(P2SEL_PRI3P1_MASK | P2SEL_PRI0P1_MASK)) |
-               (P2SEL_PRI3P1_USART0 | P2SEL_PRI0P1_USART0);
-
-       /* Make the USART pins be controlled by the USART */
-       P1SEL |= (1 << 2) | (1 << 3);
-#if HAS_SERIAL_0_HW_FLOW
-       P1SEL |= (1 << 5) | (1 << 4);
-#endif
-#endif
-
-       /* UART mode with receiver enabled */
-       U0CSR = (UxCSR_MODE_UART | UxCSR_RE);
-
-       /* Pick a 9600 baud rate */
-       ao_serial0_set_speed(AO_SERIAL_SPEED_9600);
-
-       /* Reasonable serial parameters */
-       U0UCR = (UxUCR_FLUSH |
-#if HAS_SERIAL_0_HW_FLOW
-                UxUCR_FLOW_ENABLE |
-#else
-                UxUCR_FLOW_DISABLE |
-#endif
-                UxUCR_D9_EVEN_PARITY |
-                UxUCR_BIT9_8_BITS |
-                UxUCR_PARITY_DISABLE |
-                UxUCR_SPB_1_STOP_BIT |
-                UxUCR_STOP_HIGH |
-                UxUCR_START_LOW);
-
-       IEN0 |= IEN0_URX0IE;
-       IEN2 |= IEN2_UTX0IE;
-}
index 35c9ac20e80fd07a4bd37ecd045a1eeef8210079..ce26e8088a4cfee539b78bb82ea54538dab1af9d 100644 (file)
@@ -261,15 +261,15 @@ ao_usb_ep0_setup(void)
                break;
        case AO_USB_TYPE_CLASS:
                switch (ao_usb_setup.request) {
                break;
        case AO_USB_TYPE_CLASS:
                switch (ao_usb_setup.request) {
-               case SET_LINE_CODING:
+               case AO_USB_SET_LINE_CODING:
                        ao_usb_ep0_out_len = 7;
                        ao_usb_ep0_out_data = (__xdata uint8_t *) &ao_usb_line_coding;
                        break;
                        ao_usb_ep0_out_len = 7;
                        ao_usb_ep0_out_data = (__xdata uint8_t *) &ao_usb_line_coding;
                        break;
-               case GET_LINE_CODING:
+               case AO_USB_GET_LINE_CODING:
                        ao_usb_ep0_in_len = 7;
                        ao_usb_ep0_in_data = (uint8_t *) &ao_usb_line_coding;
                        break;
                        ao_usb_ep0_in_len = 7;
                        ao_usb_ep0_in_data = (uint8_t *) &ao_usb_line_coding;
                        break;
-               case SET_CONTROL_LINE_STATE:
+               case AO_USB_SET_CONTROL_LINE_STATE:
                        break;
                }
                break;
                        break;
                }
                break;
diff --git a/src/cc1111/ao_usb.h b/src/cc1111/ao_usb.h
deleted file mode 100644 (file)
index 6633daf..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright Â© 2009 Keith Packard <keithp@keithp.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- */
-
-#ifndef _AO_USB_H_
-#define _AO_USB_H_
-
-#define AO_USB_SETUP_DIR_MASK  (0x01 << 7)
-#define AO_USB_SETUP_TYPE_MASK (0x03 << 5)
-#define AO_USB_SETUP_RECIP_MASK        (0x1f)
-
-#define AO_USB_DIR_OUT                 0
-#define AO_USB_DIR_IN                  (1 << 7)
-
-#define AO_USB_TYPE_STANDARD           0
-#define AO_USB_TYPE_CLASS              (1 << 5)
-#define AO_USB_TYPE_VENDOR             (2 << 5)
-#define AO_USB_TYPE_RESERVED           (3 << 5)
-
-#define AO_USB_RECIP_DEVICE            0
-#define AO_USB_RECIP_INTERFACE         1
-#define AO_USB_RECIP_ENDPOINT          2
-#define AO_USB_RECIP_OTHER             3
-
-/* standard requests */
-#define        AO_USB_REQ_GET_STATUS           0x00
-#define AO_USB_REQ_CLEAR_FEATURE       0x01
-#define AO_USB_REQ_SET_FEATURE         0x03
-#define AO_USB_REQ_SET_ADDRESS         0x05
-#define AO_USB_REQ_GET_DESCRIPTOR      0x06
-#define AO_USB_REQ_SET_DESCRIPTOR      0x07
-#define AO_USB_REQ_GET_CONFIGURATION   0x08
-#define AO_USB_REQ_SET_CONFIGURATION   0x09
-#define AO_USB_REQ_GET_INTERFACE       0x0A
-#define AO_USB_REQ_SET_INTERFACE       0x0B
-#define AO_USB_REQ_SYNCH_FRAME         0x0C
-
-#define AO_USB_DESC_DEVICE             1
-#define AO_USB_DESC_CONFIGURATION      2
-#define AO_USB_DESC_STRING             3
-#define AO_USB_DESC_INTERFACE          4
-#define AO_USB_DESC_ENDPOINT           5
-#define AO_USB_DESC_DEVICE_QUALIFIER   6
-#define AO_USB_DESC_OTHER_SPEED                7
-#define AO_USB_DESC_INTERFACE_POWER    8
-
-#define AO_USB_GET_DESC_TYPE(x)                (((x)>>8)&0xFF)
-#define AO_USB_GET_DESC_INDEX(x)       ((x)&0xFF)
-
-#define AO_USB_CONTROL_EP      0
-#define AO_USB_INT_EP          1
-#define AO_USB_OUT_EP          4
-#define AO_USB_IN_EP           5
-#define AO_USB_CONTROL_SIZE    32
-/*
- * Double buffer IN and OUT EPs, so each
- * gets half of the available space
- *
- * Ah, but USB bulk packets can only come in 8, 16, 32 and 64
- * byte sizes, so we'll use 64 for everything
- */
-#define AO_USB_IN_SIZE         64
-#define AO_USB_OUT_SIZE                64
-
-#define AO_USB_EP0_IDLE                0
-#define AO_USB_EP0_DATA_IN     1
-#define AO_USB_EP0_DATA_OUT    2
-
-#define LE_WORD(x)    ((x)&0xFF),((uint8_t) (((uint16_t) (x))>>8))
-
-/* CDC definitions */
-#define CS_INTERFACE      0x24
-#define CS_ENDPOINT       0x25
-
-#define SET_LINE_CODING         0x20
-#define GET_LINE_CODING         0x21
-#define SET_CONTROL_LINE_STATE  0x22
-
-/* Data structure for GET_LINE_CODING / SET_LINE_CODING class requests */
-struct ao_usb_line_coding {
-       uint32_t        rate;
-       uint8_t         char_format;
-       uint8_t         parity;
-       uint8_t         data_bits;
-} ;
-
-#endif /* _AO_USB_H_ */
index 9a3b5829e87745449ae465ac03f9e1692865b2a0..28d0ba872cb441a186231b77c1012932e5885060 100644 (file)
@@ -154,182 +154,14 @@ void
 ao_clock_init(void);
 
 /*
 ao_clock_init(void);
 
 /*
- * One set of samples read from the A/D converter or telemetry
- */
-
-#if HAS_ADC
-
-/*
- * ao_adc.c
- */
-
-#define ao_adc_ring_next(n)    (((n) + 1) & (AO_ADC_RING - 1))
-#define ao_adc_ring_prev(n)    (((n) - 1) & (AO_ADC_RING - 1))
-
-
-/*
- * A/D data is stored in a ring, with the next sample to be written
- * at ao_adc_head
- */
-extern volatile __xdata struct ao_adc  ao_adc_ring[AO_ADC_RING];
-extern volatile __data uint8_t         ao_adc_head;
-#if HAS_ACCEL_REF
-extern volatile __xdata uint16_t       ao_accel_ref[AO_ADC_RING];
-#endif
-
-/* Trigger a conversion sequence (called from the timer interrupt) */
-void
-ao_adc_poll(void);
-
-/* Suspend the current task until another A/D sample is converted */
-void
-ao_adc_sleep(void);
-
-/* Get a copy of the last complete A/D sample set */
-void
-ao_adc_get(__xdata struct ao_adc *packet);
-
-/* The A/D interrupt handler */
-
-void
-ao_adc_isr(void) ao_arch_interrupt(1);
-
-/* Initialize the A/D converter */
-void
-ao_adc_init(void);
-
-#endif /* HAS_ADC */
-
-/*
- * ao_beep.c
- */
-
-/*
- * Various pre-defined beep frequencies
- *
- * frequency = 1/2 (24e6/32) / beep
- */
-
-#define AO_BEEP_LOW    150     /* 2500Hz */
-#define AO_BEEP_MID    94      /* 3989Hz */
-#define AO_BEEP_HIGH   75      /* 5000Hz */
-#define AO_BEEP_OFF    0       /* off */
-
-#define AO_BEEP_g      240     /* 1562.5Hz */
-#define AO_BEEP_gs     227     /* 1652Hz (1655Hz) */
-#define AO_BEEP_aa     214     /* 1752Hz (1754Hz) */
-#define AO_BEEP_bbf    202     /* 1856Hz (1858Hz) */
-#define AO_BEEP_bb     190     /* 1974Hz (1969Hz) */
-#define AO_BEEP_cc     180     /* 2083Hz (2086Hz) */
-#define AO_BEEP_ccs    170     /* 2205Hz (2210Hz) */
-#define AO_BEEP_dd     160     /* 2344Hz (2341Hz) */
-#define AO_BEEP_eef    151     /* 2483Hz (2480Hz) */
-#define AO_BEEP_ee     143     /* 2622Hz (2628Hz) */
-#define AO_BEEP_ff     135     /* 2778Hz (2784Hz) */
-#define AO_BEEP_ffs    127     /* 2953Hz (2950Hz) */
-#define AO_BEEP_gg     120     /* 3125Hz */
-#define AO_BEEP_ggs    113     /* 3319Hz (3311Hz) */
-#define AO_BEEP_aaa    107     /* 3504Hz (3508Hz) */
-#define AO_BEEP_bbbf   101     /* 3713Hz (3716Hz) */
-#define AO_BEEP_bbb    95      /* 3947Hz (3937Hz) */
-#define AO_BEEP_ccc    90      /* 4167Hz (4171Hz) */
-#define AO_BEEP_cccs   85      /* 4412Hz (4419Hz) */
-#define AO_BEEP_ddd    80      /* 4688Hz (4682Hz) */
-#define AO_BEEP_eeef   76      /* 4934Hz (4961Hz) */
-#define AO_BEEP_eee    71      /* 5282Hz (5256Hz) */
-#define AO_BEEP_fff    67      /* 5597Hz (5568Hz) */
-#define AO_BEEP_fffs   64      /* 5859Hz (5899Hz) */
-#define AO_BEEP_ggg    60      /* 6250Hz */
-
-/* Set the beeper to the specified tone */
-void
-ao_beep(uint8_t beep);
-
-/* Turn on the beeper for the specified time */
-void
-ao_beep_for(uint8_t beep, uint16_t ticks) __reentrant;
-
-/* Initialize the beeper */
-void
-ao_beep_init(void);
-
-/*
- * ao_led.c
- */
-
-#define AO_LED_NONE    0
-
-#ifndef AO_LED_TYPE
-#define AO_LED_TYPE uint8_t
-#endif
-
-/* Turn on the specified LEDs */
-void
-ao_led_on(AO_LED_TYPE colors);
-
-/* Turn off the specified LEDs */
-void
-ao_led_off(AO_LED_TYPE colors);
-
-/* Set all of the LEDs to the specified state */
-void
-ao_led_set(AO_LED_TYPE colors);
-
-/* Toggle the specified LEDs */
-void
-ao_led_toggle(AO_LED_TYPE colors);
-
-/* Turn on the specified LEDs for the indicated interval */
-void
-ao_led_for(AO_LED_TYPE colors, uint16_t ticks) __reentrant;
-
-/* Initialize the LEDs */
-void
-ao_led_init(AO_LED_TYPE enable);
-
-/*
- * ao_usb.c
- */
-
-/* Put one character to the USB output queue */
-void
-ao_usb_putchar(char c);
-
-/* Get one character from the USB input queue */
-char
-ao_usb_getchar(void);
-
-/* Poll for a charcter on the USB input queue.
- * returns AO_READ_AGAIN if none are available
+ * ao_mutex.c
  */
  */
-char
-ao_usb_pollchar(void);
-
-/* Flush the USB output queue */
-void
-ao_usb_flush(void);
-
-#if HAS_USB
-/* USB interrupt handler */
-void
-ao_usb_isr(void) ao_arch_interrupt(6);
-#endif
 
 
-/* Enable the USB controller */
 void
 void
-ao_usb_enable(void);
-
-/* Disable the USB controller */
-void
-ao_usb_disable(void);
+ao_mutex_get(__xdata uint8_t *ao_mutex) __reentrant;
 
 
-/* Initialize the USB system */
 void
 void
-ao_usb_init(void);
-
-#if HAS_USB
-extern __code __at (0x00aa) uint8_t ao_usb_descriptors [];
-#endif
+ao_mutex_put(__xdata uint8_t *ao_mutex) __reentrant;
 
 /*
  * ao_cmd.c
 
 /*
  * ao_cmd.c
@@ -396,405 +228,36 @@ ao_cmd_filter(void);
 #endif
 
 /*
 #endif
 
 /*
- * ao_mutex.c
- */
-
-void
-ao_mutex_get(__xdata uint8_t *ao_mutex) __reentrant;
-
-void
-ao_mutex_put(__xdata uint8_t *ao_mutex) __reentrant;
-
-/*
- * Storage interface, provided by one of the eeprom or flash
- * drivers
- */
-
-/* Total bytes of available storage */
-extern __pdata uint32_t        ao_storage_total;
-
-/* Block size - device is erased in these units. At least 256 bytes */
-extern __pdata uint32_t        ao_storage_block;
-
-/* Byte offset of config block. Will be ao_storage_block bytes long */
-extern __pdata uint32_t        ao_storage_config;
-
-/* Storage unit size - device reads and writes must be within blocks of this size. Usually 256 bytes. */
-extern __pdata uint16_t ao_storage_unit;
-
-#define AO_STORAGE_ERASE_LOG   (ao_storage_config + AO_CONFIG_MAX_SIZE)
-
-/* Initialize above values. Can only be called once the OS is running */
-void
-ao_storage_setup(void) __reentrant;
-
-/* Write data. Returns 0 on failure, 1 on success */
-uint8_t
-ao_storage_write(uint32_t pos, __xdata void *buf, uint16_t len) __reentrant;
-
-/* Read data. Returns 0 on failure, 1 on success */
-uint8_t
-ao_storage_read(uint32_t pos, __xdata void *buf, uint16_t len) __reentrant;
-
-/* Erase a block of storage. This always clears ao_storage_block bytes */
-uint8_t
-ao_storage_erase(uint32_t pos) __reentrant;
-
-/* Flush any pending writes to stable storage */
-void
-ao_storage_flush(void) __reentrant;
-
-/* Initialize the storage code */
-void
-ao_storage_init(void);
-
-/*
- * Low-level functions wrapped by ao_storage.c
- */
-
-/* Read data within a storage unit */
-uint8_t
-ao_storage_device_read(uint32_t pos, __xdata void *buf, uint16_t len) __reentrant;
-
-/* Write data within a storage unit */
-uint8_t
-ao_storage_device_write(uint32_t pos, __xdata void *buf, uint16_t len) __reentrant;
-
-/* Initialize low-level device bits */
-void
-ao_storage_device_init(void);
-
-/* Print out information about flash chips */
-void
-ao_storage_device_info(void) __reentrant;
-
-/*
- * ao_log.c
- */
-
-/* We record flight numbers in the first record of
- * the log. Tasks may wait for this to be initialized
- * by sleeping on this variable.
- */
-extern __xdata uint16_t ao_flight_number;
-
-extern __pdata uint32_t ao_log_current_pos;
-extern __pdata uint32_t ao_log_end_pos;
-extern __pdata uint32_t ao_log_start_pos;
-extern __xdata uint8_t ao_log_running;
-extern __pdata enum flight_state ao_log_state;
-
-/* required functions from the underlying log system */
-
-#define AO_LOG_FORMAT_UNKNOWN          0       /* unknown; altosui will have to guess */
-#define AO_LOG_FORMAT_FULL             1       /* 8 byte typed log records */
-#define AO_LOG_FORMAT_TINY             2       /* two byte state/baro records */
-#define AO_LOG_FORMAT_TELEMETRY                3       /* 32 byte ao_telemetry records */
-#define AO_LOG_FORMAT_TELESCIENCE      4       /* 32 byte typed telescience records */
-#define AO_LOG_FORMAT_NONE             127     /* No log at all */
-
-extern __code uint8_t ao_log_format;
-
-/* Return the flight number from the given log slot, 0 if none */
-uint16_t
-ao_log_flight(uint8_t slot);
-
-/* Flush the log */
-void
-ao_log_flush(void);
-
-/* Logging thread main routine */
-void
-ao_log(void);
-
-/* functions provided in ao_log.c */
-
-/* Figure out the current flight number */
-void
-ao_log_scan(void) __reentrant;
-
-/* Return the position of the start of the given log slot */
-uint32_t
-ao_log_pos(uint8_t slot);
-
-/* Start logging to eeprom */
-void
-ao_log_start(void);
-
-/* Stop logging */
-void
-ao_log_stop(void);
-
-/* Initialize the logging system */
-void
-ao_log_init(void);
-
-/* Write out the current flight number to the erase log */
-void
-ao_log_write_erase(uint8_t pos);
-
-/* Returns true if there are any logs stored in eeprom */
-uint8_t
-ao_log_present(void);
-
-/* Returns true if there is no more storage space available */
-uint8_t
-ao_log_full(void);
-
-/*
- * ao_log_big.c
+ * Various drivers
  */
  */
-
-/*
- * The data log is recorded in the eeprom as a sequence
- * of data packets.
- *
- * Each packet starts with a 4-byte header that has the
- * packet type, the packet checksum and the tick count. Then
- * they all contain 2 16 bit values which hold packet-specific
- * data.
- *
- * For each flight, the first packet
- * is FLIGHT packet, indicating the serial number of the
- * device and a unique number marking the number of flights
- * recorded by this device.
- *
- * During flight, data from the accelerometer and barometer
- * are recorded in SENSOR packets, using the raw 16-bit values
- * read from the A/D converter.
- *
- * Also during flight, but at a lower rate, the deployment
- * sensors are recorded in DEPLOY packets. The goal here is to
- * detect failure in the deployment circuits.
- *
- * STATE packets hold state transitions as the flight computer
- * transitions through different stages of the flight.
- */
-#define AO_LOG_FLIGHT          'F'
-#define AO_LOG_SENSOR          'A'
-#define AO_LOG_TEMP_VOLT       'T'
-#define AO_LOG_DEPLOY          'D'
-#define AO_LOG_STATE           'S'
-#define AO_LOG_GPS_TIME                'G'
-#define AO_LOG_GPS_LAT         'N'
-#define AO_LOG_GPS_LON         'W'
-#define AO_LOG_GPS_ALT         'H'
-#define AO_LOG_GPS_SAT         'V'
-#define AO_LOG_GPS_DATE                'Y'
-
-#define AO_LOG_POS_NONE                (~0UL)
-
-struct ao_log_record {
-       char                    type;
-       uint8_t                 csum;
-       uint16_t                tick;
-       union {
-               struct {
-                       int16_t         ground_accel;
-                       uint16_t        flight;
-               } flight;
-               struct {
-                       int16_t         accel;
-                       int16_t         pres;
-               } sensor;
-               struct {
-                       int16_t         temp;
-                       int16_t         v_batt;
-               } temp_volt;
-               struct {
-                       int16_t         drogue;
-                       int16_t         main;
-               } deploy;
-               struct {
-                       uint16_t        state;
-                       uint16_t        reason;
-               } state;
-               struct {
-                       uint8_t         hour;
-                       uint8_t         minute;
-                       uint8_t         second;
-                       uint8_t         flags;
-               } gps_time;
-               int32_t         gps_latitude;
-               int32_t         gps_longitude;
-               struct {
-                       int16_t         altitude;
-                       uint16_t        unused;
-               } gps_altitude;
-               struct {
-                       uint16_t        svid;
-                       uint8_t         unused;
-                       uint8_t         c_n;
-               } gps_sat;
-               struct {
-                       uint8_t         year;
-                       uint8_t         month;
-                       uint8_t         day;
-                       uint8_t         extra;
-               } gps_date;
-               struct {
-                       uint16_t        d0;
-                       uint16_t        d1;
-               } anon;
-       } u;
-};
-
-/* Write a record to the eeprom log */
-uint8_t
-ao_log_data(__xdata struct ao_log_record *log) __reentrant;
-
-/*
- * ao_flight.c
- */
-
-enum ao_flight_state {
-       ao_flight_startup = 0,
-       ao_flight_idle = 1,
-       ao_flight_pad = 2,
-       ao_flight_boost = 3,
-       ao_flight_fast = 4,
-       ao_flight_coast = 5,
-       ao_flight_drogue = 6,
-       ao_flight_main = 7,
-       ao_flight_landed = 8,
-       ao_flight_invalid = 9
-};
-
-extern __pdata enum ao_flight_state    ao_flight_state;
-
-extern __pdata uint16_t                        ao_launch_time;
-extern __pdata uint8_t                 ao_flight_force_idle;
-
-/* Flight thread */
-void
-ao_flight(void);
-
-/* Initialize flight thread */
-void
-ao_flight_init(void);
-
-/*
- * ao_flight_nano.c
- */
-
-void
-ao_flight_nano_init(void);
-
-/*
- * ao_sample.c
- */
-
-/*
- * Barometer calibration
- *
- * We directly sample the barometer. The specs say:
- *
- * Pressure range: 15-115 kPa
- * Voltage at 115kPa: 2.82
- * Output scale: 27mV/kPa
- *
- * If we want to detect launch with the barometer, we need
- * a large enough bump to not be fooled by noise. At typical
- * launch elevations (0-2000m), a 200Pa pressure change cooresponds
- * to about a 20m elevation change. This is 5.4mV, or about 3LSB.
- * As all of our calculations are done in 16 bits, we'll actually see a change
- * of 16 times this though
- *
- * 27 mV/kPa * 32767 / 3300 counts/mV = 268.1 counts/kPa
- */
-
-/* Accelerometer calibration
- *
- * We're sampling the accelerometer through a resistor divider which
- * consists of 5k and 10k resistors. This multiplies the values by 2/3.
- * That goes into the cc1111 A/D converter, which is running at 11 bits
- * of precision with the bits in the MSB of the 16 bit value. Only positive
- * values are used, so values should range from 0-32752 for 0-3.3V. The
- * specs say we should see 40mV/g (uncalibrated), multiply by 2/3 for what
- * the A/D converter sees (26.67 mV/g). We should see 32752/3300 counts/mV,
- * for a final computation of:
- *
- * 26.67 mV/g * 32767/3300 counts/mV = 264.8 counts/g
- *
- * Zero g was measured at 16000 (we would expect 16384).
- * Note that this value is only require to tell if the
- * rocket is standing upright. Once that is determined,
- * the value of the accelerometer is averaged for 100 samples
- * to find the resting accelerometer value, which is used
- * for all further flight computations
- */
-
-#define GRAVITY 9.80665
-
-/*
- * Above this height, the baro sensor doesn't work
- */
-#define AO_MAX_BARO_HEIGHT     12000
-
-/*
- * Above this speed, baro measurements are unreliable
- */
-#define AO_MAX_BARO_SPEED      200
-
-#define ACCEL_NOSE_UP  (ao_accel_2g >> 2)
-
-/*
- * Speed and acceleration are scaled by 16 to provide a bit more
- * resolution while still having reasonable range. Note that this
- * limits speed to 2047m/s (around mach 6) and acceleration to
- * 2047m/s² (over 200g)
- */
-
-#define AO_M_TO_HEIGHT(m)      ((int16_t) (m))
-#define AO_MS_TO_SPEED(ms)     ((int16_t) ((ms) * 16))
-#define AO_MSS_TO_ACCEL(mss)   ((int16_t) ((mss) * 16))
-
-extern __pdata uint16_t        ao_sample_tick;         /* time of last data */
-extern __pdata int16_t ao_sample_pres;         /* most recent pressure sensor reading */
-extern __pdata int16_t ao_sample_alt;          /* MSL of ao_sample_pres */
-extern __pdata int16_t ao_sample_height;       /* AGL of ao_sample_pres */
-extern __data uint8_t  ao_sample_adc;          /* Ring position of last processed sample */
-
-#if HAS_ACCEL
-extern __pdata int16_t ao_sample_accel;        /* most recent accel sensor reading */
+#if HAS_ADC
+#include <ao_adc.h>
 #endif
 
 #endif
 
-extern __pdata int16_t ao_ground_pres;         /* startup pressure */
-extern __pdata int16_t ao_ground_height;       /* MSL of ao_ground_pres */
-
-#if HAS_ACCEL
-extern __pdata int16_t ao_ground_accel;        /* startup acceleration */
-extern __pdata int16_t         ao_accel_2g;            /* factory accel calibration */
-extern __pdata int32_t ao_accel_scale;         /* sensor to m/s² conversion */
+#if HAS_BEEP
+#include <ao_beep.h>
 #endif
 
 #endif
 
-void ao_sample_init(void);
-
-/* returns FALSE in preflight mode, TRUE in flight mode */
-uint8_t ao_sample(void);
-
-/*
- * ao_kalman.c
- */
-
-#define to_fix16(x) ((int16_t) ((x) * 65536.0 + 0.5))
-#define to_fix32(x) ((int32_t) ((x) * 65536.0 + 0.5))
-#define from_fix(x)    ((x) >> 16)
+#if LEDS_AVAILABLE
+#include <ao_led.h>
+#endif
 
 
-extern __pdata int16_t                 ao_height;      /* meters */
-extern __pdata int16_t                 ao_speed;       /* m/s * 16 */
-extern __pdata int16_t                 ao_accel;       /* m/s² * 16 */
-extern __pdata int16_t                 ao_max_height;  /* max of ao_height */
-extern __pdata int16_t                 ao_avg_height;  /* running average of height */
+#if HAS_USB
+#include <ao_usb.h>
+#endif
 
 
-extern __pdata int16_t                 ao_error_h;
-extern __pdata int16_t                 ao_error_h_sq_avg;
+#if HAS_EEPROM
+#include <ao_storage.h>
+#endif
 
 
-#if HAS_ACCEL
-extern __pdata int16_t                 ao_error_a;
+#if HAS_LOG
+#include <ao_log.h>
 #endif
 
 #endif
 
-void ao_kalman(void);
+#if HAS_FLIGHT
+#include <ao_flight.h>
+#include <ao_sample.h>
+#endif
 
 /*
  * ao_report.c
 
 /*
  * ao_report.c
@@ -819,125 +282,12 @@ ao_altitude_to_pres(int16_t alt) __reentrant;
 int16_t
 ao_temp_to_dC(int16_t temp) __reentrant;
 
 int16_t
 ao_temp_to_dC(int16_t temp) __reentrant;
 
-/*
- * ao_dbg.c
- *
- * debug another telemetrum board
- */
-
-/* Send a byte to the dbg target */
-void
-ao_dbg_send_byte(uint8_t byte);
-
-/* Receive a byte from the dbg target */
-uint8_t
-ao_dbg_recv_byte(void);
-
-/* Start a bulk transfer to/from dbg target memory */
-void
-ao_dbg_start_transfer(uint16_t addr);
-
-/* End a bulk transfer to/from dbg target memory */
-void
-ao_dbg_end_transfer(void);
-
-/* Write a byte to dbg target memory */
-void
-ao_dbg_write_byte(uint8_t byte);
-
-/* Read a byte from dbg target memory */
-uint8_t
-ao_dbg_read_byte(void);
-
-/* Enable dbg mode, switching use of the pins */
-void
-ao_dbg_debug_mode(void);
-
-/* Reset the dbg target */
-void
-ao_dbg_reset(void);
-
-void
-ao_dbg_init(void);
-
-/*
- * ao_serial.c
- */
-
-#ifndef HAS_SERIAL_1
-#error Please define HAS_SERIAL_1
+#if HAS_DBG
+#include <ao_dbg.h>
 #endif
 
 #endif
 
-#if HAS_SERIAL_1 | HAS_SERIAL_2 | HAS_SERIAL_3
-#ifndef USE_SERIAL_STDIN
-#error Please define USE_SERIAL_STDIN
-#endif
-
-void
-ao_serial_rx1_isr(void) ao_arch_interrupt(3);
-
-void
-ao_serial_tx1_isr(void) ao_arch_interrupt(14);
-
-char
-ao_serial_getchar(void) __critical;
-
-#if USE_SERIAL_STDIN
-char
-ao_serial_pollchar(void) __critical;
-
-void
-ao_serial_set_stdin(uint8_t in);
-#endif
-
-void
-ao_serial_putchar(char c) __critical;
-
-void
-ao_serial_drain(void) __critical;
-
-#define AO_SERIAL_SPEED_4800   0
-#define AO_SERIAL_SPEED_9600   1
-#define AO_SERIAL_SPEED_19200  2
-#define AO_SERIAL_SPEED_57600  3
-
-void
-ao_serial_set_speed(uint8_t speed);
-
-void
-ao_serial_init(void);
-#endif
-
-#ifndef HAS_SERIAL_0
-#define HAS_SERIAL_0 0
-#endif
-
-#if HAS_SERIAL_0
-
-extern volatile __xdata struct ao_fifo ao_usart0_rx_fifo;
-extern volatile __xdata struct ao_fifo ao_usart0_tx_fifo;
-
-void
-ao_serial0_rx0_isr(void) ao_arch_interrupt(2);
-
-void
-ao_serial0_tx0_isr(void) ao_arch_interrupt(7);
-
-char
-ao_serial0_getchar(void) __critical;
-
-void
-ao_serial0_putchar(char c) __critical;
-
-void
-ao_serial0_drain(void) __critical;
-
-void
-ao_serial0_set_speed(uint8_t speed);
-
-void
-ao_serial0_init(void);
-
+#if HAS_SERIAL_0 || HAS_SERIAL_1 || HAS_SERIAL_2 || HAS_SERIAL_3
+#include <ao_serial.h>
 #endif
 
 
 #endif
 
 
diff --git a/src/core/ao_adc.h b/src/core/ao_adc.h
new file mode 100644 (file)
index 0000000..db5bfab
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright Â© 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#ifndef _AO_ADC_H_
+#define _AO_ADC_H_
+
+
+
+/*
+ * One set of samples read from the A/D converter or telemetry
+ */
+
+
+/*
+ * ao_adc.c
+ */
+
+#define ao_adc_ring_next(n)    (((n) + 1) & (AO_ADC_RING - 1))
+#define ao_adc_ring_prev(n)    (((n) - 1) & (AO_ADC_RING - 1))
+
+
+/*
+ * A/D data is stored in a ring, with the next sample to be written
+ * at ao_adc_head
+ */
+extern volatile __xdata struct ao_adc  ao_adc_ring[AO_ADC_RING];
+extern volatile __data uint8_t         ao_adc_head;
+#if HAS_ACCEL_REF
+extern volatile __xdata uint16_t       ao_accel_ref[AO_ADC_RING];
+#endif
+
+/* Trigger a conversion sequence (called from the timer interrupt) */
+void
+ao_adc_poll(void);
+
+/* Suspend the current task until another A/D sample is converted */
+void
+ao_adc_sleep(void);
+
+/* Get a copy of the last complete A/D sample set */
+void
+ao_adc_get(__xdata struct ao_adc *packet);
+
+/* Initialize the A/D converter */
+void
+ao_adc_init(void);
+
+#endif /* _AO_ADC_H_ */
diff --git a/src/core/ao_beep.h b/src/core/ao_beep.h
new file mode 100644 (file)
index 0000000..55f6117
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * Copyright Â© 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#ifndef _AO_BEEP_H_
+#define _AO_BEEP_H_
+
+/*
+ * ao_beep.c
+ */
+
+/*
+ * Various pre-defined beep frequencies
+ *
+ * frequency = 1/2 (24e6/32) / beep
+ */
+
+#define AO_BEEP_LOW    150     /* 2500Hz */
+#define AO_BEEP_MID    94      /* 3989Hz */
+#define AO_BEEP_HIGH   75      /* 5000Hz */
+#define AO_BEEP_OFF    0       /* off */
+
+#define AO_BEEP_g      240     /* 1562.5Hz */
+#define AO_BEEP_gs     227     /* 1652Hz (1655Hz) */
+#define AO_BEEP_aa     214     /* 1752Hz (1754Hz) */
+#define AO_BEEP_bbf    202     /* 1856Hz (1858Hz) */
+#define AO_BEEP_bb     190     /* 1974Hz (1969Hz) */
+#define AO_BEEP_cc     180     /* 2083Hz (2086Hz) */
+#define AO_BEEP_ccs    170     /* 2205Hz (2210Hz) */
+#define AO_BEEP_dd     160     /* 2344Hz (2341Hz) */
+#define AO_BEEP_eef    151     /* 2483Hz (2480Hz) */
+#define AO_BEEP_ee     143     /* 2622Hz (2628Hz) */
+#define AO_BEEP_ff     135     /* 2778Hz (2784Hz) */
+#define AO_BEEP_ffs    127     /* 2953Hz (2950Hz) */
+#define AO_BEEP_gg     120     /* 3125Hz */
+#define AO_BEEP_ggs    113     /* 3319Hz (3311Hz) */
+#define AO_BEEP_aaa    107     /* 3504Hz (3508Hz) */
+#define AO_BEEP_bbbf   101     /* 3713Hz (3716Hz) */
+#define AO_BEEP_bbb    95      /* 3947Hz (3937Hz) */
+#define AO_BEEP_ccc    90      /* 4167Hz (4171Hz) */
+#define AO_BEEP_cccs   85      /* 4412Hz (4419Hz) */
+#define AO_BEEP_ddd    80      /* 4688Hz (4682Hz) */
+#define AO_BEEP_eeef   76      /* 4934Hz (4961Hz) */
+#define AO_BEEP_eee    71      /* 5282Hz (5256Hz) */
+#define AO_BEEP_fff    67      /* 5597Hz (5568Hz) */
+#define AO_BEEP_fffs   64      /* 5859Hz (5899Hz) */
+#define AO_BEEP_ggg    60      /* 6250Hz */
+
+/* Set the beeper to the specified tone */
+void
+ao_beep(uint8_t beep);
+
+/* Turn on the beeper for the specified time */
+void
+ao_beep_for(uint8_t beep, uint16_t ticks) __reentrant;
+
+/* Initialize the beeper */
+void
+ao_beep_init(void);
+
+#endif /* _AO_BEEP_H_ */
diff --git a/src/core/ao_dbg.h b/src/core/ao_dbg.h
new file mode 100644 (file)
index 0000000..181e6ec
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright Â© 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#ifndef _AO_DBG_H_
+#define _AO_DBG_H_
+
+/*
+ * ao_dbg.c
+ *
+ * debug another telemetrum board
+ */
+
+/* Send a byte to the dbg target */
+void
+ao_dbg_send_byte(uint8_t byte);
+
+/* Receive a byte from the dbg target */
+uint8_t
+ao_dbg_recv_byte(void);
+
+/* Start a bulk transfer to/from dbg target memory */
+void
+ao_dbg_start_transfer(uint16_t addr);
+
+/* End a bulk transfer to/from dbg target memory */
+void
+ao_dbg_end_transfer(void);
+
+/* Write a byte to dbg target memory */
+void
+ao_dbg_write_byte(uint8_t byte);
+
+/* Read a byte from dbg target memory */
+uint8_t
+ao_dbg_read_byte(void);
+
+/* Enable dbg mode, switching use of the pins */
+void
+ao_dbg_debug_mode(void);
+
+/* Reset the dbg target */
+void
+ao_dbg_reset(void);
+
+void
+ao_dbg_init(void);
+
+#endif /* _AO_DBG_H_ */
diff --git a/src/core/ao_flight.h b/src/core/ao_flight.h
new file mode 100644 (file)
index 0000000..aa5ab60
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright Â© 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#ifndef _AO_FLIGHT_H_
+#define _AO_FLIGHT_H_
+
+
+/*
+ * ao_flight.c
+ */
+
+enum ao_flight_state {
+       ao_flight_startup = 0,
+       ao_flight_idle = 1,
+       ao_flight_pad = 2,
+       ao_flight_boost = 3,
+       ao_flight_fast = 4,
+       ao_flight_coast = 5,
+       ao_flight_drogue = 6,
+       ao_flight_main = 7,
+       ao_flight_landed = 8,
+       ao_flight_invalid = 9
+};
+
+extern __pdata enum ao_flight_state    ao_flight_state;
+
+extern __pdata uint16_t                        ao_launch_time;
+extern __pdata uint8_t                 ao_flight_force_idle;
+
+/* Flight thread */
+void
+ao_flight(void);
+
+/* Initialize flight thread */
+void
+ao_flight_init(void);
+
+/*
+ * ao_flight_nano.c
+ */
+
+void
+ao_flight_nano_init(void);
+
+#endif /* _AO_FLIGHT_H_ */
diff --git a/src/core/ao_led.h b/src/core/ao_led.h
new file mode 100644 (file)
index 0000000..edc5fd1
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright Â© 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#ifndef _AO_LED_H_
+#define _AO_LED_H_
+
+/*
+ * ao_led.c
+ */
+
+#define AO_LED_NONE    0
+
+#ifndef AO_LED_TYPE
+#define AO_LED_TYPE uint8_t
+#endif
+
+/* Turn on the specified LEDs */
+void
+ao_led_on(AO_LED_TYPE colors);
+
+/* Turn off the specified LEDs */
+void
+ao_led_off(AO_LED_TYPE colors);
+
+/* Set all of the LEDs to the specified state */
+void
+ao_led_set(AO_LED_TYPE colors);
+
+/* Toggle the specified LEDs */
+void
+ao_led_toggle(AO_LED_TYPE colors);
+
+/* Turn on the specified LEDs for the indicated interval */
+void
+ao_led_for(AO_LED_TYPE colors, uint16_t ticks) __reentrant;
+
+/* Initialize the LEDs */
+void
+ao_led_init(AO_LED_TYPE enable);
+
+#endif /* _AO_LED_H_ */
diff --git a/src/core/ao_log.h b/src/core/ao_log.h
new file mode 100644 (file)
index 0000000..611c00d
--- /dev/null
@@ -0,0 +1,196 @@
+/*
+ * Copyright Â© 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#ifndef _AO_LOG_H_
+#define _AO_LOG_H_
+
+/*
+ * ao_log.c
+ */
+
+/* We record flight numbers in the first record of
+ * the log. Tasks may wait for this to be initialized
+ * by sleeping on this variable.
+ */
+extern __xdata uint16_t ao_flight_number;
+
+extern __pdata uint32_t ao_log_current_pos;
+extern __pdata uint32_t ao_log_end_pos;
+extern __pdata uint32_t ao_log_start_pos;
+extern __xdata uint8_t ao_log_running;
+extern __pdata enum flight_state ao_log_state;
+
+/* required functions from the underlying log system */
+
+#define AO_LOG_FORMAT_UNKNOWN          0       /* unknown; altosui will have to guess */
+#define AO_LOG_FORMAT_FULL             1       /* 8 byte typed log records */
+#define AO_LOG_FORMAT_TINY             2       /* two byte state/baro records */
+#define AO_LOG_FORMAT_TELEMETRY                3       /* 32 byte ao_telemetry records */
+#define AO_LOG_FORMAT_TELESCIENCE      4       /* 32 byte typed telescience records */
+#define AO_LOG_FORMAT_NONE             127     /* No log at all */
+
+extern __code uint8_t ao_log_format;
+
+/* Return the flight number from the given log slot, 0 if none */
+uint16_t
+ao_log_flight(uint8_t slot);
+
+/* Flush the log */
+void
+ao_log_flush(void);
+
+/* Logging thread main routine */
+void
+ao_log(void);
+
+/* functions provided in ao_log.c */
+
+/* Figure out the current flight number */
+void
+ao_log_scan(void) __reentrant;
+
+/* Return the position of the start of the given log slot */
+uint32_t
+ao_log_pos(uint8_t slot);
+
+/* Start logging to eeprom */
+void
+ao_log_start(void);
+
+/* Stop logging */
+void
+ao_log_stop(void);
+
+/* Initialize the logging system */
+void
+ao_log_init(void);
+
+/* Write out the current flight number to the erase log */
+void
+ao_log_write_erase(uint8_t pos);
+
+/* Returns true if there are any logs stored in eeprom */
+uint8_t
+ao_log_present(void);
+
+/* Returns true if there is no more storage space available */
+uint8_t
+ao_log_full(void);
+
+/*
+ * ao_log_big.c
+ */
+
+/*
+ * The data log is recorded in the eeprom as a sequence
+ * of data packets.
+ *
+ * Each packet starts with a 4-byte header that has the
+ * packet type, the packet checksum and the tick count. Then
+ * they all contain 2 16 bit values which hold packet-specific
+ * data.
+ *
+ * For each flight, the first packet
+ * is FLIGHT packet, indicating the serial number of the
+ * device and a unique number marking the number of flights
+ * recorded by this device.
+ *
+ * During flight, data from the accelerometer and barometer
+ * are recorded in SENSOR packets, using the raw 16-bit values
+ * read from the A/D converter.
+ *
+ * Also during flight, but at a lower rate, the deployment
+ * sensors are recorded in DEPLOY packets. The goal here is to
+ * detect failure in the deployment circuits.
+ *
+ * STATE packets hold state transitions as the flight computer
+ * transitions through different stages of the flight.
+ */
+#define AO_LOG_FLIGHT          'F'
+#define AO_LOG_SENSOR          'A'
+#define AO_LOG_TEMP_VOLT       'T'
+#define AO_LOG_DEPLOY          'D'
+#define AO_LOG_STATE           'S'
+#define AO_LOG_GPS_TIME                'G'
+#define AO_LOG_GPS_LAT         'N'
+#define AO_LOG_GPS_LON         'W'
+#define AO_LOG_GPS_ALT         'H'
+#define AO_LOG_GPS_SAT         'V'
+#define AO_LOG_GPS_DATE                'Y'
+
+#define AO_LOG_POS_NONE                (~0UL)
+
+struct ao_log_record {
+       char                    type;
+       uint8_t                 csum;
+       uint16_t                tick;
+       union {
+               struct {
+                       int16_t         ground_accel;
+                       uint16_t        flight;
+               } flight;
+               struct {
+                       int16_t         accel;
+                       int16_t         pres;
+               } sensor;
+               struct {
+                       int16_t         temp;
+                       int16_t         v_batt;
+               } temp_volt;
+               struct {
+                       int16_t         drogue;
+                       int16_t         main;
+               } deploy;
+               struct {
+                       uint16_t        state;
+                       uint16_t        reason;
+               } state;
+               struct {
+                       uint8_t         hour;
+                       uint8_t         minute;
+                       uint8_t         second;
+                       uint8_t         flags;
+               } gps_time;
+               int32_t         gps_latitude;
+               int32_t         gps_longitude;
+               struct {
+                       int16_t         altitude;
+                       uint16_t        unused;
+               } gps_altitude;
+               struct {
+                       uint16_t        svid;
+                       uint8_t         unused;
+                       uint8_t         c_n;
+               } gps_sat;
+               struct {
+                       uint8_t         year;
+                       uint8_t         month;
+                       uint8_t         day;
+                       uint8_t         extra;
+               } gps_date;
+               struct {
+                       uint16_t        d0;
+                       uint16_t        d1;
+               } anon;
+       } u;
+};
+
+/* Write a record to the eeprom log */
+uint8_t
+ao_log_data(__xdata struct ao_log_record *log) __reentrant;
+
+#endif /* _AO_LOG_H_ */
index 9e1b06d31fc658e6fc7a0c6a4a9c375be38c4e4b..18ab85dd4fd5b9ab1aee3409784b8db165b43eb9 100644 (file)
@@ -15,7 +15,9 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-#include "ao.h"
+#include <ao.h>
+#include <ao_flight.h>
+#include <ao_sample.h>
 
 __code uint8_t ao_log_format = AO_LOG_FORMAT_TELEMETRY;
 
 
 __code uint8_t ao_log_format = AO_LOG_FORMAT_TELEMETRY;
 
index fb59580b8d4b123b729cf0a0712495282eac8da5..f79922f5ab8bdc52c2037a10b6f3ecc586b3a812 100644 (file)
@@ -70,26 +70,26 @@ __code __at(0x00aa) uint8_t ao_usb_descriptors [] =
 
        /* Header functional descriptor */
        0x05,
 
        /* Header functional descriptor */
        0x05,
-       CS_INTERFACE,
+       AO_USB_CS_INTERFACE,
        0x00,                   /*  bDescriptor SubType Header */
        LE_WORD(0x0110),        /*  CDC version 1.1 */
 
        /* Call management functional descriptor */
        0x05,
        0x00,                   /*  bDescriptor SubType Header */
        LE_WORD(0x0110),        /*  CDC version 1.1 */
 
        /* Call management functional descriptor */
        0x05,
-       CS_INTERFACE,
+       AO_USB_CS_INTERFACE,
        0x01,                   /* bDescriptor SubType Call Management */
        0x01,                   /* bmCapabilities = device handles call management */
        0x01,                   /* bDataInterface call management interface number */
 
        /* ACM functional descriptor */
        0x04,
        0x01,                   /* bDescriptor SubType Call Management */
        0x01,                   /* bmCapabilities = device handles call management */
        0x01,                   /* bDataInterface call management interface number */
 
        /* ACM functional descriptor */
        0x04,
-       CS_INTERFACE,
+       AO_USB_CS_INTERFACE,
        0x02,                   /* bDescriptor SubType Abstract Control Management */
        0x02,                   /* bmCapabilities = D1 (Set_line_Coding, Set_Control_Line_State, Get_Line_Coding and Serial_State) */
 
        /* Union functional descriptor */
        0x05,
        0x02,                   /* bDescriptor SubType Abstract Control Management */
        0x02,                   /* bmCapabilities = D1 (Set_line_Coding, Set_Control_Line_State, Get_Line_Coding and Serial_State) */
 
        /* Union functional descriptor */
        0x05,
-       CS_INTERFACE,
+       AO_USB_CS_INTERFACE,
        0x06,                   /* bDescriptor SubType Union Functional descriptor */
        0x00,                   /* bMasterInterface */
        0x01,                   /* bSlaveInterface0 */
        0x06,                   /* bDescriptor SubType Union Functional descriptor */
        0x00,                   /* bMasterInterface */
        0x01,                   /* bSlaveInterface0 */
index 7c9287928e28a5cdbd5ac8b6bce75a48594c88ee..eb90a4f8c6eb99b62dc83dbb71d33c6b8530d528 100644 (file)
@@ -16,6 +16,8 @@
  */
 
 #include "ao.h"
  */
 
 #include "ao.h"
+#include <ao_flight.h>
+#include <ao_sample.h>
 
 #define BIT(i,x)          ((x) ? (1 << (i)) : 0)
 #define MORSE1(a)          (1 | BIT(3,a))
 
 #define BIT(i,x)          ((x) ? (1 << (i)) : 0)
 #define MORSE1(a)          (1 | BIT(3,a))
diff --git a/src/core/ao_sample.h b/src/core/ao_sample.h
new file mode 100644 (file)
index 0000000..fb0e69e
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+ * Copyright Â© 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#ifndef _AO_SAMPLE_H_
+#define _AO_SAMPLE_H_
+
+/*
+ * ao_sample.c
+ */
+
+/*
+ * Barometer calibration
+ *
+ * We directly sample the barometer. The specs say:
+ *
+ * Pressure range: 15-115 kPa
+ * Voltage at 115kPa: 2.82
+ * Output scale: 27mV/kPa
+ *
+ * If we want to detect launch with the barometer, we need
+ * a large enough bump to not be fooled by noise. At typical
+ * launch elevations (0-2000m), a 200Pa pressure change cooresponds
+ * to about a 20m elevation change. This is 5.4mV, or about 3LSB.
+ * As all of our calculations are done in 16 bits, we'll actually see a change
+ * of 16 times this though
+ *
+ * 27 mV/kPa * 32767 / 3300 counts/mV = 268.1 counts/kPa
+ */
+
+/* Accelerometer calibration
+ *
+ * We're sampling the accelerometer through a resistor divider which
+ * consists of 5k and 10k resistors. This multiplies the values by 2/3.
+ * That goes into the cc1111 A/D converter, which is running at 11 bits
+ * of precision with the bits in the MSB of the 16 bit value. Only positive
+ * values are used, so values should range from 0-32752 for 0-3.3V. The
+ * specs say we should see 40mV/g (uncalibrated), multiply by 2/3 for what
+ * the A/D converter sees (26.67 mV/g). We should see 32752/3300 counts/mV,
+ * for a final computation of:
+ *
+ * 26.67 mV/g * 32767/3300 counts/mV = 264.8 counts/g
+ *
+ * Zero g was measured at 16000 (we would expect 16384).
+ * Note that this value is only require to tell if the
+ * rocket is standing upright. Once that is determined,
+ * the value of the accelerometer is averaged for 100 samples
+ * to find the resting accelerometer value, which is used
+ * for all further flight computations
+ */
+
+#define GRAVITY 9.80665
+
+/*
+ * Above this height, the baro sensor doesn't work
+ */
+#define AO_MAX_BARO_HEIGHT     12000
+
+/*
+ * Above this speed, baro measurements are unreliable
+ */
+#define AO_MAX_BARO_SPEED      200
+
+#define ACCEL_NOSE_UP  (ao_accel_2g >> 2)
+
+/*
+ * Speed and acceleration are scaled by 16 to provide a bit more
+ * resolution while still having reasonable range. Note that this
+ * limits speed to 2047m/s (around mach 6) and acceleration to
+ * 2047m/s² (over 200g)
+ */
+
+#define AO_M_TO_HEIGHT(m)      ((int16_t) (m))
+#define AO_MS_TO_SPEED(ms)     ((int16_t) ((ms) * 16))
+#define AO_MSS_TO_ACCEL(mss)   ((int16_t) ((mss) * 16))
+
+extern __pdata uint16_t        ao_sample_tick;         /* time of last data */
+extern __pdata int16_t ao_sample_pres;         /* most recent pressure sensor reading */
+extern __pdata int16_t ao_sample_alt;          /* MSL of ao_sample_pres */
+extern __pdata int16_t ao_sample_height;       /* AGL of ao_sample_pres */
+extern __data uint8_t  ao_sample_adc;          /* Ring position of last processed sample */
+
+#if HAS_ACCEL
+extern __pdata int16_t ao_sample_accel;        /* most recent accel sensor reading */
+#endif
+
+extern __pdata int16_t ao_ground_pres;         /* startup pressure */
+extern __pdata int16_t ao_ground_height;       /* MSL of ao_ground_pres */
+
+#if HAS_ACCEL
+extern __pdata int16_t ao_ground_accel;        /* startup acceleration */
+extern __pdata int16_t         ao_accel_2g;            /* factory accel calibration */
+extern __pdata int32_t ao_accel_scale;         /* sensor to m/s² conversion */
+#endif
+
+void ao_sample_init(void);
+
+/* returns FALSE in preflight mode, TRUE in flight mode */
+uint8_t ao_sample(void);
+
+/*
+ * ao_kalman.c
+ */
+
+#define to_fix16(x) ((int16_t) ((x) * 65536.0 + 0.5))
+#define to_fix32(x) ((int32_t) ((x) * 65536.0 + 0.5))
+#define from_fix(x)    ((x) >> 16)
+
+extern __pdata int16_t                 ao_height;      /* meters */
+extern __pdata int16_t                 ao_speed;       /* m/s * 16 */
+extern __pdata int16_t                 ao_accel;       /* m/s² * 16 */
+extern __pdata int16_t                 ao_max_height;  /* max of ao_height */
+extern __pdata int16_t                 ao_avg_height;  /* running average of height */
+
+extern __pdata int16_t                 ao_error_h;
+extern __pdata int16_t                 ao_error_h_sq_avg;
+
+#if HAS_ACCEL
+extern __pdata int16_t                 ao_error_a;
+#endif
+
+void ao_kalman(void);
+
+#endif /* _AO_SAMPLE_H_ */
diff --git a/src/core/ao_serial.h b/src/core/ao_serial.h
new file mode 100644 (file)
index 0000000..53aa8a8
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright Â© 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#ifndef _AO_SERIAL_H_
+#define _AO_SERIAL_H_
+
+#define AO_SERIAL_SPEED_4800   0
+#define AO_SERIAL_SPEED_9600   1
+#define AO_SERIAL_SPEED_19200  2
+#define AO_SERIAL_SPEED_57600  3
+
+#if HAS_SERIAL_0
+extern volatile __xdata struct ao_fifo ao_serial0_rx_fifo;
+extern volatile __xdata struct ao_fifo ao_serial0_tx_fifo;
+
+char
+ao_serial0_getchar(void);
+
+void
+ao_serial0_putchar(char c);
+
+void
+ao_serial0_drain(void);
+
+void
+ao_serial0_set_speed(uint8_t speed);
+#endif
+
+#if HAS_SERIAL_1
+extern volatile __xdata struct ao_fifo ao_serial1_rx_fifo;
+extern volatile __xdata struct ao_fifo ao_serial1_tx_fifo;
+
+char
+ao_serial1_getchar(void);
+
+char
+ao_serial1_pollchar(void);
+
+void
+ao_serial1_putchar(char c);
+
+void
+ao_serial1_drain(void);
+
+void
+ao_serial1_set_speed(uint8_t speed);
+#endif
+
+#if HAS_SERIAL_2
+extern volatile __xdata struct ao_fifo ao_serial2_rx_fifo;
+extern volatile __xdata struct ao_fifo ao_serial2_tx_fifo;
+
+char
+ao_serial2_getchar(void);
+
+char
+ao_serial2_pollchar(void);
+
+void
+ao_serial2_putchar(char c);
+
+void
+ao_serial2_drain(void);
+
+void
+ao_serial2_set_speed(uint8_t speed);
+#endif
+
+void
+ao_serial_init(void);
+
+#endif /* _AO_SERIAL_H_ */
index 2967e705cf013e9c3d08fb12a6e55da1c405f62e..18fa913e5a57126f55524ca87f541e3877e3985a 100644 (file)
  * Basic I/O functions to support SDCC stdio package
  */
 
  * Basic I/O functions to support SDCC stdio package
  */
 
+#ifdef SERIAL_STDIN_PORT
+#define USE_SERIAL_STDIN 1
+#else
+#define USE_SERIAL_STDIN 0
+#endif
+
 #define AO_NUM_STDIOS  (HAS_USB + PACKET_HAS_SLAVE + USE_SERIAL_STDIN)
 
 __xdata struct ao_stdio ao_stdios[AO_NUM_STDIOS];
 #define AO_NUM_STDIOS  (HAS_USB + PACKET_HAS_SLAVE + USE_SERIAL_STDIN)
 
 __xdata struct ao_stdio ao_stdios[AO_NUM_STDIOS];
index ff4747d0ec2bd2099b8a6e4c783fc19cf5be673b..66394e01296a199d6832f3dded53448e827009cb 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-#include "ao.h"
+#include <ao.h>
 
 uint8_t
 ao_storage_read(uint32_t pos, __xdata void *buf, uint16_t len) __reentrant
 
 uint8_t
 ao_storage_read(uint32_t pos, __xdata void *buf, uint16_t len) __reentrant
diff --git a/src/core/ao_storage.h b/src/core/ao_storage.h
new file mode 100644 (file)
index 0000000..873fe09
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Copyright Â© 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#ifndef _AO_STORAGE_H_
+#define _AO_STORAGE_H_
+
+/*
+ * Storage interface, provided by one of the eeprom or flash
+ * drivers
+ */
+
+/* Total bytes of available storage */
+extern __pdata uint32_t        ao_storage_total;
+
+/* Block size - device is erased in these units. At least 256 bytes */
+extern __pdata uint32_t        ao_storage_block;
+
+/* Byte offset of config block. Will be ao_storage_block bytes long */
+extern __pdata uint32_t        ao_storage_config;
+
+/* Storage unit size - device reads and writes must be within blocks of this size. Usually 256 bytes. */
+extern __pdata uint16_t ao_storage_unit;
+
+#define AO_STORAGE_ERASE_LOG   (ao_storage_config + AO_CONFIG_MAX_SIZE)
+
+/* Initialize above values. Can only be called once the OS is running */
+void
+ao_storage_setup(void) __reentrant;
+
+/* Write data. Returns 0 on failure, 1 on success */
+uint8_t
+ao_storage_write(uint32_t pos, __xdata void *buf, uint16_t len) __reentrant;
+
+/* Read data. Returns 0 on failure, 1 on success */
+uint8_t
+ao_storage_read(uint32_t pos, __xdata void *buf, uint16_t len) __reentrant;
+
+/* Erase a block of storage. This always clears ao_storage_block bytes */
+uint8_t
+ao_storage_erase(uint32_t pos) __reentrant;
+
+/* Flush any pending writes to stable storage */
+void
+ao_storage_flush(void) __reentrant;
+
+/* Initialize the storage code */
+void
+ao_storage_init(void);
+
+/*
+ * Low-level functions wrapped by ao_storage.c
+ */
+
+/* Read data within a storage unit */
+uint8_t
+ao_storage_device_read(uint32_t pos, __xdata void *buf, uint16_t len) __reentrant;
+
+/* Write data within a storage unit */
+uint8_t
+ao_storage_device_write(uint32_t pos, __xdata void *buf, uint16_t len) __reentrant;
+
+/* Initialize low-level device bits */
+void
+ao_storage_device_init(void);
+
+/* Print out information about flash chips */
+void
+ao_storage_device_info(void) __reentrant;
+
+#endif /* _AO_STORAGE_H_ */
diff --git a/src/core/ao_usb.h b/src/core/ao_usb.h
new file mode 100644 (file)
index 0000000..e051db9
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * Copyright Â© 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#ifndef _AO_USB_H_
+#define _AO_USB_H_
+
+/*
+ * ao_usb.c
+ */
+
+/* Put one character to the USB output queue */
+void
+ao_usb_putchar(char c);
+
+/* Get one character from the USB input queue */
+char
+ao_usb_getchar(void);
+
+/* Poll for a charcter on the USB input queue.
+ * returns AO_READ_AGAIN if none are available
+ */
+char
+ao_usb_pollchar(void);
+
+/* Flush the USB output queue */
+void
+ao_usb_flush(void);
+
+/* Enable the USB controller */
+void
+ao_usb_enable(void);
+
+/* Disable the USB controller */
+void
+ao_usb_disable(void);
+
+/* Initialize the USB system */
+void
+ao_usb_init(void);
+
+extern __code __at (0x00aa) uint8_t ao_usb_descriptors [];
+
+#define AO_USB_SETUP_DIR_MASK  (0x01 << 7)
+#define AO_USB_SETUP_TYPE_MASK (0x03 << 5)
+#define AO_USB_SETUP_RECIP_MASK        (0x1f)
+
+#define AO_USB_DIR_OUT                 0
+#define AO_USB_DIR_IN                  (1 << 7)
+
+#define AO_USB_TYPE_STANDARD           0
+#define AO_USB_TYPE_CLASS              (1 << 5)
+#define AO_USB_TYPE_VENDOR             (2 << 5)
+#define AO_USB_TYPE_RESERVED           (3 << 5)
+
+#define AO_USB_RECIP_DEVICE            0
+#define AO_USB_RECIP_INTERFACE         1
+#define AO_USB_RECIP_ENDPOINT          2
+#define AO_USB_RECIP_OTHER             3
+
+/* standard requests */
+#define        AO_USB_REQ_GET_STATUS           0x00
+#define AO_USB_REQ_CLEAR_FEATURE       0x01
+#define AO_USB_REQ_SET_FEATURE         0x03
+#define AO_USB_REQ_SET_ADDRESS         0x05
+#define AO_USB_REQ_GET_DESCRIPTOR      0x06
+#define AO_USB_REQ_SET_DESCRIPTOR      0x07
+#define AO_USB_REQ_GET_CONFIGURATION   0x08
+#define AO_USB_REQ_SET_CONFIGURATION   0x09
+#define AO_USB_REQ_GET_INTERFACE       0x0A
+#define AO_USB_REQ_SET_INTERFACE       0x0B
+#define AO_USB_REQ_SYNCH_FRAME         0x0C
+
+#define AO_USB_DESC_DEVICE             1
+#define AO_USB_DESC_CONFIGURATION      2
+#define AO_USB_DESC_STRING             3
+#define AO_USB_DESC_INTERFACE          4
+#define AO_USB_DESC_ENDPOINT           5
+#define AO_USB_DESC_DEVICE_QUALIFIER   6
+#define AO_USB_DESC_OTHER_SPEED                7
+#define AO_USB_DESC_INTERFACE_POWER    8
+
+#define AO_USB_GET_DESC_TYPE(x)                (((x)>>8)&0xFF)
+#define AO_USB_GET_DESC_INDEX(x)       ((x)&0xFF)
+
+#define AO_USB_CONTROL_EP      0
+#define AO_USB_CONTROL_SIZE    32
+
+#define AO_USB_INT_EP          1
+#define AO_USB_INT_SIZE                8
+
+#define AO_USB_OUT_EP          4
+#define AO_USB_IN_EP           5
+/*
+ * USB bulk packets can only come in 8, 16, 32 and 64
+ * byte sizes, so we'll use 64 for everything
+ */
+#define AO_USB_IN_SIZE         64
+#define AO_USB_OUT_SIZE                64
+
+#define AO_USB_EP0_IDLE                0
+#define AO_USB_EP0_DATA_IN     1
+#define AO_USB_EP0_DATA_OUT    2
+
+#define LE_WORD(x)    ((x)&0xFF),((uint8_t) (((uint16_t) (x))>>8))
+
+/* CDC definitions */
+#define AO_USB_CS_INTERFACE            0x24
+#define AO_USB_CS_ENDPOINT             0x25
+
+#define AO_USB_SET_LINE_CODING         0x20
+#define AO_USB_GET_LINE_CODING         0x21
+#define AO_USB_SET_CONTROL_LINE_STATE  0x22
+
+/* Data structure for GET_LINE_CODING / SET_LINE_CODING class requests */
+struct ao_usb_line_coding {
+       uint32_t        rate;
+       uint8_t         char_format;
+       uint8_t         parity;
+       uint8_t         data_bits;
+} ;
+
+#endif /* _AO_USB_H_ */
index 5eb788156ad4f893e025a95d4b583e56b76bef41..f193ac8ee25c0f4ef3731b33af13b6c8ee2caba5 100644 (file)
 
 #include "ao.h"
 
 
 #include "ao.h"
 
+#ifndef ao_serial_btm_getchar
+#define ao_serial_btm_putchar  ao_serial1_putchar
+#define ao_serial_btm_pollchar ao_serial1_pollchar
+#define ao_serial_btm_set_speed ao_serial1_set_speed
+#define ao_serial_btm_drain    ao_serial1_drain
+#endif
+
 int8_t                 ao_btm_stdio;
 __xdata uint8_t                ao_btm_connected;
 
 int8_t                 ao_btm_stdio;
 __xdata uint8_t                ao_btm_connected;
 
@@ -80,9 +87,9 @@ ao_btm_speed(void)
 {
        ao_cmd_decimal();
        if (ao_cmd_lex_u32 == 57600)
 {
        ao_cmd_decimal();
        if (ao_cmd_lex_u32 == 57600)
-               ao_serial_set_speed(AO_SERIAL_SPEED_57600);
+               ao_serial_btm_set_speed(AO_SERIAL_SPEED_57600);
        else if (ao_cmd_lex_u32 == 19200)
        else if (ao_cmd_lex_u32 == 19200)
-               ao_serial_set_speed(AO_SERIAL_SPEED_19200);
+               ao_serial_btm_set_speed(AO_SERIAL_SPEED_19200);
        else
                ao_cmd_status = ao_cmd_syntax_error;
 }
        else
                ao_cmd_status = ao_cmd_syntax_error;
 }
@@ -104,8 +111,6 @@ __code struct ao_cmds ao_btm_cmds[] = {
 #define AO_BTM_MAX_REPLY       16
 __xdata char           ao_btm_reply[AO_BTM_MAX_REPLY];
 
 #define AO_BTM_MAX_REPLY       16
 __xdata char           ao_btm_reply[AO_BTM_MAX_REPLY];
 
-extern volatile __xdata struct ao_fifo ao_usart1_rx_fifo;
-
 /*
  * Read a line of data from the serial port, truncating
  * it after a few characters.
 /*
  * Read a line of data from the serial port, truncating
  * it after a few characters.
@@ -119,7 +124,7 @@ ao_btm_get_line(void)
 
        for (;;) {
 
 
        for (;;) {
 
-               while ((c = ao_serial_pollchar()) != AO_READ_AGAIN) {
+               while ((c = ao_serial_btm_pollchar()) != AO_READ_AGAIN) {
                        ao_btm_log_in_char(c);
                        if (ao_btm_reply_len < sizeof (ao_btm_reply))
                                ao_btm_reply[ao_btm_reply_len++] = c;
                        ao_btm_log_in_char(c);
                        if (ao_btm_reply_len < sizeof (ao_btm_reply))
                                ao_btm_reply[ao_btm_reply_len++] = c;
@@ -128,7 +133,7 @@ ao_btm_get_line(void)
                }
                for (c = 0; c < 10; c++) {
                        ao_delay(AO_MS_TO_TICKS(10));
                }
                for (c = 0; c < 10; c++) {
                        ao_delay(AO_MS_TO_TICKS(10));
-                       if (!ao_fifo_empty(ao_usart1_rx_fifo))
+                       if (!ao_fifo_empty(ao_serial1_rx_fifo))
                                break;
                }
                if (c == 10)
                                break;
                }
                if (c == 10)
@@ -168,7 +173,7 @@ void
 ao_btm_putchar(char c)
 {
        ao_btm_log_out_char(c);
 ao_btm_putchar(char c)
 {
        ao_btm_log_out_char(c);
-       ao_serial_putchar(c);
+       ao_serial_btm_putchar(c);
        ao_delay(1);
 }
 
        ao_delay(1);
 }
 
@@ -229,8 +234,8 @@ ao_btm_set_name(void)
 uint8_t
 ao_btm_try_speed(uint8_t speed)
 {
 uint8_t
 ao_btm_try_speed(uint8_t speed)
 {
-       ao_serial_set_speed(speed);
-       ao_btm_drain();
+       ao_serial_btm_set_speed(speed);
+       ao_serial_btm_drain();
        (void) ao_btm_cmd("\rATE0\rATQ0\r");
        if (ao_btm_cmd("AT\r") == 1)
                return 1;
        (void) ao_btm_cmd("\rATE0\rATQ0\r");
        if (ao_btm_cmd("AT\r") == 1)
                return 1;
@@ -274,8 +279,8 @@ ao_btm(void)
        /* Turn off status reporting */
        ao_btm_cmd("ATQ1\r");
 
        /* Turn off status reporting */
        ao_btm_cmd("ATQ1\r");
 
-       ao_btm_stdio = ao_add_stdio(ao_serial_pollchar,
-                                   ao_serial_putchar,
+       ao_btm_stdio = ao_add_stdio(ao_serial_btm_pollchar,
+                                   ao_serial_btm_putchar,
                                    NULL);
        ao_btm_echo(0);
 
                                    NULL);
        ao_btm_echo(0);
 
@@ -341,7 +346,8 @@ void
 ao_btm_init (void)
 {
        ao_serial_init();
 ao_btm_init (void)
 {
        ao_serial_init();
-       ao_serial_set_speed(AO_SERIAL_SPEED_19200);
+
+       ao_serial_btm_set_speed(AO_SERIAL_SPEED_19200);
 
 #if BT_LINK_ON_P1
        /*
 
 #if BT_LINK_ON_P1
        /*
index f2abbf84033c663e36d14745ad0663c28b773656..91fc948b466fa18935fd5d3b6d34f5f65ce4cc83 100644 (file)
@@ -124,7 +124,13 @@ static __xdata struct sirf_measured_tracker_data   ao_sirf_tracker_data;
 static __pdata uint16_t ao_sirf_cksum;
 static __pdata uint16_t ao_sirf_len;
 
 static __pdata uint16_t ao_sirf_cksum;
 static __pdata uint16_t ao_sirf_len;
 
-#define ao_sirf_byte() ((uint8_t) ao_serial_getchar())
+#ifndef ao_sirf_getchar
+#define ao_sirf_getchar                ao_serial1_getchar
+#define ao_sirf_putchar                ao_serial1_putchar
+#define ao_sirf_set_speed      ao_serial1_set_speed
+#endif
+
+#define ao_sirf_byte() ((uint8_t) ao_sirf_getchar())
 
 static uint8_t data_byte(void)
 {
 
 static uint8_t data_byte(void)
 {
@@ -283,15 +289,15 @@ static void
 ao_gps_setup(void) __reentrant
 {
        uint8_t i, k;
 ao_gps_setup(void) __reentrant
 {
        uint8_t i, k;
-       ao_serial_set_speed(AO_SERIAL_SPEED_4800);
+       ao_sirf_set_speed(AO_SERIAL_SPEED_4800);
        for (i = 0; i < 64; i++)
        for (i = 0; i < 64; i++)
-               ao_serial_putchar(0x00);
+               ao_sirf_putchar(0x00);
        for (k = 0; k < 3; k++)
                for (i = 0; i < sizeof (ao_gps_set_nmea); i++)
        for (k = 0; k < 3; k++)
                for (i = 0; i < sizeof (ao_gps_set_nmea); i++)
-                       ao_serial_putchar(ao_gps_set_nmea[i]);
-       ao_serial_set_speed(AO_SERIAL_SPEED_57600);
+                       ao_sirf_putchar(ao_gps_set_nmea[i]);
+       ao_sirf_set_speed(AO_SERIAL_SPEED_57600);
        for (i = 0; i < 64; i++)
        for (i = 0; i < 64; i++)
-               ao_serial_putchar(0x00);
+               ao_sirf_putchar(0x00);
 }
 
 static const char ao_gps_set_message_rate[] = {
 }
 
 static const char ao_gps_set_message_rate[] = {
@@ -307,16 +313,16 @@ ao_sirf_set_message_rate(uint8_t msg, uint8_t rate) __reentrant
        uint8_t         i;
 
        for (i = 0; i < sizeof (ao_gps_set_message_rate); i++)
        uint8_t         i;
 
        for (i = 0; i < sizeof (ao_gps_set_message_rate); i++)
-               ao_serial_putchar(ao_gps_set_message_rate[i]);
-       ao_serial_putchar(msg);
-       ao_serial_putchar(rate);
+               ao_sirf_putchar(ao_gps_set_message_rate[i]);
+       ao_sirf_putchar(msg);
+       ao_sirf_putchar(rate);
        cksum = 0xa6 + msg + rate;
        for (i = 0; i < 4; i++)
        cksum = 0xa6 + msg + rate;
        for (i = 0; i < 4; i++)
-               ao_serial_putchar(0);
-       ao_serial_putchar((cksum >> 8) & 0x7f);
-       ao_serial_putchar(cksum & 0xff);
-       ao_serial_putchar(0xb0);
-       ao_serial_putchar(0xb3);
+               ao_sirf_putchar(0);
+       ao_sirf_putchar((cksum >> 8) & 0x7f);
+       ao_sirf_putchar(cksum & 0xff);
+       ao_sirf_putchar(0xb0);
+       ao_sirf_putchar(0xb3);
 }
 
 static const uint8_t sirf_disable[] = {
 }
 
 static const uint8_t sirf_disable[] = {
@@ -338,7 +344,7 @@ ao_gps(void) __reentrant
        for (k = 0; k < 5; k++)
        {
                for (i = 0; i < sizeof (ao_gps_config); i++)
        for (k = 0; k < 5; k++)
        {
                for (i = 0; i < sizeof (ao_gps_config); i++)
-                       ao_serial_putchar(ao_gps_config[i]);
+                       ao_sirf_putchar(ao_gps_config[i]);
                for (i = 0; i < sizeof (sirf_disable); i++)
                        ao_sirf_set_message_rate(sirf_disable[i], 0);
                ao_sirf_set_message_rate(41, 1);
                for (i = 0; i < sizeof (sirf_disable); i++)
                        ao_sirf_set_message_rate(sirf_disable[i], 0);
                ao_sirf_set_message_rate(41, 1);
index 39e36cc8e32a1ffe86497ca3a30703af8b01613e..84616a05d0a8729de7e7379387e7cf898424dd5f 100644 (file)
 #endif
 
 #ifndef ao_gps_getchar
 #endif
 
 #ifndef ao_gps_getchar
-#define ao_gps_getchar ao_serial_getchar
+#define ao_gps_getchar ao_serial1_getchar
 #endif
 
 #ifndef ao_gps_putchar
 #endif
 
 #ifndef ao_gps_putchar
-#define ao_gps_putchar ao_serial_putchar
+#define ao_gps_putchar ao_serial1_putchar
 #endif
 
 #ifndef ao_gps_set_speed
 #endif
 
 #ifndef ao_gps_set_speed
-#define ao_gps_set_speed       ao_serial_set_speed
+#define ao_gps_set_speed       ao_serial1_set_speed
 #endif
 
 __xdata uint8_t ao_gps_mutex;
 #endif
 
 __xdata uint8_t ao_gps_mutex;
index 1ebb1480b36927167fc38c035ccbb06b6796ccfb..fa9db98bad80315b6806c74512b3c2ff76ab0f70 100644 (file)
@@ -17,6 +17,7 @@
 
 #include "ao.h"
 #include "ao_product.h"
 
 #include "ao.h"
 #include "ao_product.h"
+#include "ao_flight.h"
 
 struct ao_companion_command    ao_companion_command;
 
 
 struct ao_companion_command    ao_companion_command;
 
index e4e5def64ef8c59e05463f77423a1dfd3dcdb392..f761e5c3602ab46753f5ae654c74d14722745dd3 100644 (file)
@@ -61,6 +61,8 @@
 #define ao_gps_putchar         ao_serial3_putchar
 #define ao_gps_set_speed       ao_serial3_set_speed
 
 #define ao_gps_putchar         ao_serial3_putchar
 #define ao_gps_set_speed       ao_serial3_set_speed
 
+#define HAS_EEPROM             1
+#define USE_INTERNAL_FLASH     0
 #define HAS_USB                        1
 #define HAS_BEEP               1
 
 #define HAS_USB                        1
 #define HAS_BEEP               1
 
index 97c9d792b0885b4c5c8f25dca9282c89a49e501f..46c63418bab456ccf3c5b4e864d8672de6bbfbcd 100644 (file)
@@ -17,7 +17,9 @@
 
 #include "ao.h"
 
 
 #include "ao.h"
 
+#if HAS_LOG
 __code uint8_t ao_log_format = AO_LOG_FORMAT_NONE;     /* until we actually log stuff */
 __code uint8_t ao_log_format = AO_LOG_FORMAT_NONE;     /* until we actually log stuff */
+#endif
 
 void
 main(void)
 
 void
 main(void)
index 8875ff487b7438040a9f8dd9478f8428e1f2bb61..963c7be41182d938479ec6c07a4b13878816c692 100644 (file)
@@ -16,6 +16,7 @@
  */
 
 #include "ao.h"
  */
 
 #include "ao.h"
+#include <ao_flight.h>
 #include <math.h>
 
 static __xdata struct ao_telemetry_sensor              ao_tel_sensor;
 #include <math.h>
 
 static __xdata struct ao_telemetry_sensor              ao_tel_sensor;
index adb6eb947a30daec3e4c6ff02c051ff3f5e69fc8..62af86f776faba6cd1ac17c64256b4336e6c06aa 100644 (file)
@@ -181,8 +181,6 @@ void ao_lcd_font_init(void);
 
 void ao_lcd_font_string(char *s);
 
 
 void ao_lcd_font_string(char *s);
 
-#define USE_SERIAL_STDIN       (USE_SERIAL_1_STDIN + USE_SERIAL_2_STDIN + USE_SERIAL_3_STDIN)
-
 char
 ao_serial1_getchar(void);
 
 char
 ao_serial1_getchar(void);
 
index 3cebc0944d1359ecc828d6b8e34ca72382cbb062..406da9fbb6739099c12fa4867eec61611a5f7a88 100644 (file)
@@ -249,7 +249,7 @@ ao_serial2_set_speed(uint8_t speed)
 
 struct ao_stm_usart ao_stm_usart3;
 
 
 struct ao_stm_usart ao_stm_usart3;
 
-void stm_usart3_isr(void) { ao_usart_isr(&ao_stm_usart3, USE_SERIAL_3_STDIN); }
+void stm_usart3_isr(void) { ao_usart_isr(&ao_stm_usart3, USE_SERIAL_2_STDIN); }
 
 char
 ao_serial3_getchar(void)
 
 char
 ao_serial3_getchar(void)
diff --git a/src/stm/ao_usb.h b/src/stm/ao_usb.h
deleted file mode 100644 (file)
index d3129d3..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright Â© 2009 Keith Packard <keithp@keithp.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- */
-
-#ifndef _AO_USB_H_
-#define _AO_USB_H_
-
-#define AO_USB_SETUP_DIR_MASK  (0x01 << 7)
-#define AO_USB_SETUP_TYPE_MASK (0x03 << 5)
-#define AO_USB_SETUP_RECIP_MASK        (0x1f)
-
-#define AO_USB_DIR_OUT                 0
-#define AO_USB_DIR_IN                  (1 << 7)
-
-#define AO_USB_TYPE_STANDARD           0
-#define AO_USB_TYPE_CLASS              (1 << 5)
-#define AO_USB_TYPE_VENDOR             (2 << 5)
-#define AO_USB_TYPE_RESERVED           (3 << 5)
-
-#define AO_USB_RECIP_DEVICE            0
-#define AO_USB_RECIP_INTERFACE         1
-#define AO_USB_RECIP_ENDPOINT          2
-#define AO_USB_RECIP_OTHER             3
-
-/* standard requests */
-#define        AO_USB_REQ_GET_STATUS           0x00
-#define AO_USB_REQ_CLEAR_FEATURE       0x01
-#define AO_USB_REQ_SET_FEATURE         0x03
-#define AO_USB_REQ_SET_ADDRESS         0x05
-#define AO_USB_REQ_GET_DESCRIPTOR      0x06
-#define AO_USB_REQ_SET_DESCRIPTOR      0x07
-#define AO_USB_REQ_GET_CONFIGURATION   0x08
-#define AO_USB_REQ_SET_CONFIGURATION   0x09
-#define AO_USB_REQ_GET_INTERFACE       0x0A
-#define AO_USB_REQ_SET_INTERFACE       0x0B
-#define AO_USB_REQ_SYNCH_FRAME         0x0C
-
-#define AO_USB_DESC_DEVICE             1
-#define AO_USB_DESC_CONFIGURATION      2
-#define AO_USB_DESC_STRING             3
-#define AO_USB_DESC_INTERFACE          4
-#define AO_USB_DESC_ENDPOINT           5
-#define AO_USB_DESC_DEVICE_QUALIFIER   6
-#define AO_USB_DESC_OTHER_SPEED                7
-#define AO_USB_DESC_INTERFACE_POWER    8
-
-#define AO_USB_GET_DESC_TYPE(x)                (((x)>>8)&0xFF)
-#define AO_USB_GET_DESC_INDEX(x)       ((x)&0xFF)
-
-#define AO_USB_CONTROL_EP      0
-#define AO_USB_INT_EP          1
-#define AO_USB_OUT_EP          4
-#define AO_USB_IN_EP           5
-#define AO_USB_CONTROL_SIZE    32
-/*
- * Double buffer IN and OUT EPs, so each
- * gets half of the available space
- *
- * Ah, but USB bulk packets can only come in 8, 16, 32 and 64
- * byte sizes, so we'll use 64 for everything
- */
-#define AO_USB_INT_SIZE                8
-#define AO_USB_IN_SIZE         64
-#define AO_USB_OUT_SIZE                64
-
-#define AO_USB_EP0_IDLE                0
-#define AO_USB_EP0_DATA_IN     1
-#define AO_USB_EP0_DATA_OUT    2
-
-#define LE_WORD(x)    ((x)&0xFF),((uint8_t) (((uint16_t) (x))>>8))
-
-/* CDC definitions */
-#define CS_INTERFACE      0x24
-#define CS_ENDPOINT       0x25
-
-#define SET_LINE_CODING         0x20
-#define GET_LINE_CODING         0x21
-#define SET_CONTROL_LINE_STATE  0x22
-
-/* Data structure for GET_LINE_CODING / SET_LINE_CODING class requests */
-struct ao_usb_line_coding {
-       uint32_t        rate;
-       uint8_t         char_format;
-       uint8_t         parity;
-       uint8_t         data_bits;
-} ;
-
-#endif /* _AO_USB_H_ */
index 5a447d4308e15d415d1fa27d2e94e28752df924e..586f1e3326df53d20d28302d1c7b3b08a9c09a8d 100644 (file)
@@ -717,17 +717,17 @@ ao_usb_ep0_setup(void)
        case AO_USB_TYPE_CLASS:
                debug ("Class setup packet\n");
                switch (ao_usb_setup.request) {
        case AO_USB_TYPE_CLASS:
                debug ("Class setup packet\n");
                switch (ao_usb_setup.request) {
-               case SET_LINE_CODING:
+               case AO_USB_SET_LINE_CODING:
                        debug ("set line coding\n");
                        ao_usb_ep0_out_len = 7;
                        ao_usb_ep0_out_data = (uint8_t *) &ao_usb_line_coding;
                        break;
                        debug ("set line coding\n");
                        ao_usb_ep0_out_len = 7;
                        ao_usb_ep0_out_data = (uint8_t *) &ao_usb_line_coding;
                        break;
-               case GET_LINE_CODING:
+               case AO_USB_GET_LINE_CODING:
                        debug ("get line coding\n");
                        ao_usb_ep0_in_len = 7;
                        ao_usb_ep0_in_data = (uint8_t *) &ao_usb_line_coding;
                        break;
                        debug ("get line coding\n");
                        ao_usb_ep0_in_len = 7;
                        ao_usb_ep0_in_data = (uint8_t *) &ao_usb_line_coding;
                        break;
-               case SET_CONTROL_LINE_STATE:
+               case AO_USB_SET_CONTROL_LINE_STATE:
                        break;
                }
                break;
                        break;
                }
                break;
index a96c6f2b7c76a691ba7eafc4cf5a570434061b6c..3305719a577acf5192a77cf8f4b4c8dd2ad9a0c8 100644 (file)
@@ -30,7 +30,6 @@
        #define HAS_BEEP                1
        #define HAS_GPS                 1
        #define HAS_SERIAL_1            1
        #define HAS_BEEP                1
        #define HAS_GPS                 1
        #define HAS_SERIAL_1            1
-       #define USE_SERIAL_STDIN        0
        #define HAS_ADC                 1
        #define HAS_EEPROM              1
        #define HAS_LOG                 1
        #define HAS_ADC                 1
        #define HAS_EEPROM              1
        #define HAS_LOG                 1
 #error Please define HAS_SERIAL_1
 #endif
 
 #error Please define HAS_SERIAL_1
 #endif
 
-#ifndef USE_SERIAL_STDIN
-#error Please define USE_SERIAL_STDIN
-#endif
-
 #ifndef HAS_ADC
 #error Please define HAS_ADC
 #endif
 #ifndef HAS_ADC
 #error Please define HAS_ADC
 #endif
index 2f664fcb7b9e4fa430045867f2d71d8bc8ccecdc..2ac7e747c049de78c67ab2dba58763d1d2353af4 100644 (file)
@@ -85,8 +85,10 @@ load: $(PROG).hex
 ao_product.h: ao-make-product.5c ../Version
        $(call quiet,NICKLE,$<) $< -m altusmetrum.org -i $(IDPRODUCT) -p $(PRODUCT) -v $(VERSION) > $@
 
 ao_product.h: ao-make-product.5c ../Version
        $(call quiet,NICKLE,$<) $< -m altusmetrum.org -i $(IDPRODUCT) -p $(PRODUCT) -v $(VERSION) > $@
 
-ao_product.rel: ao_product.c ao_product.h
-       $(call quiet,CC) -c $(CFLAGS) -D PRODUCT_DEFS='\"ao_product.h\"' -o$@ $<
+ao_product.o: ao_product.c ao_product.h
+
+%.o : %.c
+       $(call quiet,CC) -c $(CFLAGS) $<
 
 distclean:     clean
 
 
 distclean:     clean
 
index be99f10dd7076bf8b47b5f92623b14872f0fcc72..10e4a2a301e01f5600fa56f3270dcd6e111b7427 100644 (file)
@@ -22,7 +22,8 @@ INC = \
        ao.h \
        ao_arch.h \
        ao_usb.h \
        ao.h \
        ao_arch.h \
        ao_usb.h \
-       ao_pins.h
+       ao_pins.h \
+       ao_product.h
 
 #
 # Common AltOS sources
 
 #
 # Common AltOS sources
@@ -96,8 +97,10 @@ load: $(PROG).hex
 ao_product.h: ao-make-product.5c ../Version
        $(call quiet,NICKLE,$<) $< -m altusmetrum.org -i $(IDPRODUCT) -p $(PRODUCT) -v $(VERSION) > $@
 
 ao_product.h: ao-make-product.5c ../Version
        $(call quiet,NICKLE,$<) $< -m altusmetrum.org -i $(IDPRODUCT) -p $(PRODUCT) -v $(VERSION) > $@
 
-ao_product.rel: ao_product.c ao_product.h
-       $(call quiet,CC) -c $(CFLAGS) -D PRODUCT_DEFS='\"ao_product.h\"' -o$@ $<
+ao_product.o: ao_product.c ao_product.h
+
+%.o : %.c $(INC)
+       $(call quiet,CC) -c $(CFLAGS) $<
 
 distclean:     clean
 
 
 distclean:     clean
 
index 4478047663daae2470609e845f28a894aa504c13..c1f45f37ecd1eae2f9f7c1434b285e6e51a85a71 100644 (file)
@@ -54,7 +54,6 @@ CC1111_SRC = \
        ao_radio.c \
        ao_romconfig.c \
        ao_serial.c \
        ao_radio.c \
        ao_romconfig.c \
        ao_serial.c \
-       ao_serial0.c \
        ao_string.c \
        ao_timer.c \
        ao_usb.c \
        ao_string.c \
        ao_timer.c \
        ao_usb.c \
index 7ff859af879dd5063c19760a556ee0d145161ce8..e6e19f67b5f876defd9f1d07941ca3e8818dc703 100644 (file)
@@ -23,7 +23,7 @@ ao_ardu_serial_recv(void)
        char    c;
 
        for (;;) {
        char    c;
 
        for (;;) {
-               if (ao_fifo_empty(ao_usart0_rx_fifo))
+               if (ao_fifo_empty(ao_serial0_rx_fifo))
                        flush();
                c = ao_serial0_getchar();
                putchar (c);
                        flush();
                c = ao_serial0_getchar();
                putchar (c);
@@ -35,6 +35,5 @@ static __xdata struct ao_task ao_ardu_serial_recv_task;
 void
 ao_ardu_serial_init (void)
 {
 void
 ao_ardu_serial_init (void)
 {
-       ao_serial0_init();
        ao_add_task(&ao_ardu_serial_recv_task, ao_ardu_serial_recv, "recv");
 }
        ao_add_task(&ao_ardu_serial_recv_task, ao_ardu_serial_recv, "recv");
 }
index a907e2a512d0dcba668ca086478ba06e0c25f851..701e25fc314b3e8830b27a1f93cecad3106df4d5 100644 (file)
        #define HAS_SERIAL_1_ALT_1      1
        #define HAS_SERIAL_1_ALT_2      0
        #define HAS_SERIAL_1_HW_FLOW    1
        #define HAS_SERIAL_1_ALT_1      1
        #define HAS_SERIAL_1_ALT_2      0
        #define HAS_SERIAL_1_HW_FLOW    1
-       #define USE_SERIAL_STDIN        1
+       #define USE_SERIAL_1_STDIN      1
        #define HAS_SERIAL_0            1
        #define HAS_SERIAL_0_ALT_1      0
        #define HAS_SERIAL_0_ALT_2      1
        #define HAS_SERIAL_0_HW_FLOW    0
        #define HAS_ADC                 0
        #define HAS_DBG                 1
        #define HAS_SERIAL_0            1
        #define HAS_SERIAL_0_ALT_1      0
        #define HAS_SERIAL_0_ALT_2      1
        #define HAS_SERIAL_0_HW_FLOW    0
        #define HAS_ADC                 0
        #define HAS_DBG                 1
-       #define HAS_EEPROM              0
+       #define HAS_EEPROM              1
        #define HAS_LOG                 0
        #define USE_INTERNAL_FLASH      1
        #define HAS_BTM                 1
        #define HAS_LOG                 0
        #define USE_INTERNAL_FLASH      1
        #define HAS_BTM                 1
 #error Please define HAS_SERIAL_1
 #endif
 
 #error Please define HAS_SERIAL_1
 #endif
 
-#ifndef USE_SERIAL_STDIN
-#error Please define USE_SERIAL_STDIN
-#endif
-
 #ifndef HAS_ADC
 #error Please define HAS_ADC
 #endif
 #ifndef HAS_ADC
 #error Please define HAS_ADC
 #endif
index fd12ce7a7580e19060427143b4e32fd3ce6b7993..4c32817af214eb3cc624ea41f2b2589c71e6e757 100644 (file)
@@ -17,7 +17,9 @@
 
 #include "ao.h"
 
 
 #include "ao.h"
 
+#if 0
 __code uint8_t ao_log_format = AO_LOG_FORMAT_NONE;     /* until we actually log stuff */
 __code uint8_t ao_log_format = AO_LOG_FORMAT_NONE;     /* until we actually log stuff */
+#endif
 
 void
 main(void)
 
 void
 main(void)
@@ -43,6 +45,7 @@ main(void)
        ao_aes_init();
        ao_radio_cmac_init();
 #endif
        ao_aes_init();
        ao_radio_cmac_init();
 #endif
+       ao_serial_init();
        ao_ardu_serial_init();
        ao_config_init();
        ao_start_scheduler();
        ao_ardu_serial_init();
        ao_config_init();
        ao_start_scheduler();
index 33de055eae83eaf48142ad9d370a56dc1896de69..ba7177afe88451011b7d6f8f168f0ff40dc97d8d 100644 (file)
@@ -25,7 +25,6 @@
        #define HAS_GPS                 0
        #define HAS_SERIAL_1            0
        #define HAS_ADC                 0
        #define HAS_GPS                 0
        #define HAS_SERIAL_1            0
        #define HAS_ADC                 0
-       #define USE_SERIAL_STDIN        0
        #define HAS_EEPROM              1
        #define HAS_LOG                 1
        #define USE_INTERNAL_FLASH      0
        #define HAS_EEPROM              1
        #define HAS_LOG                 1
        #define USE_INTERNAL_FLASH      0
 #error Please define HAS_SERIAL_1
 #endif
 
 #error Please define HAS_SERIAL_1
 #endif
 
-#ifndef USE_SERIAL_STDIN
-#error Please define USE_SERIAL_STDIN
-#endif
-
 #ifndef HAS_ADC
 #error Please define HAS_ADC
 #endif
 #ifndef HAS_ADC
 #error Please define HAS_ADC
 #endif
index 29b97385a4ae229772c1e84c57499588382001bb..2bea4e04bca273ce066805b46855c16cbbc4ec12 100644 (file)
@@ -25,7 +25,6 @@
        #define HAS_GPS                 1
        #define HAS_SERIAL_1            1
        #define HAS_ADC                 0
        #define HAS_GPS                 1
        #define HAS_SERIAL_1            1
        #define HAS_ADC                 0
-       #define USE_SERIAL_STDIN        0
        #define HAS_EEPROM              1
        #define HAS_LOG                 1
        #define USE_INTERNAL_FLASH      0
        #define HAS_EEPROM              1
        #define HAS_LOG                 1
        #define USE_INTERNAL_FLASH      0
 #error Please define HAS_SERIAL_1
 #endif
 
 #error Please define HAS_SERIAL_1
 #endif
 
-#ifndef USE_SERIAL_STDIN
-#error Please define USE_SERIAL_STDIN
-#endif
-
 #ifndef HAS_ADC
 #error Please define HAS_ADC
 #endif
 #ifndef HAS_ADC
 #error Please define HAS_ADC
 #endif
index 93d7a9abc6ee5e3371cf72f33fda50d19dd9ad50..4d4012df10b54e11ed7d1d9f26681ac649faf246 100644 (file)
@@ -317,7 +317,7 @@ static uint8_t      sirf_in_message[4096];
 static int     sirf_in_len;
 
 char
 static int     sirf_in_len;
 
 char
-ao_serial_getchar(void)
+ao_serial1_getchar(void)
 {
        char    c;
        uint8_t uc;
 {
        char    c;
        uint8_t uc;
@@ -351,7 +351,7 @@ ao_serial_getchar(void)
 
 
 void
 
 
 void
-ao_serial_putchar(char c)
+ao_serial1_putchar(char c)
 {
        int     i;
        uint8_t uc = (uint8_t) c;
 {
        int     i;
        uint8_t uc = (uint8_t) c;
@@ -388,7 +388,7 @@ ao_serial_putchar(char c)
 #define AO_SERIAL_SPEED_57600  1
 
 static void
 #define AO_SERIAL_SPEED_57600  1
 
 static void
-ao_serial_set_speed(uint8_t speed)
+ao_serial1_set_speed(uint8_t speed)
 {
        int     fd = ao_gps_fd;
        struct termios  termios;
 {
        int     fd = ao_gps_fd;
        struct termios  termios;
index a78fae0fefcda4f49ecf6a3b04107976fc57baf0..88bed3054ff9d985dba2a8acce1ad71c992d112b 100644 (file)
@@ -319,7 +319,7 @@ static uint8_t      skytraq_in_message[4096];
 static int     skytraq_in_len;
 
 char
 static int     skytraq_in_len;
 
 char
-ao_serial_getchar(void)
+ao_serial1_getchar(void)
 {
        char    c;
        uint8_t uc;
 {
        char    c;
        uint8_t uc;
@@ -354,7 +354,7 @@ ao_serial_getchar(void)
 
 
 void
 
 
 void
-ao_serial_putchar(char c)
+ao_serial1_putchar(char c)
 {
        int     i;
        uint8_t uc = (uint8_t) c;
 {
        int     i;
        uint8_t uc = (uint8_t) c;
@@ -392,7 +392,7 @@ ao_serial_putchar(char c)
 #define AO_SERIAL_SPEED_57600  2
 
 static void
 #define AO_SERIAL_SPEED_57600  2
 
 static void
-ao_serial_set_speed(uint8_t speed)
+ao_serial1_set_speed(uint8_t speed)
 {
        int     fd = ao_gps_fd;
        struct termios  termios;
 {
        int     fd = ao_gps_fd;
        struct termios  termios;