-/*\r
- LUFA Library\r
- Copyright (C) Dean Camera, 2010.\r
- \r
- dean [at] fourwalledcubicle [dot] com\r
- www.fourwalledcubicle.com\r
-*/\r
-\r
-/*\r
- Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
-\r
- Permission to use, copy, modify, distribute, and sell this \r
- software and its documentation for any purpose is hereby granted\r
- without fee, provided that the above copyright notice appear in \r
- all copies and that both that the copyright notice and this\r
- permission notice and warranty disclaimer appear in supporting \r
- documentation, and that the name of the author not be used in \r
- advertising or publicity pertaining to distribution of the \r
- software without specific, written prior permission.\r
-\r
- The author disclaim all warranties with regard to this\r
- software, including all implied warranties of merchantability\r
- and fitness. In no event shall the author be liable for any\r
- special, indirect or consequential damages or any damages\r
- whatsoever resulting from loss of use, data or profits, whether\r
- in an action of contract, negligence or other tortious action,\r
- arising out of or in connection with the use or performance of\r
- this software.\r
-*/\r
-\r
-#include "SDPServices.h"\r
-\r
-const struct\r
-{\r
- uint8_t Header;\r
- uint32_t Data;\r
-} PROGMEM SerialPort_Attribute_ServiceHandle =\r
- {\r
- (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_32Bit),\r
- SWAPENDIAN_32(0x00010001),\r
- };\r
-\r
-const struct\r
-{\r
- uint8_t Header;\r
- uint16_t Size;\r
- ItemUUID_t UUIDList[];\r
-} PROGMEM SerialPort_Attribute_ServiceClassIDs =\r
- {\r
- (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable16Bit),\r
- SWAPENDIAN_16(sizeof(ItemUUID_t) * 1),\r
- {\r
- {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), SP_CLASS_UUID}\r
- }\r
- };\r
-\r
-const struct\r
-{\r
- uint8_t Header;\r
- uint16_t Size;\r
-\r
- ItemProtocol_t ProtocolList[];\r
-} PROGMEM SerialPort_Attribute_ProtocolDescriptor =\r
- {\r
- (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable16Bit),\r
- SWAPENDIAN_16(sizeof(ItemProtocol_t) * 2),\r
- {\r
- {\r
- (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),\r
- sizeof(ItemUUID_t),\r
- {\r
- {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), L2CAP_UUID},\r
- }\r
- },\r
- {\r
- (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),\r
- sizeof(ItemUUID_t),\r
- {\r
- {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), RFCOMM_UUID},\r
- }\r
- },\r
- }\r
- };\r
-\r
-const struct\r
-{\r
- uint8_t Header;\r
- uint16_t Size;\r
- ItemUUID_t UUIDList[];\r
-} PROGMEM SerialPort_Attribute_BrowseGroupList =\r
- {\r
- (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable16Bit),\r
- SWAPENDIAN_16(sizeof(ItemUUID_t) * 1),\r
- {\r
- {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), PUBLICBROWSEGROUP_CLASS_UUID}\r
- }\r
- };\r
- \r
-const struct\r
-{\r
- uint8_t Header;\r
- uint8_t Size;\r
- ItemLangEncoding_t LanguageEncodings[];\r
-} PROGMEM SerialPort_Attribute_LanguageBaseIDOffset =\r
- {\r
- .Header = (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),\r
- .Size = (sizeof(ItemLangEncoding_t) * 1),\r
- .LanguageEncodings =\r
- {\r
- {\r
- {(SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), SWAPENDIAN_16(0x454E)},\r
- {(SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), SWAPENDIAN_16(0x006A)},\r
- {(SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), SWAPENDIAN_16(0x0100)},\r
- }\r
- }\r
- };\r
- \r
-const struct\r
-{\r
- uint8_t Header;\r
- uint8_t Size;\r
- char Text[];\r
-} PROGMEM SerialPort_Attribute_ServiceName =\r
- {\r
- (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),\r
- sizeof("Wireless Serial Port") - 1,\r
- "Wireless Serial Port",\r
- };\r
-\r
-const struct\r
-{\r
- uint8_t Header;\r
- uint8_t Size;\r
- char Text[];\r
-} PROGMEM SerialPort_Attribute_ServiceDescription =\r
- {\r
- (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),\r
- sizeof("Wireless Serial Port Service") - 1,\r
- "Wireless Serial Port Service",\r
- };\r
-\r
-const ServiceAttributeTable_t PROGMEM SerialPort_Attribute_Table[] =\r
- {\r
- {.AttributeID = SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE, .Data = &SerialPort_Attribute_ServiceHandle },\r
- {.AttributeID = SDP_ATTRIBUTE_ID_SERVICECLASSIDS, .Data = &SerialPort_Attribute_ServiceClassIDs },\r
- {.AttributeID = SDP_ATTRIBUTE_ID_PROTOCOLDESCRIPTORLIST, .Data = &SerialPort_Attribute_ProtocolDescriptor },\r
- {.AttributeID = SDP_ATTRIBUTE_ID_BROWSEGROUPLIST, .Data = &SerialPort_Attribute_BrowseGroupList },\r
- {.AttributeID = SDP_ATTRIBUTE_ID_LANGUAGEBASEATTROFFSET, .Data = &SerialPort_Attribute_LanguageBaseIDOffset},\r
- {.AttributeID = SDP_ATTRIBUTE_ID_SERVICENAME, .Data = &SerialPort_Attribute_ServiceName },\r
- {.AttributeID = SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION, .Data = &SerialPort_Attribute_ServiceDescription },\r
-\r
- SERVICE_ATTRIBUTE_TABLE_TERMINATOR\r
- };\r
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2012.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2012 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
+ *
+ * SDP Service Attribute definitions. This file contains the attributes
+ * and attribute tables of all the services the device supports, which can
+ * then be retrieved by a connected Bluetooth device via the SDP server.
+ */
+
+#include "SDPServices.h"
+
+/** Serial Port Profile attribute, listing the unique service handle of the Serial Port service
+ * within the device. This handle can then be requested by the SDP client in future transactions
+ * in lieu of a search UUID list.
+ */
+const struct
+{
+ uint8_t Header;
+ uint32_t Data;
+} PROGMEM SerialPort_Attribute_ServiceHandle =
+ {
+ (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_32Bit),
+ SWAPENDIAN_32(0x00010001),
+ };
+
+/** Serial Port Profile attribute, listing the implemented Service Class UUIDs of the Serial Port service
+ * within the device. This list indicates all the class UUIDs that apply to the Serial Port service, so that
+ * a SDP client can search by a generalized class rather than a specific UUID to determine supported services.
+ */
+const struct
+{
+ uint8_t Header;
+ uint8_t Size;
+ ItemUUID_t UUIDList[];
+} PROGMEM SerialPort_Attribute_ServiceClassIDs =
+ {
+ (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),
+ (sizeof(ItemUUID_t) * 1),
+ {
+ {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), SP_CLASS_UUID},
+ },
+ };
+
+/** Serial Port Profile attribute, listing the Protocols (and their attributes) of the Serial Port service
+ * within the device. This list indicates what protocols the service is layered on top of, as well as any
+ * configuration information for each layer.
+ */
+const struct
+{
+ uint8_t Header;
+ uint8_t Size;
+
+ ItemProtocol_t L2CAP;
+ ItemProtocol_8BitParam_t RFCOMM;
+} PROGMEM SerialPort_Attribute_ProtocolDescriptor =
+ {
+ (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),
+ (sizeof(ItemProtocol_t) + sizeof(ItemProtocol_8BitParam_t)),
+ {
+ (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),
+ sizeof(ItemUUID_t),
+ {
+ {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), L2CAP_UUID},
+ },
+ },
+ {
+ (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),
+ (sizeof(ItemUUID_t) + sizeof(Item8Bit_t)),
+ {
+ {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), RFCOMM_UUID},
+ {(SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_8Bit), 0x03},
+ },
+ },
+ };
+
+/** Serial Port Profile attribute, listing the Browse Group List UUIDs which this service is a member of.
+ * Browse Group UUIDs give a way to group together services within a device in a simple hierarchy, so that
+ * a SDP client can progressively narrow down an general browse to a specific service which it requires.
+ */
+const struct
+{
+ uint8_t Header;
+ uint8_t Size;
+ ItemUUID_t UUIDList[];
+} PROGMEM SerialPort_Attribute_BrowseGroupList =
+ {
+ (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),
+ (sizeof(ItemUUID_t) * 1),
+ {
+ {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), PUBLICBROWSEGROUP_CLASS_UUID},
+ },
+ };
+
+/** Serial Port Profile attribute, listing the languages (and their encodings) supported
+ * by the Serial Port service in its text string attributes.
+ */
+const struct
+{
+ uint8_t Header;
+ uint8_t Size;
+ ItemLangEncoding_t LanguageEncodings[];
+} PROGMEM SerialPort_Attribute_LanguageBaseIDOffset =
+ {
+ (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),
+ (sizeof(ItemLangEncoding_t) * 1),
+ {
+ {
+ {(SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), SWAPENDIAN_16(0x454E)},
+ {(SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), SWAPENDIAN_16(0x006A)},
+ {(SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), SWAPENDIAN_16(0x0100)},
+ },
+ },
+ };
+
+/** Serial Port Profile attribute, listing a human readable name of the service. */
+const struct
+{
+ uint8_t Header;
+ uint8_t Size;
+ char Text[];
+} PROGMEM SerialPort_Attribute_ServiceName =
+ {
+ (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),
+ sizeof("Wireless Serial Port") - 1,
+ "Wireless Serial Port",
+ };
+
+/** Serial Port Profile attribute, listing a human readable description of the service. */
+const struct
+{
+ uint8_t Header;
+ uint8_t Size;
+ char Text[];
+} PROGMEM SerialPort_Attribute_ServiceDescription =
+ {
+ (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),
+ sizeof("Wireless Serial Port Service") - 1,
+ "Wireless Serial Port Service",
+ };
+
+/** Service Attribute Table for the Serial Port service, linking each supported attribute ID to its data, so that
+ * the SDP server can retrieve it for transmission back to a SDP client upon request.
+ */
+const ServiceAttributeTable_t PROGMEM SerialPort_Attribute_Table[] =
+ {
+ {.AttributeID = SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE, .Data = &SerialPort_Attribute_ServiceHandle },
+ {.AttributeID = SDP_ATTRIBUTE_ID_SERVICECLASSIDS, .Data = &SerialPort_Attribute_ServiceClassIDs },
+ {.AttributeID = SDP_ATTRIBUTE_ID_PROTOCOLDESCRIPTORLIST, .Data = &SerialPort_Attribute_ProtocolDescriptor },
+ {.AttributeID = SDP_ATTRIBUTE_ID_BROWSEGROUPLIST, .Data = &SerialPort_Attribute_BrowseGroupList },
+ {.AttributeID = SDP_ATTRIBUTE_ID_LANGUAGEBASEATTROFFSET, .Data = &SerialPort_Attribute_LanguageBaseIDOffset},
+ {.AttributeID = SDP_ATTRIBUTE_ID_SERVICENAME, .Data = &SerialPort_Attribute_ServiceName },
+ {.AttributeID = SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION, .Data = &SerialPort_Attribute_ServiceDescription },
+
+ SERVICE_ATTRIBUTE_TABLE_TERMINATOR
+ };
+