bluetooth: Updated params, improved docs, etc.

This commit is contained in:
yellows8 2020-08-17 11:49:17 -04:00
parent 6ab0dc38e6
commit 162552b58c
No known key found for this signature in database
GPG Key ID: 0AF90DA3F1E60E43
11 changed files with 462 additions and 280 deletions

View File

@ -1,6 +1,8 @@
/**
* @file btdev.h
* @brief Wrapper around the bt/btmu services for using bluetooth BLE.
* @note Only available on [5.0.0+].
* @note See also: https://switchbrew.org/wiki/BTM_services
* @author yellows8
* @copyright libnx Authors
*/
@ -65,7 +67,12 @@ Result btdevStartBleScanGeneral(BtdrvBleAdvertisePacketParameter param);
/// Wrapper for \ref btmuStopBleScanForGeneral.
Result btdevStopBleScanGeneral(void);
/// Wrapper for \ref btmuGetBleScanResultsForGeneral and \ref btmuGetBleScanResultsForSmartDevice.
/**
* @brief Wrapper for \ref btmuGetBleScanResultsForGeneral and \ref btmuGetBleScanResultsForSmartDevice.
* @param[out] results Output array of \ref BtdrvBleScanResult.
* @param[in] count Size of the results array in entries.
* @param[out] total_out Total output entries.
*/
Result btdevGetBleScanResult(BtdrvBleScanResult *results, u8 count, u8 *total_out);
/// Wrapper for \ref btmuStartBleScanForPaired.
@ -95,20 +102,32 @@ Result btdevGetBleConnectionInfoList(BtdrvBleConnectionInfo *info, u8 count, u8
/// Wrapper for \ref btmuAcquireBleServiceDiscoveryEvent.
Result btdevAcquireBleServiceDiscoveryEvent(Event* out_event);
/// Wrapper for \ref btmuGetGattServices.
/**
* @brief Wrapper for \ref btmuGetGattServices.
* @param[in] connection_handle ConnectionHandle
* @param[out] services Output array of \ref BtdevGattService.
* @param[in] count Size of the services array in entries. The max is 100.
* @param[out] total_out Total output entries.
*/
Result btdevGetGattServices(u32 connection_handle, BtdevGattService *services, u8 count, u8 *total_out);
/// Wrapper for \ref btmuGetGattService.
/**
* @brief Wrapper for \ref btmuGetGattService.
* @param[in] connection_handle ConnectionHandle
* @param[in] uuid \ref BtdrvGattAttributeUuid
* @param[out] service \ref BtdevGattService
* @param[out] flag Whether a \ref BtdevGattService was returned.
*/
Result btdevGetGattService(u32 connection_handle, const BtdrvGattAttributeUuid *uuid, BtdevGattService *service, bool *flag);
/// Wrapper for \ref btmuAcquireBlePairingEvent.
Result btdevAcquireBlePairingEvent(Event* out_event);
/// Wrapper for \ref btmuBlePairDevice.
Result btdevPairGattServer(BtdrvBleAdvertisePacketParameter param, u32 id);
Result btdevPairGattServer(u32 connection_handle, BtdrvBleAdvertisePacketParameter param);
/// Wrapper for \ref btmuBleUnPairDevice.
Result btdevUnpairGattServer(BtdrvBleAdvertisePacketParameter param, u32 id);
Result btdevUnpairGattServer(u32 connection_handle, BtdrvBleAdvertisePacketParameter param);
/// Wrapper for \ref btmuBleUnPairDevice2.
Result btdevUnpairGattServer2(BtdrvAddress addr, BtdrvBleAdvertisePacketParameter param);
@ -119,61 +138,114 @@ Result btdevGetPairedGattServerAddress(BtdrvBleAdvertisePacketParameter param, B
/// Wrapper for \ref btmuAcquireBleMtuConfigEvent.
Result btdevAcquireBleMtuConfigEvent(Event* out_event);
/// Wrapper for \ref btmuConfigureBleMtu. mtu must be 0x18-0x200.
Result btdevConfigureBleMtu(u32 id, u16 mtu);
/**
* @brief Wrapper for \ref btmuConfigureBleMtu.
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
* @param[in] mtu MTU, must be 0x18-0x200.
*/
Result btdevConfigureBleMtu(u32 connection_handle, u16 mtu);
/// Wrapper for \ref btmuGetBleMtu.
Result btdevGetBleMtu(u32 id, u16 *out);
Result btdevGetBleMtu(u32 connection_handle, u16 *out);
/// Wrapper for \ref btRegisterBleEvent.
Result btdevAcquireBleGattOperationEvent(Event* out_event);
/// Wrapper for \ref btdevRegisterGattOperationNotification.
/**
* @brief Wrapper for \ref btmuRegisterBleGattDataPath.
* @param[in] uuid \ref BtdrvGattAttributeUuid
*/
Result btdevRegisterGattOperationNotification(const BtdrvGattAttributeUuid *uuid);
/// Wrapper for \ref btdevUnregisterGattOperationNotification.
/**
* @brief Wrapper for \ref btmuUnregisterBleGattDataPath.
* @param[in] uuid \ref BtdrvGattAttributeUuid
*/
Result btdevUnregisterGattOperationNotification(const BtdrvGattAttributeUuid *uuid);
/// Wrapper for \ref btGetLeEventInfo.
/**
* @brief Wrapper for \ref btGetLeEventInfo.
* @param[out] out \ref BtdrvBleClientGattOperationInfo
*/
Result btdevGetGattOperationResult(BtdrvBleClientGattOperationInfo *out);
/// Wrapper for \ref btLeClientReadCharacteristic.
/**
* @brief Wrapper for \ref btLeClientReadCharacteristic.
* @note An error is thrown if the properties from \ref btdevGattCharacteristicGetProperties don't allow using this.
* @param c \ref BtdevGattCharacteristic
*/
Result btdevReadGattCharacteristic(BtdevGattCharacteristic *c);
/// Wrapper for \ref btLeClientWriteCharacteristic.
/**
* @brief Wrapper for \ref btLeClientWriteCharacteristic.
* @note An error is thrown if the properties from \ref btdevGattCharacteristicGetProperties don't allow using this.
* @note This uses the Value from \ref btdevGattCharacteristicSetValue.
* @param c \ref BtdevGattCharacteristic
*/
Result btdevWriteGattCharacteristic(BtdevGattCharacteristic *c);
/// Wrapper for \ref btLeClientRegisterNotification / \ref btLeClientDeregisterNotification, flag controls which func to call.
/**
* @brief Wrapper for \ref btLeClientRegisterNotification / \ref btLeClientDeregisterNotification.
* @note An error is thrown if the properties from \ref btdevGattCharacteristicGetProperties don't allow using this.
* @param c \ref BtdevGattCharacteristic
* @param[in] flag Whether to enable/disable, controls which func to call.
*/
Result btdevEnableGattCharacteristicNotification(BtdevGattCharacteristic *c, bool flag);
/// Wrapper for \ref btLeClientReadDescriptor.
/**
* @brief Wrapper for \ref btLeClientReadDescriptor.
* @param d \ref BtdevGattDescriptor
*/
Result btdevReadGattDescriptor(BtdevGattDescriptor *d);
/// Wrapper for \ref btLeClientWriteDescriptor.
/**
* @brief Wrapper for \ref btLeClientWriteDescriptor.
* @note This uses the Value from \ref btdevGattDescriptorSetValue.
* @param d \ref BtdevGattDescriptor
*/
Result btdevWriteGattDescriptor(BtdevGattDescriptor *d);
///@name GattAttribute
///@{
/// Creates a \ref BtdevGattAttribute object.
/**
* @brief Creates a \ref BtdevGattAttribute object. This is intended for internal use.
* @param a \ref BtdevGattAttribute
* @param[in] uuid \ref BtdrvGattAttributeUuid
* @param[in] handle Handle
* @param[in] connection_handle ConnectionHandle
*/
void btdevGattAttributeCreate(BtdevGattAttribute *a, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle);
/// Gets the Type.
/**
* @brief Gets the Type.
* @param a \ref BtdevGattAttribute
*/
NX_CONSTEXPR u8 btdevGattAttributeGetType(BtdevGattAttribute *a) {
return a->type;
}
/// Gets the Uuid.
/**
* @brief Gets the Uuid.
* @param a \ref BtdevGattAttribute
* @param[out] out \ref BtdrvGattAttributeUuid
*/
NX_CONSTEXPR void btdevGattAttributeGetUuid(BtdevGattAttribute *a, BtdrvGattAttributeUuid *out) {
*out = a->uuid;
}
/// Gets the Handle.
/**
* @brief Gets the Handle.
* @param a \ref BtdevGattAttribute
*/
NX_CONSTEXPR u16 btdevGattAttributeGetHandle(BtdevGattAttribute *a) {
return a->handle;
}
/// Gets the ConnectionHandle.
/**
* @brief Gets the ConnectionHandle.
* @param a \ref BtdevGattAttribute
*/
NX_CONSTEXPR u32 btdevGattAttributeGetConnectionHandle(BtdevGattAttribute *a) {
return a->connection_handle;
}
@ -183,31 +255,67 @@ NX_CONSTEXPR u32 btdevGattAttributeGetConnectionHandle(BtdevGattAttribute *a) {
///@name GattService
///@{
/// Creates a \ref BtdevGattService object.
/**
* @brief Creates a \ref BtdevGattService object. This is intended for internal use.
* @param s \ref BtdevGattService
* @param[in] uuid \ref BtdrvGattAttributeUuid
* @param[in] handle Handle
* @param[in] connection_handle ConnectionHandle
* @param[in] instance_id InstanceId
* @param[in] end_group_handle EndGroupHandle
* @param[in] primary_service PrimaryService
*/
void btdevGattServiceCreate(BtdevGattService *s, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle, u16 instance_id, u16 end_group_handle, bool primary_service);
/// Gets the InstanceId.
/**
* @brief Gets the InstanceId.
* @param s \ref BtdevGattService
*/
NX_CONSTEXPR u16 btdevGattServiceGetInstanceId(BtdevGattService *s) {
return s->instance_id;
}
/// Gets the EndGroupHandle.
/**
* @brief Gets the EndGroupHandle.
* @param s \ref BtdevGattService
*/
NX_CONSTEXPR u16 btdevGattServiceGetEndGroupHandle(BtdevGattService *s) {
return s->end_group_handle;
}
/// Gets whether this is the PrimaryService.
/**
* @brief Gets whether this is the PrimaryService.
* @param s \ref BtdevGattService
*/
NX_CONSTEXPR u16 btdevGattServiceIsPrimaryService(BtdevGattService *s) {
return s->primary_service;
}
/// Wrapper for \ref btmuGetGattIncludedServices.
/**
* @brief Wrapper for \ref btmuGetGattIncludedServices.
* @param s \ref BtdevGattService
* @param[out] services Output array of \ref BtdevGattService.
* @param[in] count Size of the services array in entries. The max is 100.
* @param[out] total_out Total output entries.
*/
Result btdevGattServiceGetIncludedServices(BtdevGattService *s, BtdevGattService *services, u8 count, u8 *total_out);
/// Wrapper for \ref btmuGetGattCharacteristics.
Result btdevGattServiceGetCharacteristics(BtdevGattService *s, BtdevGattCharacteristic *characteristic, u8 count, u8 *total_out);
/**
* @brief Wrapper for \ref btmuGetGattCharacteristics.
* @param s \ref BtdevGattService
* @param[out] characteristics Output array of \ref BtdevGattCharacteristic.
* @param[in] count Size of the characteristics array in entries. The max is 100.
* @param[out] total_out Total output entries.
*/
Result btdevGattServiceGetCharacteristics(BtdevGattService *s, BtdevGattCharacteristic *characteristics, u8 count, u8 *total_out);
/// Wrapper for \ref btmuGetGattCharacteristics.
/**
* @brief Same as \ref btdevGattServiceGetCharacteristics except this only returns the \ref BtdevGattCharacteristic which contains a matching \ref BtdrvGattAttributeUuid.
* @param s \ref BtdevGattService
* @param[in] uuid \ref BtdrvGattAttributeUuid
* @param[out] characteristic \ref BtdevGattCharacteristic
* @param[out] flag Whether a \ref BtdevGattService was returned.
*/
Result btdevGattServiceGetCharacteristic(BtdevGattService *s, const BtdrvGattAttributeUuid *uuid, BtdevGattCharacteristic *characteristic, bool *flag);
///@}
@ -215,32 +323,75 @@ Result btdevGattServiceGetCharacteristic(BtdevGattService *s, const BtdrvGattAtt
///@name GattCharacteristic
///@{
/// Creates a \ref BtdevGattCharacteristic object.
/**
* @brief Creates a \ref BtdevGattCharacteristic object. This is intended for internal use.
* @param c \ref BtdevGattCharacteristic
* @param[in] uuid \ref BtdrvGattAttributeUuid
* @param[in] handle Handle
* @param[in] connection_handle ConnectionHandle
* @param[in] instance_id InstanceId
* @param[in] properties Properties
*/
void btdevGattCharacteristicCreate(BtdevGattCharacteristic *c, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle, u16 instance_id, u8 properties);
/// Gets the InstanceId.
/**
* @brief Gets the InstanceId.
* @param c \ref BtdevGattCharacteristic
*/
NX_CONSTEXPR u16 btdevGattCharacteristicGetInstanceId(BtdevGattCharacteristic *c) {
return c->instance_id;
}
/// Gets the Properties.
/**
* @brief Gets the Properties.
* @param c \ref BtdevGattCharacteristic
*/
NX_CONSTEXPR u8 btdevGattCharacteristicGetProperties(BtdevGattCharacteristic *c) {
return c->properties;
}
/// Wrapper for \ref btmuGetBelongingGattService.
/**
* @brief Wrapper for \ref btmuGetBelongingGattService.
* @note Gets the \ref BtdevGattService which belongs to this object.
* @param c \ref BtdevGattCharacteristic.
* @param[out] service \ref BtdevGattService
*/
Result btdevGattCharacteristicGetService(BtdevGattCharacteristic *c, BtdevGattService *service);
/// Wrapper for \ref btmuGetGattDescriptors.
/**
* @brief Wrapper for \ref btmuGetGattDescriptors.
* @note Gets the descriptors which belongs to this object.
* @param c \ref BtdevGattCharacteristic
* @param[out] descriptors Output array of \ref BtdevGattDescriptor.
* @param[in] count Size of the descriptors array in entries. The max is 100.
* @param[out] total_out Total output entries.
*/
Result btdevGattCharacteristicGetDescriptors(BtdevGattCharacteristic *c, BtdevGattDescriptor *descriptors, u8 count, u8 *total_out);
/// Same as \ref btdevGattCharacteristicGetDescriptors except this only returns a \ref BtdevGattDescriptor which contains a matching \ref BtdrvGattAttributeUuid.
/**
* @brief Same as \ref btdevGattCharacteristicGetDescriptors except this only returns a \ref BtdevGattDescriptor which contains a matching \ref BtdrvGattAttributeUuid.
* @param c \ref BtdevGattCharacteristic
* @param[in] uuid \ref BtdrvGattAttributeUuid
* @param[out] descriptor \ref BtdevGattDescriptor
* @param[out] flag Whether a \ref BtdevGattDescriptor was returned.
*/
Result btdevGattCharacteristicGetDescriptor(BtdevGattCharacteristic *c, const BtdrvGattAttributeUuid *uuid, BtdevGattDescriptor *descriptor, bool *flag);
/// Sets the Value in the object, max size is 0x200.
/**
* @brief Sets the Value in the object.
* @note See also \ref btdevWriteGattCharacteristic.
* @param c \ref BtdevGattCharacteristic
* @param[in] buffer Input buffer.
* @param[in] size Input buffer size, max is 0x200.
*/
void btdevGattCharacteristicSetValue(BtdevGattCharacteristic *c, const void* buffer, size_t size);
/// Gets the Value in the object, returns the copied value size.
/**
* @brief Gets the Value in the object, returns the copied value size.
* @param c \ref BtdevGattCharacteristic
* @param[out] buffer Output buffer.
* @param[in] size Output buffer size, max is 0x200.
*/
u64 btdevGattCharacteristicGetValue(BtdevGattCharacteristic *c, void* buffer, size_t size);
///@}
@ -248,19 +399,46 @@ u64 btdevGattCharacteristicGetValue(BtdevGattCharacteristic *c, void* buffer, si
///@name GattDescriptor
///@{
/// Creates a \ref BtdevGattDescriptor object.
/**
* @brief Creates a \ref BtdevGattDescriptor object. This is intended for internal use.
* @param d \ref BtdevGattDescriptor
* @param[in] uuid \ref BtdrvGattAttributeUuid
* @param[in] handle Handle
* @param[in] connection_handle ConnectionHandle
*/
void btdevGattDescriptorCreate(BtdevGattDescriptor *d, const BtdrvGattAttributeUuid *uuid, u16 handle, u32 connection_handle);
/// Wrapper for \ref btmuGetBelongingGattService.
/**
* @brief Wrapper for \ref btmuGetBelongingGattService.
* @note Gets the \ref BtdevGattService which belongs to this object.
* @param d \ref BtdevGattDescriptor
* @param[out] service \ref BtdevGattService
*/
Result btdevGattDescriptorGetService(BtdevGattDescriptor *d, BtdevGattService *service);
/// Wrapper for \ref btmuGetGattCharacteristics.
/**
* @brief Wrapper for \ref btmuGetGattCharacteristics.
* @note Gets the \ref BtdevGattCharacteristic which belongs to this object.
* @param d \ref BtdevGattDescriptor
* @param[out] characteristic \ref BtdevGattCharacteristic
*/
Result btdevGattDescriptorGetCharacteristic(BtdevGattDescriptor *d, BtdevGattCharacteristic *characteristic);
/// Sets the Value in the object, max size is 0x200.
/**
* @brief Sets the Value in the object.
* @note See also \ref btdevWriteGattDescriptor.
* @param d \ref BtdevGattDescriptor
* @param[in] buffer Input buffer.
* @param[in] size Input buffer size, max is 0x200.
*/
void btdevGattDescriptorSetValue(BtdevGattDescriptor *d, const void* buffer, size_t size);
/// Gets the Value in the object, returns the copied value size.
/**
* @brief Gets the Value in the object, returns the copied value size.
* @param d \ref BtdevGattDescriptor
* @param[out] buffer Output buffer.
* @param[in] size Output buffer size, max is 0x200.
*/
u64 btdevGattDescriptorGetValue(BtdevGattDescriptor *d, void* buffer, size_t size);
///@}

View File

@ -1,6 +1,7 @@
/**
* @file bt.h
* @brief Bluetooth user (bt) service IPC wrapper.
* @note See also btdev.
* @author yellows8
* @copyright libnx Authors
*/
@ -22,73 +23,73 @@ Service* btGetServiceSession(void);
/**
* @brief LeClientReadCharacteristic
* @note This is essentially the same as \ref btdrvReadGattCharacteristic.
* @param[in] flag Flag
* @param[in] unk Unknown
* @param[in] unk2 Unknown
* @param[in] connection_handle ConnectionHandle
* @param[in] primary_service PrimaryService
* @param[in] id0 \ref BtdrvGattId
* @param[in] id1 \ref BtdrvGattId
* @param[in] unk Unknown
*/
Result btLeClientReadCharacteristic(bool flag, u8 unk, u32 unk2, const BtdrvGattId *id0, const BtdrvGattId *id1);
Result btLeClientReadCharacteristic(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, u8 unk);
/**
* @brief LeClientReadDescriptor
* @note This is essentially the same as \ref btdrvReadGattDescriptor.
* @param[in] flag Flag
* @param[in] unk Unknown
* @param[in] unk2 Unknown
* @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
*/
Result btLeClientReadDescriptor(bool flag, u8 unk, u32 unk2, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2);
Result btLeClientReadDescriptor(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2, u8 unk);
/**
* @brief LeClientWriteCharacteristic
* @note This is essentially the same as \ref btdrvWriteGattCharacteristic.
* @param[in] flag Flag
* @param[in] unk Unknown
* @param[in] flag2 Flag
* @param[in] unk2 Unknown
* @param[in] connection_handle ConnectionHandle
* @param[in] primary_service PrimaryService
* @param[in] id0 \ref BtdrvGattId
* @param[in] id1 \ref BtdrvGattId
* @param[in] buffer Input buffer.
* @param[in] size Input buffer size, must be <=0x258.
* @param[in] unk Unknown
* @param[in] flag Flag
*/
Result btLeClientWriteCharacteristic(bool flag, u8 unk, bool flag2, u32 unk2, const BtdrvGattId *id0, const BtdrvGattId *id1, const void* buffer, size_t size);
Result btLeClientWriteCharacteristic(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const void* buffer, size_t size, u8 unk, bool flag);
/**
* @brief LeClientWriteDescriptor
* @note This is essentially the same as \ref btdrvWriteGattDescriptor.
* @param[in] flag Flag
* @param[in] unk Unknown
* @param[in] unk2 Unknown
* @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] buffer Input buffer.
* @param[in] size Input buffer size, must be <=0x258.
* @param[in] unk Unknown
*/
Result btLeClientWriteDescriptor(bool flag, u8 unk, u32 unk2, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2, const void* buffer, size_t size);
Result btLeClientWriteDescriptor(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2, const void* buffer, size_t size, u8 unk);
/**
* @brief LeClientRegisterNotification
* @note This is essentially the same as \ref btdrvRegisterGattNotification.
* @param[in] flag Flag
* @param[in] unk Unknown
* @param[in] connection_handle ConnectionHandle
* @param[in] primary_service PrimaryService
* @param[in] id0 \ref BtdrvGattId
* @param[in] id1 \ref BtdrvGattId
*/
Result btLeClientRegisterNotification(bool flag, u32 unk, const BtdrvGattId *id0, const BtdrvGattId *id1);
Result btLeClientRegisterNotification(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1);
/**
* @brief LeClientDeregisterNotification
* @note This is essentially the same as \ref btdrvUnregisterGattNotification.
* @param[in] flag Flag
* @param[in] unk Unknown
* @param[in] connection_handle ConnectionHandle
* @param[in] primary_service PrimaryService
* @param[in] id0 \ref BtdrvGattId
* @param[in] id1 \ref BtdrvGattId
*/
Result btLeClientDeregisterNotification(bool flag, u32 unk, const BtdrvGattId *id0, const BtdrvGattId *id1);
Result btLeClientDeregisterNotification(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1);
/**
* @brief SetLeResponse
@ -103,13 +104,13 @@ Result btSetLeResponse(u8 unk, const BtdrvGattAttributeUuid *uuid0, const BtdrvG
/**
* @brief LeSendIndication
* @param[in] unk Unknown
* @param[in] flag Flag
* @param[in] uuid0 \ref BtdrvGattAttributeUuid
* @param[in] uuid1 \ref BtdrvGattAttributeUuid
* @param[in] buffer Input buffer.
* @param[in] size Input buffer size, clamped to max size 0x258.
* @param[in] flag Flag
*/
Result btLeSendIndication(u8 unk, bool flag, const BtdrvGattAttributeUuid *uuid0, const BtdrvGattAttributeUuid *uuid1, const void* buffer, size_t size);
Result btLeSendIndication(u8 unk, const BtdrvGattAttributeUuid *uuid0, const BtdrvGattAttributeUuid *uuid1, const void* buffer, size_t size, bool flag);
/**
* @brief GetLeEventInfo
@ -117,7 +118,7 @@ Result btLeSendIndication(u8 unk, bool flag, const BtdrvGattAttributeUuid *uuid0
* @note The state used by this is reset after writing the data to output.
* @param[in] buffer Output buffer. 0x400-bytes from state is written here. See \ref BtdrvLeEventInfo.
* @param[in] size Output buffer size.
* @oaram[out] type Output BleEventType.
* @param[out] type Output BleEventType.
*/
Result btGetLeEventInfo(void* buffer, size_t size, u32 *type);

View File

@ -860,73 +860,73 @@ Result btdrvUnregisterGattDataPath(const BtdrvGattAttributeUuid *uuid);
/**
* @brief ReadGattCharacteristic
* @note Only available on [5.0.0+].
* @param[in] flag Flag
* @param[in] unk Unknown
* @param[in] unk2 Unknown
* @param[in] connection_handle ConnectionHandle
* @param[in] primary_service PrimaryService
* @param[in] id0 \ref BtdrvGattId
* @param[in] id1 \ref BtdrvGattId
* @param[in] unk Unknown
*/
Result btdrvReadGattCharacteristic(bool flag, u8 unk, u32 unk2, const BtdrvGattId *id0, const BtdrvGattId *id1);
Result btdrvReadGattCharacteristic(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, u8 unk);
/**
* @brief ReadGattDescriptor
* @note Only available on [5.0.0+].
* @param[in] flag Flag
* @param[in] unk Unknown
* @param[in] unk2 Unknown
* @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
*/
Result btdrvReadGattDescriptor(bool flag, u8 unk, u32 unk2, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2);
Result btdrvReadGattDescriptor(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2, u8 unk);
/**
* @brief WriteGattCharacteristic
* @note Only available on [5.0.0+].
* @param[in] flag Flag
* @param[in] unk Unknown
* @param[in] flag2 Flag
* @param[in] unk2 Unknown
* @param[in] connection_handle ConnectionHandle
* @param[in] primary_service PrimaryService
* @param[in] id0 \ref BtdrvGattId
* @param[in] id1 \ref BtdrvGattId
* @param[in] buffer Input buffer.
* @param[in] size Input buffer size, must be <=0x258.
* @param[in] unk Unknown
* @param[in] flag Flag
*/
Result btdrvWriteGattCharacteristic(bool flag, u8 unk, bool flag2, u32 unk2, const BtdrvGattId *id0, const BtdrvGattId *id1, const void* buffer, size_t size);
Result btdrvWriteGattCharacteristic(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const void* buffer, size_t size, u8 unk, bool flag);
/**
* @brief WriteGattDescriptor
* @note Only available on [5.0.0+].
* @param[in] flag Flag
* @param[in] unk Unknown
* @param[in] unk2 Unknown
* @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] buffer Input buffer.
* @param[in] size Input buffer size, must be <=0x258.
* @param[in] unk Unknown
*/
Result btdrvWriteGattDescriptor(bool flag, u8 unk, u32 unk2, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2, const void* buffer, size_t size);
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);
/**
* @brief RegisterGattNotification
* @note Only available on [5.0.0+].
* @param[in] flag Flag
* @param[in] unk Unknown
* @param[in] connection_handle ConnectionHandle
* @param[in] primary_service PrimaryService
* @param[in] id0 \ref BtdrvGattId
* @param[in] id1 \ref BtdrvGattId
*/
Result btdrvRegisterGattNotification(bool flag, u32 unk, const BtdrvGattId *id0, const BtdrvGattId *id1);
Result btdrvRegisterGattNotification(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1);
/**
* @brief UnregisterGattNotification
* @note Only available on [5.0.0+].
* @param[in] flag Flag
* @param[in] unk Unknown
* @param[in] connection_handle ConnectionHandle
* @param[in] primary_service PrimaryService
* @param[in] id0 \ref BtdrvGattId
* @param[in] id1 \ref BtdrvGattId
*/
Result btdrvUnregisterGattNotification(bool flag, u32 unk, const BtdrvGattId *id0, const BtdrvGattId *id1);
Result btdrvUnregisterGattNotification(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1);
/**
* @brief GetLeHidEventInfo

View File

@ -141,7 +141,7 @@ typedef struct {
/// BleConnectionInfo
typedef struct {
u32 id; ///< Id, 0xFFFFFFFF ([5.0.0-5.0.2] 0xFFFF) is invalid.
u32 connection_handle; ///< ConnectionHandle, 0xFFFFFFFF ([5.0.0-5.0.2] 0xFFFF) is invalid.
BtdrvAddress addr; ///< \ref BtdrvAddress
u8 pad[2]; ///< Padding
} BtdrvBleConnectionInfo;

View File

@ -1,6 +1,7 @@
/**
* @file btm.h
* @brief btm service IPC wrapper.
* @note See also: https://switchbrew.org/wiki/BTM_services
* @author yellows8
*/
#pragma once
@ -354,9 +355,9 @@ Result btmBleOverrideConnection(u32 id);
/**
* @brief BleDisconnect
* @note Only available on [5.0.0+].
* @param[in] id This must match a BtdrvBleConnectionInfo::id from \ref btmBleGetConnectionState. [5.1.0+] 0xFFFFFFFF is invalid.
* @param[in] connection_handle This must match a BtdrvBleConnectionInfo::id from \ref btmBleGetConnectionState. [5.1.0+] 0xFFFFFFFF is invalid.
*/
Result btmBleDisconnect(u32 id);
Result btmBleDisconnect(u32 connection_handle);
/**
* @brief BleGetConnectionState
@ -385,18 +386,18 @@ Result btmAcquireBlePairingEvent(Event* out_event);
/**
* @brief BlePairDevice
* @note Only available on [5.1.0+].
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
* @param[in] id Same as \ref btmBleDisconnect.
*/
Result btmBlePairDevice(BtdrvBleAdvertisePacketParameter param, u32 id);
Result btmBlePairDevice(u32 connection_handle, BtdrvBleAdvertisePacketParameter param);
/**
* @brief BleUnpairDeviceOnBoth
* @note Only available on [5.1.0+].
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
* @param[in] id Same as \ref btmBleDisconnect.
*/
Result btmBleUnpairDeviceOnBoth(BtdrvBleAdvertisePacketParameter param, u32 id);
Result btmBleUnpairDeviceOnBoth(u32 connection_handle, BtdrvBleAdvertisePacketParameter param);
/**
* @brief BleUnPairDevice
@ -427,65 +428,65 @@ Result btmAcquireBleServiceDiscoveryEvent(Event* out_event);
/**
* @brief GetGattServices
* @note Only available on [5.0.0+].
* @param[in] id Same as \ref btmBleDisconnect.
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[out] services Output array of \ref BtmGattService.
* @param[in] count Size of the services array in entries. The max is 100.
* @param[out] total_out Total output entries.
*/
Result btmGetGattServices(u32 id, BtmGattService *services, u8 count, u8 *total_out);
Result btmGetGattServices(u32 connection_handle, BtmGattService *services, u8 count, u8 *total_out);
/**
* @brief Same as \ref btmGetGattServices except this only returns the \ref BtmGattService which matches the input \ref BtdrvGattAttributeUuid.
* @note Only available on [5.0.0+].
* @param[in] id Same as \ref btmBleDisconnect.
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[in] uuid \ref BtdrvGattAttributeUuid
* @param[out] service \ref BtmGattService
* @param[out] flag Whether a \ref BtmGattService was returned.
*/
Result btmGetGattService(u32 id, const BtdrvGattAttributeUuid *uuid, BtmGattService *service, bool *flag);
Result btmGetGattService(u32 connection_handle, const BtdrvGattAttributeUuid *uuid, BtmGattService *service, bool *flag);
/**
* @brief Same as \ref btmGetGattServices except this only returns \ref BtmGattService entries where various checks pass with u16 fields.
* @note Only available on [5.0.0+].
* @param[in] id Same as \ref btmBleDisconnect.
* @param[in] unk1 Unknown
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[in] handle Handle
* @param[out] services \ref BtmGattService
* @param[in] count Size of the services array in entries. The max is 100.
* @param[out] out Output value.
*/
Result btmGetGattIncludedServices(u32 id, u16 unk1, BtmGattService *services, u8 count, u8 *out);
Result btmGetGattIncludedServices(u32 connection_handle, u16 handle, BtmGattService *services, u8 count, u8 *out);
/**
* @brief This is similar to \ref btmGetGattIncludedServices except this only returns 1 \ref BtmGattService.
* @note Only available on [5.0.0+].
* @param[in] id Same as \ref btmBleDisconnect.
* @param[in] unk1 Unknown
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[in] handle Handle
* @param[out] service \ref BtmGattService
* @param[out] flag Whether a \ref BtmGattService was returned.
*/
Result btmGetBelongingService(u32 id, u16 unk1, BtmGattService *service, bool *flag);
Result btmGetBelongingService(u32 connection_handle, u16 handle, BtmGattService *service, bool *flag);
/**
* @brief GetGattCharacteristics
* @note Only available on [5.0.0+].
* @param[in] id Same as \ref btmBleDisconnect.
* @param[in] unk1 This controls which \ref BtmGattCharacteristic entries to return.
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[in] handle This controls which \ref BtmGattCharacteristic entries to return.
* @param[out] characteristics \ref BtmGattCharacteristic
* @param[in] count Size of the characteristics array in entries. The max is 100.
* @param[out] total_out Total output entries.
*/
Result btmGetGattCharacteristics(u32 id, u16 unk1, BtmGattCharacteristic *characteristics, u8 count, u8 *total_out);
Result btmGetGattCharacteristics(u32 connection_handle, u16 handle, BtmGattCharacteristic *characteristics, u8 count, u8 *total_out);
/**
* @brief GetGattDescriptors
* @note Only available on [5.0.0+].
* @param[in] id Same as \ref btmBleDisconnect.
* @param[in] unk1 This controls which \ref BtmGattDescriptor entries to return.
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[in] handle This controls which \ref BtmGattDescriptor entries to return.
* @param[out] descriptors \ref BtmGattDescriptor
* @param[in] count Size of the descriptors array in entries. The max is 100.
* @param[out] total_out Total output entries.
*/
Result btmGetGattDescriptors(u32 id, u16 unk1, BtmGattDescriptor *descriptors, u8 count, u8 *total_out);
Result btmGetGattDescriptors(u32 connection_handle, u16 handle, BtmGattDescriptor *descriptors, u8 count, u8 *total_out);
/**
* @brief AcquireBleMtuConfigEvent
@ -498,18 +499,18 @@ Result btmAcquireBleMtuConfigEvent(Event* out_event);
/**
* @brief ConfigureBleMtu
* @note Only available on [5.0.0+].
* @param[in] id Same as \ref btmBleDisconnect.
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[in] mtu MTU
*/
Result btmConfigureBleMtu(u32 id, u16 mtu);
Result btmConfigureBleMtu(u32 connection_handle, u16 mtu);
/**
* @brief GetBleMtu
* @note Only available on [5.0.0+].
* @param[in] id Same as \ref btmBleDisconnect.
* @param[in] connection_handle Same as \ref btmBleDisconnect.
* @param[out] out Output MTU.
*/
Result btmGetBleMtu(u32 id, u16 *out);
Result btmGetBleMtu(u32 connection_handle, u16 *out);
/**
* @brief RegisterBleGattDataPath

View File

@ -2,6 +2,8 @@
* @file btmu.h
* @brief btm:u (btm user) service IPC wrapper.
* @note Only available on [5.0.0+].
* @note See also btdev.
* @note See also: https://switchbrew.org/wiki/BTM_services
* @author yellows8
*/
#pragma once
@ -122,9 +124,9 @@ Result btmuBleConnect(BtdrvAddress addr);
/**
* @brief BleDisconnect
* @note This is similar to \ref btmBleDisconnect.
* @param[in] id This must match a BtdrvBleConnectionInfo::id from \ref btmuBleGetConnectionState. [5.1.0+] 0xFFFFFFFF is invalid.
* @param[in] connection_handle This must match a BtdrvBleConnectionInfo::connection_handle from \ref btmuBleGetConnectionState. [5.1.0+] 0xFFFFFFFF is invalid.
*/
Result btmuBleDisconnect(u32 id);
Result btmuBleDisconnect(u32 connection_handle);
/**
* @brief BleGetConnectionState
@ -146,18 +148,18 @@ Result btmuAcquireBlePairingEvent(Event* out_event);
/**
* @brief BlePairDevice
* @note This is similar to \ref btmBlePairDevice.
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
* @param[in] id Same as \ref btmuBleDisconnect.
*/
Result btmuBlePairDevice(BtdrvBleAdvertisePacketParameter param, u32 id);
Result btmuBlePairDevice(u32 connection_handle, BtdrvBleAdvertisePacketParameter param);
/**
* @brief BleUnPairDevice
* @note This is similar to \ref btmBleUnpairDeviceOnBoth.
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
* @param[in] param \ref BtdrvBleAdvertisePacketParameter
* @param[in] id Same as \ref btmuBleDisconnect.
*/
Result btmuBleUnPairDevice(BtdrvBleAdvertisePacketParameter param, u32 id);
Result btmuBleUnPairDevice(u32 connection_handle, BtdrvBleAdvertisePacketParameter param);
/**
* @brief BleUnPairDevice2
@ -188,65 +190,65 @@ Result btmuAcquireBleServiceDiscoveryEvent(Event* out_event);
/**
* @brief GetGattServices
* @note This is similar to \ref btmGetGattServices.
* @param[in] id Same as \ref btmuBleDisconnect.
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
* @param[out] services Output array of \ref BtmGattService.
* @param[in] count Size of the services array in entries. The max is 100.
* @param[out] total_out Total output entries.
*/
Result btmuGetGattServices(u32 id, BtmGattService *services, u8 count, u8 *total_out);
Result btmuGetGattServices(u32 connection_handle, BtmGattService *services, u8 count, u8 *total_out);
/**
* @brief Same as \ref btmuGetGattServices except this only returns the \ref BtmGattService which matches the input \ref BtdrvGattAttributeUuid.
* @note This is similar to \ref btmGetGattService.
* @param[in] id Same as \ref btmuBleDisconnect.
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
* @param[in] uuid \ref BtdrvGattAttributeUuid
* @param[out] service \ref BtmGattService
* @param[out] flag Whether a \ref BtmGattService was returned.
*/
Result btmuGetGattService(u32 id, const BtdrvGattAttributeUuid *uuid, BtmGattService *service, bool *flag);
Result btmuGetGattService(u32 connection_handle, const BtdrvGattAttributeUuid *uuid, BtmGattService *service, bool *flag);
/**
* @brief Same as \ref btmuGetGattServices except this only returns \ref BtmGattService entries where various checks pass with u16 fields.
* @note This is similar to \ref btmGetGattIncludedServices.
* @param[in] id Same as \ref btmuBleDisconnect.
* @param[in] unk1 Unknown
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
* @param[in] handle Handle
* @param[out] services \ref BtmGattService
* @param[in] count Size of the services array in entries. The max is 100.
* @param[out] out Output value.
*/
Result btmuGetGattIncludedServices(u32 id, u16 unk1, BtmGattService *services, u8 count, u8 *out);
Result btmuGetGattIncludedServices(u32 connection_handle, u16 handle, BtmGattService *services, u8 count, u8 *out);
/**
* @brief This is similar to \ref btmuGetGattIncludedServices except this only returns 1 \ref BtmGattService.
* @note This is similar to \ref btmGetBelongingService.
* @param[in] id Same as \ref btmuBleDisconnect.
* @param[in] unk1 Unknown
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
* @param[in] handle Handle
* @param[out] service \ref BtmGattService
* @param[out] flag Whether a \ref BtmGattService was returned.
*/
Result btmuGetBelongingGattService(u32 id, u16 unk1, BtmGattService *service, bool *flag);
Result btmuGetBelongingGattService(u32 connection_handle, u16 handle, BtmGattService *service, bool *flag);
/**
* @brief GetGattCharacteristics
* @note This is similar to \ref btmGetGattCharacteristics.
* @param[in] id Same as \ref btmuBleDisconnect.
* @param[in] unk1 This controls which \ref BtmGattCharacteristic entries to return.
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
* @param[in] handle This controls which \ref BtmGattCharacteristic entries to return.
* @param[out] characteristics \ref BtmGattCharacteristic
* @param[in] count Size of the characteristics array in entries. The max is 100.
* @param[out] total_out Total output entries.
*/
Result btmuGetGattCharacteristics(u32 id, u16 unk1, BtmGattCharacteristic *characteristics, u8 count, u8 *total_out);
Result btmuGetGattCharacteristics(u32 connection_handle, u16 handle, BtmGattCharacteristic *characteristics, u8 count, u8 *total_out);
/**
* @brief GetGattDescriptors
* @note This is similar to \ref btmGetGattDescriptors.
* @param[in] id Same as \ref btmuBleDisconnect.
* @param[in] unk1 This controls which \ref BtmGattDescriptor entries to return.
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
* @param[in] handle This controls which \ref BtmGattDescriptor entries to return.
* @param[out] descriptors \ref BtmGattDescriptor
* @param[in] count Size of the descriptors array in entries. The max is 100.
* @param[out] total_out Total output entries.
*/
Result btmuGetGattDescriptors(u32 id, u16 unk1, BtmGattDescriptor *descriptors, u8 count, u8 *total_out);
Result btmuGetGattDescriptors(u32 connection_handle, u16 handle, BtmGattDescriptor *descriptors, u8 count, u8 *total_out);
/**
* @brief AcquireBleMtuConfigEvent
@ -259,18 +261,18 @@ Result btmuAcquireBleMtuConfigEvent(Event* out_event);
/**
* @brief ConfigureBleMtu
* @note This is similar to \ref btmConfigureBleMtu.
* @param[in] id Same as \ref btmuBleDisconnect.
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
* @param[in] mtu MTU
*/
Result btmuConfigureBleMtu(u32 id, u16 mtu);
Result btmuConfigureBleMtu(u32 connection_handle, u16 mtu);
/**
* @brief GetBleMtu
* @note This is similar to \ref btmGetBleMtu.
* @param[in] id Same as \ref btmuBleDisconnect.
* @param[in] connection_handle Same as \ref btmuBleDisconnect.
* @param[out] out Output MTU.
*/
Result btmuGetBleMtu(u32 id, u16 *out);
Result btmuGetBleMtu(u32 connection_handle, u16 *out);
/**
* @brief RegisterBleGattDataPath

View File

@ -156,12 +156,12 @@ Result btdevAcquireBlePairingEvent(Event* out_event) {
return btmuAcquireBlePairingEvent(out_event);
}
Result btdevPairGattServer(BtdrvBleAdvertisePacketParameter param, u32 id) {
return btmuBlePairDevice(param, id);
Result btdevPairGattServer(u32 connection_handle, BtdrvBleAdvertisePacketParameter param) {
return btmuBlePairDevice(connection_handle, param);
}
Result btdevUnpairGattServer(BtdrvBleAdvertisePacketParameter param, u32 id) {
return btmuBleUnPairDevice(param, id);
Result btdevUnpairGattServer(u32 connection_handle, BtdrvBleAdvertisePacketParameter param) {
return btmuBleUnPairDevice(connection_handle, param);
}
Result btdevUnpairGattServer2(BtdrvAddress addr, BtdrvBleAdvertisePacketParameter param) {
@ -176,13 +176,13 @@ Result btdevAcquireBleMtuConfigEvent(Event* out_event) {
return btmuAcquireBleMtuConfigEvent(out_event);
}
Result btdevConfigureBleMtu(u32 id, u16 mtu) {
Result btdevConfigureBleMtu(u32 connection_handle, u16 mtu) {
if (mtu < 0x18 || mtu > 0x200) return MAKERESULT(Module_Libnx, LibnxError_BadInput); // sdknso would Abort here, sdknso impls the same thing in the btmu func as well (but we don't).
return btmuConfigureBleMtu(id, mtu);
return btmuConfigureBleMtu(connection_handle, mtu);
}
Result btdevGetBleMtu(u32 id, u16 *out) {
return btmuGetBleMtu(id, out);
Result btdevGetBleMtu(u32 connection_handle, u16 *out) {
return btmuGetBleMtu(connection_handle, out);
}
Result btdevAcquireBleGattOperationEvent(Event* out_event) {
@ -292,7 +292,7 @@ Result btdevReadGattCharacteristic(BtdevGattCharacteristic *c) {
btdevGattAttributeGetUuid(&tmpservice.attr, &gattid0.uuid);
gattid1.instance_id = btdevGattCharacteristicGetInstanceId(c);
btdevGattAttributeGetUuid(&c->attr, &gattid1.uuid);
rc = btLeClientReadCharacteristic(btdevGattServiceIsPrimaryService(&tmpservice), 0, btdevGattAttributeGetConnectionHandle(&c->attr), &gattid0, &gattid1);
rc = btLeClientReadCharacteristic(btdevGattAttributeGetConnectionHandle(&c->attr), btdevGattServiceIsPrimaryService(&tmpservice), &gattid0, &gattid1, 0);
}
return rc;
@ -319,7 +319,7 @@ Result btdevWriteGattCharacteristic(BtdevGattCharacteristic *c) {
btdevGattAttributeGetUuid(&tmpservice.attr, &gattid0.uuid);
gattid1.instance_id = btdevGattCharacteristicGetInstanceId(c);
btdevGattAttributeGetUuid(&c->attr, &gattid1.uuid);
rc = btLeClientWriteCharacteristic(btdevGattServiceIsPrimaryService(&tmpservice), 0, (prop & BIT(3)) != 0, btdevGattAttributeGetConnectionHandle(&c->attr), &gattid0, &gattid1, value, value_size);
rc = btLeClientWriteCharacteristic(btdevGattAttributeGetConnectionHandle(&c->attr), btdevGattServiceIsPrimaryService(&tmpservice), &gattid0, &gattid1, value, value_size, 0, (prop & BIT(3)) != 0);
}
return rc;
@ -342,11 +342,11 @@ Result btdevEnableGattCharacteristicNotification(BtdevGattCharacteristic *c, boo
btdevGattAttributeGetUuid(&tmpservice.attr, &gattid0.uuid);
gattid1.instance_id = btdevGattCharacteristicGetInstanceId(c);
btdevGattAttributeGetUuid(&c->attr, &gattid1.uuid);
bool is_primary = btdevGattServiceIsPrimaryService(&tmpservice);
bool primary_service = btdevGattServiceIsPrimaryService(&tmpservice);
if (flag)
rc = btLeClientRegisterNotification(is_primary, connection_handle, &gattid0, &gattid1);
rc = btLeClientRegisterNotification(connection_handle, primary_service, &gattid0, &gattid1);
else
rc = btLeClientDeregisterNotification(is_primary, connection_handle, &gattid0, &gattid1);
rc = btLeClientDeregisterNotification(connection_handle, primary_service, &gattid0, &gattid1);
}
return rc;
@ -369,7 +369,7 @@ Result btdevReadGattDescriptor(BtdevGattDescriptor *d) {
gattid1.instance_id = btdevGattCharacteristicGetInstanceId(&tmpcharacteristic);
btdevGattAttributeGetUuid(&tmpcharacteristic.attr, &gattid1.uuid);
btdevGattAttributeGetUuid(&d->attr, &gattid2.uuid);
rc = btLeClientReadDescriptor(btdevGattServiceIsPrimaryService(&tmpservice), 0, btdevGattAttributeGetConnectionHandle(&d->attr), &gattid0, &gattid1, &gattid2);
rc = btLeClientReadDescriptor(btdevGattAttributeGetConnectionHandle(&d->attr), btdevGattServiceIsPrimaryService(&tmpservice), &gattid0, &gattid1, &gattid2, 0);
}
return rc;
@ -396,7 +396,7 @@ Result btdevWriteGattDescriptor(BtdevGattDescriptor *d) {
gattid1.instance_id = btdevGattCharacteristicGetInstanceId(&tmpcharacteristic);
btdevGattAttributeGetUuid(&tmpcharacteristic.attr, &gattid1.uuid);
btdevGattAttributeGetUuid(&d->attr, &gattid2.uuid);
rc = btLeClientWriteDescriptor(btdevGattServiceIsPrimaryService(&tmpservice), 0, btdevGattAttributeGetConnectionHandle(&d->attr), &gattid0, &gattid1, &gattid2, value, value_size);
rc = btLeClientWriteDescriptor(btdevGattAttributeGetConnectionHandle(&d->attr), btdevGattServiceIsPrimaryService(&tmpservice), &gattid0, &gattid1, &gattid2, value, value_size, 0);
}
return rc;
@ -441,7 +441,7 @@ Result btdevGattServiceGetIncludedServices(BtdevGattService *s, BtdevGattService
return rc;
}
Result btdevGattServiceGetCharacteristics(BtdevGattService *s, BtdevGattCharacteristic *characteristic, u8 count, u8 *total_out) {
Result btdevGattServiceGetCharacteristics(BtdevGattService *s, BtdevGattCharacteristic *characteristics, u8 count, u8 *total_out) {
Result rc=0;
BtmGattCharacteristic tmpcharacteristics[100]={0};
u8 tmp_total_out=0;
@ -450,7 +450,7 @@ Result btdevGattServiceGetCharacteristics(BtdevGattService *s, BtdevGattCharacte
if (R_SUCCEEDED(rc)) {
if (tmp_total_out > count) tmp_total_out = count;
for (u8 i=0; i<tmp_total_out; i++) {
btdevGattCharacteristicCreate(characteristic, &tmpcharacteristics[i].uuid, tmpcharacteristics[i].handle, s->attr.connection_handle, tmpcharacteristics[i].instance_id, tmpcharacteristics[i].properties);
btdevGattCharacteristicCreate(&characteristics[i], &tmpcharacteristics[i].uuid, tmpcharacteristics[i].handle, s->attr.connection_handle, tmpcharacteristics[i].instance_id, tmpcharacteristics[i].properties);
}
if (total_out) *total_out = tmp_total_out;
}

View File

@ -24,50 +24,50 @@ Service* btGetServiceSession(void) {
return &g_btSrv;
}
Result btLeClientReadCharacteristic(bool flag, u8 unk, u32 unk2, const BtdrvGattId *id0, const BtdrvGattId *id1) {
Result btLeClientReadCharacteristic(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, u8 unk) {
const struct {
u8 flag;
u8 primary_service;
u8 unk;
u8 pad[2];
u32 unk2;
u32 connection_handle;
BtdrvGattId id0;
BtdrvGattId id1;
u64 AppletResourceUserId;
} in = { flag!=0, unk, {0}, unk2, *id0, *id1, appletGetAppletResourceUserId() };
} in = { primary_service!=0, unk, {0}, connection_handle, *id0, *id1, appletGetAppletResourceUserId() };
return serviceDispatchIn(&g_btSrv, 0, in,
.in_send_pid = true,
);
}
Result btLeClientReadDescriptor(bool flag, u8 unk, u32 unk2, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2) {
Result btLeClientReadDescriptor(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2, u8 unk) {
const struct {
u8 flag;
u8 primary_service;
u8 unk;
u8 pad[2];
u32 unk2;
u32 connection_handle;
BtdrvGattId id0;
BtdrvGattId id1;
BtdrvGattId id2;
u64 AppletResourceUserId;
} in = { flag!=0, unk, {0}, unk2, *id0, *id1, *id2, appletGetAppletResourceUserId() };
} in = { primary_service!=0, unk, {0}, connection_handle, *id0, *id1, *id2, appletGetAppletResourceUserId() };
return serviceDispatchIn(&g_btSrv, 1, in,
.in_send_pid = true,
);
}
Result btLeClientWriteCharacteristic(bool flag, u8 unk, bool flag2, u32 unk2, const BtdrvGattId *id0, const BtdrvGattId *id1, const void* buffer, size_t size) {
Result btLeClientWriteCharacteristic(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const void* buffer, size_t size, u8 unk, bool flag) {
const struct {
u8 flag;
u8 primary_service;
u8 unk;
u8 flag2;
u8 flag;
u8 pad;
u32 unk2;
u32 connection_handle;
BtdrvGattId id0;
BtdrvGattId id1;
u64 AppletResourceUserId;
} in = { flag!=0, unk, flag2!=0, 0, unk2, *id0, *id1, appletGetAppletResourceUserId() };
} in = { primary_service!=0, unk, flag!=0, 0, connection_handle, *id0, *id1, appletGetAppletResourceUserId() };
return serviceDispatchIn(&g_btSrv, 2, in,
.buffer_attrs = { SfBufferAttr_HipcPointer | SfBufferAttr_In },
@ -76,17 +76,17 @@ Result btLeClientWriteCharacteristic(bool flag, u8 unk, bool flag2, u32 unk2, co
);
}
Result btLeClientWriteDescriptor(bool flag, u8 unk, u32 unk2, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2, const void* buffer, size_t size) {
Result btLeClientWriteDescriptor(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2, const void* buffer, size_t size, u8 unk) {
const struct {
u8 flag;
u8 primary_service;
u8 unk;
u8 pad[2];
u32 unk2;
u32 connection_handle;
BtdrvGattId id0;
BtdrvGattId id1;
BtdrvGattId id2;
u64 AppletResourceUserId;
} in = { flag!=0, unk, {0}, unk2, *id0, *id1, *id2, appletGetAppletResourceUserId() };
} in = { primary_service!=0, unk, {0}, connection_handle, *id0, *id1, *id2, appletGetAppletResourceUserId() };
return serviceDispatchIn(&g_btSrv, 3, in,
.buffer_attrs = { SfBufferAttr_HipcPointer | SfBufferAttr_In },
@ -95,27 +95,27 @@ Result btLeClientWriteDescriptor(bool flag, u8 unk, u32 unk2, const BtdrvGattId
);
}
static Result _btLeClientNotification(bool flag, u32 unk, const BtdrvGattId *id0, const BtdrvGattId *id1, u32 cmd_id) {
static Result _btLeClientNotification(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, u32 cmd_id) {
const struct {
u8 flag;
u8 primary_service;
u8 pad[3];
u32 unk;
u32 connection_handle;
BtdrvGattId id0;
BtdrvGattId id1;
u64 AppletResourceUserId;
} in = { flag!=0, {0}, unk, *id0, *id1, appletGetAppletResourceUserId() };
} in = { primary_service!=0, {0}, connection_handle, *id0, *id1, appletGetAppletResourceUserId() };
return serviceDispatchIn(&g_btSrv, cmd_id, in,
.in_send_pid = true,
);
}
Result btLeClientRegisterNotification(bool flag, u32 unk, const BtdrvGattId *id0, const BtdrvGattId *id1) {
return _btLeClientNotification(flag, unk, id0, id1, 4);
Result btLeClientRegisterNotification(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1) {
return _btLeClientNotification(connection_handle, primary_service, id0, id1, 4);
}
Result btLeClientDeregisterNotification(bool flag, u32 unk, const BtdrvGattId *id0, const BtdrvGattId *id1) {
return _btLeClientNotification(flag, unk, id0, id1, 5);
Result btLeClientDeregisterNotification(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1) {
return _btLeClientNotification(connection_handle, primary_service, id0, id1, 5);
}
Result btSetLeResponse(u8 unk, const BtdrvGattAttributeUuid *uuid0, const BtdrvGattAttributeUuid *uuid1, const void* buffer, size_t size) {
@ -135,7 +135,7 @@ Result btSetLeResponse(u8 unk, const BtdrvGattAttributeUuid *uuid0, const BtdrvG
);
}
Result btLeSendIndication(u8 unk, bool flag, const BtdrvGattAttributeUuid *uuid0, const BtdrvGattAttributeUuid *uuid1, const void* buffer, size_t size) {
Result btLeSendIndication(u8 unk, const BtdrvGattAttributeUuid *uuid0, const BtdrvGattAttributeUuid *uuid1, const void* buffer, size_t size, bool flag) {
const struct {
u8 unk;
u8 flag;

View File

@ -129,14 +129,14 @@ static Result _btdrvCmdOutU32OutBuf(void* buffer, size_t size, u32 *out, u32 cmd
);
}
static Result _btdrvGattNotification(bool flag, u32 unk, const BtdrvGattId *id0, const BtdrvGattId *id1, u32 cmd_id) {
static Result _btdrvGattNotification(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, u32 cmd_id) {
const struct {
u8 flag;
u8 primary_service;
u8 pad[3];
u32 unk;
u32 connection_handle;
BtdrvGattId id0;
BtdrvGattId id1;
} in = { flag!=0, {0}, unk, *id0, *id1 };
} in = { primary_service!=0, {0}, connection_handle, *id0, *id1 };
return serviceDispatchIn(&g_btdrvSrv, cmd_id, in);
}
@ -998,55 +998,55 @@ Result btdrvUnregisterGattDataPath(const BtdrvGattAttributeUuid *uuid) {
return _btdrvCmdInUuidNoOut(uuid, cmd_id);
}
Result btdrvReadGattCharacteristic(bool flag, u8 unk, u32 unk2, const BtdrvGattId *id0, const BtdrvGattId *id1) {
Result btdrvReadGattCharacteristic(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, u8 unk) {
if (hosversionBefore(5,0,0))
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
u32 cmd_id = hosversionBefore(5,1,0) ? 89 : 90;
const struct {
u8 flag;
u8 primary_service;
u8 unk;
u8 pad[2];
u32 unk2;
u32 connection_handle;
BtdrvGattId id0;
BtdrvGattId id1;
} in = { flag!=0, unk, {0}, unk2, *id0, *id1};
} in = { primary_service!=0, unk, {0}, connection_handle, *id0, *id1};
return serviceDispatchIn(&g_btdrvSrv, cmd_id, in);
}
Result btdrvReadGattDescriptor(bool flag, u8 unk, u32 unk2, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2) {
Result btdrvReadGattDescriptor(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2, u8 unk) {
if (hosversionBefore(5,0,0))
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
u32 cmd_id = hosversionBefore(5,1,0) ? 90 : 91;
const struct {
u8 flag;
u8 primary_service;
u8 unk;
u8 pad[2];
u32 unk2;
u32 connection_handle;
BtdrvGattId id0;
BtdrvGattId id1;
BtdrvGattId id2;
} in = { flag!=0, unk, {0}, unk2, *id0, *id1, *id2 };
} in = { primary_service!=0, unk, {0}, connection_handle, *id0, *id1, *id2 };
return serviceDispatchIn(&g_btdrvSrv, cmd_id, in);
}
Result btdrvWriteGattCharacteristic(bool flag, u8 unk, bool flag2, u32 unk2, const BtdrvGattId *id0, const BtdrvGattId *id1, const void* buffer, size_t size) {
Result btdrvWriteGattCharacteristic(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1, const void* buffer, size_t size, u8 unk, bool flag) {
if (hosversionBefore(5,0,0))
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
u32 cmd_id = hosversionBefore(5,1,0) ? 91 : 92;
const struct {
u8 flag;
u8 primary_service;
u8 unk;
u8 flag2;
u8 flag;
u8 pad;
u32 unk2;
u32 connection_handle;
BtdrvGattId id0;
BtdrvGattId id1;
} in = { flag!=0, unk, flag2!=0, 0, unk2, *id0, *id1 };
} in = { primary_service!=0, unk, flag!=0, 0, connection_handle, *id0, *id1 };
return serviceDispatchIn(&g_btdrvSrv, cmd_id, in,
.buffer_attrs = { SfBufferAttr_HipcPointer | SfBufferAttr_In },
@ -1054,20 +1054,20 @@ Result btdrvWriteGattCharacteristic(bool flag, u8 unk, bool flag2, u32 unk2, con
);
}
Result btdrvWriteGattDescriptor(bool flag, u8 unk, u32 unk2, const BtdrvGattId *id0, const BtdrvGattId *id1, const BtdrvGattId *id2, const void* buffer, size_t size) {
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) {
if (hosversionBefore(5,0,0))
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
u32 cmd_id = hosversionBefore(5,1,0) ? 92 : 93;
const struct {
u8 flag;
u8 primary_service;
u8 unk;
u8 pad[2];
u32 unk2;
u32 connection_handle;
BtdrvGattId id0;
BtdrvGattId id1;
BtdrvGattId id2;
} in = { flag!=0, unk, {0}, unk2, *id0, *id1, *id2 };
} in = { primary_service!=0, unk, {0}, connection_handle, *id0, *id1, *id2 };
return serviceDispatchIn(&g_btdrvSrv, cmd_id, in,
.buffer_attrs = { SfBufferAttr_HipcPointer | SfBufferAttr_In },
@ -1075,19 +1075,19 @@ Result btdrvWriteGattDescriptor(bool flag, u8 unk, u32 unk2, const BtdrvGattId *
);
}
Result btdrvRegisterGattNotification(bool flag, u32 unk, const BtdrvGattId *id0, const BtdrvGattId *id1) {
Result btdrvRegisterGattNotification(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1) {
if (hosversionBefore(5,0,0))
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
return _btdrvGattNotification(flag, unk, id0, id1, 94);
return _btdrvGattNotification(connection_handle, primary_service, id0, id1, 94);
}
Result btdrvUnregisterGattNotification(bool flag, u32 unk, const BtdrvGattId *id0, const BtdrvGattId *id1) {
Result btdrvUnregisterGattNotification(u32 connection_handle, bool primary_service, const BtdrvGattId *id0, const BtdrvGattId *id1) {
if (hosversionBefore(5,0,0))
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
u32 cmd_id = hosversionBefore(5,1,0) ? 93 : 95;
return _btdrvGattNotification(flag, unk, id0, id1, cmd_id);
return _btdrvGattNotification(connection_handle, primary_service, id0, id1, cmd_id);
}
Result btdrvGetLeHidEventInfo(void* buffer, size_t size, u32 *type) {

View File

@ -115,21 +115,21 @@ static Result _btmGetBleScanResults(BtdrvBleScanResult *results, u8 count, u8 *t
);
}
static Result _btmBlePairDevice(BtdrvBleAdvertisePacketParameter param, u32 id, u32 cmd_id) {
static Result _btmBlePairDevice(u32 connection_handle, BtdrvBleAdvertisePacketParameter param, u32 cmd_id) {
const struct {
BtdrvBleAdvertisePacketParameter param;
u32 id;
} in = { param, id };
u32 connection_handle;
} in = { param, connection_handle };
return serviceDispatchIn(&g_btmSrv, cmd_id, in);
}
static Result _btmGetGattServiceData(u32 id, u16 unk1, void* buffer, size_t entrysize, u8 count, u8 *out, u32 cmd_id) {
static Result _btmGetGattServiceData(u32 connection_handle, u16 handle, void* buffer, size_t entrysize, u8 count, u8 *out, u32 cmd_id) {
const struct {
u16 unk1;
u16 handle;
u16 pad;
u32 unk0;
} in = { unk1, 0, id };
u32 connection_handle;
} in = { handle, 0, connection_handle };
return serviceDispatchInOut(&g_btmSrv, cmd_id, in, *out,
.buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out },
@ -362,12 +362,12 @@ Result btmBleOverrideConnection(u32 id) {
return _btmCmdInU32NoOut(id, 36);
}
Result btmBleDisconnect(u32 id) {
Result btmBleDisconnect(u32 connection_handle) {
if (hosversionBefore(5,0,0))
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
u32 cmd_id = hosversionBefore(5,1,0) ? 25 : 37;
return _btmCmdInU32NoOut(id, cmd_id);
return _btmCmdInU32NoOut(connection_handle, cmd_id);
}
Result btmBleGetConnectionState(BtdrvBleConnectionInfo *info, u8 count, u8 *total_out) {
@ -400,18 +400,18 @@ Result btmAcquireBlePairingEvent(Event* out_event) {
return _btmCmdGetEventOutFlag(out_event, true, cmd_id);
}
Result btmBlePairDevice(BtdrvBleAdvertisePacketParameter param, u32 id) {
Result btmBlePairDevice(u32 connection_handle, BtdrvBleAdvertisePacketParameter param) {
if (hosversionBefore(5,1,0))
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
return _btmBlePairDevice(param, id, 41);
return _btmBlePairDevice(connection_handle, param, 41);
}
Result btmBleUnpairDeviceOnBoth(BtdrvBleAdvertisePacketParameter param, u32 id) {
Result btmBleUnpairDeviceOnBoth(u32 connection_handle, BtdrvBleAdvertisePacketParameter param) {
if (hosversionBefore(5,1,0))
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
return _btmBlePairDevice(param, id, 42);
return _btmBlePairDevice(connection_handle, param, 42);
}
Result btmBleUnPairDevice(BtdrvAddress addr, BtdrvBleAdvertisePacketParameter param) {
@ -443,26 +443,26 @@ Result btmAcquireBleServiceDiscoveryEvent(Event* out_event) {
return _btmCmdGetEventOutFlag(out_event, true, 45);
}
Result btmGetGattServices(u32 id, BtmGattService *services, u8 count, u8 *total_out) {
Result btmGetGattServices(u32 connection_handle, BtmGattService *services, u8 count, u8 *total_out) {
if (hosversionBefore(5,0,0))
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
u32 cmd_id = hosversionBefore(5,1,0) ? 29 : 46;
return serviceDispatchInOut(&g_btmSrv, cmd_id, id, *total_out,
return serviceDispatchInOut(&g_btmSrv, cmd_id, connection_handle, *total_out,
.buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out },
.buffers = { { services, sizeof(BtmGattService)*count } },
);
}
Result btmGetGattService(u32 id, const BtdrvGattAttributeUuid *uuid, BtmGattService *service, bool *flag) {
Result btmGetGattService(u32 connection_handle, const BtdrvGattAttributeUuid *uuid, BtmGattService *service, bool *flag) {
if (hosversionBefore(5,0,0))
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
u32 cmd_id = hosversionBefore(5,1,0) ? 30 : 47;
const struct {
u32 id;
u32 connection_handle;
BtdrvGattAttributeUuid uuid;
} in = { id, *uuid };
} in = { connection_handle, *uuid };
u8 tmp=0;
Result rc = serviceDispatchInOut(&g_btmSrv, cmd_id, in, tmp,
@ -473,24 +473,24 @@ Result btmGetGattService(u32 id, const BtdrvGattAttributeUuid *uuid, BtmGattServ
return rc;
}
Result btmGetGattIncludedServices(u32 id, u16 unk1, BtmGattService *services, u8 count, u8 *out) {
Result btmGetGattIncludedServices(u32 connection_handle, u16 handle, BtmGattService *services, u8 count, u8 *out) {
if (hosversionBefore(5,0,0))
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
u32 cmd_id = hosversionBefore(5,1,0) ? 31 : 48;
return _btmGetGattServiceData(id, unk1, services, sizeof(BtmGattService), count, out, cmd_id);
return _btmGetGattServiceData(connection_handle, handle, services, sizeof(BtmGattService), count, out, cmd_id);
}
Result btmGetBelongingService(u32 id, u16 unk1, BtmGattService *service, bool *flag) {
Result btmGetBelongingService(u32 connection_handle, u16 handle, BtmGattService *service, bool *flag) {
if (hosversionBefore(5,0,0))
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
u32 cmd_id = hosversionBefore(5,1,0) ? 32 : 49;
const struct {
u16 unk1;
u16 handle;
u16 pad;
u32 id;
} in = { unk1, 0, id };
u32 connection_handle;
} in = { handle, 0, connection_handle };
u8 tmp=0;
Result rc = serviceDispatchInOut(&g_btmSrv, cmd_id, in, tmp,
@ -501,20 +501,20 @@ Result btmGetBelongingService(u32 id, u16 unk1, BtmGattService *service, bool *f
return rc;
}
Result btmGetGattCharacteristics(u32 id, u16 unk1, BtmGattCharacteristic *characteristics, u8 count, u8 *total_out) {
Result btmGetGattCharacteristics(u32 connection_handle, u16 handle, BtmGattCharacteristic *characteristics, u8 count, u8 *total_out) {
if (hosversionBefore(5,0,0))
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
u32 cmd_id = hosversionBefore(5,1,0) ? 33 : 50;
return _btmGetGattServiceData(id, unk1, characteristics, sizeof(BtmGattCharacteristic), count, total_out, cmd_id);
return _btmGetGattServiceData(connection_handle, handle, characteristics, sizeof(BtmGattCharacteristic), count, total_out, cmd_id);
}
Result btmGetGattDescriptors(u32 id, u16 unk1, BtmGattDescriptor *descriptors, u8 count, u8 *total_out) {
Result btmGetGattDescriptors(u32 connection_handle, u16 handle, BtmGattDescriptor *descriptors, u8 count, u8 *total_out) {
if (hosversionBefore(5,0,0))
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
u32 cmd_id = hosversionBefore(5,1,0) ? 34 : 51;
return _btmGetGattServiceData(id, unk1, descriptors, sizeof(BtmGattDescriptor), count, total_out, cmd_id);
return _btmGetGattServiceData(connection_handle, handle, descriptors, sizeof(BtmGattDescriptor), count, total_out, cmd_id);
}
Result btmAcquireBleMtuConfigEvent(Event* out_event) {
@ -525,7 +525,7 @@ Result btmAcquireBleMtuConfigEvent(Event* out_event) {
return _btmCmdGetEventOutFlag(out_event, true, cmd_id);
}
Result btmConfigureBleMtu(u32 id, u16 mtu) {
Result btmConfigureBleMtu(u32 connection_handle, u16 mtu) {
if (hosversionBefore(5,0,0))
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
u32 cmd_id = hosversionBefore(5,1,0) ? 36 : 53;
@ -533,18 +533,18 @@ Result btmConfigureBleMtu(u32 id, u16 mtu) {
const struct {
u16 mtu;
u16 pad;
u32 id;
} in = { mtu, 0, id };
u32 connection_handle;
} in = { mtu, 0, connection_handle };
return serviceDispatchIn(&g_btmSrv, cmd_id, in);
}
Result btmGetBleMtu(u32 id, u16 *out) {
Result btmGetBleMtu(u32 connection_handle, u16 *out) {
if (hosversionBefore(5,0,0))
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
u32 cmd_id = hosversionBefore(5,1,0) ? 37 : 54;
return serviceDispatchInOut(&g_btmSrv, cmd_id, id, *out);
return serviceDispatchInOut(&g_btmSrv, cmd_id, connection_handle, *out);
}
Result btmRegisterBleGattDataPath(const BtmBleDataPath *path) {

View File

@ -85,22 +85,22 @@ static Result _btmuGetBleScanResults(BtdrvBleScanResult *results, u8 count, u8 *
);
}
static Result _btmuBlePairDevice(BtdrvBleAdvertisePacketParameter param, u32 id, u32 cmd_id) {
static Result _btmuBlePairDevice(u32 connection_handle, BtdrvBleAdvertisePacketParameter param, u32 cmd_id) {
const struct {
BtdrvBleAdvertisePacketParameter param;
u32 id;
} in = { param, id };
u32 connection_handle;
} in = { param, connection_handle };
return serviceDispatchIn(&g_btmuIBtmUserCore, cmd_id, in);
}
static Result _btmuGetGattServiceData(u32 id, u16 unk1, void* buffer, size_t entrysize, u8 count, u8 *out, u32 cmd_id) {
static Result _btmuGetGattServiceData(u32 connection_handle, u16 handle, void* buffer, size_t entrysize, u8 count, u8 *out, u32 cmd_id) {
const struct {
u16 unk1;
u16 handle;
u16 pad;
u32 unk0;
u32 connection_handle;
u64 AppletResourceUserId;
} in = { unk1, 0, id, appletGetAppletResourceUserId() };
} in = { handle, 0, connection_handle, appletGetAppletResourceUserId() };
return serviceDispatchInOut(&g_btmuIBtmUserCore, cmd_id, in, *out,
.buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out },
@ -188,8 +188,8 @@ Result btmuBleConnect(BtdrvAddress addr) {
);
}
Result btmuBleDisconnect(u32 id) {
return _btmuCmdInU32NoOut(id, 19);
Result btmuBleDisconnect(u32 connection_handle) {
return _btmuCmdInU32NoOut(connection_handle, 19);
}
Result btmuBleGetConnectionState(BtdrvBleConnectionInfo *info, u8 count, u8 *total_out) {
@ -205,12 +205,12 @@ Result btmuAcquireBlePairingEvent(Event* out_event) {
return _btmuCmdGetEventOutFlag(out_event, true, 21);
}
Result btmuBlePairDevice(BtdrvBleAdvertisePacketParameter param, u32 id) {
return _btmuBlePairDevice(param, id, 22);
Result btmuBlePairDevice(u32 connection_handle, BtdrvBleAdvertisePacketParameter param) {
return _btmuBlePairDevice(connection_handle, param, 22);
}
Result btmuBleUnPairDevice(BtdrvBleAdvertisePacketParameter param, u32 id) {
return _btmuBlePairDevice(param, id, 23);
Result btmuBleUnPairDevice(u32 connection_handle, BtdrvBleAdvertisePacketParameter param) {
return _btmuBlePairDevice(connection_handle, param, 23);
}
Result btmuBleUnPairDevice2(BtdrvAddress addr, BtdrvBleAdvertisePacketParameter param) {
@ -233,12 +233,12 @@ Result btmuAcquireBleServiceDiscoveryEvent(Event* out_event) {
return _btmuCmdGetEventOutFlag(out_event, true, 26);
}
Result btmuGetGattServices(u32 id, BtmGattService *services, u8 count, u8 *total_out) {
Result btmuGetGattServices(u32 connection_handle, BtmGattService *services, u8 count, u8 *total_out) {
const struct {
u32 id;
u32 connection_handle;
u32 pad;
u64 AppletResourceUserId;
} in = { id, 0, appletGetAppletResourceUserId() };
} in = { connection_handle, 0, appletGetAppletResourceUserId() };
return serviceDispatchInOut(&g_btmuIBtmUserCore, 27, in, *total_out,
.buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out },
@ -247,12 +247,12 @@ Result btmuGetGattServices(u32 id, BtmGattService *services, u8 count, u8 *total
);
}
Result btmuGetGattService(u32 id, const BtdrvGattAttributeUuid *uuid, BtmGattService *service, bool *flag) {
Result btmuGetGattService(u32 connection_handle, const BtdrvGattAttributeUuid *uuid, BtmGattService *service, bool *flag) {
const struct {
u32 id;
u32 connection_handle;
BtdrvGattAttributeUuid uuid;
u64 AppletResourceUserId;
} in = { id, *uuid, appletGetAppletResourceUserId() };
} in = { connection_handle, *uuid, appletGetAppletResourceUserId() };
u8 tmp=0;
Result rc = serviceDispatchInOut(&g_btmuIBtmUserCore, 28, in, tmp,
@ -264,17 +264,17 @@ Result btmuGetGattService(u32 id, const BtdrvGattAttributeUuid *uuid, BtmGattSer
return rc;
}
Result btmuGetGattIncludedServices(u32 id, u16 unk1, BtmGattService *services, u8 count, u8 *out) {
return _btmuGetGattServiceData(id, unk1, services, sizeof(BtmGattService), count, out, 29);
Result btmuGetGattIncludedServices(u32 connection_handle, u16 handle, BtmGattService *services, u8 count, u8 *out) {
return _btmuGetGattServiceData(connection_handle, handle, services, sizeof(BtmGattService), count, out, 29);
}
Result btmuGetBelongingGattService(u32 id, u16 unk1, BtmGattService *service, bool *flag) {
Result btmuGetBelongingGattService(u32 connection_handle, u16 handle, BtmGattService *service, bool *flag) {
const struct {
u16 unk1;
u16 handle;
u16 pad;
u32 id;
u32 connection_handle;
u64 AppletResourceUserId;
} in = { unk1, 0, id, appletGetAppletResourceUserId() };
} in = { handle, 0, connection_handle, appletGetAppletResourceUserId() };
u8 tmp=0;
Result rc = serviceDispatchInOut(&g_btmuIBtmUserCore, 30, in, tmp,
@ -286,37 +286,37 @@ Result btmuGetBelongingGattService(u32 id, u16 unk1, BtmGattService *service, bo
return rc;
}
Result btmuGetGattCharacteristics(u32 id, u16 unk1, BtmGattCharacteristic *characteristics, u8 count, u8 *total_out) {
return _btmuGetGattServiceData(id, unk1, characteristics, sizeof(BtmGattCharacteristic), count, total_out, 31);
Result btmuGetGattCharacteristics(u32 connection_handle, u16 handle, BtmGattCharacteristic *characteristics, u8 count, u8 *total_out) {
return _btmuGetGattServiceData(connection_handle, handle, characteristics, sizeof(BtmGattCharacteristic), count, total_out, 31);
}
Result btmuGetGattDescriptors(u32 id, u16 unk1, BtmGattDescriptor *descriptors, u8 count, u8 *total_out) {
return _btmuGetGattServiceData(id, unk1, descriptors, sizeof(BtmGattDescriptor), count, total_out, 32);
Result btmuGetGattDescriptors(u32 connection_handle, u16 handle, BtmGattDescriptor *descriptors, u8 count, u8 *total_out) {
return _btmuGetGattServiceData(connection_handle, handle, descriptors, sizeof(BtmGattDescriptor), count, total_out, 32);
}
Result btmuAcquireBleMtuConfigEvent(Event* out_event) {
return _btmuCmdGetEventOutFlag(out_event, true, 33);
}
Result btmuConfigureBleMtu(u32 id, u16 mtu) {
Result btmuConfigureBleMtu(u32 connection_handle, u16 mtu) {
const struct {
u16 mtu;
u16 pad;
u32 id;
u32 connection_handle;
u64 AppletResourceUserId;
} in = { mtu, 0, id, appletGetAppletResourceUserId() };
} in = { mtu, 0, connection_handle, appletGetAppletResourceUserId() };
return serviceDispatchIn(&g_btmuIBtmUserCore, 34, in,
.in_send_pid = true,
);
}
Result btmuGetBleMtu(u32 id, u16 *out) {
Result btmuGetBleMtu(u32 connection_handle, u16 *out) {
const struct {
u32 id;
u32 connection_handle;
u32 pad;
u64 AppletResourceUserId;
} in = { id, 0, appletGetAppletResourceUserId() };
} in = { connection_handle, 0, appletGetAppletResourceUserId() };
return serviceDispatchInOut(&g_btmuIBtmUserCore, 35, in, *out,
.in_send_pid = true,