Move SDP service tables out into a new set of files, to make the SDP service code cleaner.
This commit is contained in:
		
							parent
							
								
									587f320333
								
							
						
					
					
						commit
						e0ef5741d4
					
				
					 10 changed files with 320 additions and 212 deletions
				
			
		| 
						 | 
				
			
			@ -28,6 +28,11 @@
 | 
			
		|||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/** \file
 | 
			
		||||
 *
 | 
			
		||||
 *  Header file for BluetoothACLPackets.c.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _BLUETOOTH_ACLPACKETS_
 | 
			
		||||
#define _BLUETOOTH_ACLPACKETS_
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,6 +5,7 @@
 | 
			
		|||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
      www.fourwalledcubicle.com
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -27,6 +28,12 @@
 | 
			
		|||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/** \file
 | 
			
		||||
 *
 | 
			
		||||
 *  Bluetooth class codes, used to describe the type and overall function of a
 | 
			
		||||
 *  Bluetooth device to other Bluetooth devices.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _BLUETOOTH_CLASS_CODES_H_
 | 
			
		||||
#define _BLUETOOTH_CLASS_CODES_H_
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,6 +28,11 @@
 | 
			
		|||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/** \file
 | 
			
		||||
 *
 | 
			
		||||
 *  Header file for BluetoothHCICommands.c.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _BLUETOOTH_HCICOMMANDS_H_
 | 
			
		||||
#define _BLUETOOTH_HCICOMMANDS_H_
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,6 +28,11 @@
 | 
			
		|||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/** \file
 | 
			
		||||
 *
 | 
			
		||||
 *  Header file for BluetoothStack.c.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _BLUETOOTH_STACK_
 | 
			
		||||
#define _BLUETOOTH_STACK_
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										174
									
								
								Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										174
									
								
								Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,174 @@
 | 
			
		|||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2010.
 | 
			
		||||
              
 | 
			
		||||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
      www.fourwalledcubicle.com
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
 | 
			
		||||
  Permission to use, copy, modify, distribute, and sell this 
 | 
			
		||||
  software and its documentation for any purpose is hereby granted
 | 
			
		||||
  without fee, provided that the above copyright notice appear in 
 | 
			
		||||
  all copies and that both that the copyright notice and this
 | 
			
		||||
  permission notice and warranty disclaimer appear in supporting 
 | 
			
		||||
  documentation, and that the name of the author not be used in 
 | 
			
		||||
  advertising or publicity pertaining to distribution of the 
 | 
			
		||||
  software without specific, written prior permission.
 | 
			
		||||
 | 
			
		||||
  The author disclaim all warranties with regard to this
 | 
			
		||||
  software, including all implied warranties of merchantability
 | 
			
		||||
  and fitness.  In no event shall the author be liable for any
 | 
			
		||||
  special, indirect or consequential damages or any damages
 | 
			
		||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
			
		||||
  in an action of contract, negligence or other tortious action,
 | 
			
		||||
  arising out of or in connection with the use or performance of
 | 
			
		||||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "SDPServices.h"
 | 
			
		||||
 | 
			
		||||
const struct
 | 
			
		||||
{
 | 
			
		||||
	uint8_t  Header;
 | 
			
		||||
	uint32_t Data;
 | 
			
		||||
} PROGMEM SDP_Attribute_ServiceHandle = {(SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_32Bit), SWAPENDIAN_32(0x00010000)};
 | 
			
		||||
 | 
			
		||||
const struct
 | 
			
		||||
{
 | 
			
		||||
	uint8_t     Header;
 | 
			
		||||
	uint16_t    Size;
 | 
			
		||||
	ClassUUID_t UUIDList[];
 | 
			
		||||
} PROGMEM SDP_Attribute_ServiceClassIDs =
 | 
			
		||||
	{
 | 
			
		||||
		.Header = (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable16Bit),
 | 
			
		||||
		.Size   = SWAPENDIAN_16(sizeof(ClassUUID_t) * 1),
 | 
			
		||||
		.UUIDList =
 | 
			
		||||
			{
 | 
			
		||||
				{.Header = (SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), .UUID = {BASE_96BIT_UUID, 0x00, 0x10, 0x00, 0x00}}
 | 
			
		||||
			}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
const struct
 | 
			
		||||
{
 | 
			
		||||
	uint8_t     Header;
 | 
			
		||||
	uint8_t     Size;
 | 
			
		||||
	Item16Bit_t VersionList[];
 | 
			
		||||
} PROGMEM SDP_Attribute_Version =
 | 
			
		||||
	{
 | 
			
		||||
		.Header = (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),
 | 
			
		||||
		.Size   = (sizeof(Item16Bit_t) * 1),
 | 
			
		||||
		.VersionList =
 | 
			
		||||
			{
 | 
			
		||||
				{.Header = (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), .Value = SWAPENDIAN_16(0x0100)}
 | 
			
		||||
			}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
const struct
 | 
			
		||||
{
 | 
			
		||||
	uint8_t     Header;
 | 
			
		||||
	uint8_t     Size;
 | 
			
		||||
	Item16Bit_t OffsetList[];
 | 
			
		||||
} PROGMEM SDP_Attribute_LangOffset =
 | 
			
		||||
	{
 | 
			
		||||
		.Header = (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),
 | 
			
		||||
		.Size   = (sizeof(Item16Bit_t) * 1),
 | 
			
		||||
		.OffsetList =
 | 
			
		||||
			{
 | 
			
		||||
				{.Header = (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), .Value = SWAPENDIAN_16(0x0100)}
 | 
			
		||||
			}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
const struct
 | 
			
		||||
{
 | 
			
		||||
	uint8_t     Header;
 | 
			
		||||
	uint8_t     Size;
 | 
			
		||||
	char        Text[];
 | 
			
		||||
} PROGMEM SDP_Attribute_ServiceName =
 | 
			
		||||
	{
 | 
			
		||||
		.Header = (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),
 | 
			
		||||
		.Size   = sizeof("SDP") - 1,
 | 
			
		||||
		.Text   = "SDP",
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
const struct
 | 
			
		||||
{
 | 
			
		||||
	uint8_t     Header;
 | 
			
		||||
	uint8_t     Size;
 | 
			
		||||
	char        Text[];
 | 
			
		||||
} PROGMEM SDP_Attribute_ServiceDescription =
 | 
			
		||||
	{
 | 
			
		||||
		.Header = (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),
 | 
			
		||||
		.Size   = sizeof("Service Discovery Protocol Server") - 1,
 | 
			
		||||
		.Text   = "Service Discovery Protocol Server",
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
/** Service Discovery Protocol attribute table, listing all supported attributes of the service. */
 | 
			
		||||
