#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_ */
#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 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_EEPROM 1
#define HAS_STORAGE_DEBUG 0
#define AVR_VCC_5V 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 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_ */
#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)
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
}
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_fifo_remove(ao_usart1_tx_fifo, UDR1);
+ ao_fifo_remove(ao_serial1_tx_fifo, UDR1);
}
}
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
-ao_serial_getchar(void) __critical
+ao_serial1_getchar(void) __critical
{
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;
}
-#if USE_SERIAL_STDIN
+#if USE_SERIAL_1_STDIN
char
-ao_serial_pollchar(void) __critical
+ao_serial1_pollchar(void) __critical
{
char c;
cli();
- if (ao_fifo_empty(ao_usart1_rx_fifo)) {
+ if (ao_fifo_empty(ao_serial1_rx_fifo)) {
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
-ao_serial_putchar(char c) __critical
+ao_serial1_putchar(char c) __critical
{
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_drain(void) __critical
+ao_serial1_drain(void) __critical
{
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();
}
};
void
-ao_serial_set_speed(uint8_t speed)
+ao_serial1_set_speed(uint8_t speed)
{
ao_serial_drain();
if (speed > AO_SERIAL_SPEED_57600)
(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
}
+++ /dev/null
-/*
- * 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_ */
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;
- 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;
- case SET_CONTROL_LINE_STATE:
+ case AO_USB_SET_CONTROL_LINE_STATE:
break;
}
break;
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_ */
#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_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_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_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_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_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_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_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_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_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_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_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
#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
#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
-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
}
-static __xdata uint8_t ao_serial_tx1_started;
+static __xdata uint8_t ao_serial1_tx_started;
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
-ao_serial_tx1_isr(void) __interrupt 14
+ao_serial1_tx_isr(void) __interrupt 14
{
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
-ao_serial_getchar(void) __critical
+ao_serial1_getchar(void) __critical
{
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;
}
-#if USE_SERIAL_STDIN
+#if USE_SERIAL_1_STDIN
char
-ao_serial_pollchar(void) __critical
+ao_serial1_pollchar(void) __critical
{
char c;
- if (ao_fifo_empty(ao_usart1_rx_fifo))
+ if (ao_fifo_empty(ao_serial1_rx_fifo))
return AO_READ_AGAIN;
- ao_fifo_remove(ao_usart1_rx_fifo,c);
+ ao_fifo_remove(ao_serial1_rx_fifo,c);
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
-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[] = {
};
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;
U1GCR = ao_serial_speeds[speed].gcr;
}
+#endif /* HAS_SERIAL_1 */
+
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;
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 |
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 */
}
+++ /dev/null
-/*
- * 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;
-}
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;
- 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;
- case SET_CONTROL_LINE_STATE:
+ case AO_USB_SET_CONTROL_LINE_STATE:
break;
}
break;
+++ /dev/null
-/*
- * 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_ */
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
-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
-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
#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
-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
-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
-void ao_kalman(void);
+#if HAS_FLIGHT
+#include <ao_flight.h>
+#include <ao_sample.h>
+#endif
/*
* ao_report.c
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
-#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
--- /dev/null
+/*
+ * 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_ */
--- /dev/null
+/*
+ * 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_ */
--- /dev/null
+/*
+ * 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_ */
--- /dev/null
+/*
+ * 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_ */
--- /dev/null
+/*
+ * 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_ */
--- /dev/null
+/*
+ * 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_ */
* 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;
/* 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,
- 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,
- 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,
- CS_INTERFACE,
+ AO_USB_CS_INTERFACE,
0x06, /* bDescriptor SubType Union Functional descriptor */
0x00, /* bMasterInterface */
0x01, /* bSlaveInterface0 */
*/
#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))
--- /dev/null
+/*
+ * 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_ */
--- /dev/null
+/*
+ * 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_ */
* 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];
* 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
--- /dev/null
+/*
+ * 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_ */
--- /dev/null
+/*
+ * 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_ */
#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;
{
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)
- 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;
}
#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.
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;
}
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)
ao_btm_putchar(char c)
{
ao_btm_log_out_char(c);
- ao_serial_putchar(c);
+ ao_serial_btm_putchar(c);
ao_delay(1);
}
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;
/* 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);
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
/*
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)
{
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++)
- ao_serial_putchar(0x00);
+ ao_sirf_putchar(0x00);
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++)
- ao_serial_putchar(0x00);
+ ao_sirf_putchar(0x00);
}
static const char ao_gps_set_message_rate[] = {
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++)
- 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[] = {
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);
#endif
#ifndef ao_gps_getchar
-#define ao_gps_getchar ao_serial_getchar
+#define ao_gps_getchar ao_serial1_getchar
#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
-#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;
#include "ao.h"
#include "ao_product.h"
+#include "ao_flight.h"
struct ao_companion_command ao_companion_command;
#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
#include "ao.h"
+#if HAS_LOG
__code uint8_t ao_log_format = AO_LOG_FORMAT_NONE; /* until we actually log stuff */
+#endif
void
main(void)
*/
#include "ao.h"
+#include <ao_flight.h>
#include <math.h>
static __xdata struct ao_telemetry_sensor ao_tel_sensor;
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);
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)
+++ /dev/null
-/*
- * 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_ */
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;
- 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;
- case SET_CONTROL_LINE_STATE:
+ case AO_USB_SET_CONTROL_LINE_STATE:
break;
}
break;
#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
#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
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
ao.h \
ao_arch.h \
ao_usb.h \
- ao_pins.h
+ ao_pins.h \
+ ao_product.h
#
# Common AltOS sources
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
ao_radio.c \
ao_romconfig.c \
ao_serial.c \
- ao_serial0.c \
ao_string.c \
ao_timer.c \
ao_usb.c \
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);
void
ao_ardu_serial_init (void)
{
- ao_serial0_init();
ao_add_task(&ao_ardu_serial_recv_task, ao_ardu_serial_recv, "recv");
}
#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_EEPROM 0
+ #define HAS_EEPROM 1
#define HAS_LOG 0
#define USE_INTERNAL_FLASH 1
#define HAS_BTM 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
#include "ao.h"
+#if 0
__code uint8_t ao_log_format = AO_LOG_FORMAT_NONE; /* until we actually log stuff */
+#endif
void
main(void)
ao_aes_init();
ao_radio_cmac_init();
#endif
+ ao_serial_init();
ao_ardu_serial_init();
ao_config_init();
ao_start_scheduler();
#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
#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
#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
#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
static int sirf_in_len;
char
-ao_serial_getchar(void)
+ao_serial1_getchar(void)
{
char c;
uint8_t uc;
void
-ao_serial_putchar(char c)
+ao_serial1_putchar(char c)
{
int i;
uint8_t uc = (uint8_t) c;
#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;
static int skytraq_in_len;
char
-ao_serial_getchar(void)
+ao_serial1_getchar(void)
{
char c;
uint8_t uc;
void
-ao_serial_putchar(char c)
+ao_serial1_putchar(char c)
{
int i;
uint8_t uc = (uint8_t) c;
#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;