diff options
Diffstat (limited to 'src/kernel')
| -rw-r--r-- | src/kernel/ao.h | 12 | ||||
| -rw-r--r-- | src/kernel/ao_config.c | 9 | ||||
| -rw-r--r-- | src/kernel/ao_gps_print.c | 6 | ||||
| -rw-r--r-- | src/kernel/ao_log.h | 17 | ||||
| -rw-r--r-- | src/kernel/ao_monitor.c | 11 | ||||
| -rw-r--r-- | src/kernel/ao_serial.h | 12 | ||||
| -rw-r--r-- | src/kernel/ao_stdio.c | 2 | ||||
| -rw-r--r-- | src/kernel/ao_telemetry.c | 173 | ||||
| -rw-r--r-- | src/kernel/ao_telemetry.h | 10 | ||||
| -rw-r--r-- | src/kernel/ao_tracker.c | 10 | 
10 files changed, 151 insertions, 111 deletions
diff --git a/src/kernel/ao.h b/src/kernel/ao.h index ad5bbf8e..59a469ae 100644 --- a/src/kernel/ao.h +++ b/src/kernel/ao.h @@ -43,10 +43,6 @@  #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 +72,7 @@ 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_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 */ @@ -518,15 +515,9 @@ 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); @@ -662,6 +653,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; diff --git a/src/kernel/ao_config.c b/src/kernel/ao_config.c index 6b8a1813..8dab7c42 100644 --- a/src/kernel/ao_config.c +++ b/src/kernel/ao_config.c @@ -557,10 +557,10 @@ ao_config_radio_rate_set(void) __reentrant  	}  	_ao_config_edit_start();  	ao_config.radio_rate = ao_cmd_lex_i; +	_ao_config_edit_finish();  #if HAS_TELEMETRY  	ao_telemetry_reset_interval();  #endif -	_ao_config_edit_finish();  #if HAS_RADIO_RECV  	ao_radio_recv_abort();  #endif @@ -684,6 +684,9 @@ ao_config_radio_enable_set(void) __reentrant  	_ao_config_edit_start();  	ao_config.radio_enable = ao_cmd_lex_i;  	_ao_config_edit_finish(); +#if HAS_TELEMETRY && HAS_RADIO_RATE +	ao_telemetry_reset_interval(); +#endif  }  #endif /* HAS_RADIO */ @@ -735,6 +738,7 @@ ao_config_aprs_set(void)  	_ao_config_edit_start();  	ao_config.aprs_interval = ao_cmd_lex_i;  	_ao_config_edit_finish(); +	ao_telemetry_reset_interval();  }  #endif /* HAS_APRS */ @@ -825,6 +829,9 @@ ao_config_tracker_set(void)  	ao_config.tracker_motion = m;  	ao_config.tracker_interval = i;  	_ao_config_edit_finish(); +#if HAS_TELEMETRY +	ao_telemetry_reset_interval(); +#endif  }  #endif /* HAS_TRACKER */ diff --git a/src/kernel/ao_gps_print.c b/src/kernel/ao_gps_print.c index d26021da..6d9ee346 100644 --- a/src/kernel/ao_gps_print.c +++ b/src/kernel/ao_gps_print.c @@ -20,8 +20,8 @@  #endif  #include "ao_telem.h" -#ifndef AO_TELEMETRY_LOCATION_ALTITUDE -#define AO_TELEMETRY_LOCATION_ALTITUDE(l)	((l)->altitude) +#ifndef AO_GPS_ORIG_ALTITUDE +#define AO_GPS_ORIG_ALTITUDE(l)	((l)->altitude)  #endif  void @@ -46,7 +46,7 @@ ao_gps_print(__xdata struct ao_gps_orig *gps_data) __reentrant  	       AO_TELEM_GPS_ALTITUDE " %d ",  	       (long) gps_data->latitude,  	       (long) gps_data->longitude, -	       AO_TELEMETRY_LOCATION_ALTITUDE(gps_data)); +	       AO_GPS_ORIG_ALTITUDE(gps_data));  	if (gps_data->flags & AO_GPS_DATE_VALID)  		printf(AO_TELEM_GPS_YEAR " %d " diff --git a/src/kernel/ao_log.h b/src/kernel/ao_log.h index c13a2580..f86fb359 100644 --- a/src/kernel/ao_log.h +++ b/src/kernel/ao_log.h @@ -43,11 +43,12 @@ extern __pdata enum ao_flight_state ao_log_state;  #define AO_LOG_FORMAT_TINY		2	/* two byte state/baro records */  #define AO_LOG_FORMAT_TELEMETRY		3	/* 32 byte ao_telemetry records */  #define AO_LOG_FORMAT_TELESCIENCE	4	/* 32 byte typed telescience records */ -#define AO_LOG_FORMAT_TELEMEGA		5	/* 32 byte typed telemega records */ +#define AO_LOG_FORMAT_TELEMEGA_OLD	5	/* 32 byte typed telemega records */  #define AO_LOG_FORMAT_EASYMINI		6	/* 16-byte MS5607 baro only, 3.0V supply */  #define AO_LOG_FORMAT_TELEMETRUM	7	/* 16-byte typed telemetrum records */  #define AO_LOG_FORMAT_TELEMINI		8	/* 16-byte MS5607 baro only, 3.3V supply */  #define AO_LOG_FORMAT_TELEGPS		9	/* 32 byte telegps records */ +#define AO_LOG_FORMAT_TELEMEGA		10	/* 32 byte typed telemega records with 32 bit gyro cal */  #define AO_LOG_FORMAT_NONE		127	/* No log at all */  extern __code uint8_t ao_log_format; @@ -215,10 +216,22 @@ struct ao_log_mega {  			int16_t		ground_accel_along;	/* 12 */  			int16_t		ground_accel_across;	/* 14 */  			int16_t		ground_accel_through;	/* 16 */ +			int16_t		pad_18;			/* 18 */ +			int32_t		ground_roll;		/* 20 */ +			int32_t		ground_pitch;		/* 24 */ +			int32_t		ground_yaw;		/* 28 */ +		} flight;					/* 32 */ +		struct { +			uint16_t	flight;			/* 4 */ +			int16_t		ground_accel;		/* 6 */ +			uint32_t	ground_pres;		/* 8 */ +			int16_t		ground_accel_along;	/* 12 */ +			int16_t		ground_accel_across;	/* 14 */ +			int16_t		ground_accel_through;	/* 16 */  			int16_t		ground_roll;		/* 18 */  			int16_t		ground_pitch;		/* 20 */  			int16_t		ground_yaw;		/* 22 */ -		} flight;					/* 24 */ +		} flight_old;					/* 24 */  		/* AO_LOG_STATE */  		struct {  			uint16_t	state; diff --git a/src/kernel/ao_monitor.c b/src/kernel/ao_monitor.c index 2d75c41c..cba0d80a 100644 --- a/src/kernel/ao_monitor.c +++ b/src/kernel/ao_monitor.c @@ -94,9 +94,18 @@ __xdata struct ao_task ao_monitor_blink_task;  void  ao_monitor_blink(void)  { +#ifdef AO_MONITOR_BAD +	uint8_t		*recv; +#endif  	for (;;) {  		ao_sleep(DATA_TO_XDATA(&ao_monitor_head)); -		ao_led_for(AO_MONITOR_LED, AO_MS_TO_TICKS(100)); +#ifdef AO_MONITOR_BAD +		recv = (uint8_t *) &ao_monitor_ring[ao_monitor_ring_prev(ao_monitor_head)]; +		if (ao_monitoring && !(recv[ao_monitoring + 1] & AO_RADIO_STATUS_CRC_OK)) +			ao_led_for(AO_MONITOR_BAD, AO_MS_TO_TICKS(100)); +		else +#endif +			ao_led_for(AO_MONITOR_LED, AO_MS_TO_TICKS(100));  	}  }  #endif diff --git a/src/kernel/ao_serial.h b/src/kernel/ao_serial.h index baf213c0..dbc9f8e4 100644 --- a/src/kernel/ao_serial.h +++ b/src/kernel/ao_serial.h @@ -34,6 +34,9 @@ ao_serial0_getchar(void);  int  _ao_serial0_pollchar(void); +uint8_t +_ao_serial0_sleep(void); +  void  ao_serial0_putchar(char c); @@ -54,6 +57,9 @@ ao_serial1_getchar(void);  int  _ao_serial1_pollchar(void); +uint8_t +_ao_serial1_sleep(void); +  void  ao_serial1_putchar(char c); @@ -74,6 +80,9 @@ ao_serial2_getchar(void);  int  _ao_serial2_pollchar(void); +uint8_t +_ao_serial2_sleep(void); +  void  ao_serial2_putchar(char c); @@ -94,6 +103,9 @@ ao_serial3_getchar(void);  int  _ao_serial3_pollchar(void); +uint8_t +_ao_serial3_sleep(void); +  void  ao_serial3_putchar(char c); diff --git a/src/kernel/ao_stdio.c b/src/kernel/ao_stdio.c index 99118137..1d65fcf5 100644 --- a/src/kernel/ao_stdio.c +++ b/src/kernel/ao_stdio.c @@ -142,10 +142,8 @@ ao_add_stdio(int (*_pollchar)(void),  	     void (*putchar)(char),  	     void (*flush)(void)) __reentrant  { -#if AO_NUM_STDIOS > 1  	if (ao_num_stdios == AO_NUM_STDIOS)  		ao_panic(AO_PANIC_STDIO); -#endif  	ao_stdios[ao_num_stdios]._pollchar = _pollchar;  	ao_stdios[ao_num_stdios].putchar = putchar;  	ao_stdios[ao_num_stdios].flush = flush; diff --git a/src/kernel/ao_telemetry.c b/src/kernel/ao_telemetry.c index 27306a34..e2197f7a 100644 --- a/src/kernel/ao_telemetry.c +++ b/src/kernel/ao_telemetry.c @@ -19,19 +19,32 @@  #include "ao_log.h"  #include "ao_product.h" -#ifndef HAS_RDF -#define HAS_RDF 1 -#endif -  static __pdata uint16_t ao_telemetry_interval;  #if HAS_RADIO_RATE  static __xdata uint16_t ao_telemetry_desired_interval;  #endif +/* TeleMetrum v1.0 just doesn't have enough space to + * manage the more complicated telemetry scheduling, so + * it loses the ability to disable telem/rdf separately + */ + +#if defined(TELEMETRUM_V_1_0) +#define SIMPLIFY +#endif + +#ifdef SIMPLIFY +#define ao_telemetry_time time +#define RDF_SPACE	__pdata +#else +#define RDF_SPACE	__xdata +static __pdata uint16_t ao_telemetry_time; +#endif +  #if HAS_RDF -static __pdata uint8_t ao_rdf = 0; -static __pdata uint16_t ao_rdf_time; +static RDF_SPACE uint8_t ao_rdf = 0; +static RDF_SPACE uint16_t ao_rdf_time;  #endif  #if HAS_APRS @@ -120,7 +133,9 @@ ao_send_mega_sensor(void)  	telemetry.generic.tick = packet->tick;  	telemetry.generic.type = AO_TELEMETRY_MEGA_SENSOR; +#if HAS_MPU6000  	telemetry.mega_sensor.orient = ao_sample_orient; +#endif  	telemetry.mega_sensor.accel = ao_data_accel(packet);  	telemetry.mega_sensor.pres = ao_data_pres(packet);  	telemetry.mega_sensor.temp = ao_data_temp(packet); @@ -269,30 +284,6 @@ ao_send_mini(void)  #endif /* AO_SEND_MINI */ -#ifdef AO_SEND_ALL_BARO -static uint8_t		ao_baro_sample; - -static void -ao_send_baro(void) -{ -	uint8_t		sample = ao_sample_data; -	uint8_t		samples = (sample - ao_baro_sample) & (AO_DATA_RING - 1); - -	if (samples > 12) { -		ao_baro_sample = (ao_baro_sample + (samples - 12)) & (AO_DATA_RING - 1); -		samples = 12; -	} -	telemetry.generic.tick = ao_data_ring[sample].tick; -	telemetry.generic.type = AO_TELEMETRY_BARO; -	telemetry.baro.samples = samples; -	for (sample = 0; sample < samples; sample++) { -		telemetry.baro.baro[sample] = ao_data_ring[ao_baro_sample].adc.pres; -		ao_baro_sample = ao_data_ring_next(ao_baro_sample); -	} -	ao_radio_send(&telemetry, sizeof (telemetry)); -} -#endif -  static __pdata int8_t ao_telemetry_config_max;  static __pdata int8_t ao_telemetry_config_cur; @@ -332,6 +323,7 @@ ao_send_configuration(void)  #if HAS_GPS +static __pdata int8_t ao_telemetry_gps_max;  static __pdata int8_t ao_telemetry_loc_cur;  static __pdata int8_t ao_telemetry_sat_cur; @@ -348,7 +340,7 @@ ao_send_location(void)  		telemetry.location.tick = ao_gps_tick;  		ao_mutex_put(&ao_gps_mutex);  		ao_radio_send(&telemetry, sizeof (telemetry)); -		ao_telemetry_loc_cur = ao_telemetry_config_max; +		ao_telemetry_loc_cur = ao_telemetry_gps_max;  	}  } @@ -365,7 +357,7 @@ ao_send_satellite(void)  		       AO_MAX_GPS_TRACKING * sizeof (struct ao_telemetry_satellite_info));  		ao_mutex_put(&ao_gps_mutex);  		ao_radio_send(&telemetry, sizeof (telemetry)); -		ao_telemetry_sat_cur = ao_telemetry_config_max; +		ao_telemetry_sat_cur = ao_telemetry_gps_max;  	}  }  #endif @@ -411,6 +403,7 @@ ao_telemetry(void)  		while (ao_telemetry_interval == 0)  			ao_sleep(&telemetry);  		time = ao_time(); +		ao_telemetry_time = time;  #if HAS_RDF  		ao_rdf_time = time;  #endif @@ -418,79 +411,85 @@ ao_telemetry(void)  		ao_aprs_time = time;  #endif  		while (ao_telemetry_interval) { -#if HAS_APRS +			time = ao_time() + AO_SEC_TO_TICKS(100); +#ifndef SIMPLIFY  			if (!(ao_config.radio_enable & AO_RADIO_DISABLE_TELEMETRY))  #endif  			{ -#ifdef AO_SEND_ALL_BARO -				ao_send_baro(); +#ifndef SIMPLIFY +				if ( (int16_t) (ao_time() - ao_telemetry_time) >= 0)  #endif - -#if HAS_FLIGHT +				{ +					ao_telemetry_time = ao_time() + ao_telemetry_interval;  # ifdef AO_SEND_MEGA -				ao_send_mega_sensor(); -				ao_send_mega_data(); +					ao_send_mega_sensor(); +					ao_send_mega_data();  # endif  # ifdef AO_SEND_METRUM -				ao_send_metrum_sensor(); -				ao_send_metrum_data(); +					ao_send_metrum_sensor(); +					ao_send_metrum_data();  # endif  # ifdef AO_SEND_MINI -				ao_send_mini(); +					ao_send_mini();  # endif  # ifdef AO_TELEMETRY_SENSOR -				ao_send_sensor(); +					ao_send_sensor();  # endif -#endif /* HAS_FLIGHT */ -  #if HAS_COMPANION -				if (ao_companion_running) -					ao_send_companion(); +					if (ao_companion_running) +						ao_send_companion();  #endif -				ao_send_configuration();  #if HAS_GPS -				ao_send_location(); -				ao_send_satellite(); +					ao_send_location(); +					ao_send_satellite(); +#endif +					ao_send_configuration(); +				} +#ifndef SIMPLIFY +				time = ao_telemetry_time;  #endif  			} -#ifndef AO_SEND_ALL_BARO  #if HAS_RDF -			if (ao_rdf && -#if HAS_APRS -			    !(ao_config.radio_enable & AO_RADIO_DISABLE_RDF) && -#endif /* HAS_APRS */ -			    (int16_t) (ao_time() - ao_rdf_time) >= 0) +			if (ao_rdf +#ifndef SIMPLIFY +			    && !(ao_config.radio_enable & AO_RADIO_DISABLE_RDF) +#endif +				)  			{ +				if ((int16_t) (ao_time() - ao_rdf_time) >= 0) {  #if HAS_IGNITE_REPORT -				uint8_t	c; -#endif /* HAS_IGNITE_REPORT */ -				ao_rdf_time = ao_time() + AO_RDF_INTERVAL_TICKS; +					uint8_t	c; +#endif +					ao_rdf_time = ao_time() + AO_RDF_INTERVAL_TICKS;  #if HAS_IGNITE_REPORT -				if (ao_flight_state == ao_flight_pad && (c = ao_report_igniter())) -					ao_radio_continuity(c); -				else -#endif /* HAS_IGNITE_REPORT*/ -					ao_radio_rdf(); +					if (ao_flight_state == ao_flight_pad && (c = ao_report_igniter())) +						ao_radio_continuity(c); +					else +#endif +						ao_radio_rdf(); +				} +#ifndef SIMPLIFY +				if ((int16_t) (time - ao_rdf_time) > 0) +					time = ao_rdf_time; +#endif  			}  #endif /* HAS_RDF */  #if HAS_APRS -			if (ao_config.aprs_interval != 0 && -			    (int16_t) (ao_time() - ao_aprs_time) >= 0) -			{ -				ao_aprs_time = ao_time() + AO_SEC_TO_TICKS(ao_config.aprs_interval); -				ao_aprs_send(); +			if (ao_config.aprs_interval != 0) { +				if ((int16_t) (ao_time() - ao_aprs_time) >= 0) { +					ao_aprs_time = ao_time() + AO_SEC_TO_TICKS(ao_config.aprs_interval); +					ao_aprs_send(); +				} +				if ((int16_t) (time - ao_aprs_time) > 0) +					time = ao_aprs_time;  			}  #endif /* HAS_APRS */ -#endif /* !AO_SEND_ALL_BARO */ -			time += ao_telemetry_interval;  			delay = time - ao_time();  			if (delay > 0) {  				ao_alarm(delay);  				ao_sleep(&telemetry);  				ao_clear_alarm();  			} -			else -				time = ao_time();  		}  	}  } @@ -547,21 +546,31 @@ ao_telemetry_set_interval(uint16_t interval)  	ao_telemetry_companion_cur = cur;  #endif -	ao_telemetry_config_max = AO_SEC_TO_TICKS(5) / interval; -#if HAS_COMPANION -	if (ao_telemetry_config_max > cur) -		cur++; -	ao_telemetry_config_cur = cur; -#endif -  #if HAS_GPS -	if (ao_telemetry_config_max > cur) +	ao_telemetry_gps_max = AO_SEC_TO_TICKS(1) / interval; +	if (ao_telemetry_gps_max > cur)  		cur++;  	ao_telemetry_loc_cur = cur; -	if (ao_telemetry_config_max > cur) +	if (ao_telemetry_gps_max > cur)  		cur++;  	ao_telemetry_sat_cur = cur;  #endif + +	ao_telemetry_config_max = AO_SEC_TO_TICKS(5) / interval; +	if (ao_telemetry_config_max > cur) +		cur++; +	ao_telemetry_config_cur = cur; + +#ifndef SIMPLIFY +	ao_telemetry_time =  +#if HAS_RDF +		ao_rdf_time = +#endif +#if HAS_APRS +		ao_aprs_time = +#endif +		ao_time(); +#endif  	ao_wakeup(&telemetry);  } diff --git a/src/kernel/ao_telemetry.h b/src/kernel/ao_telemetry.h index 83d432cf..711e0d36 100644 --- a/src/kernel/ao_telemetry.h +++ b/src/kernel/ao_telemetry.h @@ -116,12 +116,16 @@ struct ao_telemetry_location {  	/* 32 */  }; -#if HAS_GPS -  #ifndef HAS_WIDE_GPS  #define HAS_WIDE_GPS	1  #endif +#ifdef HAS_TELEMETRY +#ifndef HAS_RDF +#define HAS_RDF		1 +#endif +#endif +  #if HAS_WIDE_GPS  typedef int32_t		gps_alt_t;  #define AO_TELEMETRY_LOCATION_ALTITUDE(l) 	(((gps_alt_t) (l)->altitude_high << 16) | ((l)->altitude_low)) @@ -135,8 +139,6 @@ typedef int16_t		gps_alt_t;  						  (l)->altitude_low = (a)))  #endif /* HAS_WIDE_GPS */ -#endif /* HAS_GPS */ -  #define AO_TELEMETRY_SATELLITE		0x06  struct ao_telemetry_satellite_info { diff --git a/src/kernel/ao_tracker.c b/src/kernel/ao_tracker.c index 9b007af8..962f145d 100644 --- a/src/kernel/ao_tracker.c +++ b/src/kernel/ao_tracker.c @@ -132,7 +132,7 @@ ao_tracker(void)  					if (height < 0)  						height = -height; -					if (ao_tracker_force_telem) +					if (ao_tracker_force_telem > 1)  						printf("head %d ring %d ground_distance %d height %d\n", gps_head, ring, ground_distance, height);  					if (ground_distance > ao_config.tracker_motion ||  					    height > (ao_config.tracker_motion << 1)) @@ -141,7 +141,7 @@ ao_tracker(void)  						break;  					}  				} -				if (ao_tracker_force_telem) { +				if (ao_tracker_force_telem > 1) {  					printf ("moving %d started %d\n", moving, log_started);  					flush();  				} @@ -191,11 +191,9 @@ static struct ao_task ao_tracker_task;  static void  ao_tracker_set_telem(void)  { -	uint8_t	telem;  	ao_cmd_hex(); -	telem = ao_cmd_lex_i;  	if (ao_cmd_status == ao_cmd_success) -		ao_tracker_force_telem = telem; +		ao_tracker_force_telem = ao_cmd_lex_i;  	ao_cmd_status = ao_cmd_success;  	printf ("flight: %d\n", ao_flight_number);  	printf ("force_telem: %d\n", ao_tracker_force_telem); @@ -211,7 +209,7 @@ ao_tracker_set_telem(void)  }  static const struct ao_cmds ao_tracker_cmds[] = { -	{ ao_tracker_set_telem,	"t <d>\0Set telem on USB" }, +	{ ao_tracker_set_telem,	"t <d>\0Set telem on USB (0 off, 1 on, 2 dbg)" },  	{ 0, NULL },  };  | 
