Switch from GPLv2 to GPLv2+
[fw/altos] / src / kernel / ao.h
index b1f850ba9f10aa6db47aabdcd9a746205a985315..0f878df5be68f4aff61ba9c39247f333e6e5e243 100644 (file)
@@ -3,7 +3,8 @@
  *
  * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of
 #define HAS_TASK       1
 #endif
 
-#ifndef AO_PORT_TYPE
-#define AO_PORT_TYPE uint8_t
-#endif
-
 typedef AO_PORT_TYPE ao_port_t;
 
 #if HAS_TASK
@@ -76,6 +73,8 @@ typedef AO_PORT_TYPE ao_port_t;
 #define AO_PANIC_BUFIO         15      /* Mis-using bufio API */
 #define AO_PANIC_EXTI          16      /* Mis-using exti API */
 #define AO_PANIC_FAST_TIMER    17      /* Mis-using fast timer API */
+#define AO_PANIC_ADC           18      /* Mis-using ADC interface */
+#define AO_PANIC_IRQ           19      /* interrupts not blocked */
 #define AO_PANIC_SELF_TEST_CC1120      0x40 | 1        /* Self test failure */
 #define AO_PANIC_SELF_TEST_HMC5883     0x40 | 2        /* Self test failure */
 #define AO_PANIC_SELF_TEST_MPU6000     0x40 | 3        /* Self test failure */
@@ -127,11 +126,24 @@ ao_timer_init(void);
 void
 ao_clock_init(void);
 
+#if AO_POWER_MANAGEMENT
+/* Go to low power clock */
+void
+ao_clock_suspend(void);
+
+/* Restart full-speed clock */
+void
+ao_clock_resume(void);
+#endif
+
 /*
  * ao_mutex.c
  */
 
 #ifndef ao_mutex_get
+uint8_t
+ao_mutex_try(__xdata uint8_t *ao_mutex, uint8_t task_id) __reentrant;
+
 void
 ao_mutex_get(__xdata uint8_t *ao_mutex) __reentrant;
 
@@ -275,15 +287,17 @@ ao_report_init(void);
  * Given raw data, convert to SI units
  */
 
+#if HAS_BARO
 /* pressure from the sensor to altitude in meters */
-int16_t
-ao_pres_to_altitude(int16_t pres) __reentrant;
+alt_t
+ao_pres_to_altitude(pres_t pres) __reentrant;
 
-int16_t
-ao_altitude_to_pres(int16_t alt) __reentrant;
+pres_t
+ao_altitude_to_pres(alt_t alt) __reentrant;
 
 int16_t
 ao_temp_to_dC(int16_t temp) __reentrant;
+#endif
 
 /*
  * ao_convert_pa.c
@@ -293,11 +307,13 @@ ao_temp_to_dC(int16_t temp) __reentrant;
 
 #include <ao_data.h>
 
+#if HAS_BARO
 alt_t
-ao_pa_to_altitude(int32_t pa);
+ao_pa_to_altitude(pres_t pa);
 
 int32_t
 ao_altitude_to_pa(alt_t alt);
+#endif
 
 #if HAS_DBG
 #include <ao_dbg.h>
@@ -511,15 +527,12 @@ struct ao_telemetry_raw_recv {
 
 /* Set delay between telemetry reports (0 to disable) */
 
-#ifdef AO_SEND_ALL_BARO
-#define AO_TELEMETRY_INTERVAL_PAD      AO_MS_TO_TICKS(100)
-#define AO_TELEMETRY_INTERVAL_FLIGHT   AO_MS_TO_TICKS(100)
-#define AO_TELEMETRY_INTERVAL_RECOVER  AO_MS_TO_TICKS(100)
-#else
 #define AO_TELEMETRY_INTERVAL_PAD      AO_MS_TO_TICKS(1000)
 #define AO_TELEMETRY_INTERVAL_FLIGHT   AO_MS_TO_TICKS(100)
 #define AO_TELEMETRY_INTERVAL_RECOVER  AO_MS_TO_TICKS(1000)
-#endif
+
+void
+ao_telemetry_reset_interval(void);
 
 void
 ao_telemetry_set_interval(uint16_t interval);
@@ -558,6 +571,15 @@ extern __xdata int8_t      ao_radio_rssi;
 #define HAS_RADIO_XMIT HAS_RADIO
 #endif
 
+#define AO_RADIO_RATE_38400    0
+#define AO_RADIO_RATE_9600     1
+#define AO_RADIO_RATE_2400     2
+#define AO_RADIO_RATE_MAX      AO_RADIO_RATE_2400
+
+#if defined(HAS_RADIO) && !defined(HAS_RADIO_RATE)
+#define HAS_RADIO_RATE HAS_RADIO
+#endif
+
 void
 ao_radio_general_isr(void) ao_arch_interrupt(16);
 
