[FL-2053] BLE MTU processing #830
Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
		
							parent
							
								
									013ed64cbb
								
							
						
					
					
						commit
						a5052a0375
					
				| @ -55,6 +55,8 @@ static void bt_battery_level_changed_callback(const void* _event, void* context) | |||||||
| 
 | 
 | ||||||
| Bt* bt_alloc() { | Bt* bt_alloc() { | ||||||
|     Bt* bt = furi_alloc(sizeof(Bt)); |     Bt* bt = furi_alloc(sizeof(Bt)); | ||||||
|  |     // Init default maximum packet size
 | ||||||
|  |     bt->max_packet_size = FURI_HAL_BT_PACKET_SIZE_MAX; | ||||||
|     // Load settings
 |     // Load settings
 | ||||||
|     if(!bt_settings_load(&bt->bt_settings)) { |     if(!bt_settings_load(&bt->bt_settings)) { | ||||||
|         bt_settings_save(&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; |     size_t bytes_sent = 0; | ||||||
|     while(bytes_sent < bytes_len) { |     while(bytes_sent < bytes_len) { | ||||||
|         size_t bytes_remain = bytes_len - bytes_sent; |         size_t bytes_remain = bytes_len - bytes_sent; | ||||||
|         if(bytes_remain > FURI_HAL_BT_PACKET_SIZE_MAX) { |         if(bytes_remain > bt->max_packet_size) { | ||||||
|             furi_hal_bt_tx(&bytes[bytes_sent], FURI_HAL_BT_PACKET_SIZE_MAX); |             furi_hal_bt_tx(&bytes[bytes_sent], bt->max_packet_size); | ||||||
|             bytes_sent += FURI_HAL_BT_PACKET_SIZE_MAX; |             bytes_sent += bt->max_packet_size; | ||||||
|         } else { |         } else { | ||||||
|             furi_hal_bt_tx(&bytes[bytes_sent], bytes_remain); |             furi_hal_bt_tx(&bytes[bytes_sent], bytes_remain); | ||||||
|             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 = { |         BtMessage message = { | ||||||
|             .type = BtMessageTypePinCodeShow, .data.pin_code = event.data.pin_code}; |             .type = BtMessageTypePinCodeShow, .data.pin_code = event.data.pin_code}; | ||||||
|         furi_check(osMessageQueuePut(bt->message_queue, &message, 0, osWaitForever) == osOK); |         furi_check(osMessageQueuePut(bt->message_queue, &message, 0, osWaitForever) == osOK); | ||||||
|  |     } else if(event.type == BleEventTypeUpdateMTU) { | ||||||
|  |         bt->max_packet_size = event.data.max_packet_size; | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -41,6 +41,7 @@ typedef struct { | |||||||
| struct Bt { | struct Bt { | ||||||
|     uint8_t* bt_keys_addr_start; |     uint8_t* bt_keys_addr_start; | ||||||
|     uint16_t bt_keys_size; |     uint16_t bt_keys_size; | ||||||
|  |     uint16_t max_packet_size; | ||||||
|     BtSettings bt_settings; |     BtSettings bt_settings; | ||||||
|     BtStatus status; |     BtStatus status; | ||||||
|     osMessageQueueId_t message_queue; |     osMessageQueueId_t message_queue; | ||||||
|  | |||||||
| @ -155,6 +155,16 @@ SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt ) | |||||||
|             } |             } | ||||||
|                 break; |                 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: |             case EVT_BLUE_GAP_AUTHORIZATION_REQUEST: | ||||||
|                 FURI_LOG_I(TAG, "Authorization request event"); |                 FURI_LOG_I(TAG, "Authorization request event"); | ||||||
|                 break; |                 break; | ||||||
|  | |||||||
| @ -13,10 +13,12 @@ typedef enum { | |||||||
|     BleEventTypeStartAdvertising, |     BleEventTypeStartAdvertising, | ||||||
|     BleEventTypeStopAdvertising, |     BleEventTypeStopAdvertising, | ||||||
|     BleEventTypePinCodeShow, |     BleEventTypePinCodeShow, | ||||||
|  |     BleEventTypeUpdateMTU, | ||||||
| } BleEventType; | } BleEventType; | ||||||
| 
 | 
 | ||||||
| typedef union { | typedef union { | ||||||
|     uint32_t pin_code; |     uint32_t pin_code; | ||||||
|  |     uint16_t max_packet_size; | ||||||
| } BleEventData; | } BleEventData; | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ | |||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
| #include <stdbool.h> | #include <stdbool.h> | ||||||
| 
 | 
 | ||||||
| #define SERIAL_SVC_DATA_LEN_MAX (245) | #define SERIAL_SVC_DATA_LEN_MAX (248) | ||||||
| 
 | 
 | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| extern "C" { | extern "C" { | ||||||
|  | |||||||
| @ -155,6 +155,16 @@ SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt ) | |||||||
|             } |             } | ||||||
|                 break; |                 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: |             case EVT_BLUE_GAP_AUTHORIZATION_REQUEST: | ||||||
|                 FURI_LOG_I(TAG, "Authorization request event"); |                 FURI_LOG_I(TAG, "Authorization request event"); | ||||||
|                 break; |                 break; | ||||||
|  | |||||||
| @ -13,10 +13,12 @@ typedef enum { | |||||||
|     BleEventTypeStartAdvertising, |     BleEventTypeStartAdvertising, | ||||||
|     BleEventTypeStopAdvertising, |     BleEventTypeStopAdvertising, | ||||||
|     BleEventTypePinCodeShow, |     BleEventTypePinCodeShow, | ||||||
|  |     BleEventTypeUpdateMTU, | ||||||
| } BleEventType; | } BleEventType; | ||||||
| 
 | 
 | ||||||
| typedef union { | typedef union { | ||||||
|     uint32_t pin_code; |     uint32_t pin_code; | ||||||
|  |     uint16_t max_packet_size; | ||||||
| } BleEventData; | } BleEventData; | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ | |||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
| #include <stdbool.h> | #include <stdbool.h> | ||||||
| 
 | 
 | ||||||
| #define SERIAL_SVC_DATA_LEN_MAX (245) | #define SERIAL_SVC_DATA_LEN_MAX (248) | ||||||
| 
 | 
 | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| extern "C" { | extern "C" { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 gornekich
						gornekich