diff options
Diffstat (limited to 'src/ao_monitor.c')
| -rw-r--r-- | src/ao_monitor.c | 198 | 
1 files changed, 154 insertions, 44 deletions
diff --git a/src/ao_monitor.c b/src/ao_monitor.c index 9c4be6fb..d6fd8305 100644 --- a/src/ao_monitor.c +++ b/src/ao_monitor.c @@ -16,6 +16,7 @@   */  #include "ao.h" +#include "ao_telem.h"  __xdata uint8_t ao_monitoring;  __pdata uint8_t ao_monitor_led; @@ -23,54 +24,163 @@ __pdata uint8_t ao_monitor_led;  void  ao_monitor(void)  { -	__xdata struct ao_telemetry_recv recv;  	__xdata char callsign[AO_MAX_CALLSIGN+1]; +	__xdata union { +		struct ao_telemetry_recv	full; +		struct ao_telemetry_tiny_recv	tiny; +	} u; + +#define recv		(u.full) +#define recv_tiny	(u.tiny) +  	uint8_t state;  	int16_t rssi;  	for (;;) {  		__critical while (!ao_monitoring)  			ao_sleep(&ao_monitoring); -		if (!ao_radio_recv(&recv, sizeof (recv))) -			continue; -		state = recv.telemetry.flight_state; - -		/* Typical RSSI offset for 38.4kBaud at 433 MHz is 74 */ -		rssi = (int16_t) (recv.rssi >> 1) - 74; -		memcpy(callsign, recv.telemetry.callsign, AO_MAX_CALLSIGN); -		if (state > ao_flight_invalid) -			state = ao_flight_invalid; -		if (recv.status & PKT_APPEND_STATUS_1_CRC_OK) { -			printf("VERSION %d CALL %s SERIAL %d FLIGHT %5u RSSI %4d STATUS %02x STATE %7s ", -			       AO_TELEMETRY_VERSION, -			       callsign, -			       recv.telemetry.serial, -			       recv.telemetry.flight, -			       rssi, recv.status, -			       ao_state_names[state]); -			printf("%5u a: %5d p: %5d t: %5d v: %5d d: %5d m: %5d " -			       "fa: %5d ga: %d fv: %7ld fp: %5d gp: %5d a+: %5d a-: %5d ", -			       recv.telemetry.adc.tick, -			       recv.telemetry.adc.accel, -			       recv.telemetry.adc.pres, -			       recv.telemetry.adc.temp, -			       recv.telemetry.adc.v_batt, -			       recv.telemetry.adc.sense_d, -			       recv.telemetry.adc.sense_m, -			       recv.telemetry.flight_accel, -			       recv.telemetry.ground_accel, -			       recv.telemetry.flight_vel, -			       recv.telemetry.flight_pres, -			       recv.telemetry.ground_pres, -			       recv.telemetry.accel_plus_g, -			       recv.telemetry.accel_minus_g); -			ao_gps_print(&recv.telemetry.gps); -			putchar(' '); -			ao_gps_tracking_print(&recv.telemetry.gps_tracking); -			putchar('\n'); -			ao_rssi_set(rssi); +		if (ao_monitoring == AO_MONITORING_FULL) { +			if (!ao_radio_recv(&recv, sizeof (struct ao_telemetry_recv))) +				continue; + +			state = recv.telemetry.flight_state; + +			/* Typical RSSI offset for 38.4kBaud at 433 MHz is 74 */ +			rssi = (int16_t) (recv.rssi >> 1) - 74; +			memcpy(callsign, recv.telemetry.callsign, AO_MAX_CALLSIGN); +			if (state > ao_flight_invalid) +				state = ao_flight_invalid; +			if (recv.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.telemetry.serial, +				       recv.telemetry.flight, +				       rssi, +				       ao_state_names[state], +				       recv.telemetry.adc.tick); + +				/* Raw sensor values */ +				printf(AO_TELEM_RAW_ACCEL " %d " +				       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.telemetry.adc.accel, +				       recv.telemetry.adc.pres, +				       recv.telemetry.adc.temp, +				       recv.telemetry.adc.v_batt, +				       recv.telemetry.adc.sense_d, +				       recv.telemetry.adc.sense_m); + +				/* Sensor calibration values */ +				printf(AO_TELEM_CAL_ACCEL_GROUND " %d " +				       AO_TELEM_CAL_BARO_GROUND " %d " +				       AO_TELEM_CAL_ACCEL_PLUS " %d " +				       AO_TELEM_CAL_ACCEL_MINUS " %d ", +				       recv.telemetry.ground_accel, +				       recv.telemetry.ground_pres, +				       recv.telemetry.accel_plus_g, +				       recv.telemetry.accel_minus_g); + +#if 0 +				/* Kalman state values */ +				printf(AO_TELEM_KALMAN_HEIGHT " %d " +				       AO_TELEM_KALMAN_SPEED " %d " +				       AO_TELEM_KALMAN_ACCEL " %d ", +				       recv.telemetry.height, +				       recv.telemetry.speed, +				       recv.telemetry.accel); +#else +				/* Ad-hoc flight values */ +				printf(AO_TELEM_ADHOC_ACCEL " %d " +				       AO_TELEM_ADHOC_SPEED " %ld " +				       AO_TELEM_ADHOC_BARO " %d ", +				       recv.telemetry.flight_accel, +				       recv.telemetry.flight_vel, +				       recv.telemetry.flight_pres); +#endif +				ao_gps_print(&recv.telemetry.gps); +				ao_gps_tracking_print(&recv.telemetry.gps_tracking); +				putchar('\n'); +				ao_rssi_set(rssi); +			} else { +				printf("CRC INVALID RSSI %3d\n", rssi); +			}  		} else { -			printf("CRC INVALID RSSI %3d\n", rssi); +			if (!ao_radio_recv(&recv_tiny, sizeof (struct ao_telemetry_tiny_recv))) +				continue; + +			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; +			memcpy(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 +				ao_rssi_set(rssi); +			} else { +				printf("CRC INVALID RSSI %3d\n", rssi); +			}  		}  		ao_usb_flush();  		ao_led_toggle(ao_monitor_led); @@ -82,21 +192,21 @@ __xdata struct ao_task ao_monitor_task;  void  ao_set_monitor(uint8_t monitoring)  { +	if (ao_monitoring) +		ao_radio_recv_abort();  	ao_monitoring = monitoring;  	ao_wakeup(&ao_monitoring); -	if (!ao_monitoring) -		ao_radio_recv_abort();  }  static void  set_monitor(void)  {  	ao_cmd_hex(); -	ao_set_monitor(ao_cmd_lex_i != 0); +	ao_set_monitor(ao_cmd_lex_i);  }  __code struct ao_cmds ao_monitor_cmds[] = { -	{ set_monitor,	"m <0 off, 1 on>\0Enable/disable radio monitoring" }, +	{ set_monitor,	"m <0 off, 1 full, 2 tiny>\0Enable/disable radio monitoring" },  	{ 0,	NULL },  };  | 
