[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 = 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; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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 { | ||||
|  | ||||
| @ -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" { | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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 { | ||||
|  | ||||
| @ -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" { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 gornekich
						gornekich