const ServiceAttributeTable_t SDP_Attribute_Table[] PROGMEM =
 | 
			
		||||
	{
 | 
			
		||||
		{.AttributeID = SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE, .Data = &SDP_Attribute_ServiceHandle      },
 | 
			
		||||
		{.AttributeID = SDP_ATTRIBUTE_ID_SERVICECLASSIDS,     .Data = &SDP_Attribute_ServiceClassIDs    },
 | 
			
		||||
		{.AttributeID = SDP_ATTRIBUTE_ID_VERSION,             .Data = &SDP_Attribute_Version            },
 | 
			
		||||
		{.AttributeID = SDP_ATTRIBUTE_ID_LANGIDOFFSET,        .Data = &SDP_Attribute_LangOffset         },
 | 
			
		||||
		{.AttributeID = SDP_ATTRIBUTE_ID_SERVICENAME,         .Data = &SDP_Attribute_ServiceName        },
 | 
			
		||||
		{.AttributeID = SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION,  .Data = &SDP_Attribute_ServiceDescription },
 | 
			
		||||
 | 
			
		||||
		SERVICE_ATTRIBUTE_TABLE_TERMINATOR
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
const struct
 | 
			
		||||
{
 | 
			
		||||
	uint8_t  Header;
 | 
			
		||||
	uint32_t Data;
 | 
			
		||||
} PROGMEM RFCOMM_Attribute_ServiceHandle = {(SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_32Bit), SWAPENDIAN_32(0x00010001)};
 | 
			
		||||
 | 
			
		||||
const struct
 | 
			
		||||
{
 | 
			
		||||
	uint8_t     Header;
 | 
			
		||||
	uint16_t    Size;
 | 
			
		||||
	ClassUUID_t UUIDList[];
 | 
			
		||||
} PROGMEM RFCOMM_Attribute_ServiceClassIDs =
 | 
			
		||||
	{
 | 
			
		||||
		.Header = (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable16Bit),
 | 
			
		||||
		.Size   = SWAPENDIAN_16(sizeof(ClassUUID_t) * 1),
 | 
			
		||||
		.UUIDList =
 | 
			
		||||
			{
 | 
			
		||||
				{.Header = (SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), .UUID = {BASE_96BIT_UUID, 0x01, 0x11, 0x00, 0x00}}
 | 
			
		||||
			}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
const struct
 | 
			
		||||
{
 | 
			
		||||
	uint8_t     Header;
 | 
			
		||||
	uint8_t     Size;
 | 
			
		||||
	char        Text[];
 | 
			
		||||
} PROGMEM RFCOMM_Attribute_ServiceName =
 | 
			
		||||
	{
 | 
			
		||||
		.Header = (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),
 | 
			
		||||
		.Size   = sizeof("Serial Port") - 1,
 | 
			
		||||
		.Text   = "Serial Port",
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
const struct
 | 
			
		||||
{
 | 
			
		||||
	uint8_t     Header;
 | 
			
		||||
	uint8_t     Size;
 | 
			
		||||
	char        Text[];
 | 
			
		||||
} PROGMEM RFCOMM_Attribute_ServiceDescription =
 | 
			
		||||
	{
 | 
			
		||||
		.Header = (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),
 | 
			
		||||
		.Size   = sizeof("Wireless Serial Port Service") - 1,
 | 
			
		||||
		.Text   = "Wireless Serial Port Service",
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
const ServiceAttributeTable_t RFCOMM_Attribute_Table[] PROGMEM =
 | 
			
		||||
	{
 | 
			
		||||
		{.AttributeID = SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE, .Data = &RFCOMM_Attribute_ServiceHandle      },
 | 
			
		||||
		{.AttributeID = SDP_ATTRIBUTE_ID_SERVICECLASSIDS,     .Data = &RFCOMM_Attribute_ServiceClassIDs    },
 | 
			
		||||
		{.AttributeID = SDP_ATTRIBUTE_ID_SERVICENAME,         .Data = &RFCOMM_Attribute_ServiceName        },
 | 
			
		||||
		{.AttributeID = SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION,  .Data = &RFCOMM_Attribute_ServiceDescription },
 | 
			
		||||
 | 
			
		||||
		SERVICE_ATTRIBUTE_TABLE_TERMINATOR
 | 
			
		||||
	};
 | 
			
		||||
							
								
								
									
										114
									
								
								Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								Demos/Host/Incomplete/BluetoothHost/Lib/SDPServices.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,114 @@
 | 
			
		|||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2010.
 | 
			
		||||
              
 | 
			
		||||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
      www.fourwalledcubicle.com
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
 | 
			
		||||
  Permission to use, copy, modify, distribute, and sell this 
 | 
			
		||||
  software and its documentation for any purpose is hereby granted
 | 
			
		||||
  without fee, provided that the above copyright notice appear in 
 | 
			
		||||
  all copies and that both that the copyright notice and this
 | 
			
		||||
  permission notice and warranty disclaimer appear in supporting 
 | 
			
		||||
  documentation, and that the name of the author not be used in 
 | 
			
		||||
  advertising or publicity pertaining to distribution of the 
 | 
			
		||||
  software without specific, written prior permission.
 | 
			
		||||
 | 
			
		||||
  The author disclaim all warranties with regard to this
 | 
			
		||||
  software, including all implied warranties of merchantability
 | 
			
		||||
  and fitness.  In no event shall the author be liable for any
 | 
			
		||||
  special, indirect or consequential damages or any damages
 | 
			
		||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
			
		||||
  in an action of contract, negligence or other tortious action,
 | 
			
		||||
  arising out of or in connection with the use or performance of
 | 
			
		||||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/** \file
 | 
			
		||||
 *
 | 
			
		||||
 *  Header file for SDPServices.c.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _SDPSERVICES_H_
 | 
			
		||||
#define _SDPSERVICES_H_
 | 
			
		||||
	
 | 
			
		||||
	/* Includes: */
 | 
			
		||||
		#include "ServiceDiscoveryProtocol.h"
 | 
			
		||||
 | 
			
		||||
	/* Macros: */
 | 
			
		||||
		/** Size of a full 128 bit UUID, in bytes. */
 | 
			
		||||
		#define UUID_SIZE_BYTES                         16
 | 
			
		||||
		
 | 
			
		||||
		/** First 96 bits common to all standardized Bluetooth services. */
 | 
			
		||||
		#define BASE_96BIT_UUID                         0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00
 | 
			
		||||
		
 | 
			
		||||
		#define SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE    0x0000
 | 
			
		||||
		#define SDP_ATTRIBUTE_ID_SERVICECLASSIDS        0x0001
 | 
			
		||||
		#define SDP_ATTRIBUTE_ID_LANGIDOFFSET           0x0006
 | 
			
		||||
		#define SDP_ATTRIBUTE_ID_AVAILABILITY           0x0008
 | 
			
		||||
		#define SDP_ATTRIBUTE_ID_VERSION                0x0200
 | 
			
		||||
		#define SDP_ATTRIBUTE_ID_SERVICENAME            0x0100
 | 
			
		||||
		#define SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION     0x0101
 | 
			
		||||
		
 | 
			
		||||
		#define SWAPENDIAN_16(x)                        ((((x) & 0xFF00) >> 8) | (((x) & 0x00FF) << 8))
 | 
			
		||||
		#define SWAPENDIAN_32(x)                        (SWAPENDIAN_16(((x) & 0xFFFF0000) >> 16) | SWAPENDIAN_16(((x) & 0x0000FFFF) << 16))
 | 
			
		||||
		
 | 
			
		||||
		/** Terminator for a service attribute table of type \ref ServiceAttributeTable_t. */
 | 
			
		||||
		#define SERVICE_ATTRIBUTE_TABLE_TERMINATOR      {.Data = NULL}
 | 
			
		||||
		
 | 
			
		||||
	/* Type Defines: */
 | 
			
		||||
		/** Structure for the association of attribute ID values to an attribute value in FLASH. A table of these
 | 
			
		||||
		 *  structures can then be built up for each supported UUID service within the device.
 | 
			
		||||
		 */
 | 
			
		||||
		typedef struct
 | 
			
		||||
		{
 | 
			
		||||
			uint16_t    AttributeID; /**< Attribute ID of the table element which the UUID service supports */
 | 
			
		||||
			const void* Data; /**< Pointer to the attribute data, located in PROGMEM memory space */
 | 
			
		||||
		} ServiceAttributeTable_t;
 | 
			
		||||
 | 
			
		||||
		/** Structure for the association of service UUID values to attribute tables stored in FLASH. A table of these
 | 
			
		||||
		 *  structures can then be built up for each supported UUID service within the device.
 | 
			
		||||
		 */
 | 
			
		||||
		typedef struct
 | 
			
		||||
		{
 | 
			
		||||
			uint8_t     UUID[UUID_SIZE_BYTES]; /**< UUID of a service supported by the device */
 | 
			
		||||
			const void* AttributeTable; /**< Pointer to the UUID's attribute table, located in PROGMEM memory space */
 | 
			
		||||
		} ServiceTable_t;
 | 
			
		||||
 | 
			
		||||
		/** Structure for a list of Data Elements containing UUIDs, for service attributes requiring UUID lists. */
 | 
			
		||||
		typedef struct
 | 
			
		||||
		{
 | 
			
		||||
			uint8_t Header; /**< Data Element header, should be (SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit) */
 | 
			
		||||
			uint8_t UUID[UUID_SIZE_BYTES]; /**< UUID to store in the list Data Element */
 | 
			
		||||
		} ClassUUID_t;
 | 
			
		||||
 | 
			
		||||
		/** Structure for a list of Data Elements containing 8-bit integers, for service attributes requiring such lists. */
 | 
			
		||||
		typedef struct
 | 
			
		||||
		{
 | 
			
		||||
			uint8_t  Header; /**< Data Element header, should be (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_8Bit) */
 | 
			
		||||
			uint8_t Value; /**< Value to store in the list Data Element */
 | 
			
		||||
		} Item8Bit_t;
 | 
			
		||||
 | 
			
		||||
		/** Structure for a list of Data Elements containing 16-bit integers, for service attributes requiring such lists. */
 | 
			
		||||
		typedef struct
 | 
			
		||||
		{
 | 
			
		||||
			uint8_t  Header; /**< Data Element header, should be (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit) */
 | 
			
		||||
			uint16_t Value; /**< Value to store in the list Data Element */
 | 
			
		||||
		} Item16Bit_t;
 | 
			
		||||
 | 
			
		||||
		/** Structure for a list of Data Elements containing 32-bit integers, for service attributes requiring such lists. */
 | 
			
		||||
		typedef struct
 | 
			
		||||
		{
 | 
			
		||||
			uint8_t  Header; /**< Data Element header, should be (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_32Bit) */
 | 
			
		||||
			uint32_t Value; /**< Value to store in the list Data Element */
 | 
			
		||||
		} Item32Bit_t;
 | 
			
		||||
 | 
			
		||||
	/* External Variables: */
 | 
			
		||||
		extern const ServiceAttributeTable_t SDP_Attribute_Table[];
 | 
			
		||||
		extern const ServiceAttributeTable_t RFCOMM_Attribute_Table[];
 | 
			
		||||
		
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -31,149 +31,9 @@
 | 
			
		|||
#define  INCLUDE_FROM_SERVICEDISCOVERYPROTOCOL_C
 | 
			
		||||
#include "ServiceDiscoveryProtocol.h"
 | 
			
		||||
 | 
			
		||||
const struct
 | 
			
		||||
{
 | 
			
		||||
	uint8_t  Header;
 | 
			
		||||
	uint32_t Data;
 | 
			
		||||
} PROGMEM SDP_Attribute_ServiceHandle = {(SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_32Bit), SWAPENDIAN_32(0x00010000)};
 | 
			
		||||
/** Base UUID value common to all standardized Bluetooth services */
 | 
			
		||||
const uint8_t BaseUUID[] PROGMEM = {BASE_96BIT_UUID, 0x00, 0x00, 0x00, 0x00};
 | 
			
		||||
 | 
			
		||||
const struct
 | 
			
		||||
{
 | 
			
		||||
	uint8_t     Header;
 | 
			
		||||
	uint16_t    Size;
 | 
			
		||||
	ClassUUID_t UUIDList[];
 | 
			
		||||
} PROGMEM SDP_Attribute_ServiceClassIDs =
 | 
			
		||||
	{
 | 
			
		||||
		.Header = (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable16Bit),
 | 
			
		||||
		.Size   = SWAPENDIAN_16(sizeof(ClassUUID_t) * 1),
 | 
			
		||||
		.UUIDList =
 | 
			
		||||
			{
 | 
			
		||||
				{.Header = (SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), .UUID = {BASE_96BIT_UUID, 0x00, 0x10, 0x00, 0x00}}
 | 
			
		||||
			}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
const struct
 | 
			
		||||
{
 | 
			
		||||
	uint8_t     Header;
 | 
			
		||||
	uint8_t     Size;
 | 
			
		||||
	Item16Bit_t VersionList[];
 | 
			
		||||
} PROGMEM SDP_Attribute_Version =
 | 
			
		||||
	{
 | 
			
		||||
		.Header = (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),
 | 
			
		||||
		.Size   = (sizeof(Item16Bit_t) * 1),
 | 
			
		||||
		.VersionList =
 | 
			
		||||
			{
 | 
			
		||||
				{.Header = (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), .Value = SWAPENDIAN_16(0x0100)}
 | 
			
		||||
			}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
const struct
 | 
			
		||||
{
 | 
			
		||||
	uint8_t     Header;
 | 
			
		||||
	uint8_t     Size;
 | 
			
		||||
	Item16Bit_t OffsetList[];
 | 
			
		||||
} PROGMEM SDP_Attribute_LangOffset =
 | 
			
		||||
	{
 | 
			
		||||
		.Header = (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),
 | 
			
		||||
		.Size   = (sizeof(Item16Bit_t) * 1),
 | 
			
		||||
		.OffsetList =
 | 
			
		||||
			{
 | 
			
		||||
				{.Header = (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), .Value = SWAPENDIAN_16(0x0100)}
 | 
			
		||||
			}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
const struct
 | 
			
		||||
{
 | 
			
		||||
	uint8_t     Header;
 | 
			
		||||
	uint8_t     Size;
 | 
			
		||||
	char        Text[];
 | 
			
		||||
} PROGMEM SDP_Attribute_ServiceName =
 | 
			
		||||
	{
 | 
			
		||||
		.Header = (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),
 | 
			
		||||
		.Size   = sizeof("SDP") - 1,
 | 
			
		||||
		.Text   = "SDP",
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
const struct
 | 
			
		||||
{
 | 
			
		||||
	uint8_t     Header;
 | 
			
		||||
	uint8_t     Size;
 | 
			
		||||
	char        Text[];
 | 
			
		||||
} PROGMEM SDP_Attribute_ServiceDescription =
 | 
			
		||||
	{
 | 
			
		||||
		.Header = (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),
 | 
			
		||||
		.Size   = sizeof("Service Discovery Protocol Server") - 1,
 | 
			
		||||
		.Text   = "Service Discovery Protocol Server",
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
/** Service Discovery Protocol attribute table, listing all supported attributes of the service. */
 | 
			
		||||
const ServiceAttributeTable_t SDP_Attribute_Table[] PROGMEM =
 | 
			
		||||
	{
 | 
			
		||||
		{.AttributeID = SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE, .Data = &SDP_Attribute_ServiceHandle      },
 | 
			
		||||
		{.AttributeID = SDP_ATTRIBUTE_ID_SERVICECLASSIDS,     .Data = &SDP_Attribute_ServiceClassIDs    },
 | 
			
		||||
		{.AttributeID = SDP_ATTRIBUTE_ID_VERSION,             .Data = &SDP_Attribute_Version            },
 | 
			
		||||
		{.AttributeID = SDP_ATTRIBUTE_ID_LANGIDOFFSET,        .Data = &SDP_Attribute_LangOffset         },
 | 
			
		||||
		{.AttributeID = SDP_ATTRIBUTE_ID_SERVICENAME,         .Data = &SDP_Attribute_ServiceName        },
 | 
			
		||||
		{.AttributeID = SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION,  .Data = &SDP_Attribute_ServiceDescription },
 | 
			
		||||
 | 
			
		||||
		SERVICE_ATTRIBUTE_TABLE_TERMINATOR
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
const struct
 | 
			
		||||
{
 | 
			
		||||
	uint8_t  Header;
 | 
			
		||||
	uint32_t Data;
 | 
			
		||||
} PROGMEM RFCOMM_Attribute_ServiceHandle = {(SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_32Bit), SWAPENDIAN_32(0x00010001)};
 | 
			
		||||
 | 
			
		||||
const struct
 | 
			
		||||
{
 | 
			
		||||
	uint8_t     Header;
 | 
			
		||||
	uint16_t    Size;
 | 
			
		||||
	ClassUUID_t UUIDList[];
 | 
			
		||||
} PROGMEM RFCOMM_Attribute_ServiceClassIDs =
 | 
			
		||||
	{
 | 
			
		||||
		.Header = (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable16Bit),
 | 
			
		||||
		.Size   = SWAPENDIAN_16(sizeof(ClassUUID_t) * 1),
 | 
			
		||||
		.UUIDList =
 | 
			
		||||
			{
 | 
			
		||||
				{.Header = (SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), .UUID = {BASE_96BIT_UUID, 0x01, 0x11, 0x00, 0x00}}
 | 
			
		||||
			}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
const struct
 | 
			
		||||
{
 | 
			
		||||
	uint8_t     Header;
 | 
			
		||||
	uint8_t     Size;
 | 
			
		||||
	char        Text[];
 | 
			
		||||
} PROGMEM RFCOMM_Attribute_ServiceName =
 | 
			
		||||
	{
 | 
			
		||||
		.Header = (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),
 | 
			
		||||
		.Size   = sizeof("Serial Port") - 1,
 | 
			
		||||
		.Text   = "Serial Port",
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
const struct
 | 
			
		||||
{
 | 
			
		||||
	uint8_t     Header;
 | 
			
		||||
	uint8_t     Size;
 | 
			
		||||
	char        Text[];
 | 
			
		||||
} PROGMEM RFCOMM_Attribute_ServiceDescription =
 | 
			
		||||
	{
 | 
			
		||||
		.Header = (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),
 | 
			
		||||
		.Size   = sizeof("Wireless Serial Port Service") - 1,
 | 
			
		||||
		.Text   = "Wireless Serial Port Service",
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
const ServiceAttributeTable_t RFCOMM_Attribute_Table[] PROGMEM =
 | 
			
		||||
	{
 | 
			
		||||
		{.AttributeID = SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE, .Data = &RFCOMM_Attribute_ServiceHandle      },
 | 
			
		||||
		{.AttributeID = SDP_ATTRIBUTE_ID_SERVICECLASSIDS,     .Data = &RFCOMM_Attribute_ServiceClassIDs    },
 | 
			
		||||
		{.AttributeID = SDP_ATTRIBUTE_ID_SERVICENAME,         .Data = &RFCOMM_Attribute_ServiceName        },
 | 
			
		||||
		{.AttributeID = SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION,  .Data = &RFCOMM_Attribute_ServiceDescription },
 | 
			
		||||
 | 
			
		||||
		SERVICE_ATTRIBUTE_TABLE_TERMINATOR
 | 
			
		||||
	};
 | 
			
		||||
	
 | 
			
		||||
/** Master service table, listing all supported services (and their attribute tables) of the device, including
 | 
			
		||||
 *  each service's UUID.
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			@ -189,9 +49,6 @@ const ServiceTable_t SDP_Services_Table[] PROGMEM =
 | 
			
		|||
		},
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
/** Base UUID value common to all standardized Bluetooth services */
 | 
			
		||||
const uint8_t BaseUUID[] PROGMEM = {BASE_96BIT_UUID, 0x00, 0x00, 0x00, 0x00};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** Main Service Discovery Protocol packet processing routine. This function processes incomming SDP packets from
 | 
			
		||||
 *  a connected Bluetooth device, and sends back appropriate responses to allow other devices to determine the
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,6 +28,11 @@
 | 
			
		|||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/** \file
 | 
			
		||||
 *
 | 
			
		||||
 *  Header file for ServiceDiscoveryProtocol.c.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _SERVICEDISCOVERYPROTOCOL_H_
 | 
			
		||||
#define _SERVICEDISCOVERYPROTOCOL_H_
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -41,6 +46,7 @@
 | 
			
		|||
		#include <LUFA/Drivers/Peripheral/SerialStream.h>
 | 
			
		||||
 | 
			
		||||
		#include "BluetoothStack.h"
 | 
			
		||||
		#include "SDPServices.h"
 | 
			
		||||
		
 | 
			
		||||
	/* Macros: */
 | 
			
		||||
		#define BT_SDP_DEBUG(l, s, ...)                 do { if (SDP_DEBUG_LEVEL >= l) printf_P(PSTR("(SDP) " s "\r\n"), ##__VA_ARGS__); } while (0)
 | 
			
		||||
| 
						 | 
				
			
			@ -54,26 +60,6 @@
 | 
			
		|||
		#define SDP_PDU_SERVICESEARCHATTRIBUTEREQUEST   0x06
 | 
			
		||||
		#define SDP_PDU_SERVICESEARCHATTRIBUTERESPONSE  0x07
 | 
			
		||||
 | 
			
		||||
		#define SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE    0x0000
 | 
			
		||||
		#define SDP_ATTRIBUTE_ID_SERVICECLASSIDS        0x0001
 | 
			
		||||
		#define SDP_ATTRIBUTE_ID_LANGIDOFFSET           0x0006
 | 
			
		||||
		#define SDP_ATTRIBUTE_ID_AVAILABILITY           0x0008
 | 
			
		||||
		#define SDP_ATTRIBUTE_ID_VERSION                0x0200
 | 
			
		||||
		#define SDP_ATTRIBUTE_ID_SERVICENAME            0x0100
 | 
			
		||||
		#define SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION     0x0101
 | 
			
		||||
		
 | 
			
		||||
		#define SWAPENDIAN_16(x)                        ((((x) & 0xFF00) >> 8) | (((x) & 0x00FF) << 8))
 | 
			
		||||
		#define SWAPENDIAN_32(x)                        (SWAPENDIAN_16(((x) & 0xFFFF0000) >> 16) | SWAPENDIAN_16(((x) & 0x0000FFFF) << 16))
 | 
			
		||||
		
 | 
			
		||||
		/** Size of a full 128 bit UUID, in bytes. */
 | 
			
		||||
		#define UUID_SIZE_BYTES                         16
 | 
			
		||||
		
 | 
			
		||||
		/** First 96 bits common to all standadized Bluetooth services. */
 | 
			
		||||
		#define BASE_96BIT_UUID                         0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00
 | 
			
		||||
		
 | 
			
		||||
		/** Terminator for a service attribute table of type \ref ServiceAttributeTable_t. */
 | 
			
		||||
		#define SERVICE_ATTRIBUTE_TABLE_TERMINATOR      {.Data = NULL}
 | 
			
		||||
		
 | 
			
		||||
	/* Enums: */
 | 
			
		||||
		/** Data sizes for SDP Data Element headers, to indicate the size of the data contained in the element. When creating
 | 
			
		||||
		 *  a Data Element, a value from this enum should be ORed with a value from the \ref ServiceDiscovery_DataTypes_t enum.
 | 
			
		||||
| 
						 | 
				
			
			@ -117,52 +103,6 @@
 | 
			
		|||
			uint16_t ParameterLength; /**< Length of the data following the SDP header */
 | 
			
		||||
		} SDP_PDUHeader_t;
 | 
			
		||||
		
 | 
			
		||||
		/** Structure for the association of attribute ID values to an attribute value in FLASH. A table of these
 | 
			
		||||
		 *  structures can then be built up for each supported UUID service within the device.
 | 
			
		||||
		 */
 | 
			
		||||
		typedef struct
 | 
			
		||||
		{
 | 
			
		||||
			uint16_t    AttributeID; /**< Attribute ID of the table element which the UUID service supports */
 | 
			
		||||
			const void* Data; /**< Pointer to the attribute data, located in PROGMEM memory space */
 | 
			
		||||
		} ServiceAttributeTable_t;
 | 
			
		||||
 | 
			
		||||
		/** Structure for the association of service UUID values to attribute tables stored in FLASH. A table of these
 | 
			
		||||
		 *  structures can then be built up for each supported UUID service within the device.
 | 
			
		||||
		 */
 | 
			
		||||
		typedef struct
 | 
			
		||||
		{
 | 
			
		||||
			uint8_t     UUID[UUID_SIZE_BYTES]; /**< UUID of a service supported by the device */
 | 
			
		||||
			const void* AttributeTable; /**< Pointer to the UUID's attribute table, located in PROGMEM memory space */
 | 
			
		||||
		} ServiceTable_t;
 | 
			
		||||
 | 
			
		||||
		/** Structure for a list of Data Elements containing UUIDs, for service attributes requiring UUID lists. */
 | 
			
		||||
		typedef struct
 | 
			
		||||
		{
 | 
			
		||||
			uint8_t Header; /**< Data Element header, should be (SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit) */
 | 
			
		||||
			uint8_t UUID[UUID_SIZE_BYTES]; /**< UUID to store in the list Data Element */
 | 
			
		||||
		} ClassUUID_t;
 | 
			
		||||
 | 
			
		||||
		/** Structure for a list of Data Elements containing 8-bit integers, for service attributes requiring such lists. */
 | 
			
		||||
		typedef struct
 | 
			
		||||
		{
 | 
			
		||||
			uint8_t  Header; /**< Data Element header, should be (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_8Bit) */
 | 
			
		||||
			uint8_t Value; /**< Value to store in the list Data Element */
 | 
			
		||||
		} Item8Bit_t;
 | 
			
		||||
 | 
			
		||||
		/** Structure for a list of Data Elements containing 16-bit integers, for service attributes requiring such lists. */
 | 
			
		||||
		typedef struct
 | 
			
		||||
		{
 | 
			
		||||
			uint8_t  Header; /**< Data Element header, should be (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit) */
 | 
			
		||||
			uint16_t Value; /**< Value to store in the list Data Element */
 | 
			
		||||
		} Item16Bit_t;
 | 
			
		||||
 | 
			
		||||
		/** Structure for a list of Data Elements containing 32-bit integers, for service attributes requiring such lists. */
 | 
			
		||||
		typedef struct
 | 
			
		||||
		{
 | 
			
		||||
			uint8_t  Header; /**< Data Element header, should be (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_32Bit) */
 | 
			
		||||
			uint32_t Value; /**< Value to store in the list Data Element */
 | 
			
		||||
		} Item32Bit_t;
 | 
			
		||||
		
 | 
			
		||||
	/* Inline Functions: */
 | 
			
		||||
		/** Adds a new Data Element container of the given type with a 16-bit size header to the buffer. The
 | 
			
		||||
		 *  buffer pointer's position is advanced past the added header once the element has been added. The
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -136,6 +136,7 @@ SRC = $(TARGET).c                                                 \
 | 
			
		|||
	  Lib/BluetoothHCICommands.c                                  \
 | 
			
		||||
	  Lib/BluetoothACLPackets.c                                   \
 | 
			
		||||
	  Lib/ServiceDiscoveryProtocol.c                              \
 | 
			
		||||
	  Lib/SDPServices.c                                           \
 | 
			
		||||
	  $(LUFA_PATH)/LUFA/Drivers/Peripheral/SerialStream.c         \
 | 
			
		||||
	  $(LUFA_PATH)/LUFA/Drivers/Peripheral/Serial.c               \
 | 
			
		||||
	  $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/DevChapter9.c        \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue