diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ao_radio_cmac.c | 4 | ||||
| -rw-r--r-- | src/cc1111/ao_packet_master.c | 5 | ||||
| -rw-r--r-- | src/cc1111/ao_pins.h | 5 | ||||
| -rw-r--r-- | src/cc1111/ao_radio.c | 5 | ||||
| -rw-r--r-- | src/core/ao.h | 11 | ||||
| -rw-r--r-- | src/core/ao_log_telem.c | 2 | ||||
| -rw-r--r-- | src/core/ao_monitor.c | 151 | ||||
| -rw-r--r-- | src/product/ao_telebt.c | 2 | ||||
| -rw-r--r-- | src/product/ao_teledongle.c | 2 | ||||
| -rw-r--r-- | src/product/ao_teleterra_0_2.c | 2 | ||||
| -rw-r--r-- | src/product/ao_tidongle.c | 2 | ||||
| -rw-r--r-- | src/teleterra-v0.2/ao_pins.h | 3 | 
12 files changed, 96 insertions, 98 deletions
| diff --git a/src/ao_radio_cmac.c b/src/ao_radio_cmac.c index 41fbbe1f..e263f0db 100644 --- a/src/ao_radio_cmac.c +++ b/src/ao_radio_cmac.c @@ -78,7 +78,7 @@ radio_cmac_send(uint8_t len) __reentrant  	ao_config_get();  #if HAS_MONITOR -	ao_set_monitor(0); +	ao_monitor_set(0);  #endif  	ao_mutex_get(&ao_aes_mutex); @@ -107,7 +107,7 @@ radio_cmac_recv(uint8_t len, uint16_t timeout) __reentrant  	len = round_len(len);  #if HAS_MONITOR -	ao_set_monitor(0); +	ao_monitor_set(0);  #endif  	if (timeout)  		ao_alarm(timeout); diff --git a/src/cc1111/ao_packet_master.c b/src/cc1111/ao_packet_master.c index ab19f979..66f94288 100644 --- a/src/cc1111/ao_packet_master.c +++ b/src/cc1111/ao_packet_master.c @@ -114,7 +114,7 @@ ao_packet_forward(void) __reentrant  	flush();  #if HAS_MONITOR -	ao_set_monitor(0); +	ao_monitor_disable();  #endif  	ao_add_task(&ao_packet_task, ao_packet_master, "master");  	ao_add_task(&ao_packet_echo_task, ao_packet_echo, "echo"); @@ -132,6 +132,9 @@ ao_packet_forward(void) __reentrant  		ao_wakeup(&ao_stdin_ready);  		ao_delay(AO_MS_TO_TICKS(10));  	} +#if HAS_MONITOR +	ao_monitor_enable(); +#endif  } diff --git a/src/cc1111/ao_pins.h b/src/cc1111/ao_pins.h index 7c5b4574..2b6232a4 100644 --- a/src/cc1111/ao_pins.h +++ b/src/cc1111/ao_pins.h @@ -107,6 +107,7 @@  	#define PACKET_HAS_SLAVE	0  	#define AO_LED_RED		1  	#define AO_LED_GREEN		2 +	#define AO_MONITOR_LED		AO_LED_GREEN  	#define LEDS_AVAILABLE		(AO_LED_RED|AO_LED_GREEN)  	#define SPI_CS_ON_P1		1  	#define SPI_CS_ON_P0		0 @@ -218,6 +219,7 @@  	#define PACKET_HAS_SLAVE	0  	#define AO_LED_RED		2  	#define AO_LED_GREEN		1 +	#define AO_MONITOR_LED		AO_LED_GREEN  	#define LEDS_AVAILABLE		(AO_LED_RED|AO_LED_GREEN)  	#define SPI_CS_ON_P1		0  	#define SPI_CS_ON_P0		1 @@ -245,6 +247,7 @@  	#define PACKET_HAS_MASTER	1  	#define PACKET_HAS_SLAVE	0  	#define AO_LED_RED		2 +	#define AO_MONITOR_LED		AO_LED_RED  	#define LEDS_AVAILABLE		(AO_LED_RED)  	#define SPI_CS_ON_P1		0  	#define SPI_CS_ON_P0		1 @@ -274,6 +277,7 @@  	#define PACKET_HAS_SLAVE	0  	#define AO_LED_RED		2  	#define AO_LED_GREEN		1 +	#define AO_MONITOR_LED		AO_LED_RED  	#define LEDS_AVAILABLE		(AO_LED_RED|AO_LED_GREEN)  	#define SPI_CS_ON_P1		1  	#define SPI_CS_ON_P0		0 @@ -312,6 +316,7 @@  	#define PACKET_HAS_SLAVE	0  	#define AO_LED_RED		1  	#define AO_LED_GREEN		2 +	#define AO_MONITOR_LED		AO_LED_RED  	#define LEDS_AVAILABLE		(AO_LED_RED|AO_LED_GREEN)  	#define SPI_CS_ON_P1		1  	#define SPI_CS_ON_P0		0 diff --git a/src/cc1111/ao_radio.c b/src/cc1111/ao_radio.c index 75f241d4..ee506f89 100644 --- a/src/cc1111/ao_radio.c +++ b/src/cc1111/ao_radio.c @@ -421,7 +421,7 @@ ao_radio_test(void)  	mode++;  	if ((mode & 2) && !radio_on) {  #if HAS_MONITOR -		ao_set_monitor(0); +		ao_monitor_disable();  #endif  #if PACKET_HAS_SLAVE  		ao_packet_slave_stop(); @@ -439,6 +439,9 @@ ao_radio_test(void)  		ao_radio_idle();  		ao_radio_put();  		radio_on = 0; +#if HAS_MONITOR +		ao_monitor_enable(); +#endif  	}  } diff --git a/src/core/ao.h b/src/core/ao.h index cbe2f8dc..f57398ce 100644 --- a/src/core/ao.h +++ b/src/core/ao.h @@ -1406,13 +1406,18 @@ ao_monitor(void);  #define AO_MONITORING_OFF	0  #define AO_MONITORING_ORIG	1 -#define AO_MONITORING_TINY	2  void -ao_set_monitor(uint8_t monitoring); +ao_monitor_set(uint8_t monitoring);  void -ao_monitor_init(uint8_t led, uint8_t monitoring) __reentrant; +ao_monitor_disable(void); + +void +ao_monitor_enable(void); + +void +ao_monitor_init(void) __reentrant;  /*   * ao_stdio.c diff --git a/src/core/ao_log_telem.c b/src/core/ao_log_telem.c index 096ad919..9e1b06d3 100644 --- a/src/core/ao_log_telem.c +++ b/src/core/ao_log_telem.c @@ -90,6 +90,8 @@ ao_log_single(void)  	ao_log_running = 1;  	ao_log_single_restart();  	ao_flight_state = ao_flight_startup; +	ao_monitor_set(sizeof(struct ao_telemetry_generic)); +  	for (;;) {  		while (!ao_log_running)  			ao_sleep(&ao_log_running); diff --git a/src/core/ao_monitor.c b/src/core/ao_monitor.c index f7795fe4..7960208e 100644 --- a/src/core/ao_monitor.c +++ b/src/core/ao_monitor.c @@ -30,13 +30,35 @@  #define HAS_MONIOTOR_PUT 1  #endif +#ifndef AO_MONITOR_LED +#error Must define AO_MONITOR_LED +#endif +  __data uint8_t ao_monitoring; -__pdata uint8_t ao_monitor_led; +static __data uint8_t ao_monitor_disabled; +static __data uint8_t ao_internal_monitoring; +static __data uint8_t ao_external_monitoring;  __xdata union ao_monitor ao_monitor_ring[AO_MONITOR_RING];  __data uint8_t	ao_monitor_head; +static void +_ao_monitor_adjust(void) +{ +	if (ao_monitoring) +		ao_radio_recv_abort(); +	if (ao_monitor_disabled) +		ao_monitoring = 0; +	else { +		if (ao_external_monitoring) +			ao_monitoring = ao_external_monitoring; +		else +			ao_monitoring = ao_internal_monitoring; +	} +	ao_wakeup(DATA_TO_XDATA(&ao_monitoring)); +} +  void  ao_monitor_get(void)  { @@ -51,9 +73,6 @@ ao_monitor_get(void)  		case AO_MONITORING_ORIG:  			size = sizeof (struct ao_telemetry_orig_recv);  			break; -		case AO_MONITORING_TINY: -			size = sizeof (struct ao_telemetry_tiny_recv); -			break;  #endif  		default:  			if (ao_monitoring > AO_MAX_TELEMETRY) @@ -68,16 +87,21 @@ ao_monitor_get(void)  	}  } +#if AO_MONITOR_LED +__xdata struct ao_task ao_monitor_blink_task; +  void  ao_monitor_blink(void)  {  	for (;;) {  		ao_sleep(DATA_TO_XDATA(&ao_monitor_head)); -		ao_led_for(ao_monitor_led, AO_MS_TO_TICKS(100)); +		ao_led_for(AO_MONITOR_LED, AO_MS_TO_TICKS(100));  	}  } +#endif  #if HAS_MONITOR_PUT +  void  ao_monitor_put(void)  { @@ -96,11 +120,15 @@ ao_monitor_put(void)  	ao_monitor_tail = ao_monitor_head;  	for (;;) { -		while (ao_monitor_tail == ao_monitor_head) +		while (!ao_external_monitoring) +			ao_sleep(DATA_TO_XDATA(&ao_external_monitoring)); +		while (ao_monitor_tail == ao_monitor_head && ao_external_monitoring)  			ao_sleep(DATA_TO_XDATA(&ao_monitor_head));  		m = &ao_monitor_ring[ao_monitor_tail];  		ao_monitor_tail = ao_monitor_ring_next(ao_monitor_tail);  		switch (ao_monitoring) { +		case 0: +			break;  #if LEGACY_MONITOR  		case AO_MONITORING_ORIG:  			state = recv_orig.telemetry_orig.flight_state; @@ -179,71 +207,6 @@ ao_monitor_put(void)  				printf("CRC INVALID RSSI %3d\n", rssi);  			}  			break; -		case AO_MONITORING_TINY: -			state = recv_tiny.telemetry_tiny.flight_state; - -			/* Typical RSSI offset for 38.4kBaud at 433 MHz is 74 */ -			rssi = (int16_t) (recv_tiny.rssi >> 1) - 74; -			ao_xmemcpy(callsign, recv_tiny.telemetry_tiny.callsign, AO_MAX_CALLSIGN); -			if (state > ao_flight_invalid) -				state = ao_flight_invalid; -			if (recv_tiny.status & PKT_APPEND_STATUS_1_CRC_OK) { -				/* General header fields */ -				printf(AO_TELEM_VERSION " %d " -				       AO_TELEM_CALL " %s " -				       AO_TELEM_SERIAL " %d " -				       AO_TELEM_FLIGHT " %d " -				       AO_TELEM_RSSI " %d " -				       AO_TELEM_STATE " %s " -				       AO_TELEM_TICK " %d ", -				       AO_TELEMETRY_VERSION, -				       callsign, -				       recv_tiny.telemetry_tiny.serial, -				       recv_tiny.telemetry_tiny.flight, -				       rssi, -				       ao_state_names[state], -				       recv_tiny.telemetry_tiny.adc.tick); - -				/* Raw sensor values */ -				printf(AO_TELEM_RAW_BARO " %d " -				       AO_TELEM_RAW_THERMO " %d " -				       AO_TELEM_RAW_BATT " %d " -				       AO_TELEM_RAW_DROGUE " %d " -				       AO_TELEM_RAW_MAIN " %d ", -				       recv_tiny.telemetry_tiny.adc.pres, -				       recv_tiny.telemetry_tiny.adc.temp, -				       recv_tiny.telemetry_tiny.adc.v_batt, -				       recv_tiny.telemetry_tiny.adc.sense_d, -				       recv_tiny.telemetry_tiny.adc.sense_m); - -				/* Sensor calibration values */ -				printf(AO_TELEM_CAL_BARO_GROUND " %d ", -				       recv_tiny.telemetry_tiny.ground_pres); - -#if 1 -				/* Kalman state values */ -				printf(AO_TELEM_KALMAN_HEIGHT " %d " -				       AO_TELEM_KALMAN_SPEED " %d " -				       AO_TELEM_KALMAN_ACCEL " %d\n", -				       recv_tiny.telemetry_tiny.height, -				       recv_tiny.telemetry_tiny.speed, -				       recv_tiny.telemetry_tiny.accel); -#else -				/* Ad-hoc flight values */ -				printf(AO_TELEM_ADHOC_ACCEL " %d " -				       AO_TELEM_ADHOC_SPEED " %ld " -				       AO_TELEM_ADHOC_BARO " %d\n", -				       recv_tiny.telemetry_tiny.flight_accel, -				       recv_tiny.telemetry_tiny.flight_vel, -				       recv_tiny.telemetry_tiny.flight_pres); -#endif -#if HAS_RSSI -				ao_rssi_set(rssi); -#endif -			} else { -				printf("CRC INVALID RSSI %3d\n", rssi); -			} -			break;  #endif /* LEGACY_MONITOR */  		default:  			printf ("TELEM %02x", ao_monitoring + 2); @@ -265,43 +228,59 @@ ao_monitor_put(void)  		ao_usb_flush();  	}  } +  __xdata struct ao_task ao_monitor_put_task;  #endif  __xdata struct ao_task ao_monitor_get_task; -__xdata struct ao_task ao_monitor_blink_task;  void -ao_set_monitor(uint8_t monitoring) +ao_monitor_set(uint8_t monitoring)  { -	if (ao_monitoring) -		ao_radio_recv_abort(); -	ao_monitoring = monitoring; -	ao_wakeup(DATA_TO_XDATA(&ao_monitoring)); +	ao_internal_monitoring = monitoring; +	_ao_monitor_adjust();  } +void +ao_monitor_disable(void) +{ +	++ao_monitor_disabled; +	_ao_monitor_adjust(); +} + +void +ao_monitor_enable(void) +{ +	--ao_monitor_disabled; +	_ao_monitor_adjust(); +} + +#if HAS_MONITOR_PUT  static void  set_monitor(void)  {  	ao_cmd_hex(); -	ao_set_monitor(ao_cmd_lex_i); +	ao_external_monitoring = ao_cmd_lex_i; +	ao_wakeup(DATA_TO_XDATA(&ao_external_monitoring)); +	ao_wakeup(DATA_TO_XDATA(&ao_monitor_head)); +	_ao_monitor_adjust();  }  __code struct ao_cmds ao_monitor_cmds[] = { -	{ set_monitor,	"m <0 off, 1 full, 2 tiny>\0Enable/disable radio monitoring" }, +	{ set_monitor,	"m <0 off, 1 old, 20 std>\0Enable/disable radio monitoring" },  	{ 0,	NULL },  }; +#endif  void -ao_monitor_init(uint8_t monitor_led, uint8_t monitoring) __reentrant +ao_monitor_init(void) __reentrant  { -	ao_monitor_led = monitor_led; -	ao_monitoring = monitoring; -	ao_cmd_register(&ao_monitor_cmds[0]); -	ao_add_task(&ao_monitor_get_task, ao_monitor_get, "monitor_get");  #if HAS_MONITOR_PUT +	ao_cmd_register(&ao_monitor_cmds[0]);  	ao_add_task(&ao_monitor_put_task, ao_monitor_put, "monitor_put");  #endif -	if (ao_monitor_led) -		ao_add_task(&ao_monitor_blink_task, ao_monitor_blink, "monitor_blink"); +	ao_add_task(&ao_monitor_get_task, ao_monitor_get, "monitor_get"); +#if AO_MONITOR_LED +	ao_add_task(&ao_monitor_blink_task, ao_monitor_blink, "monitor_blink"); +#endif  } diff --git a/src/product/ao_telebt.c b/src/product/ao_telebt.c index c4b40dfc..97c9d792 100644 --- a/src/product/ao_telebt.c +++ b/src/product/ao_telebt.c @@ -37,7 +37,7 @@ main(void)  	ao_storage_init();  #endif  	ao_usb_init(); -	ao_monitor_init(AO_LED_RED, TRUE); +	ao_monitor_init();  #if HAS_LOG  	ao_report_init();  #endif diff --git a/src/product/ao_teledongle.c b/src/product/ao_teledongle.c index b8be9f45..49b80500 100644 --- a/src/product/ao_teledongle.c +++ b/src/product/ao_teledongle.c @@ -28,7 +28,7 @@ main(void)  	ao_timer_init();  	ao_cmd_init();  	ao_usb_init(); -	ao_monitor_init(AO_LED_GREEN, TRUE); +	ao_monitor_init();  	ao_rssi_init(AO_LED_RED);  	ao_radio_init();  	ao_packet_master_init(); diff --git a/src/product/ao_teleterra_0_2.c b/src/product/ao_teleterra_0_2.c index 6ce29894..1a268c99 100644 --- a/src/product/ao_teleterra_0_2.c +++ b/src/product/ao_teleterra_0_2.c @@ -31,7 +31,7 @@ main(void)  	ao_usb_init();  	ao_serial_init();  	ao_gps_init(); -	ao_monitor_init(0, sizeof (struct ao_telemetry_generic)); +	ao_monitor_init();  	ao_report_init();  	ao_log_single_init();  	ao_radio_init(); diff --git a/src/product/ao_tidongle.c b/src/product/ao_tidongle.c index 5adbb05c..a504a747 100644 --- a/src/product/ao_tidongle.c +++ b/src/product/ao_tidongle.c @@ -30,7 +30,7 @@ main(void)  	ao_timer_init();  	ao_cmd_init();  	ao_usb_init(); -	ao_monitor_init(AO_LED_RED, TRUE); +	ao_monitor_init();  	ao_rssi_init(AO_LED_RED);  	ao_radio_init();  	ao_dbg_init(); diff --git a/src/teleterra-v0.2/ao_pins.h b/src/teleterra-v0.2/ao_pins.h index 9c35b06a..72ded004 100644 --- a/src/teleterra-v0.2/ao_pins.h +++ b/src/teleterra-v0.2/ao_pins.h @@ -39,13 +39,14 @@  	#define HAS_COMPANION		0 +	#define AO_MONITOR_LED		0  	#define LEDS_AVAILABLE		0  	#define HAS_EXTERNAL_TEMP	0  	#define HAS_ACCEL_REF		0  	#define HAS_ACCEL		0  	#define HAS_IGNITE		0  	#define HAS_MONITOR		1 -	#define HAS_MONITOR_PUT		0 +	#define HAS_MONITOR_PUT		1  	#define LEGACY_MONITOR		0  	#define HAS_RSSI		0  	#define HAS_AES			0 | 
