Przeglądaj źródła

[FL-2053] BLE MTU processing #830

Co-authored-by: あく <alleteam@gmail.com>
gornekich 4 lat temu
rodzic
commit
a5052a0375

+ 7 - 3
applications/bt/bt_service/bt.c

@@ -55,6 +55,8 @@ static void bt_battery_level_changed_callback(const void* _event, void* context)
 
 Bt* bt_alloc() {
     Bt* bt = furi_alloc(sizeof(Bt));
+    // Init default maximum packet size
+    bt->max_packet_size = FURI_HAL_BT_PACKET_SIZE_MAX;
     // Load settings
     if(!bt_settings_load(&bt->bt_settings)) {
         bt_settings_save(&bt->bt_settings);
@@ -113,9 +115,9 @@ static void bt_rpc_send_bytes_callback(void* context, uint8_t* bytes, size_t byt
     size_t bytes_sent = 0;
     while(bytes_sent < bytes_len) {
         size_t bytes_remain = bytes_len - bytes_sent;
-        if(bytes_remain > FURI_HAL_BT_PACKET_SIZE_MAX) {
-            furi_hal_bt_tx(&bytes[bytes_sent], FURI_HAL_BT_PACKET_SIZE_MAX);
-            bytes_sent += FURI_HAL_BT_PACKET_SIZE_MAX;
+        if(bytes_remain > bt->max_packet_size) {
+            furi_hal_bt_tx(&bytes[bytes_sent], bt->max_packet_size);
+            bytes_sent += bt->max_packet_size;
         } else {
             furi_hal_bt_tx(&bytes[bytes_sent], bytes_remain);
             bytes_sent += bytes_remain;
@@ -177,6 +179,8 @@ static void bt_on_gap_event_callback(BleEvent event, void* context) {
         BtMessage message = {
             .type = BtMessageTypePinCodeShow, .data.pin_code = event.data.pin_code};
         furi_check(osMessageQueuePut(bt->message_queue, &message, 0, osWaitForever) == osOK);
+    } else if(event.type == BleEventTypeUpdateMTU) {
+        bt->max_packet_size = event.data.max_packet_size;
     }
 }
 

+ 1 - 0
applications/bt/bt_service/bt_i.h

@@ -41,6 +41,7 @@ typedef struct {
 struct Bt {
     uint8_t* bt_keys_addr_start;
     uint16_t bt_keys_size;
+    uint16_t max_packet_size;
     BtSettings bt_settings;
     BtStatus status;
     osMessageQueueId_t message_queue;

+ 10 - 0
firmware/targets/f6/ble-glue/gap.c

@@ -155,6 +155,16 @@ SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
             }
                 break;
 
+            case EVT_BLUE_ATT_EXCHANGE_MTU_RESP:
+            {
+                aci_att_exchange_mtu_resp_event_rp0 *pr = (void*)blue_evt->data;
+                FURI_LOG_I(TAG, "Rx MTU size: %d", pr->Server_RX_MTU);
+                // Set maximum packet size given header size is 3 bytes
+                BleEvent event = {.type = BleEventTypeUpdateMTU, .data.max_packet_size = pr->Server_RX_MTU - 3};
+                gap->on_event_cb(event, gap->context);
+            }
+                break;
+
             case EVT_BLUE_GAP_AUTHORIZATION_REQUEST:
                 FURI_LOG_I(TAG, "Authorization request event");
                 break;

+ 2 - 0
firmware/targets/f6/ble-glue/gap.h

@@ -13,10 +13,12 @@ typedef enum {
     BleEventTypeStartAdvertising,
     BleEventTypeStopAdvertising,
     BleEventTypePinCodeShow,
+    BleEventTypeUpdateMTU,
 } BleEventType;
 
 typedef union {
     uint32_t pin_code;
+    uint16_t max_packet_size;
 } BleEventData;
 
 typedef struct {

+ 1 - 1
firmware/targets/f6/ble-glue/serial_service.h

@@ -3,7 +3,7 @@
 #include <stdint.h>
 #include <stdbool.h>
 
-#define SERIAL_SVC_DATA_LEN_MAX (245)
+#define SERIAL_SVC_DATA_LEN_MAX (248)
 
 #ifdef __cplusplus
 extern "C" {

+ 10 - 0
firmware/targets/f7/ble-glue/gap.c

@@ -155,6 +155,16 @@ SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
             }
                 break;
 
+            case EVT_BLUE_ATT_EXCHANGE_MTU_RESP:
+            {
+                aci_att_exchange_mtu_resp_event_rp0 *pr = (void*)blue_evt->data;
+                FURI_LOG_I(TAG, "Rx MTU size: %d", pr->Server_RX_MTU);
+                // Set maximum packet size given header size is 3 bytes
+                BleEvent event = {.type = BleEventTypeUpdateMTU, .data.max_packet_size = pr->Server_RX_MTU - 3};
+                gap->on_event_cb(event, gap->context);
+            }
+                break;
+
             case EVT_BLUE_GAP_AUTHORIZATION_REQUEST:
                 FURI_LOG_I(TAG, "Authorization request event");
                 break;

+ 2 - 0
firmware/targets/f7/ble-glue/gap.h

@@ -13,10 +13,12 @@ typedef enum {
     BleEventTypeStartAdvertising,
     BleEventTypeStopAdvertising,
     BleEventTypePinCodeShow,
+    BleEventTypeUpdateMTU,
 } BleEventType;
 
 typedef union {
     uint32_t pin_code;
+    uint16_t max_packet_size;
 } BleEventData;
 
 typedef struct {

+ 1 - 1
firmware/targets/f7/ble-glue/serial_service.h

@@ -3,7 +3,7 @@
 #include <stdint.h>
 #include <stdbool.h>
 
-#define SERIAL_SVC_DATA_LEN_MAX (245)
+#define SERIAL_SVC_DATA_LEN_MAX (248)
 
 #ifdef __cplusplus
 extern "C" {