X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fao.h;h=fd8c6034bd2cdb7384a5ce7bfd50d0832f6a4e60;hb=1a8f45e7b720d01d3ff0c35ed1caaf8cbe0c3119;hp=f23e4134ac0e9713208ceed47968fc312cb6399d;hpb=e4ba9bf4291bf17c777c8c3ef7c71e4a30b9947a;p=fw%2Faltos diff --git a/src/ao.h b/src/ao.h index f23e4134..fd8c6034 100644 --- a/src/ao.h +++ b/src/ao.h @@ -163,6 +163,15 @@ struct ao_adc { #endif #if HAS_ADC + +#if HAS_ACCEL +#ifndef HAS_ACCEL_REF +#error Please define HAS_ACCEL_REF +#endif +#else +#define HAS_ACCEL_REF 0 +#endif + /* * ao_adc.c */ @@ -178,6 +187,9 @@ struct ao_adc { */ 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 @@ -295,7 +307,14 @@ extern __code __at (0x00a0) uint16_t ao_romconfig_version; extern __code __at (0x00a2) uint16_t ao_romconfig_check; extern __code __at (0x00a4) uint16_t ao_serial_number; extern __code __at (0x00a6) uint32_t ao_radio_cal; + +#ifndef HAS_USB +#error Please define HAS_USB +#endif + +#if HAS_USB extern __code __at (0x00aa) uint8_t ao_usb_descriptors []; +#endif /* * ao_usb.c @@ -319,9 +338,11 @@ ao_usb_pollchar(void); void ao_usb_flush(void); +#if HAS_USB /* USB interrupt handler */ void ao_usb_isr(void) __interrupt 6; +#endif /* Enable the USB controller */ void @@ -372,7 +393,6 @@ uint8_t ao_match_word(__code char *word); struct ao_cmds { - char cmd; void (*func)(void); const char *help; }; @@ -443,16 +463,15 @@ extern __xdata uint32_t ao_storage_block; /* Byte offset of config block. Will be ao_storage_block bytes long */ extern __xdata uint32_t ao_storage_config; +/* Storage unit size - device reads and writes must be within blocks of this size. Usually 256 bytes. */ +extern __xdata 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); -/* Flush any pending write data */ -void -ao_storage_flush(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; @@ -463,16 +482,104 @@ 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); +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 __xdata enum flight_state ao_log_state; + +/* required functions from the underlying log system */ + +/* 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. @@ -571,40 +678,6 @@ struct ao_log_record { uint8_t ao_log_data(__xdata struct ao_log_record *log) __reentrant; -/* Flush the log */ -void -ao_log_flush(void); - -/* 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; - -/* Retrieve first log record for the current flight */ -uint8_t -ao_log_dump_first(void); - -/* return next log record for the current flight */ -uint8_t -ao_log_dump_next(void); - -/* Logging thread main routine */ -void -ao_log(void); - -/* 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); - /* * ao_flight.c */ @@ -622,7 +695,7 @@ enum ao_flight_state { ao_flight_invalid = 9 }; -extern __xdata struct ao_adc ao_flight_data; +extern __data uint8_t ao_flight_adc; extern __pdata enum ao_flight_state ao_flight_state; extern __pdata uint16_t ao_flight_tick; extern __pdata int16_t ao_flight_accel; @@ -829,7 +902,7 @@ ao_gps_report_init(void); #define AO_TELEMETRY_VERSION 3 struct ao_telemetry { - uint8_t addr; + uint16_t serial; uint16_t flight; uint8_t flight_state; int16_t flight_accel; @@ -887,13 +960,13 @@ ao_radio_get(void); #define ao_radio_put() ao_mutex_put(&ao_radio_mutex) void -ao_radio_set_telemetry(void); +ao_radio_set_fixed_pkt(size_t size); -void -ao_radio_set_packet(void); +#define ao_radio_set_telemetry() \ + ao_radio_set_fixed_pkt(sizeof (struct ao_telemetry)) -void -ao_radio_set_rdf(void); +#define ao_radio_set_packet() \ + ao_radio_set_fixed_pkt(sizeof (struct ao_packet)) void ao_radio_send(__xdata void *data, uint8_t size) __reentrant; @@ -983,7 +1056,7 @@ ao_igniter_init(void); */ #define AO_CONFIG_MAJOR 1 -#define AO_CONFIG_MINOR 3 +#define AO_CONFIG_MINOR 4 struct ao_config { uint8_t major; @@ -995,6 +1068,7 @@ struct ao_config { uint8_t apogee_delay; /* minor version 1 */ int16_t accel_minus_g; /* minor version 2 */ uint32_t radio_cal; /* minor version 3 */ + uint32_t flight_log_max; /* minor version 4 */ }; extern __xdata struct ao_config ao_config; @@ -1027,7 +1101,6 @@ ao_rssi_init(uint8_t rssi_led); * each instance of a product */ -extern __code __at(0x00aa) uint8_t ao_usb_descriptors []; extern const char ao_version[]; extern const char ao_manufacturer[]; extern const char ao_product[];