@@ -643,6 +665,7 @@ union ao_monitor {
 extern __xdata union ao_monitor ao_monitor_ring[AO_MONITOR_RING];
 
 #define ao_monitor_ring_next(n)        (((n) + 1) & (AO_MONITOR_RING - 1))
+#define ao_monitor_ring_prev(n)        (((n) - 1) & (AO_MONITOR_RING - 1))
 
 extern __data uint8_t ao_monitoring;
 extern __data uint8_t ao_monitor_head;
@@ -740,6 +763,7 @@ ao_igniter_init(void);
 /*
  * ao_config.c
  */
+#include <ao_config.h>
 
 #if AO_PYRO_NUM
 #include <ao_pyro.h>
@@ -752,93 +776,17 @@ ao_igniter_init(void);
 extern __xdata uint8_t ao_force_freq;
 #endif
 
-#define AO_CONFIG_MAJOR        1
-#define AO_CONFIG_MINOR        16
-
-#define AO_AES_LEN 16
-
-extern __xdata uint8_t ao_config_aes_seq;
-
-struct ao_config {
-       uint8_t         major;
-       uint8_t         minor;
-       uint16_t        main_deploy;
-       int16_t         accel_plus_g;           /* changed for minor version 2 */
-       uint8_t         _legacy_radio_channel;
-       char            callsign[AO_MAX_CALLSIGN + 1];
-       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 */
-       uint8_t         ignite_mode;            /* minor version 5 */
-       uint8_t         pad_orientation;        /* minor version 6 */
-       uint32_t        radio_setting;          /* minor version 7 */
-       uint8_t         radio_enable;           /* minor version 8 */
-       uint8_t         aes_key[AO_AES_LEN];    /* minor version 9 */
-       uint32_t        frequency;              /* minor version 10 */
-       uint16_t        apogee_lockout;         /* minor version 11 */
-#if AO_PYRO_NUM
-       struct ao_pyro  pyro[AO_PYRO_NUM];      /* minor version 12 */
-#endif
-       uint16_t        aprs_interval;          /* minor version 13 */
-#if HAS_RADIO_POWER
-       uint8_t         radio_power;            /* minor version 14 */
-#endif
-#if HAS_RADIO_AMP
-       uint8_t         radio_amp;              /* minor version 14 */
-#endif
-#if HAS_GYRO
-       int16_t         accel_zero_along;       /* minor version 15 */
-       int16_t         accel_zero_across;      /* minor version 15 */
-       int16_t         accel_zero_through;     /* minor version 15 */
-#endif
-#if HAS_BEEP
-       uint8_t         mid_beep;               /* minor version 16 */
-#endif
-};
-
-#define AO_IGNITE_MODE_DUAL            0
-#define AO_IGNITE_MODE_APOGEE          1
-#define AO_IGNITE_MODE_MAIN            2
-
-#define AO_RADIO_ENABLE_CORE           1
-#define AO_RADIO_DISABLE_TELEMETRY     2
-#define AO_RADIO_DISABLE_RDF           4
-
-#define AO_PAD_ORIENTATION_ANTENNA_UP  0
-#define AO_PAD_ORIENTATION_ANTENNA_DOWN        1
-
-extern __xdata struct ao_config ao_config;
-
-#define AO_CONFIG_MAX_SIZE     128
-
-void
-_ao_config_edit_start(void);
-
-void
-_ao_config_edit_finish(void);
-
-void
-ao_config_get(void);
-
-void
-ao_config_put(void);
-
-void
-ao_config_set_radio(void);
-
-void
-ao_config_init(void);
-
 /*
  * ao_rssi.c
  */
 
+#ifdef AO_LED_TYPE
 void
-ao_rssi_set(int rssi_value);
+ao_rssi_set(int16_t rssi_value);
 
 void
-ao_rssi_init(uint8_t rssi_led);
+ao_rssi_init(AO_LED_TYPE rssi_led);
+#endif
 
 /*
  * ao_product.c
@@ -874,6 +822,8 @@ struct ao_fifo {
 } while(0)
 
 #define ao_fifo_full(f)                ((((f).insert + 1) & (AO_FIFO_SIZE-1)) == (f).remove)
+#define ao_fifo_mostly(f)      ((((f).insert - (f).remove) & (AO_FIFO_SIZE-1)) >= (AO_FIFO_SIZE * 3 / 4))
+#define ao_fifo_barely(f)      ((((f).insert - (f).remove) & (AO_FIFO_SIZE-1)) >= (AO_FIFO_SIZE * 1 / 4))
 #define ao_fifo_empty(f)       ((f).insert == (f).remove)
 
 #if PACKET_HAS_MASTER || PACKET_HAS_SLAVE