gatt-service/hids_device: handle reports without notify

This commit is contained in:
Matthias Ringwald 2023-06-27 15:12:34 +02:00
parent e4c7c6fa4a
commit 2c84eaa351

View File

@ -354,30 +354,40 @@ void hids_device_init_with_storage(uint8_t hid_country_code, const uint8_t * hid
uint16_t start_chr_handle = start_handle; uint16_t start_chr_handle = start_handle;
while ( (start_chr_handle < end_handle) && (assigned_reports_num < hid_reports_num)) { while ( (start_chr_handle < end_handle) && (assigned_reports_num < hid_reports_num)) {
// mandatory
uint16_t chr_value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid16(start_chr_handle, end_handle, ORG_BLUETOOTH_CHARACTERISTIC_REPORT); uint16_t chr_value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid16(start_chr_handle, end_handle, ORG_BLUETOOTH_CHARACTERISTIC_REPORT);
if (chr_value_handle == 0){ if (chr_value_handle == 0){
break; break;
} }
// optional
uint16_t chr_client_configuration_handle = gatt_server_get_client_configuration_handle_for_characteristic_with_uuid16(start_chr_handle, end_handle, ORG_BLUETOOTH_CHARACTERISTIC_REPORT); uint16_t chr_client_configuration_handle = gatt_server_get_client_configuration_handle_for_characteristic_with_uuid16(start_chr_handle, end_handle, ORG_BLUETOOTH_CHARACTERISTIC_REPORT);
// mandatory
uint16_t report_reference_handle = gatt_server_get_descriptor_handle_for_characteristic_with_uuid16(start_chr_handle, end_handle, ORG_BLUETOOTH_CHARACTERISTIC_REPORT, ORG_BLUETOOTH_DESCRIPTOR_REPORT_REFERENCE); uint16_t report_reference_handle = gatt_server_get_descriptor_handle_for_characteristic_with_uuid16(start_chr_handle, end_handle, ORG_BLUETOOTH_CHARACTERISTIC_REPORT, ORG_BLUETOOTH_DESCRIPTOR_REPORT_REFERENCE);
if (report_reference_handle == 0){
break;
}
// get report id and type from report reference
uint16_t report_reference_value_len; uint16_t report_reference_value_len;
const uint8_t * report_reference_value = gatt_server_get_const_value_for_handle(report_reference_handle, &report_reference_value_len); const uint8_t * report_reference_value = gatt_server_get_const_value_for_handle(report_reference_handle, &report_reference_value_len);
if (report_reference_value == NULL){ if (report_reference_value == NULL){
break; break;
} }
if (report_reference_value_len != 2){ if (report_reference_value_len != 2){
break; break;
} }
uint8_t report_id = report_reference_value[0];
hid_report_type_t report_type = (hid_report_type_t) report_reference_value[1];
// store report info
hids_device_report_t * report = &report_storage[assigned_reports_num]; hids_device_report_t * report = &report_storage[assigned_reports_num];
report->value_handle = chr_value_handle; report->value_handle = chr_value_handle;
report->client_configuration_handle = chr_client_configuration_handle; report->client_configuration_handle = chr_client_configuration_handle;
report->client_configuration_value = 0; report->client_configuration_value = 0;
report->id = report_id;
report->id = report_reference_value[0]; report->type = report_type;
report->type = (hid_report_type_t)report_reference_value[1];
switch (report->type){ switch (report->type){
case HID_REPORT_TYPE_INPUT: case HID_REPORT_TYPE_INPUT:
@ -394,10 +404,12 @@ void hids_device_init_with_storage(uint8_t hid_country_code, const uint8_t * hid
return; return;
} }
log_info("hid_report_value_handle 0x%02x, id %u, type %u", report->value_handle, report->id, (uint8_t)report->type); log_info("hid_report_value_handle 0x%02x, id %u, type %u", report->value_handle, report->id, (uint8_t)report->type);
if (report->client_configuration_handle != 0){
log_info("hid_report_client_configuration_handle 0x%02x", report->client_configuration_handle); log_info("hid_report_client_configuration_handle 0x%02x", report->client_configuration_handle);
}
assigned_reports_num++; assigned_reports_num++;
start_chr_handle = chr_client_configuration_handle + 1; start_chr_handle = report_reference_handle + 1;
} }
// register service with ATT Server // register service with ATT Server