btdrv: add missing ble definitions

(cherry picked from commit f60935fcc2afc82f20a921284a520dab9c61caab)
This commit is contained in:
ndeadly 2023-02-02 01:19:33 +01:00 committed by fincs
parent 0094af6d29
commit 412c48eab5
4 changed files with 1372 additions and 333 deletions

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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);
}