[FL-3376] Fixed GATT attribute order (#2776)
* hal: gatt: swapped rx/tx serial chars order * hal: gatt: reordered HID attrs to maintain previous order Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
This commit is contained in:
parent
b6dbf25f85
commit
5334a0ab92
@ -330,6 +330,7 @@ static void gap_init_svc(Gap* gap) {
|
|||||||
if(status) {
|
if(status) {
|
||||||
FURI_LOG_E(TAG, "Failed updating name characteristic: %d", status);
|
FURI_LOG_E(TAG, "Failed updating name characteristic: %d", status);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t gap_appearence_char_uuid[2] = {
|
uint8_t gap_appearence_char_uuid[2] = {
|
||||||
gap->config->appearance_char & 0xff, gap->config->appearance_char >> 8};
|
gap->config->appearance_char & 0xff, gap->config->appearance_char >> 8};
|
||||||
status = aci_gatt_update_char_value(
|
status = aci_gatt_update_char_value(
|
||||||
|
|||||||
@ -22,6 +22,10 @@ typedef struct {
|
|||||||
|
|
||||||
static_assert(sizeof(HidSvcReportId) == sizeof(uint16_t), "HidSvcReportId must be 2 bytes");
|
static_assert(sizeof(HidSvcReportId) == sizeof(uint16_t), "HidSvcReportId must be 2 bytes");
|
||||||
|
|
||||||
|
static const Service_UUID_t hid_svc_uuid = {
|
||||||
|
.Service_UUID_16 = HUMAN_INTERFACE_DEVICE_SERVICE_UUID,
|
||||||
|
};
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
hid_svc_char_desc_data_callback(const void* context, const uint8_t** data, uint16_t* data_len) {
|
hid_svc_char_desc_data_callback(const void* context, const uint8_t** data, uint16_t* data_len) {
|
||||||
const HidSvcReportId* report_id = context;
|
const HidSvcReportId* report_id = context;
|
||||||
@ -148,18 +152,15 @@ static SVCCTL_EvtAckStatus_t hid_svc_event_handler(void* event) {
|
|||||||
void hid_svc_start() {
|
void hid_svc_start() {
|
||||||
tBleStatus status;
|
tBleStatus status;
|
||||||
hid_svc = malloc(sizeof(HIDSvc));
|
hid_svc = malloc(sizeof(HIDSvc));
|
||||||
Service_UUID_t svc_uuid = {};
|
|
||||||
|
|
||||||
// Register event handler
|
// Register event handler
|
||||||
SVCCTL_RegisterSvcHandler(hid_svc_event_handler);
|
SVCCTL_RegisterSvcHandler(hid_svc_event_handler);
|
||||||
// Add service
|
|
||||||
svc_uuid.Service_UUID_16 = HUMAN_INTERFACE_DEVICE_SERVICE_UUID;
|
|
||||||
/**
|
/**
|
||||||
* Add Human Interface Device Service
|
* Add Human Interface Device Service
|
||||||
*/
|
*/
|
||||||
status = aci_gatt_add_service(
|
status = aci_gatt_add_service(
|
||||||
UUID_TYPE_16,
|
UUID_TYPE_16,
|
||||||
&svc_uuid,
|
&hid_svc_uuid,
|
||||||
PRIMARY_SERVICE,
|
PRIMARY_SERVICE,
|
||||||
2 + /* protocol mode */
|
2 + /* protocol mode */
|
||||||
(4 * HID_SVC_INPUT_REPORT_COUNT) + (3 * HID_SVC_OUTPUT_REPORT_COUNT) +
|
(4 * HID_SVC_INPUT_REPORT_COUNT) + (3 * HID_SVC_OUTPUT_REPORT_COUNT) +
|
||||||
@ -170,10 +171,12 @@ void hid_svc_start() {
|
|||||||
FURI_LOG_E(TAG, "Failed to add HID service: %d", status);
|
FURI_LOG_E(TAG, "Failed to add HID service: %d", status);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(size_t i = 0; i < HidSvcGattCharacteristicCount; i++) {
|
// Maintain previously defined characteristic order
|
||||||
flipper_gatt_characteristic_init(
|
flipper_gatt_characteristic_init(
|
||||||
hid_svc->svc_handle, &hid_svc_chars[i], &hid_svc->chars[i]);
|
hid_svc->svc_handle,
|
||||||
}
|
&hid_svc_chars[HidSvcGattCharacteristicProtocolMode],
|
||||||
|
&hid_svc->chars[HidSvcGattCharacteristicProtocolMode]);
|
||||||
|
|
||||||
uint8_t protocol_mode = 1;
|
uint8_t protocol_mode = 1;
|
||||||
flipper_gatt_characteristic_update(
|
flipper_gatt_characteristic_update(
|
||||||
hid_svc->svc_handle,
|
hid_svc->svc_handle,
|
||||||
@ -215,6 +218,12 @@ void hid_svc_start() {
|
|||||||
&hid_report_chars[report_type_idx].chars[report_idx]);
|
&hid_report_chars[report_type_idx].chars[report_idx]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Setup remaining characteristics
|
||||||
|
for(size_t i = HidSvcGattCharacteristicReportMap; i < HidSvcGattCharacteristicCount; i++) {
|
||||||
|
flipper_gatt_characteristic_init(
|
||||||
|
hid_svc->svc_handle, &hid_svc_chars[i], &hid_svc->chars[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool hid_svc_update_report_map(const uint8_t* data, uint16_t len) {
|
bool hid_svc_update_report_map(const uint8_t* data, uint16_t len) {
|
||||||
|
|||||||
@ -10,24 +10,14 @@
|
|||||||
#define TAG "BtSerialSvc"
|
#define TAG "BtSerialSvc"
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SerialSvcGattCharacteristicTx = 0,
|
SerialSvcGattCharacteristicRx = 0,
|
||||||
SerialSvcGattCharacteristicRx,
|
SerialSvcGattCharacteristicTx,
|
||||||
SerialSvcGattCharacteristicFlowCtrl,
|
SerialSvcGattCharacteristicFlowCtrl,
|
||||||
SerialSvcGattCharacteristicStatus,
|
SerialSvcGattCharacteristicStatus,
|
||||||
SerialSvcGattCharacteristicCount,
|
SerialSvcGattCharacteristicCount,
|
||||||
} SerialSvcGattCharacteristicId;
|
} SerialSvcGattCharacteristicId;
|
||||||
|
|
||||||
static const FlipperGattCharacteristicParams serial_svc_chars[SerialSvcGattCharacteristicCount] = {
|
static const FlipperGattCharacteristicParams serial_svc_chars[SerialSvcGattCharacteristicCount] = {
|
||||||
[SerialSvcGattCharacteristicTx] =
|
|
||||||
{.name = "TX",
|
|
||||||
.data_prop_type = FlipperGattCharacteristicDataFixed,
|
|
||||||
.data.fixed.length = SERIAL_SVC_DATA_LEN_MAX,
|
|
||||||
.uuid.Char_UUID_128 = SERIAL_SVC_TX_CHAR_UUID,
|
|
||||||
.uuid_type = UUID_TYPE_128,
|
|
||||||
.char_properties = CHAR_PROP_READ | CHAR_PROP_INDICATE,
|
|
||||||
.security_permissions = ATTR_PERMISSION_AUTHEN_READ,
|
|
||||||
.gatt_evt_mask = GATT_DONT_NOTIFY_EVENTS,
|
|
||||||
.is_variable = CHAR_VALUE_LEN_VARIABLE},
|
|
||||||
[SerialSvcGattCharacteristicRx] =
|
[SerialSvcGattCharacteristicRx] =
|
||||||
{.name = "RX",
|
{.name = "RX",
|
||||||
.data_prop_type = FlipperGattCharacteristicDataFixed,
|
.data_prop_type = FlipperGattCharacteristicDataFixed,
|
||||||
@ -38,6 +28,16 @@ static const FlipperGattCharacteristicParams serial_svc_chars[SerialSvcGattChara
|
|||||||
.security_permissions = ATTR_PERMISSION_AUTHEN_READ | ATTR_PERMISSION_AUTHEN_WRITE,
|
.security_permissions = ATTR_PERMISSION_AUTHEN_READ | ATTR_PERMISSION_AUTHEN_WRITE,
|
||||||
.gatt_evt_mask = GATT_NOTIFY_ATTRIBUTE_WRITE,
|
.gatt_evt_mask = GATT_NOTIFY_ATTRIBUTE_WRITE,
|
||||||
.is_variable = CHAR_VALUE_LEN_VARIABLE},
|
.is_variable = CHAR_VALUE_LEN_VARIABLE},
|
||||||
|
[SerialSvcGattCharacteristicTx] =
|
||||||
|
{.name = "TX",
|
||||||
|
.data_prop_type = FlipperGattCharacteristicDataFixed,
|
||||||
|
.data.fixed.length = SERIAL_SVC_DATA_LEN_MAX,
|
||||||
|
.uuid.Char_UUID_128 = SERIAL_SVC_TX_CHAR_UUID,
|
||||||
|
.uuid_type = UUID_TYPE_128,
|
||||||
|
.char_properties = CHAR_PROP_READ | CHAR_PROP_INDICATE,
|
||||||
|
.security_permissions = ATTR_PERMISSION_AUTHEN_READ,
|
||||||
|
.gatt_evt_mask = GATT_DONT_NOTIFY_EVENTS,
|
||||||
|
.is_variable = CHAR_VALUE_LEN_VARIABLE},
|
||||||
[SerialSvcGattCharacteristicFlowCtrl] =
|
[SerialSvcGattCharacteristicFlowCtrl] =
|
||||||
{.name = "Flow control",
|
{.name = "Flow control",
|
||||||
.data_prop_type = FlipperGattCharacteristicDataFixed,
|
.data_prop_type = FlipperGattCharacteristicDataFixed,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user