#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
*/
*/
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
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
void
ao_usb_flush(void);
+#if HAS_USB
/* USB interrupt handler */
void
ao_usb_isr(void) __interrupt 6;
+#endif
/* Enable the USB controller */
void
ao_match_word(__code char *word);
struct ao_cmds {
- char cmd;
void (*func)(void);
const char *help;
};
/* 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;
/* 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.
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
*/
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;
#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;
#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;
*/
#define AO_CONFIG_MAJOR 1
-#define AO_CONFIG_MINOR 3
+#define AO_CONFIG_MINOR 4
struct ao_config {
uint8_t major;
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;
* 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[];