From 412c48eab5b6e13c2a005effa3d9f73d558cc3d0 Mon Sep 17 00:00:00 2001 From: ndeadly <24677491+ndeadly@users.noreply.github.com> Date: Thu, 2 Feb 2023 01:19:33 +0100 Subject: [PATCH] btdrv: add missing ble definitions (cherry picked from commit f60935fcc2afc82f20a921284a520dab9c61caab) --- nx/include/switch/services/btdrv.h | 403 +++++----- nx/include/switch/services/btdrv_ids.h | 917 +++++++++++++++++++++++ nx/include/switch/services/btdrv_types.h | 131 +++- nx/source/services/btdrv.c | 254 +++---- 4 files changed, 1372 insertions(+), 333 deletions(-) create mode 100644 nx/include/switch/services/btdrv_ids.h diff --git a/nx/include/switch/services/btdrv.h b/nx/include/switch/services/btdrv.h index 8fc6f0d7..c3dcec37 100644 --- a/nx/include/switch/services/btdrv.h +++ b/nx/include/switch/services/btdrv.h @@ -323,96 +323,137 @@ typedef struct { u8 initialized; } BtdrvCircularBuffer; -/// Data for \ref btdrvGetBleManagedEventInfo. The data stored here depends on the \ref BtdrvBleEventType. +/// Data for \ref btdrvGetBleManagedEventInfo and \ref btdrvGetLeHidEventInfo. The data stored here depends on the \ref BtdrvBleEventType. typedef struct { union { u8 data[0x400]; struct { - u32 status; - u8 handle; - u8 registered; - } type0; + u32 result; ///< 0 for success, non-zero for error. + u8 client_if; ///< Client interface handle + u8 status; ///< Registration status. 0 = Unregistered, 1 = Registered + u8 pad[2]; ///< Padding + } client_registration; ///< ::BtdrvBleEventType_ClientRegistration struct { - u32 status; - u32 conn_id; - u32 unk_x8; - u32 unk_xC; - } type2; + u32 result; ///< 0 for success, non-zero for error. + u8 server_if; ///< Server interface handle. Unused + u8 status; ///< Registration status. 0 = Unregistered, 1 = Registered + u8 pad[2]; ///< Padding + } server_registration; ///< ::BtdrvBleEventType_ServerRegistration struct { - u32 conn_id; - u16 min_interval; - u16 max_interval; - u16 slave_latency; - u16 timeout_multiplier; - } type3; ///< Connection params? + u32 result; ///< 0 for success, non-zero for error. + u32 conn_id; ///< Connection ID + u16 conn_interval; ///< Connection interval + u16 conn_latency; ///< Connection latency + u16 supervision_tout; ///< Connection supervision timeout multiplier + u8 pad[2]; ///< Padding + } connection_update; ///< ::BtdrvBleEventType_ConnectionUpdate struct { - u32 status; - u8 unk_x4; - u8 unk_x5; - u8 unk_x6; - u8 unk_x7; - u32 conn_id; - BtdrvAddress address; - u16 unk_x12; - } type4; ///< Connection status? + u32 conn_id; ///< Connection ID + u16 min_conn_interval; ///< Minimum connection interval + u16 max_conn_interval; ///< Maximum connection interval + u16 slave_latency; ///< Slave latency + u16 supervision_tout; ///< Connection supervision timeout multiplier + } preferred_connection_parameters; ///< ::BtdrvBleEventType_PreferredConnectionParameters struct { - u32 status; - u8 unk_x4; - u8 unk_x5; - u8 unk_x6; - BtdrvAddress address; - BtdrvBleAdvertisementData adv[10]; - u8 count; - u32 unk_x144; - } type6; ///< Scan result? + u32 result; ///< 0 for success, non-zero for error. + u8 status; ///< Connection status. 0 = Connected, 2 = Disconnected + u8 client_if; ///< Client interface handle + u8 pad[2]; ///< Padding + u32 conn_id; ///< Connection ID + BtdrvAddress address; ///< Device address + u16 reason; ///< Disconnection reason + } client_connection; ///< ::BtdrvBleEventType_ClientConnection struct { - u32 status; - u32 conn_id; - } type7; + u32 result; ///< 0 for success, non-zero for error. + u8 status; ///< Connection status. 0 = Connected, 2 = Disconnected + u16 server_if; ///< Server interface handle + u8 pad; ///< Padding + u32 conn_id; ///< Connection ID + BtdrvAddress address; ///< Device address + u16 reason; ///< Disconnection reason + } server_connection; ///< ::BtdrvBleEventType_ServerConnection struct { - u32 status; - u8 interface; - u8 unk_x5; - u16 unk_x6; - u32 unk_x8; - BtdrvGattAttributeUuid svc_uuid; - BtdrvGattAttributeUuid char_uuid; - BtdrvGattAttributeUuid descr_uuid; - u16 size; - u8 data[0x202]; - } type8; ///< Notification? + u32 result; ///< 0 for success, non-zero for error. + u8 status; ///< BLE scan status. 1 = Scan complete, 2 = New device found, 0xFF = Scan started + u8 device_type; ///< Device type. 0 = BD/EDR, 1 = BLE, 2 = Dual Mode + u8 ble_addr_type; ///< BLE address type. 0 = Public, 1 = Random, 2 = Public ID, 3 = Random ID + BtdrvAddress address; ///< Device address + BtdrvBleAdvertisement ad_list[10]; ///< BLE Advertisement list \ref BtdrvBleAdvertisement + u8 count; ///< Number of entries above + s32 rssi; ///< RSSI value + } scan_result; ///< ::BtdrvBleEventType_ScanResult struct { - u32 status; - u32 conn_id; - u32 unk_x8; - u8 unk_xC[0x140]; - } type9; + u32 result; ///< 0 for success, non-zero for error. + u32 action; ///< Scan filter action. 0 = Add, 1 = Delete, 2 = Clear, 3 = Enable, 4 = Disable + } scan_filter; ///< ::BtdrvBleEventType_ScanFilter struct { - u32 status; - u32 conn_id; - u8 unk_x8[0x24]; - u32 unk_x2C; - u8 unk_x30[0x11c]; - } type10; + u32 result; ///< 0 for success, non-zero for error. + u32 conn_id; ///< Connection ID + u8 type; ///< Notification type. 4 = Notification, 5 = Indication. + u8 pad[3]; ///< Padding + BtdrvGattAttributeUuid serv_uuid; ///< GATT Service UUID \ref BtdrvGattAttributeUuid + BtdrvGattAttributeUuid char_uuid; ///< GATT Characteristic UUID \ref BtdrvGattAttributeUuid + BtdrvGattAttributeUuid desc_uuid; ///< GATT Descriptor UUID \ref BtdrvGattAttributeUuid + u16 size; ///< Size of the below data + u8 data[0x200]; ///< Notification data. + u8 pad2[2]; ///< Padding + } client_notify; ///< ::BtdrvBleEventType_ClientNotify struct { - u32 status; - u32 conn_id; - u16 unk_x8; - } type11; + u32 result; ///< 0 for success, non-zero for error. + u32 conn_id; ///< Connection ID + u32 count; ///< Number of attributes below. + BtdrvGattAttribute attr_list[10]; ///< List of Gatt attributes \ref BtdrvGattAttribute + } client_cache_save; ///< ::BtdrvBleEventType_ClientCacheSave struct { - u8 unk_x0[0x218]; - } type13; + u32 result; ///< 0 for success, non-zero for error. + u32 conn_id; ///< Connection ID + u16 unk_x8; ///< Unknown. Always 0 + u8 unused[0x142]; ///< Unused + } client_cache_load; ///< ::BtdrvBleEventType_ClientCacheLoad + + struct { + u32 result; ///< 0 for success, non-zero for error. + u32 conn_id; ///< Connection ID + u16 mtu; ///< MTU value + u8 pad[2]; ///< Padding + } client_configure_mtu; ///< ::BtdrvBleEventType_ClientConfigureMtu + + struct { + u32 result; ///< 0 for success, non-zero for error. + u32 server_if; ///< Server interface handle + BtdrvGattAttributeUuid uuid; ///< \ref BtdrvGattAttributeUuid + u16 service_id; ///< Service ID + u16 attr_id; ///< Attribute ID + u8 attr_type; ///< Attribute type \ref BtdrvGattAttributeType + u8 property; ///< Characteristic properties. Only set if attr_type is 1 \ref BtdrvGattCharacteristicProperty + u8 is_primary; ///< Is a primary service or not + u8 pad; ///< Padding + } server_add_characteristic; ///< ::BtdrvBleEventType_ServerAddCharacteristic + + struct { + u32 result; ///< 0 for success, non-zero for error. + u16 conn_id; ///< Connection ID + u8 unk_x6; ///< Unknown. Always 1 + u8 pad; ///< Padding + u16 service_id; ///< Service ID + u16 attr_id; ///< Attribute ID + u8 attr_type; ///< Attribute type \ref BtdrvGattAttributeType + u8 data[0x200]; ///< Data + u16 size; ///< Size of the above data + u16 offset; ///< Offset + u8 pad2[2]; ///< Padding + } server_write; ///< ::BtdrvBleEventType_ServerWrite }; } BtdrvBleEventInfo; @@ -748,7 +789,7 @@ Result btdrvRegisterHidReportEvent(Event* out_event); * @note [7.0.0+] When data isn't available, the type is set to ::BtdrvHidEventType_Data, with the buffer cleared to all-zero. * @param[out] buffer Output buffer, see \ref BtdrvHidReportEventInfo. * @param[in] size Output buffer size. - * @oaram[out] type \ref BtdrvHidEventType + * @param[out] type \ref BtdrvHidEventType */ Result btdrvGetHidReportEventInfo(void* buffer, size_t size, BtdrvHidEventType *type); @@ -853,9 +894,9 @@ Result btdrvSetLeConnectionParameter(const BtdrvLeConnectionParams *param); * @note Only available on [9.0.0+]. This is the newer version of \ref btdrvSetLeConnectionParameter. * @param[in] addr \ref BtdrvAddress * @param[in] param \ref BtdrvBleConnectionParameter - * @param[in] flag Flag + * @param[in] preference Unused */ -Result btdrvSetBleConnectionParameter(BtdrvAddress addr, const BtdrvBleConnectionParameter *param, bool flag); +Result btdrvSetBleConnectionParameter(BtdrvAddress addr, const BtdrvBleConnectionParameter *param, bool preference); /** * @brief SetLeDefaultConnectionParameter @@ -882,10 +923,10 @@ Result btdrvSetBleAdvertiseData(const BtdrvBleAdvertisePacketData *data); * @brief SetBleAdvertiseParameter * @note Only available on [5.0.0+]. * @param[in] addr \ref BtdrvAddress - * @param[in] unk0 Unknown - * @param[in] unk1 Unknown + * @param[in] min_interval Minimum advertisement interval + * @param[in] max_interval Maximum advertisement interval */ -Result btdrvSetBleAdvertiseParameter(BtdrvAddress addr, u16 unk0, u16 unk1); +Result btdrvSetBleAdvertiseParameter(BtdrvAddress addr, u16 min_interval, u16 max_interval); /** * @brief StartBleScan @@ -920,9 +961,9 @@ Result btdrvDeleteBleScanFilterCondition(const BtdrvBleAdvertiseFilter *filter); /** * @brief DeleteBleScanFilter * @note Only available on [5.0.0+]. - * @param[in] unk Unknown + * @param[in] index Filter index */ -Result btdrvDeleteBleScanFilter(u8 unk); +Result btdrvDeleteBleScanFilter(u8 index); /** * @brief ClearBleScanFilters @@ -950,9 +991,9 @@ Result btdrvRegisterGattClient(const BtdrvGattAttributeUuid *uuid); /** * @brief UnregisterGattClient * @note Only available on [5.0.0+]. - * @param[in] unk Unknown + * @param[in] client_if Client interface ID */ -Result btdrvUnregisterGattClient(u8 unk); +Result btdrvUnregisterGattClient(u8 client_if); /** * @brief UnregisterAllGattClients @@ -964,55 +1005,55 @@ Result btdrvUnregisterAllGattClients(void); * @brief ConnectGattServer * @note Only available on [5.0.0+]. * @note This is used by btm-sysmodule. - * @param[in] unk Unknown + * @param[in] client_if Client interface ID * @param[in] addr \ref BtdrvAddress - * @param[in] flag Flag + * @param[in] is_direct Whether a direct connection or a background auto connection * @param[in] AppletResourceUserId AppletResourceUserId */ -Result btdrvConnectGattServer(u8 unk, BtdrvAddress addr, bool flag, u64 AppletResourceUserId); +Result btdrvConnectGattServer(u8 client_if, BtdrvAddress addr, bool is_direct, u64 AppletResourceUserId); /** * @brief CancelConnectGattServer * @note Only available on [5.1.0+]. * @note This is used by btm-sysmodule. - * @param[in] unk Unknown + * @param[in] client_if Client interface ID * @param[in] addr \ref BtdrvAddress - * @param[in] flag Flag + * @param[in] is_direct Whether a direct connection or a background auto connection */ -Result btdrvCancelConnectGattServer(u8 unk, BtdrvAddress addr, bool flag); +Result btdrvCancelConnectGattServer(u8 client_if, BtdrvAddress addr, bool is_direct); /** * @brief DisconnectGattServer * @note Only available on [5.0.0+]. * @note This is used by btm-sysmodule. - * @param[in] unk Unknown + * @param[in] conn_id Connection ID */ -Result btdrvDisconnectGattServer(u32 unk); +Result btdrvDisconnectGattServer(u32 conn_id); /** * @brief GetGattAttribute * @note Only available on [5.0.0+]. * @param[in] addr \ref BtdrvAddress, only used on pre-9.0.0. - * @param[in] unk Unknown + * @param[in] conn_id Connection ID */ -Result btdrvGetGattAttribute(BtdrvAddress addr, u32 unk); +Result btdrvGetGattAttribute(BtdrvAddress addr, u32 conn_id); /** * @brief GetGattService * @note Only available on [5.0.0+]. - * @param[in] unk Unknown + * @param[in] conn_id Connection ID * @param[in] uuid \ref BtdrvGattAttributeUuid */ -Result btdrvGetGattService(u32 unk, const BtdrvGattAttributeUuid *uuid); +Result btdrvGetGattService(u32 conn_id, const BtdrvGattAttributeUuid *uuid); /** * @brief ConfigureAttMtu * @note Only available on [5.0.0+]. * @note This is used by btm-sysmodule. - * @param[in] unk Unknown + * @param[in] conn_id Connection ID * @param[in] mtu MTU */ -Result btdrvConfigureAttMtu(u32 unk, u16 mtu); +Result btdrvConfigureAttMtu(u32 conn_id, u16 mtu); /** * @brief RegisterGattServer @@ -1024,125 +1065,125 @@ Result btdrvRegisterGattServer(const BtdrvGattAttributeUuid *uuid); /** * @brief UnregisterGattServer * @note Only available on [5.0.0+]. - * @param[in] unk Unknown + * @param[in] server_if Server interface ID */ -Result btdrvUnregisterGattServer(u8 unk); +Result btdrvUnregisterGattServer(u8 server_if); /** * @brief ConnectGattClient * @note Only available on [5.0.0+]. - * @param[in] unk Unknown + * @param[in] server_if Server interface ID * @param[in] addr \ref BtdrvAddress - * @param[in] flag Flag + * @param[in] is_direct Whether a direct connection or a background auto connection */ -Result btdrvConnectGattClient(u8 unk, BtdrvAddress addr, bool flag); +Result btdrvConnectGattClient(u8 server_if, BtdrvAddress addr, bool is_direct); /** * @brief DisconnectGattClient * @note Only available on [5.0.0+]. - * @param[in] unk Unknown + * @param[in] conn_id Connection ID * @param[in] addr \ref BtdrvAddress, only used on pre-9.0.0. */ -Result btdrvDisconnectGattClient(u8 unk, BtdrvAddress addr); +Result btdrvDisconnectGattClient(u8 conn_id, BtdrvAddress addr); /** * @brief AddGattService * @note Only available on [5.0.0+]. - * @param[in] unk0 Unknown + * @param[in] server_if Server interface ID * @param[in] uuid \ref BtdrvGattAttributeUuid - * @param[in] unk1 Unknown - * @param[in] flag Flag + * @param[in] num_handle Number of handles + * @param[in] is_primary Is a primary service or not */ -Result btdrvAddGattService(u8 unk0, const BtdrvGattAttributeUuid *uuid, u8 unk1, bool flag); +Result btdrvAddGattService(u8 server_if, const BtdrvGattAttributeUuid *uuid, u8 num_handle, bool is_primary); /** * @brief EnableGattService * @note Only available on [5.0.0+]. - * @param[in] unk Unknown + * @param[in] service_id Service ID * @param[in] uuid \ref BtdrvGattAttributeUuid */ -Result btdrvEnableGattService(u8 unk, const BtdrvGattAttributeUuid *uuid); +Result btdrvEnableGattService(u8 service_id, const BtdrvGattAttributeUuid *uuid); /** * @brief AddGattCharacteristic * @note Only available on [5.0.0+]. - * @param[in] unk0 Unknown - * @param[in] uuid0 \ref BtdrvGattAttributeUuid - * @param[in] uuid1 \ref BtdrvGattAttributeUuid - * @param[in] unk1 Unknown - * @param[in] unk2 Unknown + * @param[in] service_id Service ID + * @param[in] serv_uuid Service UUID \ref BtdrvGattAttributeUuid + * @param[in] char_uuid Characteristic UUID \ref BtdrvGattAttributeUuid + * @param[in] permissions \ref BtdrvGattAttributePermission + * @param[in] property \ref BtdrvGattCharacteristicProperty */ -Result btdrvAddGattCharacteristic(u8 unk0, const BtdrvGattAttributeUuid *uuid0, const BtdrvGattAttributeUuid *uuid1, u8 unk1, u16 unk2); +Result btdrvAddGattCharacteristic(u8 service_id, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, u8 permissions, u16 property); /** * @brief AddGattDescriptor * @note Only available on [5.0.0+]. - * @param[in] unk0 Unknown - * @param[in] uuid0 \ref BtdrvGattAttributeUuid - * @param[in] uuid1 \ref BtdrvGattAttributeUuid - * @param[in] unk1 Unknown + * @param[in] service_id Service ID + * @param[in] serv_uuid Service UUID \ref BtdrvGattAttributeUuid + * @param[in] desc_uuid Descriptor UUID \ref BtdrvGattAttributeUuid + * @param[in] permissions \ref BtdrvGattAttributePermission */ -Result btdrvAddGattDescriptor(u8 unk0, const BtdrvGattAttributeUuid *uuid0, const BtdrvGattAttributeUuid *uuid1, u16 unk1); +Result btdrvAddGattDescriptor(u8 service_id, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *desc_uuid, u16 permissions); /** * @brief GetBleManagedEventInfo * @note Only available on [5.0.0+]. * @note This is used by btm-sysmodule. - * @param[out] buffer Output buffer. 0x400-bytes from state is written here. + * @param[out] buffer Output buffer. 0x400-bytes from state is written here. See \ref BtdrvBleEventInfo. * @param[in] size Output buffer size. - * @oaram[out] type Output BtdrvBleEventType. + * @param[out] type Output BtdrvBleEventType. */ Result btdrvGetBleManagedEventInfo(void* buffer, size_t size, BtdrvBleEventType *type); /** * @brief GetGattFirstCharacteristic * @note Only available on [5.0.0+]. - * @param[in] unk Unknown - * @param[in] id \ref BtdrvGattId - * @param[in] flag Flag - * @param[in] uuid \ref BtdrvGattAttributeUuid - * @param[out] out_property Output Property. - * @param[out] out_char_id Output CharacteristicId \ref BtdrvGattId + * @param[in] conn_id Connection ID + * @param[in] serv_id Service GATT ID \ref BtdrvGattId + * @param[in] is_primary Is a primary service or not + * @param[in] filter_uuid Characteristic filter UUID \ref BtdrvGattAttributeUuid + * @param[out] out_property Output property \ref BtdrvGattCharacteristicProperty + * @param[out] out_char_id Output characteristic GATT ID \ref BtdrvGattId */ -Result btdrvGetGattFirstCharacteristic(u32 unk, const BtdrvGattId *id, bool flag, const BtdrvGattAttributeUuid *uuid, u8 *out_property, BtdrvGattId *out_char_id); +Result btdrvGetGattFirstCharacteristic(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattAttributeUuid *filter_uuid, u8 *out_property, BtdrvGattId *out_char_id); /** * @brief GetGattNextCharacteristic * @note Only available on [5.0.0+]. - * @param[in] unk Unknown - * @param[in] id0 \ref BtdrvGattId - * @param[in] flag Flag - * @param[in] id1 \ref BtdrvGattId - * @param[in] uuid \ref BtdrvGattAttributeUuid - * @param[out] out_property Output Property. - * @param[out] out_char_id Output CharacteristicId \ref BtdrvGattId + * @param[in] conn_id Connection ID + * @param[in] serv_id Service ID \ref BtdrvGattId + * @param[in] is_primary Is a primary service or not + * @param[in] char_id Previous characteristic GATT ID \ref BtdrvGattId + * @param[in] filter_uuid Characteristic filter UUID \ref BtdrvGattAttributeUuid + * @param[out] out_property Output property \ref BtdrvGattCharacteristicProperty + * @param[out] out_char_id Output characteristic GATT ID \ref BtdrvGattId */ -Result btdrvGetGattNextCharacteristic(u32 unk, const BtdrvGattId *id0, bool flag, const BtdrvGattId *id1, const BtdrvGattAttributeUuid *uuid, u8 *out_property, BtdrvGattId *out_char_id); +Result btdrvGetGattNextCharacteristic(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattId *char_id, const BtdrvGattAttributeUuid *filter_uuid, u8 *out_property, BtdrvGattId *out_char_id); /** * @brief GetGattFirstDescriptor * @note Only available on [5.0.0+]. - * @param[in] unk Unknown - * @param[in] id0 \ref BtdrvGattId - * @param[in] flag Flag - * @param[in] id1 \ref BtdrvGattId - * @param[in] uuid \ref BtdrvGattAttributeUuid - * @param[out] out_desc_id Output DescriptorId \ref BtdrvGattId + * @param[in] conn_id Connection ID + * @param[in] serv_id Service GATT ID \ref BtdrvGattId + * @param[in] is_primary Is a primary service or not + * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId + * @param[in] filter_uuid Descriptor filter UUID \ref BtdrvGattAttributeUuid + * @param[out] out_desc_id Output descriptor GATT ID \ref BtdrvGattId */ -Result btdrvGetGattFirstDescriptor(u32 unk, const BtdrvGattId *id0, bool flag, const BtdrvGattId *id1, const BtdrvGattAttributeUuid *uuid, BtdrvGattId *out_desc_id); +Result btdrvGetGattFirstDescriptor(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattId *char_id, const BtdrvGattAttributeUuid *filter_uuid, BtdrvGattId *out_desc_id); /** * @brief GetGattNextDescriptor * @note Only available on [5.0.0+]. - * @param[in] unk Unknown - * @param[in] id0 \ref BtdrvGattId - * @param[in] flag Flag - * @param[in] id1 \ref BtdrvGattId - * @param[in] id2 \ref BtdrvGattId - * @param[in] uuid \ref BtdrvGattAttributeUuid - * @param[out] out_desc_id Output DescriptorId \ref BtdrvGattId + * @param[in] conn_id Connection ID + * @param[in] serv_id Service GATT ID \ref BtdrvGattId + * @param[in] is_primary Is a primary service or not + * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId + * @param[in] desc_id Previous descriptor GATT ID \ref BtdrvGattId + * @param[in] filter_uuid Descriptor filter UUID \ref BtdrvGattAttributeUuid + * @param[out] out_desc_id Output descriptor GATT ID \ref BtdrvGattId */ -Result btdrvGetGattNextDescriptor(u32 unk, const BtdrvGattId *id0, bool flag, const BtdrvGattId *id1, const BtdrvGattId *id2, const BtdrvGattAttributeUuid *uuid, BtdrvGattId *out_desc_id); +Result btdrvGetGattNextDescriptor(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, const BtdrvGattAttributeUuid *filter_uuid, BtdrvGattId *out_desc_id); /** * @brief RegisterGattManagedDataPath @@ -1195,80 +1236,80 @@ Result btdrvUnregisterGattDataPath(const BtdrvGattAttributeUuid *uuid); * @brief ReadGattCharacteristic * @note Only available on [5.0.0+]. * @param[in] connection_handle ConnectionHandle - * @param[in] primary_service PrimaryService - * @param[in] id0 \ref BtdrvGattId - * @param[in] id1 \ref BtdrvGattId - * @param[in] unk Unknown + * @param[in] is_primary Is a primary service or not + * @param[in] serv_id Service GATT ID \ref BtdrvGattId + * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId + * @param[in] auth_req \ref BtdrvGattAuthReqType */ -Result btdrvReadGattCharacteristic(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, u8 unk); +Result btdrvReadGattCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, u8 auth_req); /** * @brief ReadGattDescriptor * @note Only available on [5.0.0+]. * @param[in] connection_handle ConnectionHandle - * @param[in] primary_service PrimaryService - * @param[in] id0 \ref BtdrvGattId - * @param[in] id1 \ref BtdrvGattId - * @param[in] id2 \ref BtdrvGattId - * @param[in] unk Unknown + * @param[in] is_primary Is a primary service or not + * @param[in] serv_id Service GATT ID \ref BtdrvGattId + * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId + * @param[in] desc_id Descriptor GATT ID \ref BtdrvGattId + * @param[in] auth_req \ref BtdrvGattAuthReqType */ -Result btdrvReadGattDescriptor(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2, u8 unk); +Result btdrvReadGattDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, u8 auth_req); /** * @brief WriteGattCharacteristic * @note Only available on [5.0.0+]. * @param[in] connection_handle ConnectionHandle - * @param[in] primary_service PrimaryService - * @param[in] id0 \ref BtdrvGattId - * @param[in] id1 \ref BtdrvGattId + * @param[in] is_primary Is a primary service or not + * @param[in] serv_id Service GATT ID \ref BtdrvGattId + * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId * @param[in] buffer Input buffer. * @param[in] size Input buffer size, must be <=0x258. - * @param[in] unk Unknown - * @param[in] flag Flag + * @param[in] auth_req \ref BtdrvGattAuthReqType + * @param[in] with_response Whether to use Write-With-Response write type or not */ -Result btdrvWriteGattCharacteristic(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const void* buffer, size_t size, u8 unk, bool flag); +Result btdrvWriteGattCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const void* buffer, size_t size, u8 auth_req, bool with_response); /** * @brief WriteGattDescriptor * @note Only available on [5.0.0+]. * @param[in] connection_handle ConnectionHandle - * @param[in] primary_service PrimaryService - * @param[in] id0 \ref BtdrvGattId - * @param[in] id1 \ref BtdrvGattId - * @param[in] id2 \ref BtdrvGattId + * @param[in] is_primary Is a primary service or not + * @param[in] serv_id Service GATT ID \ref BtdrvGattId + * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId + * @param[in] desc_id Descriptor GATT ID \ref BtdrvGattId * @param[in] buffer Input buffer. * @param[in] size Input buffer size, must be <=0x258. - * @param[in] unk Unknown + * @param[in] auth_req \ref BtdrvGattAuthReqType */ -Result btdrvWriteGattDescriptor(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2, const void* buffer, size_t size, u8 unk); +Result btdrvWriteGattDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, const void* buffer, size_t size, u8 auth_req); /** * @brief RegisterGattNotification * @note Only available on [5.0.0+]. * @param[in] connection_handle ConnectionHandle - * @param[in] primary_service PrimaryService - * @param[in] id0 \ref BtdrvGattId - * @param[in] id1 \ref BtdrvGattId + * @param[in] is_primary Is a primary service or not + * @param[in] serv_id Service GATT ID \ref BtdrvGattId + * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId */ -Result btdrvRegisterGattNotification(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1); +Result btdrvRegisterGattNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id); /** * @brief UnregisterGattNotification * @note Only available on [5.0.0+]. * @param[in] connection_handle ConnectionHandle - * @param[in] primary_service PrimaryService - * @param[in] id0 \ref BtdrvGattId - * @param[in] id1 \ref BtdrvGattId + * @param[in] is_primary Is a primary service or not + * @param[in] serv_id Service GATT ID \ref BtdrvGattId + * @param[in] char_id Characteristic GATT ID \ref BtdrvGattId */ -Result btdrvUnregisterGattNotification(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1); +Result btdrvUnregisterGattNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id); /** * @brief GetLeHidEventInfo * @note Only available on [5.0.0+]. * @note The state used by this is reset after writing the data to output. - * @param[out] buffer Output buffer. 0x400-bytes from state is written here. See \ref BtdrvLeEventInfo. + * @param[out] buffer Output buffer. 0x400-bytes from state is written here. See \ref BtdrvBleEventInfo. * @param[in] size Output buffer size. - * @oaram[out] type Output BleEventType. + * @param[out] type \ref BtdrvBleEventType. */ Result btdrvGetLeHidEventInfo(void* buffer, size_t size, BtdrvBleEventType *type); @@ -1284,10 +1325,10 @@ Result btdrvRegisterBleHidEvent(Event* out_event); * @brief SetBleScanParameter * @note Only available on [5.1.0+]. * @note This is used by btm-sysmodule. - * @param[in] unk0 Unknown - * @param[in] unk1 Unknown + * @param[in] scan_interval Scan interval + * @param[in] scan_window Scan window */ -Result btdrvSetBleScanParameter(u16 unk0, u16 unk1); +Result btdrvSetBleScanParameter(u16 scan_interval, u16 scan_window); /** * @brief MoveToSecondaryPiconet diff --git a/nx/include/switch/services/btdrv_ids.h b/nx/include/switch/services/btdrv_ids.h new file mode 100644 index 00000000..29f0a0be --- /dev/null +++ b/nx/include/switch/services/btdrv_ids.h @@ -0,0 +1,917 @@ +/** + * @file btdrv_ids.h + * @brief Bluetooth SIG assigned number definitions (see https://www.bluetooth.com/specifications/assigned-numbers/). + * @author ndeadly + * @copyright libnx Authors + */ +#pragma once + +/// Extract \ref BtdrvAppearanceCategoryType from \ref BtdrvAppearanceType. +#define APPEARANCE_CATEGORY(x) ((x & 0xFFC0) >> 6) + +/// AdType +typedef enum { + BtdrvAdType_Flags = 0x01, ///< Flags + BtdrvAdType_ServiceClassUuid16ListIncomplete = 0x02, ///< Incomplete List of 16-bit Service Class UUIDs + BtdrvAdType_ServiceClassUuid16ListComplete = 0x03, ///< Complete List of 16-bit Service Class UUIDs + BtdrvAdType_ServiceClassUuid32ListIncomplete = 0x04, ///< Incomplete List of 32-bit Service Class UUIDs + BtdrvAdType_ServiceClassUuid32ListComplete = 0x05, ///< Complete List of 32-bit Service Class UUIDs + BtdrvAdType_ServiceClassUuid128ListIncomplete = 0x06, ///< Incomplete List of 128-bit Service Class UUIDs + BtdrvAdType_ServiceClassUuid128ListComplete = 0x07, ///< Complete List of 128-bit Service Class UUIDs + BtdrvAdType_ShortenedLocalName = 0x08, ///< Shortened Local Name + BtdrvAdType_CompleteLocalName = 0x09, ///< Complete Local Name + BtdrvAdType_TxPowerLevel = 0x0A, ///< Tx Power Level + BtdrvAdType_ClassOfDevice = 0x0D, ///< Class of Device + BtdrvAdType_SimplePairingHashC192 = 0x0E, ///< Simple Pairing Hash C-192 + BtdrvAdType_SimplePairingRandomizerR192 = 0x0F, ///< Simple Pairing Randomizer R-192 + BtdrvAdType_DeviceId = 0x10, ///< Device ID + BtdrvAdType_SecurityManagerTkValue = 0x10, ///< Security Manager TK Value + BtdrvAdType_SecurityManagerOutOfBandFlags = 0x11, ///< Security Manager Out of Band Flags + BtdrvAdType_PeripheralConnectionIntervalRange = 0x12, ///< Peripheral Connection Interval Range + BtdrvAdType_ServiceSolicitationUuid16List = 0x14, ///< List of 16-bit Service Solicitation UUIDs + BtdrvAdType_ServiceSolicitationUuid128List = 0x15, ///< List of 128-bit Service Solicitation UUIDs + BtdrvAdType_ServiceDataUuid16 = 0x16, ///< Service Data - 16-bit UUID + BtdrvAdType_PublicTargetAddress = 0x17, ///< Public Target Address + BtdrvAdType_RandomTargetAddress = 0x18, ///< Random Target Address + BtdrvAdType_Appearance = 0x19, ///< Appearance + BtdrvAdType_AdvertisingInterval = 0x1A, ///< Advertising Interval + BtdrvAdType_LeBluetoothDeviceAddress = 0x1B, ///< LE Bluetooth Device Address + BtdrvAdType_LeRole = 0x1C, ///< LE Role + BtdrvAdType_SimplePairingHashC256 = 0x1D, ///< Simple Pairing Hash C-256 + BtdrvAdType_SimplePairingRandomizerR256 = 0x1E, ///< Simple Pairing Randomizer R-256 + BtdrvAdType_ServiceSolicitationUuid32List = 0x1F, ///< List of 32-bit Service Solicitation UUIDs + BtdrvAdType_ServiceDataUuid32 = 0x20, ///< Service Data - 32-bit UUID + BtdrvAdType_ServiceDataUuid128 = 0x21, ///< Service Data - 128-bit UUID + BtdrvAdType_LeSecureConnectionsConfirmationValue = 0x22, ///< LE Secure Connections Confirmation Value + BtdrvAdType_LeSecureConnectionsRandomValue = 0x23, ///< LE Secure Connections Random Value + BtdrvAdType_Uri = 0x24, ///< URI + BtdrvAdType_IndoorPositioning = 0x25, ///< Indoor Positioning + BtdrvAdType_TransportDiscoveryData = 0x26, ///< Transport Discovery Data + BtdrvAdType_LeSupportedFeatures = 0x27, ///< LE Supported Features + BtdrvAdType_ChannelMapUpdateIndication = 0x28, ///< Channel Map Update Indication + BtdrvAdType_PbAdv = 0x29, ///< PB-ADV + BtdrvAdType_MeshMessage = 0x2A, ///< Mesh Message + BtdrvAdType_MeshBeacon = 0x2B, ///< Mesh Beacon + BtdrvAdType_Biginfo = 0x2C, ///< BIGInfo + BtdrvAdType_BroadcastCode = 0x2D, ///< Broadcast_Code + BtdrvAdType_ResolvableSetIdentifier = 0x2E, ///< Resolvable Set Identifier + BtdrvAdType_AdvertisingIntervalLong = 0x2F, ///< Advertising Interval - long + BtdrvAdType_BroadcastName = 0x30, ///< Broadcast_Name + BtdrvAdType_EncryptedAdvertisingData = 0x31, ///< Encrypted Advertising Data + BtdrvAdType_PeriodicAdvertisingResponseTimingInformation = 0x32, ///< Periodic Advertising Response Timing Information + BtdrvAdType_ElectronicShelfLabel = 0x34, ///< Electronic Shelf Label + BtdrvAdType_3DInformationData = 0x3D, ///< 3D Information Data + BtdrvAdType_ManufacturerSpecificData = 0xFF, ///< Manufacturer Specific Data +} BtdrvAdType; + +/// AppearanceCategoryType +typedef enum { + BtdrvAppearanceCategoryType_Unknown = 0x000, ///< Unknown + BtdrvAppearanceCategoryType_Phone = 0x001, ///< Phone + BtdrvAppearanceCategoryType_Computer = 0x002, ///< Computer + BtdrvAppearanceCategoryType_Watch = 0x003, ///< Watch + BtdrvAppearanceCategoryType_Clock = 0x004, ///< Clock + BtdrvAppearanceCategoryType_Display = 0x005, ///< Display + BtdrvAppearanceCategoryType_RemoteControl = 0x006, ///< Remote Control + BtdrvAppearanceCategoryType_EyeGlasses = 0x007, ///< Eye-glasses + BtdrvAppearanceCategoryType_Tag = 0x008, ///< Tag + BtdrvAppearanceCategoryType_Keyring = 0x009, ///< Keyring + BtdrvAppearanceCategoryType_MediaPlayer = 0x00A, ///< Media Player + BtdrvAppearanceCategoryType_BarcodeScanner = 0x00B, ///< Barcode Scanner + BtdrvAppearanceCategoryType_Thermometer = 0x00C, ///< Thermometer + BtdrvAppearanceCategoryType_HeartRateSensor = 0x00D, ///< Heart Rate Sensor + BtdrvAppearanceCategoryType_BloodPressure = 0x00E, ///< Blood Pressure + BtdrvAppearanceCategoryType_HumanInterfaceDevice = 0x00F, ///< Human Interface Device + BtdrvAppearanceCategoryType_GlucoseMeter = 0x010, ///< Glucose Meter + BtdrvAppearanceCategoryType_RunningWalkingSensor = 0x011, ///< Running Walking Sensor + BtdrvAppearanceCategoryType_Cycling = 0x012, ///< Cycling + BtdrvAppearanceCategoryType_ControlDevice = 0x013, ///< Control Device + BtdrvAppearanceCategoryType_NetworkDevice = 0x014, ///< Network Device + BtdrvAppearanceCategoryType_Sensor = 0x015, ///< Sensor + BtdrvAppearanceCategoryType_LightFixtures = 0x016, ///< Light Fixtures + BtdrvAppearanceCategoryType_Fan = 0x017, ///< Fan + BtdrvAppearanceCategoryType_Hvac = 0x018, ///< HVAC + BtdrvAppearanceCategoryType_AirConditioning = 0x019, ///< Air Conditioning + BtdrvAppearanceCategoryType_Humidifier = 0x01A, ///< Humidifier + BtdrvAppearanceCategoryType_Heating = 0x01B, ///< Heating + BtdrvAppearanceCategoryType_AccessControl = 0x01C, ///< Access Control + BtdrvAppearanceCategoryType_MotorizedDevice = 0x01D, ///< Motorized Device + BtdrvAppearanceCategoryType_PowerDevice = 0x01E, ///< Power Device + BtdrvAppearanceCategoryType_LightSource = 0x01F, ///< Light Source + BtdrvAppearanceCategoryType_WindowCovering = 0x020, ///< Window Covering + BtdrvAppearanceCategoryType_AudioSink = 0x021, ///< Audio Sink + BtdrvAppearanceCategoryType_AudioSource = 0x022, ///< Audio Source + BtdrvAppearanceCategoryType_MotorizedVehicle = 0x023, ///< Motorized Vehicle + BtdrvAppearanceCategoryType_DomesticAppliance = 0x024, ///< Domestic Appliance + BtdrvAppearanceCategoryType_WearableAudioDevice = 0x025, ///< Wearable Audio Device + BtdrvAppearanceCategoryType_Aircraft = 0x026, ///< Aircraft + BtdrvAppearanceCategoryType_AvEquipment = 0x027, ///< AV Equipment + BtdrvAppearanceCategoryType_DisplayEquipment = 0x028, ///< Display Equipment + BtdrvAppearanceCategoryType_HearingAid = 0x029, ///< Hearing aid + BtdrvAppearanceCategoryType_Gaming = 0x02A, ///< Gaming + BtdrvAppearanceCategoryType_PulseOximeter = 0x031, ///< Pulse Oximeter + BtdrvAppearanceCategoryType_WeightScale = 0x032, ///< Weight Scale + BtdrvAppearanceCategoryType_PersonalMobilityDevice = 0x033, ///< Personal Mobility Device + BtdrvAppearanceCategoryType_ContinuousGlucoseMonitor = 0x034, ///< Continuous Glucose Monitor + BtdrvAppearanceCategoryType_InsulinPump = 0x035, ///< Insulin Pump + BtdrvAppearanceCategoryType_MedicationDelivery = 0x036, ///< Medication Delivery + BtdrvAppearanceCategoryType_Spirometer = 0x037, ///< Spirometer + BtdrvAppearanceCategoryType_OutdoorSportsActivity = 0x051, ///< Outdoor Sports Activity +} BtdrvAppearanceCategoryType; + +/// AppearanceType +typedef enum { + BtdrvAppearanceType_DesktopWorkstation = 0x0081, ///< Desktop Workstation + BtdrvAppearanceType_ServerClassComputer = 0x0082, ///< Server-class Computer + BtdrvAppearanceType_Laptop = 0x0083, ///< Laptop + BtdrvAppearanceType_HandheldPcPdaClamshell = 0x0084, ///< Handheld PC/PDA (clamshell) + BtdrvAppearanceType_PalmSizePcPda = 0x0085, ///< Palm-size PC/PDA + BtdrvAppearanceType_WearableComputerWatchSize = 0x0086, ///< Wearable computer (watch size) + BtdrvAppearanceType_Tablet = 0x0087, ///< Tablet + BtdrvAppearanceType_DockingStation = 0x0088, ///< Docking Station + BtdrvAppearanceType_AllInOne = 0x0089, ///< All in One + BtdrvAppearanceType_BladeServer = 0x008A, ///< Blade Server + BtdrvAppearanceType_Convertible = 0x008B, ///< Convertible + BtdrvAppearanceType_Detachable = 0x008C, ///< Detachable + BtdrvAppearanceType_IotGateway = 0x008D, ///< IoT Gateway + BtdrvAppearanceType_MiniPc = 0x008E, ///< Mini PC + BtdrvAppearanceType_StickPc = 0x008F, ///< Stick PC + BtdrvAppearanceType_SportsWatch = 0x00C1, ///< Sports Watch + BtdrvAppearanceType_Smartwatch = 0x00C2, ///< Smartwatch + BtdrvAppearanceType_EarThermometer = 0x0301, ///< Ear Thermometer + BtdrvAppearanceType_HeartRateBelt = 0x0341, ///< Heart Rate Belt + BtdrvAppearanceType_ArmBloodPressure = 0x0381, ///< Arm Blood Pressure + BtdrvAppearanceType_WristBloodPressure = 0x0382, ///< Wrist Blood Pressure + BtdrvAppearanceType_Keyboard = 0x03C1, ///< Keyboard + BtdrvAppearanceType_Mouse = 0x03C2, ///< Mouse + BtdrvAppearanceType_Joystick = 0x03C3, ///< Joystick + BtdrvAppearanceType_Gamepad = 0x03C4, ///< Gamepad + BtdrvAppearanceType_DigitizerTablet = 0x03C5, ///< Digitizer Tablet + BtdrvAppearanceType_CardReader = 0x03C6, ///< Card Reader + BtdrvAppearanceType_DigitalPen = 0x03C7, ///< Digital Pen + BtdrvAppearanceType_BarcodeScanner = 0x03C8, ///< Barcode Scanner + BtdrvAppearanceType_Touchpad = 0x03C9, ///< Touchpad + BtdrvAppearanceType_PresentationRemote = 0x03CA, ///< Presentation Remote + BtdrvAppearanceType_InShoeRunningWalkingSensor = 0x0441, ///< In-Shoe Running Walking Sensor + BtdrvAppearanceType_OnShoeRunningWalkingSensor = 0x0442, ///< On-Shoe Running Walking Sensor + BtdrvAppearanceType_OnHipRunningWalkingSensor = 0x0443, ///< On-Hip Running Walking Sensor + BtdrvAppearanceType_CyclingComputer = 0x0481, ///< Cycling Computer + BtdrvAppearanceType_SpeedSensor = 0x0482, ///< Speed Sensor + BtdrvAppearanceType_CadenceSensor = 0x0483, ///< Cadence Sensor + BtdrvAppearanceType_PowerSensor = 0x0484, ///< Power Sensor + BtdrvAppearanceType_SpeedAndCadenceSensor = 0x0485, ///< Speed and Cadence Sensor + BtdrvAppearanceType_Switch = 0x04C1, ///< Switch + BtdrvAppearanceType_MultiSwitch = 0x04C2, ///< Multi-switch + BtdrvAppearanceType_Button = 0x04C3, ///< Button + BtdrvAppearanceType_Slider = 0x04C4, ///< Slider + BtdrvAppearanceType_RotarySwitch = 0x04C5, ///< Rotary Switch + BtdrvAppearanceType_TouchPanel = 0x04C6, ///< Touch Panel + BtdrvAppearanceType_SingleSwitch = 0x04C7, ///< Single Switch + BtdrvAppearanceType_DoubleSwitch = 0x04C8, ///< Double Switch + BtdrvAppearanceType_TripleSwitch = 0x04C9, ///< Triple Switch + BtdrvAppearanceType_BatterySwitch = 0x04CA, ///< Battery Switch + BtdrvAppearanceType_EnergyHarvestingSwitch = 0x04CB, ///< Energy Harvesting Switch + BtdrvAppearanceType_PushButton = 0x04CC, ///< Push Button + BtdrvAppearanceType_AccessPoint = 0x0501, ///< Access Point + BtdrvAppearanceType_MeshDevice = 0x0502, ///< Mesh Device + BtdrvAppearanceType_MeshNetworkProxy = 0x0503, ///< Mesh Network Proxy + BtdrvAppearanceType_MotionSensor = 0x0541, ///< Motion Sensor + BtdrvAppearanceType_AirQualitySensor = 0x0542, ///< Air quality Sensor + BtdrvAppearanceType_TemperatureSensor = 0x0543, ///< Temperature Sensor + BtdrvAppearanceType_HumiditySensor = 0x0544, ///< Humidity Sensor + BtdrvAppearanceType_LeakSensor = 0x0545, ///< Leak Sensor + BtdrvAppearanceType_SmokeSensor = 0x0546, ///< Smoke Sensor + BtdrvAppearanceType_OccupancySensor = 0x0547, ///< Occupancy Sensor + BtdrvAppearanceType_ContactSensor = 0x0548, ///< Contact Sensor + BtdrvAppearanceType_CarbonMonoxideSensor = 0x0549, ///< Carbon Monoxide Sensor + BtdrvAppearanceType_CarbonDioxideSensor = 0x054A, ///< Carbon Dioxide Sensor + BtdrvAppearanceType_AmbientLightSensor = 0x054B, ///< Ambient Light Sensor + BtdrvAppearanceType_EnergySensor = 0x054C, ///< Energy Sensor + BtdrvAppearanceType_ColorLightSensor = 0x054D, ///< Color Light Sensor + BtdrvAppearanceType_RainSensor = 0x054E, ///< Rain Sensor + BtdrvAppearanceType_FireSensor = 0x054F, ///< Fire Sensor + BtdrvAppearanceType_WindSensor = 0x0550, ///< Wind Sensor + BtdrvAppearanceType_ProximitySensor = 0x0551, ///< Proximity Sensor + BtdrvAppearanceType_MultiSensor = 0x0552, ///< Multi-Sensor + BtdrvAppearanceType_FlushMountedSensor = 0x0553, ///< Flush Mounted Sensor + BtdrvAppearanceType_CeilingMountedSensor = 0x0554, ///< Ceiling Mounted Sensor + BtdrvAppearanceType_WallMountedSensor = 0x0555, ///< Wall Mounted Sensor + BtdrvAppearanceType_Multisensor = 0x0556, ///< Multisensor + BtdrvAppearanceType_EnergyMeter = 0x0557, ///< Energy Meter + BtdrvAppearanceType_FlameDetector = 0x0558, ///< Flame Detector + BtdrvAppearanceType_VehicleTirePressureSensor = 0x0559, ///< Vehicle Tire Pressure Sensor + BtdrvAppearanceType_WallLight = 0x0581, ///< Wall Light + BtdrvAppearanceType_CeilingLight = 0x0582, ///< Ceiling Light + BtdrvAppearanceType_FloorLight = 0x0583, ///< Floor Light + BtdrvAppearanceType_CabinetLight = 0x0584, ///< Cabinet Light + BtdrvAppearanceType_DeskLight = 0x0585, ///< Desk Light + BtdrvAppearanceType_TrofferLight = 0x0586, ///< Troffer Light + BtdrvAppearanceType_PendantLight = 0x0587, ///< Pendant Light + BtdrvAppearanceType_InGroundLight = 0x0588, ///< In-ground Light + BtdrvAppearanceType_FloodLight = 0x0589, ///< Flood Light + BtdrvAppearanceType_UnderwaterLight = 0x058A, ///< Underwater Light + BtdrvAppearanceType_BollardWithLight = 0x058B, ///< Bollard with Light + BtdrvAppearanceType_PathwayLight = 0x058C, ///< Pathway Light + BtdrvAppearanceType_GardenLight = 0x058D, ///< Garden Light + BtdrvAppearanceType_PoleTopLight = 0x058E, ///< Pole-top Light + BtdrvAppearanceType_Spotlight = 0x058F, ///< Spotlight + BtdrvAppearanceType_LinearLight = 0x0590, ///< Linear Light + BtdrvAppearanceType_StreetLight = 0x0591, ///< Street Light + BtdrvAppearanceType_ShelvesLight = 0x0592, ///< Shelves Light + BtdrvAppearanceType_BayLight = 0x0593, ///< Bay Light + BtdrvAppearanceType_EmergencyExitLight = 0x0594, ///< Emergency Exit Light + BtdrvAppearanceType_LightController = 0x0595, ///< Light Controller + BtdrvAppearanceType_LightDriver = 0x0596, ///< Light Driver + BtdrvAppearanceType_Bulb = 0x0597, ///< Bulb + BtdrvAppearanceType_LowBayLight = 0x0598, ///< Low-bay Light + BtdrvAppearanceType_HighBayLight = 0x0599, ///< High-bay Light + BtdrvAppearanceType_CeilingFan = 0x05C1, ///< Ceiling Fan + BtdrvAppearanceType_AxialFan = 0x05C2, ///< Axial Fan + BtdrvAppearanceType_ExhaustFan = 0x05C3, ///< Exhaust Fan + BtdrvAppearanceType_PedestalFan = 0x05C4, ///< Pedestal Fan + BtdrvAppearanceType_DeskFan = 0x05C5, ///< Desk Fan + BtdrvAppearanceType_WallFan = 0x05C6, ///< Wall Fan + BtdrvAppearanceType_Thermostat = 0x0601, ///< Thermostat + BtdrvAppearanceType_Humidifier = 0x0602, ///< Humidifier + BtdrvAppearanceType_DeHumidifier = 0x0603, ///< De-humidifier + BtdrvAppearanceType_Heater = 0x0604, ///< Heater + BtdrvAppearanceType_HvacRadiator = 0x0605, ///< HVAC Radiator + BtdrvAppearanceType_HvacBoiler = 0x0606, ///< HVAC Boiler + BtdrvAppearanceType_HvacHeatPump = 0x0607, ///< HVAC Heat Pump + BtdrvAppearanceType_HvacInfraredHeater = 0x0608, ///< HVAC Infrared Heater + BtdrvAppearanceType_HvacRadiantPanelHeater = 0x0609, ///< HVAC Radiant Panel Heater + BtdrvAppearanceType_HvacFanHeater = 0x060A, ///< HVAC Fan Heater + BtdrvAppearanceType_HvacAirCurtain = 0x060B, ///< HVAC Air Curtain + BtdrvAppearanceType_HeatingRadiator = 0x06C1, ///< Heating Radiator + BtdrvAppearanceType_HeatingBoiler = 0x06C2, ///< Heating Boiler + BtdrvAppearanceType_HeatingHeatPump = 0x06C3, ///< Heating Heat Pump + BtdrvAppearanceType_HeatingInfraredHeater = 0x06C4, ///< Heating Infrared Heater + BtdrvAppearanceType_HeatingRadiantPanelHeater = 0x06C5, ///< Heating Radiant Panel Heater + BtdrvAppearanceType_HeatingFanHeater = 0x06C6, ///< Heating Fan Heater + BtdrvAppearanceType_HeatingAirCurtain = 0x06C7, ///< Heating Air Curtain + BtdrvAppearanceType_AccessDoor = 0x0701, ///< Access Door + BtdrvAppearanceType_GarageDoor = 0x0702, ///< Garage Door + BtdrvAppearanceType_EmergencyExitDoor = 0x0703, ///< Emergency Exit Door + BtdrvAppearanceType_AccessLock = 0x0704, ///< Access Lock + BtdrvAppearanceType_Elevator = 0x0705, ///< Elevator + BtdrvAppearanceType_Window = 0x0706, ///< Window + BtdrvAppearanceType_EntranceGate = 0x0707, ///< Entrance Gate + BtdrvAppearanceType_DoorLock = 0x0708, ///< Door Lock + BtdrvAppearanceType_Locker = 0x0709, ///< Locker + BtdrvAppearanceType_MotorizedGate = 0x0741, ///< Motorized Gate + BtdrvAppearanceType_Awning = 0x0742, ///< Awning + BtdrvAppearanceType_BlindsOrShades = 0x0743, ///< Blinds or Shades + BtdrvAppearanceType_Curtains = 0x0744, ///< Curtains + BtdrvAppearanceType_Screen = 0x0745, ///< Screen + BtdrvAppearanceType_PowerOutlet = 0x0781, ///< Power Outlet + BtdrvAppearanceType_PowerStrip = 0x0782, ///< Power Strip + BtdrvAppearanceType_Plug = 0x0783, ///< Plug + BtdrvAppearanceType_PowerSupply = 0x0784, ///< Power Supply + BtdrvAppearanceType_LedDriver = 0x0785, ///< LED Driver + BtdrvAppearanceType_FluorescentLampGear = 0x0786, ///< Fluorescent Lamp Gear + BtdrvAppearanceType_HidLampGear = 0x0787, ///< HID Lamp Gear + BtdrvAppearanceType_ChargeCase = 0x0788, ///< Charge Case + BtdrvAppearanceType_PowerBank = 0x0789, ///< Power Bank + BtdrvAppearanceType_IncandescentLightBulb = 0x07C1, ///< Incandescent Light Bulb + BtdrvAppearanceType_LedLamp = 0x07C2, ///< LED Lamp + BtdrvAppearanceType_HidLamp = 0x07C3, ///< HID Lamp + BtdrvAppearanceType_FluorescentLamp = 0x07C4, ///< Fluorescent Lamp + BtdrvAppearanceType_LedArray = 0x07C5, ///< LED Array + BtdrvAppearanceType_MultiColorLedArray = 0x07C6, ///< Multi-Color LED Array + BtdrvAppearanceType_LowVoltageHalogen = 0x07C7, ///< Low voltage halogen + BtdrvAppearanceType_OrganicLightEmittingDiodeOled = 0x07C8, ///< Organic light emitting diode (OLED) + BtdrvAppearanceType_WindowShades = 0x0801, ///< Window Shades + BtdrvAppearanceType_WindowBlinds = 0x0802, ///< Window Blinds + BtdrvAppearanceType_WindowAwning = 0x0803, ///< Window Awning + BtdrvAppearanceType_WindowCurtain = 0x0804, ///< Window Curtain + BtdrvAppearanceType_ExteriorShutter = 0x0805, ///< Exterior Shutter + BtdrvAppearanceType_ExteriorScreen = 0x0806, ///< Exterior Screen + BtdrvAppearanceType_StandaloneSpeaker = 0x0841, ///< Standalone Speaker + BtdrvAppearanceType_Soundbar = 0x0842, ///< Soundbar + BtdrvAppearanceType_BookshelfSpeaker = 0x0843, ///< Bookshelf Speaker + BtdrvAppearanceType_StandmountedSpeaker = 0x0844, ///< Standmounted Speaker + BtdrvAppearanceType_Speakerphone = 0x0845, ///< Speakerphone + BtdrvAppearanceType_Microphone = 0x0881, ///< Microphone + BtdrvAppearanceType_Alarm = 0x0882, ///< Alarm + BtdrvAppearanceType_Bell = 0x0883, ///< Bell + BtdrvAppearanceType_Horn = 0x0884, ///< Horn + BtdrvAppearanceType_BroadcastingDevice = 0x0885, ///< Broadcasting Device + BtdrvAppearanceType_ServiceDesk = 0x0886, ///< Service Desk + BtdrvAppearanceType_Kiosk = 0x0887, ///< Kiosk + BtdrvAppearanceType_BroadcastingRoom = 0x0888, ///< Broadcasting Room + BtdrvAppearanceType_Auditorium = 0x0889, ///< Auditorium + BtdrvAppearanceType_Car = 0x08C1, ///< Car + BtdrvAppearanceType_LargeGoodsVehicle = 0x08C2, ///< Large Goods Vehicle + BtdrvAppearanceType_2WheeledVehicle = 0x08C3, ///< 2-Wheeled Vehicle + BtdrvAppearanceType_Motorbike = 0x08C4, ///< Motorbike + BtdrvAppearanceType_Scooter = 0x08C5, ///< Scooter + BtdrvAppearanceType_Moped = 0x08C6, ///< Moped + BtdrvAppearanceType_3WheeledVehicle = 0x08C7, ///< 3-Wheeled Vehicle + BtdrvAppearanceType_LightVehicle = 0x08C8, ///< Light Vehicle + BtdrvAppearanceType_QuadBike = 0x08C9, ///< Quad Bike + BtdrvAppearanceType_Minibus = 0x08CA, ///< Minibus + BtdrvAppearanceType_Bus = 0x08CB, ///< Bus + BtdrvAppearanceType_Trolley = 0x08CC, ///< Trolley + BtdrvAppearanceType_AgriculturalVehicle = 0x08CD, ///< Agricultural Vehicle + BtdrvAppearanceType_CamperCaravan = 0x08CE, ///< Camper / Caravan + BtdrvAppearanceType_RecreationalVehicleMotorHome = 0x08CF, ///< Recreational Vehicle / Motor Home + BtdrvAppearanceType_Refrigerator = 0x0901, ///< Refrigerator + BtdrvAppearanceType_Freezer = 0x0902, ///< Freezer + BtdrvAppearanceType_Oven = 0x0903, ///< Oven + BtdrvAppearanceType_Microwave = 0x0904, ///< Microwave + BtdrvAppearanceType_Toaster = 0x0905, ///< Toaster + BtdrvAppearanceType_WashingMachine = 0x0906, ///< Washing Machine + BtdrvAppearanceType_Dryer = 0x0907, ///< Dryer + BtdrvAppearanceType_CoffeeMaker = 0x0908, ///< Coffee maker + BtdrvAppearanceType_ClothesIron = 0x0909, ///< Clothes iron + BtdrvAppearanceType_CurlingIron = 0x090A, ///< Curling iron + BtdrvAppearanceType_HairDryer = 0x090B, ///< Hair dryer + BtdrvAppearanceType_VacuumCleaner = 0x090C, ///< Vacuum cleaner + BtdrvAppearanceType_RoboticVacuumCleaner = 0x090D, ///< Robotic vacuum cleaner + BtdrvAppearanceType_RiceCooker = 0x090E, ///< Rice cooker + BtdrvAppearanceType_ClothesSteamer = 0x090F, ///< Clothes steamer + BtdrvAppearanceType_Earbud = 0x0941, ///< Earbud + BtdrvAppearanceType_Headset = 0x0942, ///< Headset + BtdrvAppearanceType_Headphones = 0x0943, ///< Headphones + BtdrvAppearanceType_NeckBand = 0x0944, ///< Neck Band + BtdrvAppearanceType_LightAircraft = 0x0981, ///< Light Aircraft + BtdrvAppearanceType_Microlight = 0x0982, ///< Microlight + BtdrvAppearanceType_Paraglider = 0x0983, ///< Paraglider + BtdrvAppearanceType_LargePassengerAircraft = 0x0984, ///< Large Passenger Aircraft + BtdrvAppearanceType_Amplifier = 0x09C1, ///< Amplifier + BtdrvAppearanceType_Receiver = 0x09C2, ///< Receiver + BtdrvAppearanceType_Radio = 0x09C3, ///< Radio + BtdrvAppearanceType_Tuner = 0x09C4, ///< Tuner + BtdrvAppearanceType_Turntable = 0x09C5, ///< Turntable + BtdrvAppearanceType_CdPlayer = 0x09C6, ///< CD Player + BtdrvAppearanceType_DvdPlayer = 0x09C7, ///< DVD Player + BtdrvAppearanceType_BlurayPlayer = 0x09C8, ///< Bluray Player + BtdrvAppearanceType_OpticalDiscPlayer = 0x09C9, ///< Optical Disc Player + BtdrvAppearanceType_SetTopBox = 0x09CA, ///< Set-Top Box + BtdrvAppearanceType_Television = 0x0A01, ///< Television + BtdrvAppearanceType_Monitor = 0x0A02, ///< Monitor + BtdrvAppearanceType_Projector = 0x0A03, ///< Projector + BtdrvAppearanceType_InEarHearingAid = 0x0A41, ///< In-ear hearing aid + BtdrvAppearanceType_BehindEarHearingAid = 0x0A42, ///< Behind-ear hearing aid + BtdrvAppearanceType_CochlearImplant = 0x0A43, ///< Cochlear Implant + BtdrvAppearanceType_HomeVideoGameConsole = 0x0A81, ///< Home Video Game Console + BtdrvAppearanceType_PortableHandheldConsole = 0x0A82, ///< Portable handheld console + BtdrvAppearanceType_FingertipPulseOximeter = 0x0C41, ///< Fingertip Pulse Oximeter + BtdrvAppearanceType_WristWornPulseOximeter = 0x0C42, ///< Wrist Worn Pulse Oximeter + BtdrvAppearanceType_PoweredWheelchair = 0x0CC1, ///< Powered Wheelchair + BtdrvAppearanceType_MobilityScooter = 0x0CC2, ///< Mobility Scooter + BtdrvAppearanceType_InsulinPumpDurablePump = 0x0D41, ///< Insulin Pump, durable pump + BtdrvAppearanceType_InsulinPumpPatchPump = 0x0D44, ///< Insulin Pump, patch pump + BtdrvAppearanceType_InsulinPen = 0x0D48, ///< Insulin Pen + BtdrvAppearanceType_HandheldSpirometer = 0x0DC1, ///< Handheld Spirometer + BtdrvAppearanceType_LocationDisplay = 0x1441, ///< Location Display + BtdrvAppearanceType_LocationAndNavigationDisplay = 0x1442, ///< Location and Navigation Display + BtdrvAppearanceType_LocationPod = 0x1443, ///< Location Pod + BtdrvAppearanceType_LocationAndNavigationPod = 0x1444, ///< Location and Navigation Pod +} BtdrvAppearanceType; + +/// GattServiceUuidType +typedef enum { + BtdrvGattServiceUuidType_GenericAccess = 0x1800, ///< Generic Access + BtdrvGattServiceUuidType_GenericAttribute = 0x1801, ///< Generic Attribute + BtdrvGattServiceUuidType_ImmediateAlert = 0x1802, ///< Immediate Alert + BtdrvGattServiceUuidType_LinkLoss = 0x1803, ///< Link Loss + BtdrvGattServiceUuidType_TxPower = 0x1804, ///< Tx Power + BtdrvGattServiceUuidType_CurrentTime = 0x1805, ///< Current Time + BtdrvGattServiceUuidType_ReferenceTimeUpdate = 0x1806, ///< Reference Time Update + BtdrvGattServiceUuidType_NextDstChange = 0x1807, ///< Next DST Change + BtdrvGattServiceUuidType_Glucose = 0x1808, ///< Glucose + BtdrvGattServiceUuidType_HealthThermometer = 0x1809, ///< Health Thermometer + BtdrvGattServiceUuidType_DeviceInformation = 0x180A, ///< Device Information + BtdrvGattServiceUuidType_HeartRate = 0x180D, ///< Heart Rate + BtdrvGattServiceUuidType_PhoneAlertStatus = 0x180E, ///< Phone Alert Status + BtdrvGattServiceUuidType_Battery = 0x180F, ///< Battery + BtdrvGattServiceUuidType_BloodPressure = 0x1810, ///< Blood Pressure + BtdrvGattServiceUuidType_AlertNotification = 0x1811, ///< Alert Notification + BtdrvGattServiceUuidType_HumanInterfaceDevice = 0x1812, ///< Human Interface Device + BtdrvGattServiceUuidType_ScanParameters = 0x1813, ///< Scan Parameters + BtdrvGattServiceUuidType_RunningSpeedAndCadence = 0x1814, ///< Running Speed and Cadence + BtdrvGattServiceUuidType_AutomationIo = 0x1815, ///< Automation IO + BtdrvGattServiceUuidType_CyclingSpeedAndCadence = 0x1816, ///< Cycling Speed and Cadence + BtdrvGattServiceUuidType_CyclingPower = 0x1818, ///< Cycling Power + BtdrvGattServiceUuidType_LocationAndNavigation = 0x1819, ///< Location and Navigation + BtdrvGattServiceUuidType_EnvironmentalSensing = 0x181A, ///< Environmental Sensing + BtdrvGattServiceUuidType_BodyComposition = 0x181B, ///< Body Composition + BtdrvGattServiceUuidType_UserData = 0x181C, ///< User Data + BtdrvGattServiceUuidType_WeightScale = 0x181D, ///< Weight Scale + BtdrvGattServiceUuidType_BondManagement = 0x181E, ///< Bond Management + BtdrvGattServiceUuidType_ContinuousGlucoseMonitoring = 0x181F, ///< Continuous Glucose Monitoring + BtdrvGattServiceUuidType_InternetProtocolSupport = 0x1820, ///< Internet Protocol Support + BtdrvGattServiceUuidType_IndoorPositioning = 0x1821, ///< Indoor Positioning + BtdrvGattServiceUuidType_PulseOximeter = 0x1822, ///< Pulse Oximeter + BtdrvGattServiceUuidType_HttpProxy = 0x1823, ///< HTTP Proxy + BtdrvGattServiceUuidType_TransportDiscovery = 0x1824, ///< Transport Discovery + BtdrvGattServiceUuidType_ObjectTransfer = 0x1825, ///< Object Transfer + BtdrvGattServiceUuidType_FitnessMachine = 0x1826, ///< Fitness Machine + BtdrvGattServiceUuidType_MeshProvisioning = 0x1827, ///< Mesh Provisioning + BtdrvGattServiceUuidType_MeshProxy = 0x1828, ///< Mesh Proxy + BtdrvGattServiceUuidType_ReconnectionConfiguration = 0x1829, ///< Reconnection Configuration + BtdrvGattServiceUuidType_InsulinDelivery = 0x183A, ///< Insulin Delivery + BtdrvGattServiceUuidType_BinarySensor = 0x183B, ///< Binary Sensor + BtdrvGattServiceUuidType_EmergencyConfiguration = 0x183C, ///< Emergency Configuration + BtdrvGattServiceUuidType_AuthorizationControl = 0x183D, ///< Authorization Control + BtdrvGattServiceUuidType_PhysicalActivityMonitor = 0x183E, ///< Physical Activity Monitor + BtdrvGattServiceUuidType_ElapsedTime = 0x183F, ///< Elapsed Time + BtdrvGattServiceUuidType_GenericHealthSensor = 0x1840, ///< Generic Health Sensor + BtdrvGattServiceUuidType_AudioInputControl = 0x1843, ///< Audio Input Control + BtdrvGattServiceUuidType_VolumeControl = 0x1844, ///< Volume Control + BtdrvGattServiceUuidType_VolumeOffsetControl = 0x1845, ///< Volume Offset Control + BtdrvGattServiceUuidType_CoordinatedSetIdentification = 0x1846, ///< Coordinated Set Identification + BtdrvGattServiceUuidType_DeviceTime = 0x1847, ///< Device Time + BtdrvGattServiceUuidType_MediaControl = 0x1848, ///< Media Control + BtdrvGattServiceUuidType_GenericMediaControl = 0x1849, ///< Generic Media Control + BtdrvGattServiceUuidType_ConstantToneExtension = 0x184A, ///< Constant Tone Extension + BtdrvGattServiceUuidType_TelephoneBearer = 0x184B, ///< Telephone Bearer + BtdrvGattServiceUuidType_GenericTelephoneBearer = 0x184C, ///< Generic Telephone Bearer + BtdrvGattServiceUuidType_MicrophoneControl = 0x184D, ///< Microphone Control + BtdrvGattServiceUuidType_AudioStreamControl = 0x184E, ///< Audio Stream Control + BtdrvGattServiceUuidType_BroadcastAudioScan = 0x184F, ///< Broadcast Audio Scan + BtdrvGattServiceUuidType_PublishedAudioCapabilities = 0x1850, ///< Published Audio Capabilities + BtdrvGattServiceUuidType_BasicAudioAnnouncement = 0x1851, ///< Basic Audio Announcement + BtdrvGattServiceUuidType_BroadcastAudioAnnouncement = 0x1852, ///< Broadcast Audio Announcement + BtdrvGattServiceUuidType_CommonAudio = 0x1853, ///< Common Audio + BtdrvGattServiceUuidType_HearingAccess = 0x1854, ///< Hearing Access + BtdrvGattServiceUuidType_TelephonyAndMediaAudio = 0x1855, ///< Telephony and Media Audio + BtdrvGattServiceUuidType_PublicBroadcastAnnouncement = 0x1856, ///< Public Broadcast Announcement + BtdrvGattServiceUuidType_ElectronicShelfLabel = 0x1857, ///< Electronic Shelf Label +} BtdrvGattServiceUuidType; + +/// GattCharacteristicUuidType +typedef enum { + BtdrvGattCharacteristicUuidType_DeviceName = 0x2A00, ///< Device Name + BtdrvGattCharacteristicUuidType_Appearance = 0x2A01, ///< Appearance + BtdrvGattCharacteristicUuidType_PeripheralPrivacyFlag = 0x2A02, ///< Peripheral Privacy Flag + BtdrvGattCharacteristicUuidType_ReconnectionAddress = 0x2A03, ///< Reconnection Address + BtdrvGattCharacteristicUuidType_PeripheralPreferredConnectionParameters = 0x2A04, ///< Peripheral Preferred Connection Parameters + BtdrvGattCharacteristicUuidType_ServiceChanged = 0x2A05, ///< Service Changed + BtdrvGattCharacteristicUuidType_AlertLevel = 0x2A06, ///< Alert Level + BtdrvGattCharacteristicUuidType_TxPowerLevel = 0x2A07, ///< Tx Power Level + BtdrvGattCharacteristicUuidType_DateTime = 0x2A08, ///< Date Time + BtdrvGattCharacteristicUuidType_DayOfWeek = 0x2A09, ///< Day of Week + BtdrvGattCharacteristicUuidType_DayDateTime = 0x2A0A, ///< Day Date Time + BtdrvGattCharacteristicUuidType_ExactTime256 = 0x2A0C, ///< Exact Time 256 + BtdrvGattCharacteristicUuidType_DstOffset = 0x2A0D, ///< DST Offset + BtdrvGattCharacteristicUuidType_TimeZone = 0x2A0E, ///< Time Zone + BtdrvGattCharacteristicUuidType_LocalTimeInformation = 0x2A0F, ///< Local Time Information + BtdrvGattCharacteristicUuidType_TimeWithDst = 0x2A11, ///< Time with DST + BtdrvGattCharacteristicUuidType_TimeAccuracy = 0x2A12, ///< Time Accuracy + BtdrvGattCharacteristicUuidType_TimeSource = 0x2A13, ///< Time Source + BtdrvGattCharacteristicUuidType_ReferenceTimeInformation = 0x2A14, ///< Reference Time Information + BtdrvGattCharacteristicUuidType_TimeUpdateControlPoint = 0x2A16, ///< Time Update Control Point + BtdrvGattCharacteristicUuidType_TimeUpdateState = 0x2A17, ///< Time Update State + BtdrvGattCharacteristicUuidType_GlucoseMeasurement = 0x2A18, ///< Glucose Measurement + BtdrvGattCharacteristicUuidType_BatteryLevel = 0x2A19, ///< Battery Level + BtdrvGattCharacteristicUuidType_TemperatureMeasurement = 0x2A1C, ///< Temperature Measurement + BtdrvGattCharacteristicUuidType_TemperatureType = 0x2A1D, ///< Temperature Type + BtdrvGattCharacteristicUuidType_IntermediateTemperature = 0x2A1E, ///< Intermediate Temperature + BtdrvGattCharacteristicUuidType_MeasurementInterval = 0x2A21, ///< Measurement Interval + BtdrvGattCharacteristicUuidType_BootKeyboardInputReport = 0x2A22, ///< Boot Keyboard Input Report + BtdrvGattCharacteristicUuidType_SystemId = 0x2A23, ///< System ID + BtdrvGattCharacteristicUuidType_ModelNumberString = 0x2A24, ///< Model Number String + BtdrvGattCharacteristicUuidType_SerialNumberString = 0x2A25, ///< Serial Number String + BtdrvGattCharacteristicUuidType_FirmwareRevisionString = 0x2A26, ///< Firmware Revision String + BtdrvGattCharacteristicUuidType_HardwareRevisionString = 0x2A27, ///< Hardware Revision String + BtdrvGattCharacteristicUuidType_SoftwareRevisionString = 0x2A28, ///< Software Revision String + BtdrvGattCharacteristicUuidType_ManufacturerNameString = 0x2A29, ///< Manufacturer Name String + BtdrvGattCharacteristicUuidType_IeeeRegulatoryCertificationDataList = 0x2A2A, ///< IEEE 11073-20601 Regulatory Certification Data List + BtdrvGattCharacteristicUuidType_CurrentTime = 0x2A2B, ///< Current Time + BtdrvGattCharacteristicUuidType_MagneticDeclination = 0x2A2C, ///< Magnetic Declination + BtdrvGattCharacteristicUuidType_ScanRefresh = 0x2A31, ///< Scan Refresh + BtdrvGattCharacteristicUuidType_BootKeyboardOutputReport = 0x2A32, ///< Boot Keyboard Output Report + BtdrvGattCharacteristicUuidType_BootMouseInputReport = 0x2A33, ///< Boot Mouse Input Report + BtdrvGattCharacteristicUuidType_GlucoseMeasurementContext = 0x2A34, ///< Glucose Measurement Context + BtdrvGattCharacteristicUuidType_BloodPressureMeasurement = 0x2A35, ///< Blood Pressure Measurement + BtdrvGattCharacteristicUuidType_IntermediateCuffPressure = 0x2A36, ///< Intermediate Cuff Pressure + BtdrvGattCharacteristicUuidType_HeartRateMeasurement = 0x2A37, ///< Heart Rate Measurement + BtdrvGattCharacteristicUuidType_BodySensorLocation = 0x2A38, ///< Body Sensor Location + BtdrvGattCharacteristicUuidType_HeartRateControlPoint = 0x2A39, ///< Heart Rate Control Point + BtdrvGattCharacteristicUuidType_AlertStatus = 0x2A3F, ///< Alert Status + BtdrvGattCharacteristicUuidType_RingerControlPoint = 0x2A40, ///< Ringer Control Point + BtdrvGattCharacteristicUuidType_RingerSetting = 0x2A41, ///< Ringer Setting + BtdrvGattCharacteristicUuidType_AlertCategoryIdBitMask = 0x2A42, ///< Alert Category ID Bit Mask + BtdrvGattCharacteristicUuidType_AlertCategoryId = 0x2A43, ///< Alert Category ID + BtdrvGattCharacteristicUuidType_AlertNotificationControlPoint = 0x2A44, ///< Alert Notification Control Point + BtdrvGattCharacteristicUuidType_UnreadAlertStatus = 0x2A45, ///< Unread Alert Status + BtdrvGattCharacteristicUuidType_NewAlert = 0x2A46, ///< New Alert + BtdrvGattCharacteristicUuidType_SupportedNewAlertCategory = 0x2A47, ///< Supported New Alert Category + BtdrvGattCharacteristicUuidType_SupportedUnreadAlertCategory = 0x2A48, ///< Supported Unread Alert Category + BtdrvGattCharacteristicUuidType_BloodPressureFeature = 0x2A49, ///< Blood Pressure Feature + BtdrvGattCharacteristicUuidType_HidInformation = 0x2A4A, ///< HID Information + BtdrvGattCharacteristicUuidType_ReportMap = 0x2A4B, ///< Report Map + BtdrvGattCharacteristicUuidType_HidControlPoint = 0x2A4C, ///< HID Control Point + BtdrvGattCharacteristicUuidType_Report = 0x2A4D, ///< Report + BtdrvGattCharacteristicUuidType_ProtocolMode = 0x2A4E, ///< Protocol Mode + BtdrvGattCharacteristicUuidType_ScanIntervalWindow = 0x2A4F, ///< Scan Interval Window + BtdrvGattCharacteristicUuidType_PnpId = 0x2A50, ///< PnP ID + BtdrvGattCharacteristicUuidType_GlucoseFeature = 0x2A51, ///< Glucose Feature + BtdrvGattCharacteristicUuidType_RecordAccessControlPoint = 0x2A52, ///< Record Access Control Point + BtdrvGattCharacteristicUuidType_RscMeasurement = 0x2A53, ///< RSC Measurement + BtdrvGattCharacteristicUuidType_RscFeature = 0x2A54, ///< RSC Feature + BtdrvGattCharacteristicUuidType_ScControlPoint = 0x2A55, ///< SC Control Point + BtdrvGattCharacteristicUuidType_Aggregate = 0x2A5A, ///< Aggregate + BtdrvGattCharacteristicUuidType_CscMeasurement = 0x2A5B, ///< CSC Measurement + BtdrvGattCharacteristicUuidType_CscFeature = 0x2A5C, ///< CSC Feature + BtdrvGattCharacteristicUuidType_SensorLocation = 0x2A5D, ///< Sensor Location + BtdrvGattCharacteristicUuidType_PlxSpotCheckMeasurement = 0x2A5E, ///< PLX Spot-Check Measurement + BtdrvGattCharacteristicUuidType_PlxContinuousMeasurement = 0x2A5F, ///< PLX Continuous Measurement + BtdrvGattCharacteristicUuidType_PlxFeatures = 0x2A60, ///< PLX Features + BtdrvGattCharacteristicUuidType_CyclingPowerMeasurement = 0x2A63, ///< Cycling Power Measurement + BtdrvGattCharacteristicUuidType_CyclingPowerVector = 0x2A64, ///< Cycling Power Vector + BtdrvGattCharacteristicUuidType_CyclingPowerFeature = 0x2A65, ///< Cycling Power Feature + BtdrvGattCharacteristicUuidType_CyclingPowerControlPoint = 0x2A66, ///< Cycling Power Control Point + BtdrvGattCharacteristicUuidType_LocationAndSpeed = 0x2A67, ///< Location and Speed + BtdrvGattCharacteristicUuidType_Navigation = 0x2A68, ///< Navigation + BtdrvGattCharacteristicUuidType_PositionQuality = 0x2A69, ///< Position Quality + BtdrvGattCharacteristicUuidType_LnFeature = 0x2A6A, ///< LN Feature + BtdrvGattCharacteristicUuidType_LnControlPoint = 0x2A6B, ///< LN Control Point + BtdrvGattCharacteristicUuidType_Elevation = 0x2A6C, ///< Elevation + BtdrvGattCharacteristicUuidType_Pressure = 0x2A6D, ///< Pressure + BtdrvGattCharacteristicUuidType_Temperature = 0x2A6E, ///< Temperature + BtdrvGattCharacteristicUuidType_Humidity = 0x2A6F, ///< Humidity + BtdrvGattCharacteristicUuidType_TrueWindSpeed = 0x2A70, ///< True Wind Speed + BtdrvGattCharacteristicUuidType_TrueWindDirection = 0x2A71, ///< True Wind Direction + BtdrvGattCharacteristicUuidType_ApparentWindSpeed = 0x2A72, ///< Apparent Wind Speed + BtdrvGattCharacteristicUuidType_ApparentWindDirection = 0x2A73, ///< Apparent Wind Direction + BtdrvGattCharacteristicUuidType_GustFactor = 0x2A74, ///< Gust Factor + BtdrvGattCharacteristicUuidType_PollenConcentration = 0x2A75, ///< Pollen Concentration + BtdrvGattCharacteristicUuidType_UvIndex = 0x2A76, ///< UV Index + BtdrvGattCharacteristicUuidType_Irradiance = 0x2A77, ///< Irradiance + BtdrvGattCharacteristicUuidType_Rainfall = 0x2A78, ///< Rainfall + BtdrvGattCharacteristicUuidType_WindChill = 0x2A79, ///< Wind Chill + BtdrvGattCharacteristicUuidType_HeatIndex = 0x2A7A, ///< Heat Index + BtdrvGattCharacteristicUuidType_DewPoint = 0x2A7B, ///< Dew Point + BtdrvGattCharacteristicUuidType_DescriptorValueChanged = 0x2A7D, ///< Descriptor Value Changed + BtdrvGattCharacteristicUuidType_AerobicHeartRateLowerLimit = 0x2A7E, ///< Aerobic Heart Rate Lower Limit + BtdrvGattCharacteristicUuidType_AerobicThreshold = 0x2A7F, ///< Aerobic Threshold + BtdrvGattCharacteristicUuidType_Age = 0x2A80, ///< Age + BtdrvGattCharacteristicUuidType_AnaerobicHeartRateLowerLimit = 0x2A81, ///< Anaerobic Heart Rate Lower Limit + BtdrvGattCharacteristicUuidType_AnaerobicHeartRateUpperLimit = 0x2A82, ///< Anaerobic Heart Rate Upper Limit + BtdrvGattCharacteristicUuidType_AnaerobicThreshold = 0x2A83, ///< Anaerobic Threshold + BtdrvGattCharacteristicUuidType_AerobicHeartRateUpperLimit = 0x2A84, ///< Aerobic Heart Rate Upper Limit + BtdrvGattCharacteristicUuidType_DateOfBirth = 0x2A85, ///< Date of Birth + BtdrvGattCharacteristicUuidType_DateOfThresholdAssessment = 0x2A86, ///< Date of Threshold Assessment + BtdrvGattCharacteristicUuidType_EmailAddress = 0x2A87, ///< Email Address + BtdrvGattCharacteristicUuidType_FatBurnHeartRateLowerLimit = 0x2A88, ///< Fat Burn Heart Rate Lower Limit + BtdrvGattCharacteristicUuidType_FatBurnHeartRateUpperLimit = 0x2A89, ///< Fat Burn Heart Rate Upper Limit + BtdrvGattCharacteristicUuidType_FirstName = 0x2A8A, ///< First Name + BtdrvGattCharacteristicUuidType_FiveZoneHeartRateLimits = 0x2A8B, ///< Five Zone Heart Rate Limits + BtdrvGattCharacteristicUuidType_Gender = 0x2A8C, ///< Gender + BtdrvGattCharacteristicUuidType_HeartRateMax = 0x2A8D, ///< Heart Rate Max + BtdrvGattCharacteristicUuidType_Height = 0x2A8E, ///< Height + BtdrvGattCharacteristicUuidType_HipCircumference = 0x2A8F, ///< Hip Circumference + BtdrvGattCharacteristicUuidType_LastName = 0x2A90, ///< Last Name + BtdrvGattCharacteristicUuidType_MaximumRecommendedHeartRate = 0x2A91, ///< Maximum Recommended Heart Rate + BtdrvGattCharacteristicUuidType_RestingHeartRate = 0x2A92, ///< Resting Heart Rate + BtdrvGattCharacteristicUuidType_SportTypeForAerobicAndAnaerobicThresholds = 0x2A93, ///< Sport Type for Aerobic and Anaerobic Thresholds + BtdrvGattCharacteristicUuidType_ThreeZoneHeartRateLimits = 0x2A94, ///< Three Zone Heart Rate Limits + BtdrvGattCharacteristicUuidType_TwoZoneHeartRateLimits = 0x2A95, ///< Two Zone Heart Rate Limits + BtdrvGattCharacteristicUuidType_Vo2Max = 0x2A96, ///< VO2 Max + BtdrvGattCharacteristicUuidType_WaistCircumference = 0x2A97, ///< Waist Circumference + BtdrvGattCharacteristicUuidType_Weight = 0x2A98, ///< Weight + BtdrvGattCharacteristicUuidType_DatabaseChangeIncrement = 0x2A99, ///< Database Change Increment + BtdrvGattCharacteristicUuidType_UserIndex = 0x2A9A, ///< User Index + BtdrvGattCharacteristicUuidType_BodyCompositionFeature = 0x2A9B, ///< Body Composition Feature + BtdrvGattCharacteristicUuidType_BodyCompositionMeasurement = 0x2A9C, ///< Body Composition Measurement + BtdrvGattCharacteristicUuidType_WeightMeasurement = 0x2A9D, ///< Weight Measurement + BtdrvGattCharacteristicUuidType_WeightScaleFeature = 0x2A9E, ///< Weight Scale Feature + BtdrvGattCharacteristicUuidType_UserControlPoint = 0x2A9F, ///< User Control Point + BtdrvGattCharacteristicUuidType_MagneticFluxDensity2D = 0x2AA0, ///< Magnetic Flux Density - 2D + BtdrvGattCharacteristicUuidType_MagneticFluxDensity3D = 0x2AA1, ///< Magnetic Flux Density - 3D + BtdrvGattCharacteristicUuidType_Language = 0x2AA2, ///< Language + BtdrvGattCharacteristicUuidType_BarometricPressureTrend = 0x2AA3, ///< Barometric Pressure Trend + BtdrvGattCharacteristicUuidType_BondManagementControlPoint = 0x2AA4, ///< Bond Management Control Point + BtdrvGattCharacteristicUuidType_BondManagementFeature = 0x2AA5, ///< Bond Management Feature + BtdrvGattCharacteristicUuidType_CentralAddressResolution = 0x2AA6, ///< Central Address Resolution + BtdrvGattCharacteristicUuidType_CgmMeasurement = 0x2AA7, ///< CGM Measurement + BtdrvGattCharacteristicUuidType_CgmFeature = 0x2AA8, ///< CGM Feature + BtdrvGattCharacteristicUuidType_CgmStatus = 0x2AA9, ///< CGM Status + BtdrvGattCharacteristicUuidType_CgmSessionStartTime = 0x2AAA, ///< CGM Session Start Time + BtdrvGattCharacteristicUuidType_CgmSessionRunTime = 0x2AAB, ///< CGM Session Run Time + BtdrvGattCharacteristicUuidType_CgmSpecificOpsControlPoint = 0x2AAC, ///< CGM Specific Ops Control Point + BtdrvGattCharacteristicUuidType_IndoorPositioningConfiguration = 0x2AAD, ///< Indoor Positioning Configuration + BtdrvGattCharacteristicUuidType_Latitude = 0x2AAE, ///< Latitude + BtdrvGattCharacteristicUuidType_Longitude = 0x2AAF, ///< Longitude + BtdrvGattCharacteristicUuidType_LocalNorthCoordinate = 0x2AB0, ///< Local North Coordinate + BtdrvGattCharacteristicUuidType_LocalEastCoordinate = 0x2AB1, ///< Local East Coordinate + BtdrvGattCharacteristicUuidType_FloorNumber = 0x2AB2, ///< Floor Number + BtdrvGattCharacteristicUuidType_Altitude = 0x2AB3, ///< Altitude + BtdrvGattCharacteristicUuidType_Uncertainty = 0x2AB4, ///< Uncertainty + BtdrvGattCharacteristicUuidType_LocationName = 0x2AB5, ///< Location Name + BtdrvGattCharacteristicUuidType_Uri = 0x2AB6, ///< URI + BtdrvGattCharacteristicUuidType_HttpHeaders = 0x2AB7, ///< HTTP Headers + BtdrvGattCharacteristicUuidType_HttpStatusCode = 0x2AB8, ///< HTTP Status Code + BtdrvGattCharacteristicUuidType_HttpEntityBody = 0x2AB9, ///< HTTP Entity Body + BtdrvGattCharacteristicUuidType_HttpControlPoint = 0x2ABA, ///< HTTP Control Point + BtdrvGattCharacteristicUuidType_HttpsSecurity = 0x2ABB, ///< HTTPS Security + BtdrvGattCharacteristicUuidType_TdsControlPoint = 0x2ABC, ///< TDS Control Point + BtdrvGattCharacteristicUuidType_OtsFeature = 0x2ABD, ///< OTS Feature + BtdrvGattCharacteristicUuidType_ObjectName = 0x2ABE, ///< Object Name + BtdrvGattCharacteristicUuidType_ObjectType = 0x2ABF, ///< Object Type + BtdrvGattCharacteristicUuidType_ObjectSize = 0x2AC0, ///< Object Size + BtdrvGattCharacteristicUuidType_ObjectFirstCreated = 0x2AC1, ///< Object First-Created + BtdrvGattCharacteristicUuidType_ObjectLastModified = 0x2AC2, ///< Object Last-Modified + BtdrvGattCharacteristicUuidType_ObjectId = 0x2AC3, ///< Object ID + BtdrvGattCharacteristicUuidType_ObjectProperties = 0x2AC4, ///< Object Properties + BtdrvGattCharacteristicUuidType_ObjectActionControlPoint = 0x2AC5, ///< Object Action Control Point + BtdrvGattCharacteristicUuidType_ObjectListControlPoint = 0x2AC6, ///< Object List Control Point + BtdrvGattCharacteristicUuidType_ObjectListFilter = 0x2AC7, ///< Object List Filter + BtdrvGattCharacteristicUuidType_ObjectChanged = 0x2AC8, ///< Object Changed + BtdrvGattCharacteristicUuidType_ResolvablePrivateAddressOnly = 0x2AC9, ///< Resolvable Private Address Only + BtdrvGattCharacteristicUuidType_FitnessMachineFeature = 0x2ACC, ///< Fitness Machine Feature + BtdrvGattCharacteristicUuidType_TreadmillData = 0x2ACD, ///< Treadmill Data + BtdrvGattCharacteristicUuidType_CrossTrainerData = 0x2ACE, ///< Cross Trainer Data + BtdrvGattCharacteristicUuidType_StepClimberData = 0x2ACF, ///< Step Climber Data + BtdrvGattCharacteristicUuidType_StairClimberData = 0x2AD0, ///< Stair Climber Data + BtdrvGattCharacteristicUuidType_RowerData = 0x2AD1, ///< Rower Data + BtdrvGattCharacteristicUuidType_IndoorBikeData = 0x2AD2, ///< Indoor Bike Data + BtdrvGattCharacteristicUuidType_TrainingStatus = 0x2AD3, ///< Training Status + BtdrvGattCharacteristicUuidType_SupportedSpeedRange = 0x2AD4, ///< Supported Speed Range + BtdrvGattCharacteristicUuidType_SupportedInclinationRange = 0x2AD5, ///< Supported Inclination Range + BtdrvGattCharacteristicUuidType_SupportedResistanceLevelRange = 0x2AD6, ///< Supported Resistance Level Range + BtdrvGattCharacteristicUuidType_SupportedHeartRateRange = 0x2AD7, ///< Supported Heart Rate Range + BtdrvGattCharacteristicUuidType_SupportedPowerRange = 0x2AD8, ///< Supported Power Range + BtdrvGattCharacteristicUuidType_FitnessMachineControlPoint = 0x2AD9, ///< Fitness Machine Control Point + BtdrvGattCharacteristicUuidType_FitnessMachineStatus = 0x2ADA, ///< Fitness Machine Status + BtdrvGattCharacteristicUuidType_MeshProvisioningDataIn = 0x2ADB, ///< Mesh Provisioning Data In + BtdrvGattCharacteristicUuidType_MeshProvisioningDataOut = 0x2ADC, ///< Mesh Provisioning Data Out + BtdrvGattCharacteristicUuidType_MeshProxyDataIn = 0x2ADD, ///< Mesh Proxy Data In + BtdrvGattCharacteristicUuidType_MeshProxyDataOut = 0x2ADE, ///< Mesh Proxy Data Out + BtdrvGattCharacteristicUuidType_AverageCurrent = 0x2AE0, ///< Average Current + BtdrvGattCharacteristicUuidType_AverageVoltage = 0x2AE1, ///< Average Voltage + BtdrvGattCharacteristicUuidType_Boolean = 0x2AE2, ///< Boolean + BtdrvGattCharacteristicUuidType_ChromaticDistanceFromPlanckian = 0x2AE3, ///< Chromatic Distance from Planckian + BtdrvGattCharacteristicUuidType_ChromaticityCoordinates = 0x2AE4, ///< Chromaticity Coordinates + BtdrvGattCharacteristicUuidType_ChromaticityInCctAndDuvValues = 0x2AE5, ///< Chromaticity in CCT and Duv Values + BtdrvGattCharacteristicUuidType_ChromaticityTolerance = 0x2AE6, ///< Chromaticity Tolerance + BtdrvGattCharacteristicUuidType_CieColorRenderingIndex = 0x2AE7, ///< CIE 13.3-1995 Color Rendering Index + BtdrvGattCharacteristicUuidType_Coefficient = 0x2AE8, ///< Coefficient + BtdrvGattCharacteristicUuidType_CorrelatedColorTemperature = 0x2AE9, ///< Correlated Color Temperature + BtdrvGattCharacteristicUuidType_Count16 = 0x2AEA, ///< Count 16 + BtdrvGattCharacteristicUuidType_Count24 = 0x2AEB, ///< Count 24 + BtdrvGattCharacteristicUuidType_CountryCode = 0x2AEC, ///< Country Code + BtdrvGattCharacteristicUuidType_DateUtc = 0x2AED, ///< Date UTC + BtdrvGattCharacteristicUuidType_ElectricCurrent = 0x2AEE, ///< Electric Current + BtdrvGattCharacteristicUuidType_ElectricCurrentRange = 0x2AEF, ///< Electric Current Range + BtdrvGattCharacteristicUuidType_ElectricCurrentSpecification = 0x2AF0, ///< Electric Current Specification + BtdrvGattCharacteristicUuidType_ElectricCurrentStatistics = 0x2AF1, ///< Electric Current Statistics + BtdrvGattCharacteristicUuidType_Energy = 0x2AF2, ///< Energy + BtdrvGattCharacteristicUuidType_EnergyInAPeriodOfDay = 0x2AF3, ///< Energy in a Period of Day + BtdrvGattCharacteristicUuidType_EventStatistics = 0x2AF4, ///< Event Statistics + BtdrvGattCharacteristicUuidType_FixedString16 = 0x2AF5, ///< Fixed String 16 + BtdrvGattCharacteristicUuidType_FixedString24 = 0x2AF6, ///< Fixed String 24 + BtdrvGattCharacteristicUuidType_FixedString36 = 0x2AF7, ///< Fixed String 36 + BtdrvGattCharacteristicUuidType_FixedString8 = 0x2AF8, ///< Fixed String 8 + BtdrvGattCharacteristicUuidType_GenericLevel = 0x2AF9, ///< Generic Level + BtdrvGattCharacteristicUuidType_GlobalTradeItemNumber = 0x2AFA, ///< Global Trade Item Number + BtdrvGattCharacteristicUuidType_Illuminance = 0x2AFB, ///< Illuminance + BtdrvGattCharacteristicUuidType_LuminousEfficacy = 0x2AFC, ///< Luminous Efficacy + BtdrvGattCharacteristicUuidType_LuminousEnergy = 0x2AFD, ///< Luminous Energy + BtdrvGattCharacteristicUuidType_LuminousExposure = 0x2AFE, ///< Luminous Exposure + BtdrvGattCharacteristicUuidType_LuminousFlux = 0x2AFF, ///< Luminous Flux + BtdrvGattCharacteristicUuidType_LuminousFluxRange = 0x2B00, ///< Luminous Flux Range + BtdrvGattCharacteristicUuidType_LuminousIntensity = 0x2B01, ///< Luminous Intensity + BtdrvGattCharacteristicUuidType_MassFlow = 0x2B02, ///< Mass Flow + BtdrvGattCharacteristicUuidType_PerceivedLightness = 0x2B03, ///< Perceived Lightness + BtdrvGattCharacteristicUuidType_Percentage8 = 0x2B04, ///< Percentage 8 + BtdrvGattCharacteristicUuidType_Power = 0x2B05, ///< Power + BtdrvGattCharacteristicUuidType_PowerSpecification = 0x2B06, ///< Power Specification + BtdrvGattCharacteristicUuidType_RelativeRuntimeInACurrentRange = 0x2B07, ///< Relative Runtime in a Current Range + BtdrvGattCharacteristicUuidType_RelativeRuntimeInAGenericLevelRange = 0x2B08, ///< Relative Runtime in a Generic Level Range + BtdrvGattCharacteristicUuidType_RelativeValueInAVoltageRange = 0x2B09, ///< Relative Value in a Voltage Range + BtdrvGattCharacteristicUuidType_RelativeValueInAnIlluminanceRange = 0x2B0A, ///< Relative Value in an Illuminance Range + BtdrvGattCharacteristicUuidType_RelativeValueInAPeriodOfDay = 0x2B0B, ///< Relative Value in a Period of Day + BtdrvGattCharacteristicUuidType_RelativeValueInATemperatureRange = 0x2B0C, ///< Relative Value in a Temperature Range + BtdrvGattCharacteristicUuidType_Temperature8 = 0x2B0D, ///< Temperature 8 + BtdrvGattCharacteristicUuidType_Temperature8InAPeriodOfDay = 0x2B0E, ///< Temperature 8 in a Period of Day + BtdrvGattCharacteristicUuidType_Temperature8Statistics = 0x2B0F, ///< Temperature 8 Statistics + BtdrvGattCharacteristicUuidType_TemperatureRange = 0x2B10, ///< Temperature Range + BtdrvGattCharacteristicUuidType_TemperatureStatistics = 0x2B11, ///< Temperature Statistics + BtdrvGattCharacteristicUuidType_TimeDecihour8 = 0x2B12, ///< Time Decihour 8 + BtdrvGattCharacteristicUuidType_TimeExponential8 = 0x2B13, ///< Time Exponential 8 + BtdrvGattCharacteristicUuidType_TimeHour24 = 0x2B14, ///< Time Hour 24 + BtdrvGattCharacteristicUuidType_TimeMillisecond24 = 0x2B15, ///< Time Millisecond 24 + BtdrvGattCharacteristicUuidType_TimeSecond16 = 0x2B16, ///< Time Second 16 + BtdrvGattCharacteristicUuidType_TimeSecond8 = 0x2B17, ///< Time Second 8 + BtdrvGattCharacteristicUuidType_Voltage = 0x2B18, ///< Voltage + BtdrvGattCharacteristicUuidType_VoltageSpecification = 0x2B19, ///< Voltage Specification + BtdrvGattCharacteristicUuidType_VoltageStatistics = 0x2B1A, ///< Voltage Statistics + BtdrvGattCharacteristicUuidType_VolumeFlow = 0x2B1B, ///< Volume Flow + BtdrvGattCharacteristicUuidType_ChromaticityCoordinate = 0x2B1C, ///< Chromaticity Coordinate + BtdrvGattCharacteristicUuidType_RcFeature = 0x2B1D, ///< RC Feature + BtdrvGattCharacteristicUuidType_RcSettings = 0x2B1E, ///< RC Settings + BtdrvGattCharacteristicUuidType_ReconnectionConfigurationControlPoint = 0x2B1F, ///< Reconnection Configuration Control Point + BtdrvGattCharacteristicUuidType_IddStatusChanged = 0x2B20, ///< IDD Status Changed + BtdrvGattCharacteristicUuidType_IddStatus = 0x2B21, ///< IDD Status + BtdrvGattCharacteristicUuidType_IddAnnunciationStatus = 0x2B22, ///< IDD Annunciation Status + BtdrvGattCharacteristicUuidType_IddFeatures = 0x2B23, ///< IDD Features + BtdrvGattCharacteristicUuidType_IddStatusReaderControlPoint = 0x2B24, ///< IDD Status Reader Control Point + BtdrvGattCharacteristicUuidType_IddCommandControlPoint = 0x2B25, ///< IDD Command Control Point + BtdrvGattCharacteristicUuidType_IddCommandData = 0x2B26, ///< IDD Command Data + BtdrvGattCharacteristicUuidType_IddRecordAccessControlPoint = 0x2B27, ///< IDD Record Access Control Point + BtdrvGattCharacteristicUuidType_IddHistoryData = 0x2B28, ///< IDD History Data + BtdrvGattCharacteristicUuidType_ClientSupportedFeatures = 0x2B29, ///< Client Supported Features + BtdrvGattCharacteristicUuidType_DatabaseHash = 0x2B2A, ///< Database Hash + BtdrvGattCharacteristicUuidType_BssControlPoint = 0x2B2B, ///< BSS Control Point + BtdrvGattCharacteristicUuidType_BssResponse = 0x2B2C, ///< BSS Response + BtdrvGattCharacteristicUuidType_EmergencyId = 0x2B2D, ///< Emergency ID + BtdrvGattCharacteristicUuidType_EmergencyText = 0x2B2E, ///< Emergency Text + BtdrvGattCharacteristicUuidType_AcsStatus = 0x2B2F, ///< ACS Status + BtdrvGattCharacteristicUuidType_AcsDataIn = 0x2B30, ///< ACS Data In + BtdrvGattCharacteristicUuidType_AcsDataOutNotify = 0x2B31, ///< ACS Data Out Notify + BtdrvGattCharacteristicUuidType_AcsDataOutIndicate = 0x2B32, ///< ACS Data Out Indicate + BtdrvGattCharacteristicUuidType_AcsControlPoint = 0x2B33, ///< ACS Control Point + BtdrvGattCharacteristicUuidType_EnhancedBloodPressureMeasurement = 0x2B34, ///< Enhanced Blood Pressure Measurement + BtdrvGattCharacteristicUuidType_EnhancedIntermediateCuffPressure = 0x2B35, ///< Enhanced Intermediate Cuff Pressure + BtdrvGattCharacteristicUuidType_BloodPressureRecord = 0x2B36, ///< Blood Pressure Record + BtdrvGattCharacteristicUuidType_RegisteredUser = 0x2B37, ///< Registered User + BtdrvGattCharacteristicUuidType_BrEdrHandoverData = 0x2B38, ///< BR-EDR Handover Data + BtdrvGattCharacteristicUuidType_BluetoothSigData = 0x2B39, ///< Bluetooth SIG Data + BtdrvGattCharacteristicUuidType_ServerSupportedFeatures = 0x2B3A, ///< Server Supported Features + BtdrvGattCharacteristicUuidType_PhysicalActivityMonitorFeatures = 0x2B3B, ///< Physical Activity Monitor Features + BtdrvGattCharacteristicUuidType_GeneralActivityInstantaneousData = 0x2B3C, ///< General Activity Instantaneous Data + BtdrvGattCharacteristicUuidType_GeneralActivitySummaryData = 0x2B3D, ///< General Activity Summary Data + BtdrvGattCharacteristicUuidType_CardiorespiratoryActivityInstantaneousData = 0x2B3E, ///< CardioRespiratory Activity Instantaneous Data + BtdrvGattCharacteristicUuidType_CardiorespiratoryActivitySummaryData = 0x2B3F, ///< CardioRespiratory Activity Summary Data + BtdrvGattCharacteristicUuidType_StepCounterActivitySummaryData = 0x2B40, ///< Step Counter Activity Summary Data + BtdrvGattCharacteristicUuidType_SleepActivityInstantaneousData = 0x2B41, ///< Sleep Activity Instantaneous Data + BtdrvGattCharacteristicUuidType_SleepActivitySummaryData = 0x2B42, ///< Sleep Activity Summary Data + BtdrvGattCharacteristicUuidType_PhysicalActivityMonitorControlPoint = 0x2B43, ///< Physical Activity Monitor Control Point + BtdrvGattCharacteristicUuidType_ActivityCurrentSession = 0x2B44, ///< Activity Current Session + BtdrvGattCharacteristicUuidType_PhysicalActivitySessionDescriptor = 0x2B45, ///< Physical Activity Session Descriptor + BtdrvGattCharacteristicUuidType_PreferredUnits = 0x2B46, ///< Preferred Units + BtdrvGattCharacteristicUuidType_HighResolutionHeight = 0x2B47, ///< High Resolution Height + BtdrvGattCharacteristicUuidType_MiddleName = 0x2B48, ///< Middle Name + BtdrvGattCharacteristicUuidType_StrideLength = 0x2B49, ///< Stride Length + BtdrvGattCharacteristicUuidType_Handedness = 0x2B4A, ///< Handedness + BtdrvGattCharacteristicUuidType_DeviceWearingPosition = 0x2B4B, ///< Device Wearing Position + BtdrvGattCharacteristicUuidType_FourZoneHeartRateLimits = 0x2B4C, ///< Four Zone Heart Rate Limits + BtdrvGattCharacteristicUuidType_HighIntensityExerciseThreshold = 0x2B4D, ///< High Intensity Exercise Threshold + BtdrvGattCharacteristicUuidType_ActivityGoal = 0x2B4E, ///< Activity Goal + BtdrvGattCharacteristicUuidType_SedentaryIntervalNotification = 0x2B4F, ///< Sedentary Interval Notification + BtdrvGattCharacteristicUuidType_CaloricIntake = 0x2B50, ///< Caloric Intake + BtdrvGattCharacteristicUuidType_TmapRole = 0x2B51, ///< TMAP Role + BtdrvGattCharacteristicUuidType_AudioInputState = 0x2B77, ///< Audio Input State + BtdrvGattCharacteristicUuidType_GainSettingsAttribute = 0x2B78, ///< Gain Settings Attribute + BtdrvGattCharacteristicUuidType_AudioInputType = 0x2B79, ///< Audio Input Type + BtdrvGattCharacteristicUuidType_AudioInputStatus = 0x2B7A, ///< Audio Input Status + BtdrvGattCharacteristicUuidType_AudioInputControlPoint = 0x2B7B, ///< Audio Input Control Point + BtdrvGattCharacteristicUuidType_AudioInputDescription = 0x2B7C, ///< Audio Input Description + BtdrvGattCharacteristicUuidType_VolumeState = 0x2B7D, ///< Volume State + BtdrvGattCharacteristicUuidType_VolumeControlPoint = 0x2B7E, ///< Volume Control Point + BtdrvGattCharacteristicUuidType_VolumeFlags = 0x2B7F, ///< Volume Flags + BtdrvGattCharacteristicUuidType_VolumeOffsetState = 0x2B80, ///< Volume Offset State + BtdrvGattCharacteristicUuidType_AudioLocation = 0x2B81, ///< Audio Location + BtdrvGattCharacteristicUuidType_VolumeOffsetControlPoint = 0x2B82, ///< Volume Offset Control Point + BtdrvGattCharacteristicUuidType_AudioOutputDescription = 0x2B83, ///< Audio Output Description + BtdrvGattCharacteristicUuidType_SetIdentityResolvingKey = 0x2B84, ///< Set Identity Resolving Key + BtdrvGattCharacteristicUuidType_CoordinatedSetSize = 0x2B85, ///< Coordinated Set Size + BtdrvGattCharacteristicUuidType_SetMemberLock = 0x2B86, ///< Set Member Lock + BtdrvGattCharacteristicUuidType_SetMemberRank = 0x2B87, ///< Set Member Rank + BtdrvGattCharacteristicUuidType_EncryptedDataKeyMaterial = 0x2B88, ///< Encrypted Data Key Material + BtdrvGattCharacteristicUuidType_ApparentEnergy32 = 0x2B89, ///< Apparent Energy 32 + BtdrvGattCharacteristicUuidType_ApparentPower = 0x2B8A, ///< Apparent Power + BtdrvGattCharacteristicUuidType_LiveHealthObservations = 0x2B8B, ///< Live Health Observations + BtdrvGattCharacteristicUuidType_CoTextsubscript2Concentration = 0x2B8C, ///< CO\textsubscript{2} Concentration + BtdrvGattCharacteristicUuidType_CosineOfTheAngle = 0x2B8D, ///< Cosine of the Angle + BtdrvGattCharacteristicUuidType_DeviceTimeFeature = 0x2B8E, ///< Device Time Feature + BtdrvGattCharacteristicUuidType_DeviceTimeParameters = 0x2B8F, ///< Device Time Parameters + BtdrvGattCharacteristicUuidType_DeviceTime = 0x2B90, ///< Device Time + BtdrvGattCharacteristicUuidType_DeviceTimeControlPoint = 0x2B91, ///< Device Time Control Point + BtdrvGattCharacteristicUuidType_TimeChangeLogData = 0x2B92, ///< Time Change Log Data + BtdrvGattCharacteristicUuidType_MediaPlayerName = 0x2B93, ///< Media Player Name + BtdrvGattCharacteristicUuidType_MediaPlayerIconObjectId = 0x2B94, ///< Media Player Icon Object ID + BtdrvGattCharacteristicUuidType_MediaPlayerIconUrl = 0x2B95, ///< Media Player Icon URL + BtdrvGattCharacteristicUuidType_TrackChanged = 0x2B96, ///< Track Changed + BtdrvGattCharacteristicUuidType_TrackTitle = 0x2B97, ///< Track Title + BtdrvGattCharacteristicUuidType_TrackDuration = 0x2B98, ///< Track Duration + BtdrvGattCharacteristicUuidType_TrackPosition = 0x2B99, ///< Track Position + BtdrvGattCharacteristicUuidType_PlaybackSpeed = 0x2B9A, ///< Playback Speed + BtdrvGattCharacteristicUuidType_SeekingSpeed = 0x2B9B, ///< Seeking Speed + BtdrvGattCharacteristicUuidType_CurrentTrackSegmentsObjectId = 0x2B9C, ///< Current Track Segments Object ID + BtdrvGattCharacteristicUuidType_CurrentTrackObjectId = 0x2B9D, ///< Current Track Object ID + BtdrvGattCharacteristicUuidType_NextTrackObjectId = 0x2B9E, ///< Next Track Object ID + BtdrvGattCharacteristicUuidType_ParentGroupObjectId = 0x2B9F, ///< Parent Group Object ID + BtdrvGattCharacteristicUuidType_CurrentGroupObjectId = 0x2BA0, ///< Current Group Object ID + BtdrvGattCharacteristicUuidType_PlayingOrder = 0x2BA1, ///< Playing Order + BtdrvGattCharacteristicUuidType_PlayingOrdersSupported = 0x2BA2, ///< Playing Orders Supported + BtdrvGattCharacteristicUuidType_MediaState = 0x2BA3, ///< Media State + BtdrvGattCharacteristicUuidType_MediaControlPoint = 0x2BA4, ///< Media Control Point + BtdrvGattCharacteristicUuidType_MediaControlPointOpcodesSupported = 0x2BA5, ///< Media Control Point Opcodes Supported + BtdrvGattCharacteristicUuidType_SearchResultsObjectId = 0x2BA6, ///< Search Results Object ID + BtdrvGattCharacteristicUuidType_SearchControlPoint = 0x2BA7, ///< Search Control Point + BtdrvGattCharacteristicUuidType_Energy32 = 0x2BA8, ///< Energy 32 + BtdrvGattCharacteristicUuidType_MediaPlayerIconObjectType = 0x2BA9, ///< Media Player Icon Object Type + BtdrvGattCharacteristicUuidType_TrackSegmentsObjectType = 0x2BAA, ///< Track Segments Object Type + BtdrvGattCharacteristicUuidType_TrackObjectType = 0x2BAB, ///< Track Object Type + BtdrvGattCharacteristicUuidType_GroupObjectType = 0x2BAC, ///< Group Object Type + BtdrvGattCharacteristicUuidType_ConstantToneExtensionEnable = 0x2BAD, ///< Constant Tone Extension Enable + BtdrvGattCharacteristicUuidType_AdvertisingConstantToneExtensionMinimumLength = 0x2BAE, ///< Advertising Constant Tone Extension Minimum Length + BtdrvGattCharacteristicUuidType_AdvertisingConstantToneExtensionMinimumTransmitCount = 0x2BAF, ///< Advertising Constant Tone Extension Minimum Transmit Count + BtdrvGattCharacteristicUuidType_AdvertisingConstantToneExtensionTransmitDuration = 0x2BB0, ///< Advertising Constant Tone Extension Transmit Duration + BtdrvGattCharacteristicUuidType_AdvertisingConstantToneExtensionInterval = 0x2BB1, ///< Advertising Constant Tone Extension Interval + BtdrvGattCharacteristicUuidType_AdvertisingConstantToneExtensionPhy = 0x2BB2, ///< Advertising Constant Tone Extension PHY + BtdrvGattCharacteristicUuidType_BearerProviderName = 0x2BB3, ///< Bearer Provider Name + BtdrvGattCharacteristicUuidType_BearerUci = 0x2BB4, ///< Bearer UCI + BtdrvGattCharacteristicUuidType_BearerTechnology = 0x2BB5, ///< Bearer Technology + BtdrvGattCharacteristicUuidType_BearerUriSchemesSupportedList = 0x2BB6, ///< Bearer URI Schemes Supported List + BtdrvGattCharacteristicUuidType_BearerSignalStrength = 0x2BB7, ///< Bearer Signal Strength + BtdrvGattCharacteristicUuidType_BearerSignalStrengthReportingInterval = 0x2BB8, ///< Bearer Signal Strength Reporting Interval + BtdrvGattCharacteristicUuidType_BearerListCurrentCalls = 0x2BB9, ///< Bearer List Current Calls + BtdrvGattCharacteristicUuidType_ContentControlId = 0x2BBA, ///< Content Control ID + BtdrvGattCharacteristicUuidType_StatusFlags = 0x2BBB, ///< Status Flags + BtdrvGattCharacteristicUuidType_IncomingCallTargetBearerUri = 0x2BBC, ///< Incoming Call Target Bearer URI + BtdrvGattCharacteristicUuidType_CallState = 0x2BBD, ///< Call State + BtdrvGattCharacteristicUuidType_CallControlPoint = 0x2BBE, ///< Call Control Point + BtdrvGattCharacteristicUuidType_CallControlPointOptionalOpcodes = 0x2BBF, ///< Call Control Point Optional Opcodes + BtdrvGattCharacteristicUuidType_TerminationReason = 0x2BC0, ///< Termination Reason + BtdrvGattCharacteristicUuidType_IncomingCall = 0x2BC1, ///< Incoming Call + BtdrvGattCharacteristicUuidType_CallFriendlyName = 0x2BC2, ///< Call Friendly Name + BtdrvGattCharacteristicUuidType_Mute = 0x2BC3, ///< Mute + BtdrvGattCharacteristicUuidType_SinkAse = 0x2BC4, ///< Sink ASE + BtdrvGattCharacteristicUuidType_SourceAse = 0x2BC5, ///< Source ASE + BtdrvGattCharacteristicUuidType_AseControlPoint = 0x2BC6, ///< ASE Control Point + BtdrvGattCharacteristicUuidType_BroadcastAudioScanControlPoint = 0x2BC7, ///< Broadcast Audio Scan Control Point + BtdrvGattCharacteristicUuidType_BroadcastReceiveState = 0x2BC8, ///< Broadcast Receive State + BtdrvGattCharacteristicUuidType_SinkPac = 0x2BC9, ///< Sink PAC + BtdrvGattCharacteristicUuidType_SinkAudioLocations = 0x2BCA, ///< Sink Audio Locations + BtdrvGattCharacteristicUuidType_SourcePac = 0x2BCB, ///< Source PAC + BtdrvGattCharacteristicUuidType_SourceAudioLocations = 0x2BCC, ///< Source Audio Locations + BtdrvGattCharacteristicUuidType_AvailableAudioContexts = 0x2BCD, ///< Available Audio Contexts + BtdrvGattCharacteristicUuidType_SupportedAudioContexts = 0x2BCE, ///< Supported Audio Contexts + BtdrvGattCharacteristicUuidType_AmmoniaConcentration = 0x2BCF, ///< Ammonia Concentration + BtdrvGattCharacteristicUuidType_CarbonMonoxideConcentration = 0x2BD0, ///< Carbon Monoxide Concentration + BtdrvGattCharacteristicUuidType_MethaneConcentration = 0x2BD1, ///< Methane Concentration + BtdrvGattCharacteristicUuidType_NitrogenDioxideConcentration = 0x2BD2, ///< Nitrogen Dioxide Concentration + BtdrvGattCharacteristicUuidType_NonMethaneVolatileOrganicCompoundsConcentration = 0x2BD3, ///< Non-Methane Volatile Organic Compounds Concentration + BtdrvGattCharacteristicUuidType_OzoneConcentration = 0x2BD4, ///< Ozone Concentration + BtdrvGattCharacteristicUuidType_ParticulateMatterPm1Concentration = 0x2BD5, ///< Particulate Matter - PM1 Concentration + BtdrvGattCharacteristicUuidType_ParticulateMatterPm25Concentration = 0x2BD6, ///< Particulate Matter - PM2.5 Concentration + BtdrvGattCharacteristicUuidType_ParticulateMatterPm10Concentration = 0x2BD7, ///< Particulate Matter - PM10 Concentration + BtdrvGattCharacteristicUuidType_SulfurDioxideConcentration = 0x2BD8, ///< Sulfur Dioxide Concentration + BtdrvGattCharacteristicUuidType_SulfurHexafluorideConcentration = 0x2BD9, ///< Sulfur Hexafluoride Concentration + BtdrvGattCharacteristicUuidType_HearingAidFeatures = 0x2BDA, ///< Hearing Aid Features + BtdrvGattCharacteristicUuidType_HearingAidPresetControlPoint = 0x2BDB, ///< Hearing Aid Preset Control Point + BtdrvGattCharacteristicUuidType_ActivePresetIndex = 0x2BDC, ///< Active Preset Index + BtdrvGattCharacteristicUuidType_StoredHealthObservations = 0x2BDD, ///< Stored Health Observations + BtdrvGattCharacteristicUuidType_FixedString64 = 0x2BDE, ///< Fixed String 64 + BtdrvGattCharacteristicUuidType_HighTemperature = 0x2BDF, ///< High Temperature + BtdrvGattCharacteristicUuidType_HighVoltage = 0x2BE0, ///< High Voltage + BtdrvGattCharacteristicUuidType_LightDistribution = 0x2BE1, ///< Light Distribution + BtdrvGattCharacteristicUuidType_LightOutput = 0x2BE2, ///< Light Output + BtdrvGattCharacteristicUuidType_LightSourceType = 0x2BE3, ///< Light Source Type + BtdrvGattCharacteristicUuidType_Noise = 0x2BE4, ///< Noise + BtdrvGattCharacteristicUuidType_RelativeRuntimeInACorrelatedColorTemperatureRange = 0x2BE5, ///< Relative Runtime in a Correlated Color Temperature Range + BtdrvGattCharacteristicUuidType_TimeSecond32 = 0x2BE6, ///< Time Second 32 + BtdrvGattCharacteristicUuidType_VocConcentration = 0x2BE7, ///< VOC Concentration + BtdrvGattCharacteristicUuidType_VoltageFrequency = 0x2BE8, ///< Voltage Frequency + BtdrvGattCharacteristicUuidType_BatteryCriticalStatus = 0x2BE9, ///< Battery Critical Status + BtdrvGattCharacteristicUuidType_BatteryHealthStatus = 0x2BEA, ///< Battery Health Status + BtdrvGattCharacteristicUuidType_BatteryHealthInformation = 0x2BEB, ///< Battery Health Information + BtdrvGattCharacteristicUuidType_BatteryInformation = 0x2BEC, ///< Battery Information + BtdrvGattCharacteristicUuidType_BatteryLevelStatus = 0x2BED, ///< Battery Level Status + BtdrvGattCharacteristicUuidType_BatteryTimeStatus = 0x2BEE, ///< Battery Time Status + BtdrvGattCharacteristicUuidType_EstimatedServiceDate = 0x2BEF, ///< Estimated Service Date + BtdrvGattCharacteristicUuidType_BatteryEnergyStatus = 0x2BF0, ///< Battery Energy Status + BtdrvGattCharacteristicUuidType_ObservationScheduleChanged = 0x2BF1, ///< Observation Schedule Changed + BtdrvGattCharacteristicUuidType_CurrentElapsedTime = 0x2BF2, ///< Current Elapsed Time + BtdrvGattCharacteristicUuidType_HealthSensorFeatures = 0x2BF3, ///< Health Sensor Features + BtdrvGattCharacteristicUuidType_GhsControlPoint = 0x2BF4, ///< GHS Control Point + BtdrvGattCharacteristicUuidType_LeGattSecurityLevels = 0x2BF5, ///< LE GATT Security Levels + BtdrvGattCharacteristicUuidType_EslAddress = 0x2BF6, ///< ESL Address + BtdrvGattCharacteristicUuidType_ApSyncKeyMaterial = 0x2BF7, ///< AP Sync Key Material + BtdrvGattCharacteristicUuidType_EslResponseKeyMaterial = 0x2BF8, ///< ESL Response Key Material + BtdrvGattCharacteristicUuidType_EslCurrentAbsoluteTime = 0x2BF9, ///< ESL Current Absolute Time + BtdrvGattCharacteristicUuidType_EslDisplayInformation = 0x2BFA, ///< ESL Display Information + BtdrvGattCharacteristicUuidType_EslImageInformation = 0x2BFB, ///< ESL Image Information + BtdrvGattCharacteristicUuidType_EslSensorInformation = 0x2BFC, ///< ESL Sensor Information + BtdrvGattCharacteristicUuidType_EslLedInformation = 0x2BFD, ///< ESL LED Information + BtdrvGattCharacteristicUuidType_EslControlPoint = 0x2BFE, ///< ESL Control Point + BtdrvGattCharacteristicUuidType_UdiForMedicalDevices = 0x2BFF, ///< UDI for Medical Devices +} BtdrvGattCharacteristicUuidType; + +/// GattDescriptorUuidType +typedef enum { + BtdrvGattDescriptorUuidType_CharacteristicExtendedProperties = 0x2900, ///< Characteristic Extended Properties + BtdrvGattDescriptorUuidType_CharacteristicUserDescription = 0x2901, ///< Characteristic User Description + BtdrvGattDescriptorUuidType_ClientCharacteristicConfiguration = 0x2902, ///< Client Characteristic Configuration + BtdrvGattDescriptorUuidType_ServerCharacteristicConfiguration = 0x2903, ///< Server Characteristic Configuration + BtdrvGattDescriptorUuidType_CharacteristicPresentationFormat = 0x2904, ///< Characteristic Presentation Format + BtdrvGattDescriptorUuidType_CharacteristicAggregateFormat = 0x2905, ///< Characteristic Aggregate Format + BtdrvGattDescriptorUuidType_ValidRange = 0x2906, ///< Valid Range + BtdrvGattDescriptorUuidType_ExternalReportReference = 0x2907, ///< External Report Reference + BtdrvGattDescriptorUuidType_ReportReference = 0x2908, ///< Report Reference + BtdrvGattDescriptorUuidType_NumberOfDigitals = 0x2909, ///< Number of Digitals + BtdrvGattDescriptorUuidType_ValueTriggerSetting = 0x290A, ///< Value Trigger Setting + BtdrvGattDescriptorUuidType_EnvironmentalSensingConfiguration = 0x290B, ///< Environmental Sensing Configuration + BtdrvGattDescriptorUuidType_EnvironmentalSensingMeasurement = 0x290C, ///< Environmental Sensing Measurement + BtdrvGattDescriptorUuidType_EnvironmentalSensingTriggerSetting = 0x290D, ///< Environmental Sensing Trigger Setting + BtdrvGattDescriptorUuidType_TimeTriggerSetting = 0x290E, ///< Time Trigger Setting + BtdrvGattDescriptorUuidType_CompleteBrEdrTransportBlockData = 0x290F, ///< Complete BR-EDR Transport Block Data + BtdrvGattDescriptorUuidType_ObservationSchedule = 0x2910, ///< Observation Schedule + BtdrvGattDescriptorUuidType_ValidRangeAndAccuracy = 0x2911, ///< Valid Range and Accuracy +} BtdrvGattDescriptorUuidType; diff --git a/nx/include/switch/services/btdrv_types.h b/nx/include/switch/services/btdrv_types.h index a5fb5803..bd1a99c5 100644 --- a/nx/include/switch/services/btdrv_types.h +++ b/nx/include/switch/services/btdrv_types.h @@ -6,6 +6,7 @@ */ #pragma once #include "../types.h" +#include "btdrv_ids.h" /// BluetoothPropertyType [1.0.0-11.0.1] typedef enum { @@ -124,22 +125,74 @@ typedef enum { /// BleEventType typedef enum { - BtdrvBleEventType_Unknown0 = 0, ///< Unknown. - BtdrvBleEventType_Unknown1 = 1, ///< Unknown. - BtdrvBleEventType_Unknown2 = 2, ///< Unknown. - BtdrvBleEventType_Unknown3 = 3, ///< Unknown. - BtdrvBleEventType_Unknown4 = 4, ///< Unknown. - BtdrvBleEventType_Unknown5 = 5, ///< Unknown. - BtdrvBleEventType_Unknown6 = 6, ///< Unknown. - BtdrvBleEventType_Unknown7 = 7, ///< Unknown. - BtdrvBleEventType_Unknown8 = 8, ///< Unknown. - BtdrvBleEventType_Unknown9 = 9, ///< Unknown. - BtdrvBleEventType_Unknown10 = 10, ///< Unknown. - BtdrvBleEventType_Unknown11 = 11, ///< Unknown. - BtdrvBleEventType_Unknown12 = 12, ///< Unknown. - BtdrvBleEventType_Unknown13 = 13, ///< Unknown. + BtdrvBleEventType_ClientRegistration = 0, ///< GATT client registration. + BtdrvBleEventType_ServerRegistration = 1, ///< GATT server registration. + BtdrvBleEventType_ConnectionUpdate = 2, ///< Connection update. + BtdrvBleEventType_PreferredConnectionParameters = 3, ///< Preferred connection parameters. + BtdrvBleEventType_ClientConnection = 4, ///< GATT client connection. + BtdrvBleEventType_ServerConnection = 5, ///< GATT server connection. + BtdrvBleEventType_ScanResult = 6, ///< Scan result. + BtdrvBleEventType_ScanFilter = 7, ///< Scan filter status. + BtdrvBleEventType_ClientNotify = 8, ///< GATT client notify. + BtdrvBleEventType_ClientCacheSave = 9, ///< GATT client cache save. + BtdrvBleEventType_ClientCacheLoad = 10, ///< GATT client cache load. + BtdrvBleEventType_ClientConfigureMtu = 11, ///< GATT client configure MTU. + BtdrvBleEventType_ServerAddCharacteristic = 12, ///< GATT server add characteristic. + BtdrvBleEventType_ServerWrite = 13, ///< GATT server write. } BtdrvBleEventType; +/// GattAttributeType +typedef enum { + BtdrvGattAttributeType_IncludedService = 0, ///< Included service + BtdrvGattAttributeType_Characteristic = 1, ///< Characteristic + BtdrvGattAttributeType_Descriptor = 2, ///< Descriptor + BtdrvGattAttributeType_Service = 3, ///< Service +} BtdrvGattAttributeType; + +/// GattAttributePermission +typedef enum { + BtdrvGattAttributePermission_Read = BIT(0), + BtdrvGattAttributePermission_ReadEncrypted = BIT(1), + BtdrvGattAttributePermission_ReadEncryptedMitm = BIT(2), + BtdrvGattAttributePermission_Write = BIT(4), + BtdrvGattAttributePermission_WriteEncrypted = BIT(5), + BtdrvGattAttributePermission_WriteEncryptedMitm = BIT(6), + BtdrvGattAttributePermission_WriteSigned = BIT(7), + BtdrvGattAttributePermission_WriteSignedMitm = BIT(8), + + BtdrvGattAttributePermission_ReadAllowed = BtdrvGattAttributePermission_Read | BtdrvGattAttributePermission_ReadEncrypted | BtdrvGattAttributePermission_ReadEncryptedMitm, + BtdrvGattAttributePermission_ReadAuthRequired = BtdrvGattAttributePermission_ReadEncrypted, + BtdrvGattAttributePermission_ReadMitmRequired = BtdrvGattAttributePermission_ReadEncryptedMitm, + BtdrvGattAttributePermission_ReadEncryptedRequired = BtdrvGattAttributePermission_ReadEncrypted | BtdrvGattAttributePermission_ReadEncryptedMitm, + + BtdrvGattAttributePermission_WriteAllowed = BtdrvGattAttributePermission_Write | BtdrvGattAttributePermission_WriteEncrypted | BtdrvGattAttributePermission_WriteEncryptedMitm | BtdrvGattAttributePermission_WriteSigned | BtdrvGattAttributePermission_WriteSignedMitm, + BtdrvGattAttributePermission_WriteAuthRequired = BtdrvGattAttributePermission_WriteEncrypted | BtdrvGattAttributePermission_WriteSigned, + BtdrvGattAttributePermission_WriteMitmRequired = BtdrvGattAttributePermission_WriteEncryptedMitm | BtdrvGattAttributePermission_WriteSignedMitm, + BtdrvGattAttributePermission_WriteEncryptedRequired = BtdrvGattAttributePermission_WriteEncrypted | BtdrvGattAttributePermission_WriteEncryptedMitm, + BtdrvGattAttributePermission_WriteSignedRequired = BtdrvGattAttributePermission_WriteSigned | BtdrvGattAttributePermission_WriteSignedMitm, +} BtdrvGattAttributePermission; + +/// GattCharacteristicProperty +typedef enum { + BtdrvGattCharacteristicProperty_Broadcast = BIT(0), + BtdrvGattCharacteristicProperty_Read = BIT(1), + BtdrvGattCharacteristicProperty_WriteNoResponse = BIT(2), + BtdrvGattCharacteristicProperty_Write = BIT(3), + BtdrvGattCharacteristicProperty_Notify = BIT(4), + BtdrvGattCharacteristicProperty_Indicate = BIT(5), + BtdrvGattCharacteristicProperty_Authentication = BIT(6), + BtdrvGattCharacteristicProperty_ExtendedProperties = BIT(7), +} BtdrvGattCharacteristicProperty; + +/// GattAuthReqType +typedef enum { + BtdrvGattAuthReqType_None = 0, + BtdrvGattAuthReqType_NoMitm = 1, + BtdrvGattAuthReqType_Mitm = 2, + BtdrvGattAuthReqType_SignedNoMitm = 3, + BtdrvGattAuthReqType_SignedMitm = 4, +} BtdrvGattAuthReqType; + /// AudioEventType typedef enum { BtdrvAudioEventType_None = 0, ///< None @@ -227,14 +280,27 @@ typedef struct { u8 unk_x0[0x88]; ///< Unknown } BtdrvChannelMapList; -/// LeConnectionParams +/// LeConnectionParams [5.0.0-8.1.1] typedef struct { - u8 unk_x0[0x14]; ///< Unknown + BtdrvAddress addr; ///< \ref BtdrvAddress + u16 min_conn_interval; ///< Minimum connection interval + u16 max_conn_interval; ///< Maximum connection interval + u16 scan_interval; ///< Scan interval + u16 scan_window; ///< Scan window + u16 slave_latency; ///< Slave latency + u16 supervision_tout; ///< Connection supervision timeout multiplier + u8 preference; ///< Unused + u8 pad; ///< Padding } BtdrvLeConnectionParams; -/// BleConnectionParameter +/// BleConnectionParameter [9.0.0+] typedef struct { - u8 unk_x0[0xC]; ///< Unknown + u16 min_conn_interval; ///< Minimum connection interval + u16 max_conn_interval; ///< Maximum connection interval + u16 scan_interval; ///< Scan interval + u16 scan_window; ///< Scan window + u16 slave_latency; ///< Slave latency + u16 supervision_tout; ///< Connection supervision timeout multiplier } BtdrvBleConnectionParameter; /// BtdrvBleAdvertisePacketDataEntry @@ -263,20 +329,25 @@ typedef struct { u8 pad5[3]; ///< Padding } BtdrvBleAdvertisePacketData; +/// BleAdvertisement typedef struct { - u8 length; - u8 type; - u8 value[0x1d]; -} BtdrvBleAdvertisementData; + u8 size; ///< Size of data below. + u8 type; ///< \ref BtdrvAdType + u8 data[0x1D]; ///< Advertisement data +} BtdrvBleAdvertisement; /// BleAdvertiseFilter typedef struct { - u8 unk_x0[0x3E]; ///< Unknown + u8 index; ///< Filter index + BtdrvBleAdvertisement adv; ///< \ref BtdrvBleAdvertisement + u8 mask[0x1D]; ///< Mask for advertisement data above + u8 mask_size; ///< Size of mask above. } BtdrvBleAdvertiseFilter; /// BleAdvertisePacketParameter typedef struct { - u8 data[0x8]; ///< Unknown + u16 company_id; + u8 pattern_data[6]; } BtdrvBleAdvertisePacketParameter; /// BleScanResult @@ -284,7 +355,7 @@ typedef struct { u8 unk_x0; ///< Unknown BtdrvAddress addr; ///< \ref BtdrvAddress u8 unk_x7[0x139]; ///< Unknown - s32 unk_x140; ///< Unknown + s32 count; ///< Unknown s32 unk_x144; ///< Unknown } BtdrvBleScanResult; @@ -308,6 +379,16 @@ typedef struct { BtdrvGattAttributeUuid uuid; ///< \ref BtdrvGattAttributeUuid } BtdrvGattId; +/// GattAttribute +typedef struct { + BtdrvGattId id; ///< \ref BtdrvGattId + u16 type; ///< \ref BtdrvGattAttributeType + u16 handle; + u16 group_end_handle; + u8 property; ///< Only used when type is characteristic. \ref BtdrvGattCharacteristicProperty + bool is_primary; ///< Only used when type is service +} BtdrvGattAttribute; + /// LeEventInfo typedef struct { u32 unk_x0; ///< Unknown diff --git a/nx/source/services/btdrv.c b/nx/source/services/btdrv.c index a338007c..ce720c5f 100644 --- a/nx/source/services/btdrv.c +++ b/nx/source/services/btdrv.c @@ -166,14 +166,14 @@ static Result _btdrvCmdOutU32OutBuf(void* buffer, size_t size, u32 *out, u32 cmd ); } -static Result _btdrvGattNotification(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, u32 cmd_id) { +static Result _btdrvGattNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, u32 cmd_id) { const struct { - u8 primary_service; + u8 is_primary; u8 pad[3]; u32 connection_handle; - BtdrvGattId id0; - BtdrvGattId id1; - } in = { primary_service!=0, {0}, connection_handle, *id0, *id1 }; + BtdrvGattId serv_id; + BtdrvGattId char_id; + } in = { is_primary!=0, {0}, connection_handle, *serv_id, *char_id }; return serviceDispatchIn(&g_btdrvSrv, cmd_id, in); } @@ -708,15 +708,15 @@ Result btdrvSetBleAdvertiseData(const BtdrvBleAdvertisePacketData *data) { return _btdrvCmdInBufPtrFixed(data, sizeof(*data), 53); } -Result btdrvSetBleAdvertiseParameter(BtdrvAddress addr, u16 unk0, u16 unk1) { +Result btdrvSetBleAdvertiseParameter(BtdrvAddress addr, u16 min_interval, u16 max_interval) { if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); const struct { BtdrvAddress addr; - u16 unk0; - u16 unk1; - } in = { addr, unk0, unk1 }; + u16 min_interval; + u16 max_interval; + } in = { addr, min_interval, max_interval }; return serviceDispatchIn(&g_btdrvSrv, 54, in); } @@ -749,11 +749,11 @@ Result btdrvDeleteBleScanFilterCondition(const BtdrvBleAdvertiseFilter *filter) return _btdrvCmdInBufPtrFixed(filter, sizeof(*filter), 58); } -Result btdrvDeleteBleScanFilter(u8 unk) { +Result btdrvDeleteBleScanFilter(u8 index) { if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); - return _btdrvCmdInU8NoOut(unk, 59); + return _btdrvCmdInU8NoOut(index, 59); } Result btdrvClearBleScanFilters(void) { @@ -777,11 +777,11 @@ Result btdrvRegisterGattClient(const BtdrvGattAttributeUuid *uuid) { return _btdrvCmdInUuidNoOut(uuid, 62); } -Result btdrvUnregisterGattClient(u8 unk) { +Result btdrvUnregisterGattClient(u8 client_if) { if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); - return _btdrvCmdInU8NoOut(unk, 63); + return _btdrvCmdInU8NoOut(client_if, 63); } Result btdrvUnregisterAllGattClients(void) { @@ -791,42 +791,42 @@ Result btdrvUnregisterAllGattClients(void) { return _btdrvCmdNoIO(64); } -Result btdrvConnectGattServer(u8 unk, BtdrvAddress addr, bool flag, u64 AppletResourceUserId) { +Result btdrvConnectGattServer(u8 client_if, BtdrvAddress addr, bool is_direct, u64 AppletResourceUserId) { if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); const struct { - u8 unk; + u8 client_if; BtdrvAddress addr; - u8 flag; + u8 is_direct; u64 AppletResourceUserId; - } in = { unk, addr, flag!=0, AppletResourceUserId }; + } in = { client_if, addr, is_direct!=0, AppletResourceUserId }; return serviceDispatchIn(&g_btdrvSrv, 65, in); } -Result btdrvCancelConnectGattServer(u8 unk, BtdrvAddress addr, bool flag) { +Result btdrvCancelConnectGattServer(u8 client_if, BtdrvAddress addr, bool is_direct) { if (hosversionBefore(5,1,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); const struct { - u8 unk; + u8 client_if; BtdrvAddress addr; - u8 flag; - } in = { unk, addr, flag!=0 }; + u8 is_direct; + } in = { client_if, addr, is_direct!=0 }; return serviceDispatchIn(&g_btdrvSrv, 66, in); } -Result btdrvDisconnectGattServer(u32 unk) { +Result btdrvDisconnectGattServer(u32 conn_id) { if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); u32 cmd_id = hosversionBefore(5,1,0) ? 66 : 67; - return _btdrvCmdInU32NoOut(unk, cmd_id); + return _btdrvCmdInU32NoOut(conn_id, cmd_id); } -Result btdrvGetGattAttribute(BtdrvAddress addr, u32 unk) { +Result btdrvGetGattAttribute(BtdrvAddress addr, u32 conn_id) { if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); u32 cmd_id = hosversionBefore(5,1,0) ? 67 : 68; @@ -834,28 +834,28 @@ Result btdrvGetGattAttribute(BtdrvAddress addr, u32 unk) { if (hosversionBefore(9,0,0)) { const struct { BtdrvAddress addr; - u32 unk0; - } in = { addr, unk }; + u32 conn_id; + } in = { addr, conn_id }; return serviceDispatchIn(&g_btdrvSrv, cmd_id, in); } - return _btdrvCmdInU32NoOut(unk, cmd_id); + return _btdrvCmdInU32NoOut(conn_id, cmd_id); } -Result btdrvGetGattService(u32 unk, const BtdrvGattAttributeUuid *uuid) { +Result btdrvGetGattService(u32 conn_id, const BtdrvGattAttributeUuid *uuid) { if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); u32 cmd_id = hosversionBefore(5,1,0) ? 68 : 69; const struct { - u32 unk0; + u32 conn_id; BtdrvGattAttributeUuid uuid; - } in = { unk, *uuid }; + } in = { conn_id, *uuid }; return serviceDispatchIn(&g_btdrvSrv, cmd_id, in); } -Result btdrvConfigureAttMtu(u32 unk, u16 mtu) { +Result btdrvConfigureAttMtu(u32 conn_id, u16 mtu) { if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); u32 cmd_id = hosversionBefore(5,1,0) ? 69 : 70; @@ -863,8 +863,8 @@ Result btdrvConfigureAttMtu(u32 unk, u16 mtu) { const struct { u16 mtu; u16 pad; - u32 unk; - } in = { mtu, 0, unk }; + u32 conn_id; + } in = { mtu, 0, conn_id }; return serviceDispatchIn(&g_btdrvSrv, cmd_id, in); } @@ -877,100 +877,100 @@ Result btdrvRegisterGattServer(const BtdrvGattAttributeUuid *uuid) { return _btdrvCmdInUuidNoOut(uuid, cmd_id); } -Result btdrvUnregisterGattServer(u8 unk) { +Result btdrvUnregisterGattServer(u8 server_if) { if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); u32 cmd_id = hosversionBefore(5,1,0) ? 71 : 72; - return _btdrvCmdInU8NoOut(unk, cmd_id); + return _btdrvCmdInU8NoOut(server_if, cmd_id); } -Result btdrvConnectGattClient(u8 unk, BtdrvAddress addr, bool flag) { +Result btdrvConnectGattClient(u8 server_if, BtdrvAddress addr, bool is_direct) { if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); u32 cmd_id = hosversionBefore(5,1,0) ? 72 : 73; const struct { - u8 unk; + u8 server_if; BtdrvAddress addr; - u8 flag; - } in = { unk, addr, flag!=0 }; + u8 is_direct; + } in = { server_if, addr, is_direct!=0 }; return serviceDispatchIn(&g_btdrvSrv, cmd_id, in); } -Result btdrvDisconnectGattClient(u8 unk, BtdrvAddress addr) { +Result btdrvDisconnectGattClient(u8 conn_id, BtdrvAddress addr) { if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); u32 cmd_id = hosversionBefore(5,1,0) ? 73 : 74; if (hosversionBefore(9,0,0)) { const struct { - u8 unk0; + u8 conn_id; BtdrvAddress addr; - } in = { unk, addr }; + } in = { conn_id, addr }; return serviceDispatchIn(&g_btdrvSrv, cmd_id, in); } - return serviceDispatchIn(&g_btdrvSrv, cmd_id, unk); + return serviceDispatchIn(&g_btdrvSrv, cmd_id, conn_id); } -Result btdrvAddGattService(u8 unk0, const BtdrvGattAttributeUuid *uuid, u8 unk1, bool flag) { +Result btdrvAddGattService(u8 server_if, const BtdrvGattAttributeUuid *uuid, u8 num_handle, bool is_primary) { if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); const struct { - u8 unk0; - u8 unk1; - u8 flag; + u8 server_if; + u8 num_handle; + u8 is_primary; u8 pad; BtdrvGattAttributeUuid uuid; - } in = { unk0, unk1, flag!=0, 0, *uuid }; + } in = { server_if, num_handle, is_primary!=0, 0, *uuid }; return serviceDispatchIn(&g_btdrvSrv, 75, in); } -Result btdrvEnableGattService(u8 unk, const BtdrvGattAttributeUuid *uuid) { +Result btdrvEnableGattService(u8 service_id, const BtdrvGattAttributeUuid *uuid) { if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); u32 cmd_id = hosversionBefore(5,1,0) ? 74 : 76; const struct { - u8 unk; + u8 service_id; u8 pad[3]; BtdrvGattAttributeUuid uuid; - } in = { unk, {0}, *uuid }; + } in = { service_id, {0}, *uuid }; return serviceDispatchIn(&g_btdrvSrv, cmd_id, in); } -Result btdrvAddGattCharacteristic(u8 unk0, const BtdrvGattAttributeUuid *uuid0, const BtdrvGattAttributeUuid *uuid1, u8 unk1, u16 unk2) { +Result btdrvAddGattCharacteristic(u8 service_id, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *char_uuid, u8 permissions, u16 property) { if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); const struct { - u8 unk0; - u8 unk1; - u16 unk2; - BtdrvGattAttributeUuid uuid0; - BtdrvGattAttributeUuid uuid1; - } in = { unk0, unk1, unk2, *uuid0, *uuid1 }; + u8 service_id; + u8 permissions; + u16 property; + BtdrvGattAttributeUuid serv_uuid; + BtdrvGattAttributeUuid char_uuid; + } in = { service_id, permissions, property, *serv_uuid, *char_uuid }; return serviceDispatchIn(&g_btdrvSrv, 77, in); } -Result btdrvAddGattDescriptor(u8 unk0, const BtdrvGattAttributeUuid *uuid0, const BtdrvGattAttributeUuid *uuid1, u16 unk1) { +Result btdrvAddGattDescriptor(u8 service_id, const BtdrvGattAttributeUuid *serv_uuid, const BtdrvGattAttributeUuid *desc_uuid, u16 permissions) { if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); u32 cmd_id = hosversionBefore(5,1,0) ? 76 : 78; const struct { - u8 unk0; + u8 service_id; u8 pad; - u16 unk1; - BtdrvGattAttributeUuid uuid0; - BtdrvGattAttributeUuid uuid1; - } in = { unk0, 0, unk1, *uuid0, *uuid1 }; + u16 permissions; + BtdrvGattAttributeUuid serv_uuid; + BtdrvGattAttributeUuid desc_uuid; + } in = { service_id, 0, permissions, *serv_uuid, *desc_uuid }; return serviceDispatchIn(&g_btdrvSrv, cmd_id, in); } @@ -983,18 +983,18 @@ Result btdrvGetBleManagedEventInfo(void* buffer, size_t size, BtdrvBleEventType return _btdrvCmdOutU32OutBuf(buffer, size, type, cmd_id); } -Result btdrvGetGattFirstCharacteristic(u32 unk, const BtdrvGattId *id, bool flag, const BtdrvGattAttributeUuid *uuid, u8 *out_property, BtdrvGattId *out_char_id) { +Result btdrvGetGattFirstCharacteristic(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattAttributeUuid *filter_uuid, u8 *out_property, BtdrvGattId *out_char_id) { if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); u32 cmd_id = hosversionBefore(5,1,0) ? 79 : 80; const struct { - u8 flag; + u8 is_primary; u8 pad[3]; - u32 unk; - BtdrvGattId id; - BtdrvGattAttributeUuid uuid; - } in = { flag!=0, {0}, unk, *id, *uuid }; + u32 conn_id; + BtdrvGattId serv_id; + BtdrvGattAttributeUuid filter_uuid; + } in = { is_primary!=0, {0}, conn_id, *serv_id, *filter_uuid }; struct { u8 property; @@ -1010,19 +1010,19 @@ Result btdrvGetGattFirstCharacteristic(u32 unk, const BtdrvGattId *id, bool flag return rc; } -Result btdrvGetGattNextCharacteristic(u32 unk, const BtdrvGattId *id0, bool flag, const BtdrvGattId *id1, const BtdrvGattAttributeUuid *uuid, u8 *out_property, BtdrvGattId *out_char_id) { +Result btdrvGetGattNextCharacteristic(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattId *char_id, const BtdrvGattAttributeUuid *filter_uuid, u8 *out_property, BtdrvGattId *out_char_id) { if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); u32 cmd_id = hosversionBefore(5,1,0) ? 80 : 81; const struct { - u8 flag; + u8 is_primary; u8 pad[3]; - u32 unk; - BtdrvGattId id0; - BtdrvGattId id1; - BtdrvGattAttributeUuid uuid; - } in = { flag!=0, {0}, unk, *id0, *id1, *uuid }; + u32 conn_id; + BtdrvGattId serv_id; + BtdrvGattId char_id; + BtdrvGattAttributeUuid filter_uuid; + } in = { is_primary!=0, {0}, conn_id, *serv_id, *char_id, *filter_uuid }; struct { u8 property; @@ -1038,37 +1038,37 @@ Result btdrvGetGattNextCharacteristic(u32 unk, const BtdrvGattId *id0, bool flag return rc; } -Result btdrvGetGattFirstDescriptor(u32 unk, const BtdrvGattId *id0, bool flag, const BtdrvGattId *id1, const BtdrvGattAttributeUuid *uuid, BtdrvGattId *out_desc_id) { +Result btdrvGetGattFirstDescriptor(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattId *char_id, const BtdrvGattAttributeUuid *filter_uuid, BtdrvGattId *out_desc_id) { if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); u32 cmd_id = hosversionBefore(5,1,0) ? 81 : 82; const struct { - u8 flag; + u8 is_primary; u8 pad[3]; - u32 unk; - BtdrvGattId id0; - BtdrvGattId id1; - BtdrvGattAttributeUuid uuid; - } in = { flag!=0, {0}, unk, *id0, *id1, *uuid }; + u32 conn_id; + BtdrvGattId serv_id; + BtdrvGattId char_id; + BtdrvGattAttributeUuid filter_uuid; + } in = { is_primary!=0, {0}, conn_id, *serv_id, *char_id, *filter_uuid }; return serviceDispatchInOut(&g_btdrvSrv, cmd_id, in, *out_desc_id); } -Result btdrvGetGattNextDescriptor(u32 unk, const BtdrvGattId *id0, bool flag, const BtdrvGattId *id1, const BtdrvGattId *id2, const BtdrvGattAttributeUuid *uuid, BtdrvGattId *out_desc_id) { +Result btdrvGetGattNextDescriptor(u32 conn_id, const BtdrvGattId *serv_id, bool is_primary, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, const BtdrvGattAttributeUuid *filter_uuid, BtdrvGattId *out_desc_id) { if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); u32 cmd_id = hosversionBefore(5,1,0) ? 82 : 83; const struct { - u8 flag; + u8 is_primary; u8 pad[3]; - u32 unk; - BtdrvGattId id0; - BtdrvGattId id1; - BtdrvGattId id2; - BtdrvGattAttributeUuid uuid; - } in = { flag!=0, {0}, unk, *id0, *id1, *id2, *uuid }; + u32 conn_id; + BtdrvGattId serv_id; + BtdrvGattId char_id; + BtdrvGattId desc_id; + BtdrvGattAttributeUuid filter_uuid; + } in = { is_primary!=0, {0}, conn_id, *serv_id, *char_id, *desc_id, *filter_uuid }; return serviceDispatchInOut(&g_btdrvSrv, cmd_id, in, *out_desc_id); } @@ -1116,55 +1116,55 @@ Result btdrvUnregisterGattDataPath(const BtdrvGattAttributeUuid *uuid) { return _btdrvCmdInUuidNoOut(uuid, cmd_id); } -Result btdrvReadGattCharacteristic(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, u8 unk) { +Result btdrvReadGattCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, u8 auth_req) { if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); u32 cmd_id = hosversionBefore(5,1,0) ? 89 : 90; const struct { - u8 primary_service; - u8 unk; + u8 is_primary; + u8 auth_req; u8 pad[2]; u32 connection_handle; - BtdrvGattId id0; - BtdrvGattId id1; - } in = { primary_service!=0, unk, {0}, connection_handle, *id0, *id1}; + BtdrvGattId serv_id; + BtdrvGattId char_id; + } in = { is_primary!=0, auth_req, {0}, connection_handle, *serv_id, *char_id}; return serviceDispatchIn(&g_btdrvSrv, cmd_id, in); } -Result btdrvReadGattDescriptor(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2, u8 unk) { +Result btdrvReadGattDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, u8 auth_req) { if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); u32 cmd_id = hosversionBefore(5,1,0) ? 90 : 91; const struct { - u8 primary_service; - u8 unk; + u8 is_primary; + u8 auth_req; u8 pad[2]; u32 connection_handle; - BtdrvGattId id0; - BtdrvGattId id1; - BtdrvGattId id2; - } in = { primary_service!=0, unk, {0}, connection_handle, *id0, *id1, *id2 }; + BtdrvGattId serv_id; + BtdrvGattId char_id; + BtdrvGattId desc_id; + } in = { is_primary!=0, auth_req, {0}, connection_handle, *serv_id, *char_id, *desc_id }; return serviceDispatchIn(&g_btdrvSrv, cmd_id, in); } -Result btdrvWriteGattCharacteristic(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const void* buffer, size_t size, u8 unk, bool flag) { +Result btdrvWriteGattCharacteristic(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const void* buffer, size_t size, u8 auth_req, bool with_response) { if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); u32 cmd_id = hosversionBefore(5,1,0) ? 91 : 92; const struct { - u8 primary_service; - u8 unk; - u8 flag; + u8 is_primary; + u8 auth_req; + u8 with_response; u8 pad; u32 connection_handle; - BtdrvGattId id0; - BtdrvGattId id1; - } in = { primary_service!=0, unk, flag!=0, 0, connection_handle, *id0, *id1 }; + BtdrvGattId serv_id; + BtdrvGattId char_id; + } in = { is_primary!=0, auth_req, with_response!=0, 0, connection_handle, *serv_id, *char_id }; return serviceDispatchIn(&g_btdrvSrv, cmd_id, in, .buffer_attrs = { SfBufferAttr_HipcPointer | SfBufferAttr_In }, @@ -1172,20 +1172,20 @@ Result btdrvWriteGattCharacteristic(u32 connection_handle, bool primary_service, ); } -Result btdrvWriteGattDescriptor(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2, const void* buffer, size_t size, u8 unk) { +Result btdrvWriteGattDescriptor(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id, const BtdrvGattId *desc_id, const void* buffer, size_t size, u8 auth_req) { if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); u32 cmd_id = hosversionBefore(5,1,0) ? 92 : 93; const struct { - u8 primary_service; - u8 unk; + u8 is_primary; + u8 auth_req; u8 pad[2]; u32 connection_handle; - BtdrvGattId id0; - BtdrvGattId id1; - BtdrvGattId id2; - } in = { primary_service!=0, unk, {0}, connection_handle, *id0, *id1, *id2 }; + BtdrvGattId serv_id; + BtdrvGattId char_id; + BtdrvGattId desc_id; + } in = { is_primary!=0, auth_req, {0}, connection_handle, *serv_id, *char_id, *desc_id }; return serviceDispatchIn(&g_btdrvSrv, cmd_id, in, .buffer_attrs = { SfBufferAttr_HipcPointer | SfBufferAttr_In }, @@ -1193,19 +1193,19 @@ Result btdrvWriteGattDescriptor(u32 connection_handle, bool primary_service, con ); } -Result btdrvRegisterGattNotification(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1) { +Result btdrvRegisterGattNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id) { if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); - return _btdrvGattNotification(connection_handle, primary_service, id0, id1, 94); + return _btdrvGattNotification(connection_handle, is_primary, serv_id, char_id, 94); } -Result btdrvUnregisterGattNotification(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1) { +Result btdrvUnregisterGattNotification(u32 connection_handle, bool is_primary, const BtdrvGattId *serv_id, const BtdrvGattId *char_id) { if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); u32 cmd_id = hosversionBefore(5,1,0) ? 93 : 95; - return _btdrvGattNotification(connection_handle, primary_service, id0, id1, cmd_id); + return _btdrvGattNotification(connection_handle, is_primary, serv_id, char_id, cmd_id); } Result btdrvGetLeHidEventInfo(void* buffer, size_t size, BtdrvBleEventType *type) { @@ -1224,14 +1224,14 @@ Result btdrvRegisterBleHidEvent(Event* out_event) { return _btdrvCmdGetEvent(out_event, true, cmd_id); } -Result btdrvSetBleScanParameter(u16 unk0, u16 unk1) { +Result btdrvSetBleScanParameter(u16 scan_interval, u16 scan_window) { if (hosversionBefore(5,1,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); const struct { - u16 unk0; - u16 unk1; - } in = { unk0, unk1 }; + u16 scan_interval; + u16 scan_window; + } in = { scan_interval, scan_window }; return serviceDispatchIn(&g_btdrvSrv, 98, in); }