X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=ao.h;h=c4cb5bf7176d526b2ea4a4bbe887684778070a59;hp=2cad7621c5e5db33d072954149ed05b66b441924;hb=35ac66969abe24ca23776618306a59fc17770e06;hpb=4a050704ad2c497e9f1b0988334228b0bbc4c170 diff --git a/ao.h b/ao.h index 2cad7621..c4cb5bf7 100644 --- a/ao.h +++ b/ao.h @@ -23,13 +23,16 @@ #include #include "cc1111.h" +#define TRUE 1 +#define FALSE 0 + /* Convert a __data pointer into an __xdata pointer */ #define DATA_TO_XDATA(a) ((void __xdata *) ((uint8_t) (a) | 0xff00)) /* Stack runs from above the allocated __data space to 0xfe, which avoids * writing to 0xff as that triggers the stack overflow indicator */ -#define AO_STACK_START 0x7e +#define AO_STACK_START 0x80 #define AO_STACK_END 0xfe #define AO_STACK_SIZE (AO_STACK_END - AO_STACK_START + 1) @@ -44,7 +47,7 @@ struct ao_task { extern __xdata struct ao_task *__data ao_cur_task; -#define AO_NUM_TASKS 10 /* maximum number of tasks */ +#define AO_NUM_TASKS 16 /* maximum number of tasks */ #define AO_NO_TASK 0 /* no task id */ /* @@ -241,13 +244,17 @@ ao_led_off(uint8_t colors); void ao_led_set(uint8_t colors); +/* Toggle the specified LEDs */ +void +ao_led_toggle(uint8_t colors); + /* Turn on the specified LEDs for the indicated interval */ void ao_led_for(uint8_t colors, uint16_t ticks) __reentrant; /* Initialize the LEDs */ void -ao_led_init(void); +ao_led_init(uint8_t enable); /* * ao_usb.c @@ -255,10 +262,10 @@ ao_led_init(void); /* Put one character to the USB output queue */ void -ao_usb_putchar(uint8_t c); +ao_usb_putchar(char c); /* Get one character from the USB input queue */ -uint8_t +char ao_usb_getchar(void); /* Flush the USB output queue */ @@ -269,6 +276,14 @@ ao_usb_flush(void); void ao_usb_isr(void) interrupt 6; +/* 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); @@ -284,7 +299,7 @@ enum ao_cmd_status { }; extern __xdata uint16_t ao_cmd_lex_i; -extern __xdata uint8_t ao_cmd_lex_c; +extern __xdata char ao_cmd_lex_c; extern __xdata enum ao_cmd_status ao_cmd_status; void @@ -302,8 +317,11 @@ ao_cmd_white(void); void ao_cmd_hex(void); +void +ao_cmd_decimal(void); + struct ao_cmds { - uint8_t cmd; + char cmd; void (*func)(void); const char *help; }; @@ -447,12 +465,12 @@ struct ao_gps_pos { #define AO_LOG_POS_NONE (~0UL) struct ao_log_record { - uint8_t type; + char type; uint8_t csum; uint16_t tick; union { struct { - uint16_t serial; + int16_t ground_accel; uint16_t flight; } flight; struct { @@ -550,6 +568,7 @@ extern __pdata enum ao_flight_state ao_flight_state; extern __pdata uint16_t ao_flight_tick; extern __pdata int16_t ao_flight_accel; extern __pdata int16_t ao_flight_pres; +extern __pdata int32_t ao_flight_vel; extern __pdata int16_t ao_ground_pres; extern __pdata int16_t ao_ground_accel; extern __pdata int16_t ao_min_pres; @@ -581,10 +600,10 @@ int16_t ao_pres_to_altitude(int16_t pres) __reentrant; int16_t -ao_temp_to_dC(int16_t temp) __reentrant; +ao_altitude_to_pres(int16_t alt) __reentrant; int16_t -ao_accel_to_cm_per_s2(int16_t accel) __reentrant; +ao_temp_to_dC(int16_t temp) __reentrant; /* * ao_dbg.c @@ -639,11 +658,11 @@ void ao_serial_tx1_isr(void) interrupt 14; #endif -uint8_t +char ao_serial_getchar(void) __critical; void -ao_serial_putchar(uint8_t c) __critical; +ao_serial_putchar(char c) __critical; void ao_serial_init(void); @@ -686,17 +705,44 @@ ao_gps_print(__xdata struct ao_gps_data *gps_data); void ao_gps_init(void); +/* + * ao_gps_report.c + */ + +void +ao_gps_report(void); + +void +ao_gps_report_init(void); + /* * ao_telemetry.c */ +#define AO_MAX_CALLSIGN 8 + struct ao_telemetry { uint8_t addr; uint8_t flight_state; + int16_t flight_accel; + int16_t ground_accel; + int32_t flight_vel; + int16_t flight_pres; + int16_t ground_pres; struct ao_adc adc; struct ao_gps_data gps; + char callsign[AO_MAX_CALLSIGN]; }; +/* Set delay between telemetry reports (0 to disable) */ + +#define AO_TELEMETRY_INTERVAL_PAD AO_MS_TO_TICKS(1000) +#define AO_TELEMETRY_INTERVAL_FLIGHT AO_MS_TO_TICKS(50) +#define AO_TELEMETRY_INTERVAL_RECOVER AO_MS_TO_TICKS(1000) + +void +ao_telemetry_set_interval(uint16_t interval); + void ao_telemetry_init(void); @@ -709,7 +755,7 @@ ao_radio_send(__xdata struct ao_telemetry *telemetry) __reentrant; struct ao_radio_recv { struct ao_telemetry telemetry; - uint8_t rssi; + int8_t rssi; uint8_t status; }; @@ -729,7 +775,10 @@ void ao_monitor(void); void -ao_monitor_init(void); +ao_set_monitor(uint8_t monitoring); + +void +ao_monitor_init(uint8_t led, uint8_t monitoring) __reentrant; /* * ao_stdio.c @@ -763,5 +812,115 @@ ao_igniter_status(enum ao_igniter igniter); void ao_igniter_init(void); -#endif /* _AO_H_ */ +/* + * ao_config.c + */ + +#define AO_CONFIG_MAJOR 1 +#define AO_CONFIG_MINOR 0 + +struct ao_config { + uint8_t major; + uint8_t minor; + uint16_t main_deploy; + int16_t accel_zero_g; + uint8_t radio_channel; + char callsign[AO_MAX_CALLSIGN + 1]; +}; + +extern __xdata struct ao_config ao_config; + +void +ao_config_get(void); + +void +ao_config_init(void); +/* + * ao_rssi.c + */ + +void +ao_rssi_set(int rssi_value); + +void +ao_rssi_init(uint8_t rssi_led); + +/* + * ao_product.c + * + * values which need to be defined for + * each instance of a product + */ + +extern const uint8_t ao_usb_descriptors []; +extern const uint16_t ao_serial_number; +extern const char ao_version[]; +extern const char ao_manufacturer[]; +extern const char ao_product[]; + +/* + * Fifos + */ + +#define AO_FIFO_SIZE 32 + +struct ao_fifo { + uint8_t insert; + uint8_t remove; + char fifo[AO_FIFO_SIZE]; +}; + +#define ao_fifo_insert(f,c) do { \ + (f).fifo[(f).insert] = (c); \ + (f).insert = ((f).insert + 1) & (AO_FIFO_SIZE-1); \ +} while(0) + +#define ao_fifo_remove(f,c) do {\ + c = (f).fifo[(f).remove]; \ + (f).remove = ((f).remove + 1) & (AO_FIFO_SIZE-1); \ +} while(0) + +#define ao_fifo_full(f) ((((f).insert + 1) & (AO_FIFO_SIZE-1)) == (f).remove) +#define ao_fifo_empty(f) ((f).insert == (f).remove) + +/* + * ao_packet.c + * + * Packet-based command interface + */ + +#define AO_PACKET_MAX 32 +#define AO_PACKET_WIN 256 + +#define AO_PACKET_FIN (1 << 0) +#define AO_PACKET_SYN (1 << 1) +#define AO_PACKET_RST (1 << 2) +#define AO_PACKET_ACK (1 << 3) + +struct ao_packet { + uint8_t addr; + uint8_t flags; + uint16_t seq; + uint16_t ack; + uint16_t window; + uint8_t len; + uint8_t d[AO_PACKET_MAX]; +}; + +uint8_t +ao_packet_connect(uint8_t dest); + +uint8_t +ao_packet_accept(void); + +int +ao_packet_send(uint8_t *data, int len); + +int +ao_packet_recv(uint8_t *data, int len); + +void +ao_packet_init(void); + +#endif /* _AO_H_ */