X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=ao.h;h=02810d05baefa61683254fdbb53149e128428603;hp=23f131722f087a2a1940d2cbc700e7fe8cc79125;hb=d87e9c25947d7cc2eba8894a524977f2c55a089a;hpb=5e2393eb6b1a6d7b180bd63d5165ee7b7ff5f9e0 diff --git a/ao.h b/ao.h index 23f13172..02810d05 100644 --- a/ao.h +++ b/ao.h @@ -29,7 +29,7 @@ /* 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 0x5c +#define AO_STACK_START 0x68 #define AO_STACK_END 0xfe #define AO_STACK_SIZE (AO_STACK_END - AO_STACK_START + 1) @@ -38,6 +38,7 @@ struct ao_task { __xdata void *wchan; /* current wait channel (NULL if running) */ uint8_t stack_count; /* amount of saved stack */ uint8_t task_id; /* index in the task array */ + __code char *name; /* task name */ uint8_t stack[AO_STACK_SIZE]; /* saved stack */ }; @@ -51,11 +52,11 @@ extern __xdata struct ao_task *__data ao_cur_task; */ /* Suspend the current task until wchan is awoken */ -int +void ao_sleep(__xdata void *wchan); /* Wake all tasks sleeping on wchan */ -int +void ao_wakeup(__xdata void *wchan); /* Yield the processor to another task */ @@ -64,7 +65,11 @@ ao_yield(void) _naked; /* Add a task to the run queue */ void -ao_add_task(__xdata struct ao_task * task, void (*start)(void)); +ao_add_task(__xdata struct ao_task * task, void (*start)(void), __code char *name); + +/* Dump task info to console */ +void +ao_task_info(void); /* Start the scheduler. This will not return */ void @@ -79,6 +84,7 @@ ao_start_scheduler(void); #define AO_PANIC_MUTEX 3 /* Mis-using mutex API */ #define AO_PANIC_EE 4 /* Mis-using eeprom API */ #define AO_PANIC_LOG 5 /* Failing to read/write log data */ +#define AO_PANIC_CMD 6 /* Too many command sets registered */ /* Stop the operating system, beeping and blinking the reason */ void @@ -100,6 +106,10 @@ ao_time(void); void ao_delay(uint16_t ticks); +/* Set the ADC interval */ +void +ao_timer_set_adc_interval(uint8_t interval) __critical; + /* Timer interrupt */ void ao_timer_isr(void) interrupt 9; @@ -147,8 +157,10 @@ void ao_adc_get(__xdata struct ao_adc *packet); /* The A/D interrupt handler */ +#if !AO_NO_ADC_ISR void ao_adc_isr(void) interrupt 1; +#endif /* Initialize the A/D converter */ void @@ -262,6 +274,41 @@ ao_usb_init(void); /* * ao_cmd.c */ + +enum ao_cmd_status { + ao_cmd_success = 0, + ao_cmd_lex_error = 1, + ao_cmd_syntax_error = 2, +}; + +extern __xdata uint16_t ao_cmd_lex_i; +extern __xdata uint8_t ao_cmd_lex_c; +extern __xdata enum ao_cmd_status ao_cmd_status; + +void +ao_cmd_lex(void); + +void +ao_cmd_put8(uint8_t v); + +void +ao_cmd_put16(uint16_t v); + +void +ao_cmd_white(void); + +void +ao_cmd_hex(void); + +struct ao_cmds { + uint8_t cmd; + void (*func)(void); + const char *help; +}; + +void +ao_cmd_register(__code struct ao_cmds *cmds); + void ao_cmd_init(void); @@ -352,6 +399,14 @@ ao_ee_init(void); * ao_log.c */ +/* Structure containing GPS position, either lat or lon */ + +struct ao_gps_pos { + uint8_t degrees; + uint8_t minutes; + uint16_t minutes_fraction; /* in units of 1/10000 minutes */ +}; + /* * The data log is recorded in the eeprom as a sequence * of data packets. @@ -382,6 +437,10 @@ ao_ee_init(void); #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_POS_NONE (~0UL) @@ -410,6 +469,18 @@ struct ao_log_record { uint16_t state; uint16_t reason; } state; + struct { + uint8_t hour; + uint8_t minute; + uint8_t second; + uint8_t flags; + } gps_time; + struct ao_gps_pos gps_latitude; + struct ao_gps_pos gps_longitude; + struct { + int16_t altitude; + uint16_t unused; + } gps_altitude; struct { uint16_t d0; uint16_t d1; @@ -447,6 +518,10 @@ ao_log(void); void ao_log_start(void); +/* Stop logging */ +void +ao_log_stop(void); + /* Initialize the logging system */ void ao_log_init(void); @@ -456,27 +531,27 @@ ao_log_init(void); */ enum ao_flight_state { - ao_flight_startup, - ao_flight_idle, - ao_flight_launchpad, - ao_flight_boost, - ao_flight_coast, - ao_flight_apogee, - ao_flight_drogue, - ao_flight_main, - ao_flight_landed, - ao_flight_invalid + ao_flight_startup = 0, + ao_flight_idle = 1, + ao_flight_launchpad = 2, + ao_flight_boost = 3, + ao_flight_coast = 4, + ao_flight_apogee = 5, + ao_flight_drogue = 6, + ao_flight_main = 7, + ao_flight_landed = 8, + ao_flight_invalid = 9 }; -extern __xdata struct ao_adc ao_flight_data; -extern __data enum flight_state ao_flight_state; -extern __data uint16_t ao_flight_state_tick; -extern __data int16_t ao_flight_accel; -extern __data int16_t ao_flight_pres; -extern __data int16_t ao_ground_pres; -extern __data int16_t ao_ground_accel; -extern __data int16_t ao_min_pres; -extern __data uint16_t ao_launch_time; +extern __xdata struct ao_adc ao_flight_data; +extern __pdata enum 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 int16_t ao_ground_pres; +extern __pdata int16_t ao_ground_accel; +extern __pdata int16_t ao_min_pres; +extern __pdata uint16_t ao_launch_time; /* Flight thread */ void @@ -491,9 +566,173 @@ ao_flight_init(void); */ void -ao_report_notify(void); +ao_report_init(void); + +/* + * ao_convert.c + * + * Given raw data, convert to SI units + */ + +/* pressure from the sensor to altitude in meters */ +int16_t +ao_pres_to_altitude(int16_t pres) __reentrant; +int16_t +ao_temp_to_dC(int16_t temp) __reentrant; + +int16_t +ao_accel_to_cm_per_s2(int16_t accel) __reentrant; + +/* + * ao_dbg.c + * + * debug another telemetrum board + */ + +/* Send a byte to the dbg target */ void -ao_report_init(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 + */ + +#if !AO_NO_SERIAL_ISR +void +ao_serial_rx1_isr(void) interrupt 3; + +void +ao_serial_tx1_isr(void) interrupt 14; +#endif + +uint8_t +ao_serial_getchar(void) __critical; + +void +ao_serial_putchar(uint8_t c) __critical; + +void +ao_serial_init(void); + +/* + * ao_gps.c + */ + +#define AO_GPS_NUM_SAT_MASK (0xf << 0) +#define AO_GPS_NUM_SAT_SHIFT (0) + +#define AO_GPS_VALID (1 << 4) +#define AO_GPS_LONGITUDE_MASK (1 << 5) +#define AO_GPS_LONGITUDE_EAST (0 << 5) +#define AO_GPS_LONGITUDE_WEST (1 << 5) + +#define AO_GPS_LATITUDE_MASK (1 << 6) +#define AO_GPS_LATITUDE_NORTH (0 << 6) +#define AO_GPS_LATITUDE_SOUTH (1 << 6) + +struct ao_gps_data { + uint8_t hour; + uint8_t minute; + uint8_t second; + uint8_t flags; + struct ao_gps_pos latitude; + struct ao_gps_pos longitude; + int16_t altitude; +}; + +extern __xdata uint8_t ao_gps_mutex; +extern __xdata struct ao_gps_data ao_gps_data; + +void +ao_gps(void); + +void +ao_gps_print(__xdata struct ao_gps_data *gps_data); + +void +ao_gps_init(void); + +/* + * ao_telemetry.c + */ + +struct ao_telemetry { + uint8_t addr; + uint8_t flight_state; + struct ao_adc adc; + struct ao_gps_data gps; +}; + +void +ao_telemetry_init(void); + +/* + * ao_radio.c + */ + +void +ao_radio_send(__xdata struct ao_telemetry *telemetry) __reentrant; + +struct ao_radio_recv { + struct ao_telemetry telemetry; + uint8_t rssi; + uint8_t status; +}; + +void +ao_radio_recv(__xdata struct ao_radio_recv *recv) __reentrant; + +void +ao_radio_init(void); + +/* + * ao_monitor.c + */ + +void +ao_monitor(void); + +void +ao_monitor_init(void); + +/* + * ao_stdio.c + */ + +void +flush(void); #endif /* _AO_H_ */ +