Skip to content

Commit

Permalink
[FL-3920] Fix lost BadBLE keystrokes (#3993)
Browse files Browse the repository at this point in the history
* WIP: fix lost BadBLE keystrokes
* Switch to semaphores for synchronization
* Move checking to the gap level
* Remove leftovers from hid_service
* Remove more leftovers from hid_service
* De-allocate the semaphore after use
* Change the timeout to account for unforeseen situation
* Update F18 API
* Fix naming and unbump api version
* Move away from semaphores
* Remove the left over include
* Ble: cleanup error handling in ble_gatt_characteristic_update
* Fix PVS warning

Co-authored-by: Aleksandr Kutuzov <[email protected]>
  • Loading branch information
Astrrra and skotopes authored Dec 23, 2024
1 parent 8dd5e64 commit a02781b
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 14 deletions.
14 changes: 8 additions & 6 deletions lib/ble_profile/extra_services/hid_service.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@
#define TAG "BleHid"

#define BLE_SVC_HID_REPORT_MAP_MAX_LEN (255)
#define BLE_SVC_HID_REPORT_MAX_LEN (255)
#define BLE_SVC_HID_REPORT_REF_LEN (2)
#define BLE_SVC_HID_INFO_LEN (4)
#define BLE_SVC_HID_CONTROL_POINT_LEN (1)
#define BLE_SVC_HID_REPORT_MAX_LEN (255)
#define BLE_SVC_HID_REPORT_REF_LEN (2)
#define BLE_SVC_HID_INFO_LEN (4)
#define BLE_SVC_HID_CONTROL_POINT_LEN (1)

#define BLE_SVC_HID_INPUT_REPORT_COUNT (3)
#define BLE_SVC_HID_OUTPUT_REPORT_COUNT (0)
#define BLE_SVC_HID_INPUT_REPORT_COUNT (3)
#define BLE_SVC_HID_OUTPUT_REPORT_COUNT (0)
#define BLE_SVC_HID_FEATURE_REPORT_COUNT (0)
#define BLE_SVC_HID_REPORT_COUNT \
(BLE_SVC_HID_INPUT_REPORT_COUNT + BLE_SVC_HID_OUTPUT_REPORT_COUNT + \
Expand Down Expand Up @@ -157,6 +157,7 @@ static BleEventAckStatus ble_svc_hid_event_handler(void* event, void* context) {
hci_event_pckt* event_pckt = (hci_event_pckt*)(((hci_uart_pckt*)event)->data);
evt_blecore_aci* blecore_evt = (evt_blecore_aci*)event_pckt->data;
// aci_gatt_attribute_modified_event_rp0* attribute_modified;

if(event_pckt->evt == HCI_VENDOR_SPECIFIC_DEBUG_EVT_CODE) {
if(blecore_evt->ecode == ACI_GATT_ATTRIBUTE_MODIFIED_VSEVT_CODE) {
// Process modification events
Expand Down Expand Up @@ -274,6 +275,7 @@ bool ble_svc_hid_update_input_report(
.data_ptr = data,
.data_len = len,
};

return ble_gatt_characteristic_update(
hid_svc->svc_handle, &hid_svc->input_report_chars[input_report_num], &report_data);
}
Expand Down
4 changes: 2 additions & 2 deletions lib/nfc/protocols/mf_plus/mf_plus_poller.c
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ static void mf_plus_poller_set_callback(

static NfcCommand mf_plus_poller_run(NfcGenericEvent event, void* context) {
furi_assert(context);
furi_assert(event.protocol = NfcProtocolIso14443_4a);
furi_assert(event.protocol == NfcProtocolIso14443_4a);
furi_assert(event.event_data);

MfPlusPoller* instance = context;
Expand Down Expand Up @@ -178,7 +178,7 @@ void mf_plus_poller_free(MfPlusPoller* instance) {

static bool mf_plus_poller_detect(NfcGenericEvent event, void* context) {
furi_assert(context);
furi_assert(event.protocol = NfcProtocolIso14443_4a);
furi_assert(event.protocol == NfcProtocolIso14443_4a);
furi_assert(event.event_data);

MfPlusPoller* instance = context;
Expand Down
2 changes: 1 addition & 1 deletion lib/subghz/protocols/bin_raw.c
Original file line number Diff line number Diff line change
Expand Up @@ -314,8 +314,8 @@ SubGhzProtocolStatus
flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);

if(!subghz_protocol_encoder_bin_raw_get_upload(instance)) {
break;
res = SubGhzProtocolStatusErrorEncoderGetUpload;
break;
}
instance->encoder.is_running = true;

Expand Down
34 changes: 29 additions & 5 deletions targets/f7/ble_glue/furi_ble/gatt.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@

#define GATT_MIN_READ_KEY_SIZE (10)

#ifdef BLE_GATT_STRICT
#define ble_gatt_strict_crash(message) furi_crash(message)
#else
#define ble_gatt_strict_crash(message)
#endif

void ble_gatt_characteristic_init(
uint16_t svc_handle,
const BleGattCharacteristicParams* char_descriptor,
Expand Down Expand Up @@ -42,6 +48,7 @@ void ble_gatt_characteristic_init(
&char_instance->handle);
if(status) {
FURI_LOG_E(TAG, "Failed to add %s char: %d", char_descriptor->name, status);
ble_gatt_strict_crash("Failed to add characteristic");
}

char_instance->descriptor_handle = 0;
Expand All @@ -68,6 +75,7 @@ void ble_gatt_characteristic_init(
&char_instance->descriptor_handle);
if(status) {
FURI_LOG_E(TAG, "Failed to add %s char descriptor: %d", char_descriptor->name, status);
ble_gatt_strict_crash("Failed to add characteristic descriptor");
}
if(release_data) {
free((void*)char_data);
Expand All @@ -82,6 +90,7 @@ void ble_gatt_characteristic_delete(
if(status) {
FURI_LOG_E(
TAG, "Failed to delete %s char: %d", char_instance->characteristic->name, status);
ble_gatt_strict_crash("Failed to delete characteristic");
}
free((void*)char_instance->characteristic);
}
Expand Down Expand Up @@ -111,14 +120,27 @@ bool ble_gatt_characteristic_update(
release_data = char_descriptor->data.callback.fn(context, &char_data, &char_data_size);
}

tBleStatus result = aci_gatt_update_char_value(
svc_handle, char_instance->handle, 0, char_data_size, char_data);
if(result) {
FURI_LOG_E(TAG, "Failed updating %s characteristic: %d", char_descriptor->name, result);
}
tBleStatus result;
size_t retries_left = 1000;
do {
retries_left--;
result = aci_gatt_update_char_value(
svc_handle, char_instance->handle, 0, char_data_size, char_data);
if(result == BLE_STATUS_INSUFFICIENT_RESOURCES) {
FURI_LOG_W(TAG, "Insufficient resources for %s characteristic", char_descriptor->name);
furi_delay_ms(1);
}
} while(result == BLE_STATUS_INSUFFICIENT_RESOURCES && retries_left);

if(release_data) {
free((void*)char_data);
}

if(result != BLE_STATUS_SUCCESS) {
FURI_LOG_E(TAG, "Failed updating %s characteristic: %d", char_descriptor->name, result);
ble_gatt_strict_crash("Failed to update characteristic");
}

return result != BLE_STATUS_SUCCESS;
}

Expand All @@ -132,6 +154,7 @@ bool ble_gatt_service_add(
Service_UUID_Type, Service_UUID, Service_Type, Max_Attribute_Records, Service_Handle);
if(result) {
FURI_LOG_E(TAG, "Failed to add service: %x", result);
ble_gatt_strict_crash("Failed to add service");
}

return result == BLE_STATUS_SUCCESS;
Expand All @@ -141,6 +164,7 @@ bool ble_gatt_service_delete(uint16_t svc_handle) {
tBleStatus result = aci_gatt_del_service(svc_handle);
if(result) {
FURI_LOG_E(TAG, "Failed to delete service: %x", result);
ble_gatt_strict_crash("Failed to delete service");
}

return result == BLE_STATUS_SUCCESS;
Expand Down

0 comments on commit a02781b

Please sign in to comment.