diff options
Diffstat (limited to 'src/kernel')
| -rw-r--r-- | src/kernel/ao_config.c | 23 | ||||
| -rw-r--r-- | src/kernel/ao_config.h | 9 | ||||
| -rw-r--r-- | src/kernel/ao_product.c | 8 | ||||
| -rw-r--r-- | src/kernel/ao_radio_cmac.c | 6 | ||||
| -rw-r--r-- | src/kernel/ao_telemetry.h | 7 | 
5 files changed, 45 insertions, 8 deletions
diff --git a/src/kernel/ao_config.c b/src/kernel/ao_config.c index 8dab7c42..b0d3e541 100644 --- a/src/kernel/ao_config.c +++ b/src/kernel/ao_config.c @@ -220,6 +220,10 @@ _ao_config_get(void)  		if (minor < 21)  			ao_config.send_frequency = 434550;  #endif +#if HAS_APRS +		if (minor < 22) +			ao_config.aprs_format = AO_CONFIG_DEFAULT_APRS_FORMAT; +#endif  		ao_config.minor = AO_CONFIG_MINOR;  		ao_config_dirty = 1;  	} @@ -876,6 +880,23 @@ ao_config_aprs_ssid_set(void)  	ao_config.aprs_ssid = ao_cmd_lex_i;  	_ao_config_edit_finish();  } + +void +ao_config_aprs_format_set(void) +{ +	ao_cmd_decimal(); +	if (ao_cmd_status != ao_cmd_success) +		return; +	_ao_config_edit_start(); +	ao_config.aprs_format = ao_cmd_lex_i != 0; +	_ao_config_edit_finish(); +} + +void +ao_config_aprs_format_show(void) +{ +	printf ("APRS format: %d\n", ao_config.aprs_format); +}  #endif /* HAS_APRS */  struct ao_config_var { @@ -969,6 +990,8 @@ __code struct ao_config_var ao_config_vars[] = {  #if HAS_APRS  	{ "S <ssid>\0Set APRS SSID (0-15)",  	  ao_config_aprs_ssid_set, ao_config_aprs_ssid_show }, +	{ "C <0 compressed, 1 uncompressed>\0APRS format", +	  ao_config_aprs_format_set, ao_config_aprs_format_show },  #endif  	{ "s\0Show",  	  ao_config_show,		0 }, diff --git a/src/kernel/ao_config.h b/src/kernel/ao_config.h index 164584a5..cfe8555c 100644 --- a/src/kernel/ao_config.h +++ b/src/kernel/ao_config.h @@ -57,7 +57,7 @@  #endif  #define AO_CONFIG_MAJOR	1 -#define AO_CONFIG_MINOR	21 +#define AO_CONFIG_MINOR	22  #define AO_AES_LEN 16 @@ -115,8 +115,15 @@ struct ao_config {  #if HAS_RADIO_FORWARD  	uint32_t	send_frequency;		/* minor version 21 */  #endif +#if HAS_APRS +	uint8_t		aprs_format;		/* minor version 22 */ +#endif  }; +#define AO_APRS_FORMAT_COMPRESSED	0 +#define AO_APRS_FORMAT_UNCOMPRESSED	1 +#define AO_CONFIG_DEFAULT_APRS_FORMAT	AO_APRS_FORMAT_COMPRESSED +  #if HAS_RADIO_FORWARD  extern __xdata uint32_t	ao_send_radio_setting;  #endif diff --git a/src/kernel/ao_product.c b/src/kernel/ao_product.c index b9327bac..c711a4d2 100644 --- a/src/kernel/ao_product.c +++ b/src/kernel/ao_product.c @@ -33,6 +33,10 @@ const char ao_product[] = AO_iProduct_STRING;  #define AO_USB_MAX_POWER	100  #endif +#ifndef AO_USB_INTERFACE_CLASS +#define AO_USB_INTERFACE_CLASS	0x02 +#endif +  #include "ao_usb.h"  /* USB descriptors in one giant block of bytes */  AO_ROMCONFIG_SYMBOL(0x00aa) uint8_t ao_usb_descriptors [] = @@ -45,7 +49,7 @@ AO_ROMCONFIG_SYMBOL(0x00aa) uint8_t ao_usb_descriptors [] =  	0x00,			/*  bDeviceSubClass */  	0x00,			/*  bDeviceProtocol */  	AO_USB_CONTROL_SIZE,	/*  bMaxPacketSize */ -	LE_WORD(0xFFFE),	/*  idVendor */ +	LE_WORD(AO_idVendor_NUMBER),	/*  idVendor */  	LE_WORD(AO_idProduct_NUMBER),	/*  idProduct */  	LE_WORD(0x0100),	/*  bcdDevice */  	0x01,			/*  iManufacturer */ @@ -69,7 +73,7 @@ AO_ROMCONFIG_SYMBOL(0x00aa) uint8_t ao_usb_descriptors [] =  	0x00,			/*  bInterfaceNumber */  	0x00,			/*  bAlternateSetting */  	0x01,			/*  bNumEndPoints */ -	0x02,			/*  bInterfaceClass */ +	AO_USB_INTERFACE_CLASS,	/*  bInterfaceClass */  	0x02,			/*  bInterfaceSubClass */  	0x01,			/*  bInterfaceProtocol, linux requires value of 1 for the cdc_acm module */  	0x00,			/*  iInterface */ diff --git a/src/kernel/ao_radio_cmac.c b/src/kernel/ao_radio_cmac.c index bff848f6..b6835346 100644 --- a/src/kernel/ao_radio_cmac.c +++ b/src/kernel/ao_radio_cmac.c @@ -91,7 +91,6 @@ radio_cmac_recv(uint8_t len, uint16_t timeout) __reentrant  		return AO_RADIO_CMAC_TIMEOUT;  	} -	ao_radio_cmac_rssi = ao_radio_rssi;  	if (!(cmac_data[len + AO_CMAC_KEY_LEN +1] & AO_RADIO_STATUS_CRC_OK))  		return AO_RADIO_CMAC_CRC_ERROR; @@ -114,13 +113,15 @@ radio_cmac_recv(uint8_t len, uint16_t timeout) __reentrant  	/* Check the packet signature against the signature provided  	 * over the link  	 */ -	  +  	if (memcmp(&cmac_data[len],  		   &cmac_data[len + AO_CMAC_KEY_LEN + 2],  		   AO_CMAC_KEY_LEN) != 0) {  		return AO_RADIO_CMAC_MAC_ERROR;  	} +	ao_radio_cmac_rssi = ao_radio_rssi; +  	return AO_RADIO_CMAC_OK;  } @@ -161,4 +162,3 @@ ao_radio_cmac_recv(__xdata void *packet, uint8_t len, uint16_t timeout) __reentr  	ao_mutex_put(&ao_radio_cmac_mutex);  	return i;  } - diff --git a/src/kernel/ao_telemetry.h b/src/kernel/ao_telemetry.h index 711e0d36..672d2317 100644 --- a/src/kernel/ao_telemetry.h +++ b/src/kernel/ao_telemetry.h @@ -258,13 +258,14 @@ struct ao_telemetry_metrum_data {  	uint16_t	serial;		/*  0 */  	uint16_t	tick;		/*  2 */  	uint8_t		type;		/*  4 */ +	uint8_t		pad5[3];	/*  5 */ -	int32_t		ground_pres;	/* 8 average pres on pad */ +	int32_t		ground_pres;	/*  8 average pres on pad */  	int16_t		ground_accel;	/* 12 average accel on pad */  	int16_t		accel_plus_g;	/* 14 accel calibration at +1g */  	int16_t		accel_minus_g;	/* 16 accel calibration at -1g */ -	uint8_t		pad[14];	/* 18 */ +	uint8_t		pad18[14];	/* 18 */  	/* 32 */  }; @@ -332,6 +333,8 @@ union ao_telemetry_all {  	struct ao_telemetry_baro		baro;  }; +typedef char ao_check_telemetry_size[sizeof(union ao_telemetry_all) == 32 ? 1 : -1]; +  struct ao_telemetry_all_recv {  	union ao_telemetry_all		telemetry;  	int8_t				rssi;  | 
