mirror of
https://github.com/DarkFlippers/unleashed-firmware
synced 2024-11-23 04:53:08 +00:00
BLE: Increase mtu (#837)
* Incease mtu & buffer size * bt: process mtu size in RPC callbacks Co-authored-by: Tony Freeman <tonyfreeman@users.noreply.github.com> Co-authored-by: gornekich <n.gorbadey@gmail.com>
This commit is contained in:
parent
f0aed7e583
commit
c6cb6ae810
7 changed files with 52 additions and 23 deletions
|
@ -132,9 +132,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_SERIAL_PACKET_SIZE_MAX) {
|
if(bytes_remain > bt->max_packet_size) {
|
||||||
furi_hal_bt_serial_tx(&bytes[bytes_sent], FURI_HAL_BT_SERIAL_PACKET_SIZE_MAX);
|
furi_hal_bt_serial_tx(&bytes[bytes_sent], bt->max_packet_size);
|
||||||
bytes_sent += FURI_HAL_BT_SERIAL_PACKET_SIZE_MAX;
|
bytes_sent += bt->max_packet_size;
|
||||||
} else {
|
} else {
|
||||||
furi_hal_bt_serial_tx(&bytes[bytes_sent], bytes_remain);
|
furi_hal_bt_serial_tx(&bytes[bytes_sent], bytes_remain);
|
||||||
bytes_sent += bytes_remain;
|
bytes_sent += bytes_remain;
|
||||||
|
|
|
@ -139,7 +139,7 @@
|
||||||
/**
|
/**
|
||||||
* Maximum supported ATT_MTU size
|
* Maximum supported ATT_MTU size
|
||||||
*/
|
*/
|
||||||
#define CFG_BLE_MAX_ATT_MTU (251)
|
#define CFG_BLE_MAX_ATT_MTU (489)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Size of the storage area for Attribute values
|
* Size of the storage area for Attribute values
|
||||||
|
|
|
@ -184,17 +184,31 @@ bool serial_svc_is_started() {
|
||||||
return serial_svc != NULL;
|
return serial_svc != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool serial_svc_update_tx(uint8_t* data, uint8_t data_len) {
|
bool serial_svc_update_tx(uint8_t* data, uint16_t data_len) {
|
||||||
if(data_len > SERIAL_SVC_DATA_LEN_MAX) {
|
if(data_len > SERIAL_SVC_DATA_LEN_MAX) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
tBleStatus result = aci_gatt_update_char_value(serial_svc->svc_handle,
|
|
||||||
serial_svc->tx_char_handle,
|
for(uint16_t remained = data_len; remained > 0;) {
|
||||||
|
uint8_t value_len = MIN(SERIAL_SVC_CHAR_VALUE_LEN_MAX, remained);
|
||||||
|
uint16_t value_offset = data_len - remained;
|
||||||
|
remained -= value_len;
|
||||||
|
|
||||||
|
tBleStatus result = aci_gatt_update_char_value_ext(
|
||||||
0,
|
0,
|
||||||
|
serial_svc->svc_handle,
|
||||||
|
serial_svc->tx_char_handle,
|
||||||
|
remained ? 0x00 : 0x02,
|
||||||
data_len,
|
data_len,
|
||||||
data);
|
value_offset,
|
||||||
if(result) {
|
value_len,
|
||||||
FURI_LOG_E(TAG, "Failed updating TX characteristic: %d", result);
|
data + value_offset);
|
||||||
|
|
||||||
|
if(result) {
|
||||||
|
FURI_LOG_E(TAG, "Failed updating TX characteristic: %d", result);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return result != BLE_STATUS_SUCCESS;
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
#define SERIAL_SVC_DATA_LEN_MAX (248)
|
#define SERIAL_SVC_DATA_LEN_MAX (486)
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -36,7 +36,7 @@ void serial_svc_stop();
|
||||||
|
|
||||||
bool serial_svc_is_started();
|
bool serial_svc_is_started();
|
||||||
|
|
||||||
bool serial_svc_update_tx(uint8_t* data, uint8_t data_len);
|
bool serial_svc_update_tx(uint8_t* data, uint16_t data_len);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -139,7 +139,7 @@
|
||||||
/**
|
/**
|
||||||
* Maximum supported ATT_MTU size
|
* Maximum supported ATT_MTU size
|
||||||
*/
|
*/
|
||||||
#define CFG_BLE_MAX_ATT_MTU (251)
|
#define CFG_BLE_MAX_ATT_MTU (489)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Size of the storage area for Attribute values
|
* Size of the storage area for Attribute values
|
||||||
|
|
|
@ -184,17 +184,31 @@ bool serial_svc_is_started() {
|
||||||
return serial_svc != NULL;
|
return serial_svc != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool serial_svc_update_tx(uint8_t* data, uint8_t data_len) {
|
bool serial_svc_update_tx(uint8_t* data, uint16_t data_len) {
|
||||||
if(data_len > SERIAL_SVC_DATA_LEN_MAX) {
|
if(data_len > SERIAL_SVC_DATA_LEN_MAX) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
tBleStatus result = aci_gatt_update_char_value(serial_svc->svc_handle,
|
|
||||||
serial_svc->tx_char_handle,
|
for(uint16_t remained = data_len; remained > 0;) {
|
||||||
|
uint8_t value_len = MIN(SERIAL_SVC_CHAR_VALUE_LEN_MAX, remained);
|
||||||
|
uint16_t value_offset = data_len - remained;
|
||||||
|
remained -= value_len;
|
||||||
|
|
||||||
|
tBleStatus result = aci_gatt_update_char_value_ext(
|
||||||
0,
|
0,
|
||||||
|
serial_svc->svc_handle,
|
||||||
|
serial_svc->tx_char_handle,
|
||||||
|
remained ? 0x00 : 0x02,
|
||||||
data_len,
|
data_len,
|
||||||
data);
|
value_offset,
|
||||||
if(result) {
|
value_len,
|
||||||
FURI_LOG_E(TAG, "Failed updating TX characteristic: %d", result);
|
data + value_offset);
|
||||||
|
|
||||||
|
if(result) {
|
||||||
|
FURI_LOG_E(TAG, "Failed updating TX characteristic: %d", result);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return result != BLE_STATUS_SUCCESS;
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,8 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
#define SERIAL_SVC_DATA_LEN_MAX (248)
|
#define SERIAL_SVC_DATA_LEN_MAX (486)
|
||||||
|
#define SERIAL_SVC_CHAR_VALUE_LEN_MAX (243)
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -36,7 +37,7 @@ void serial_svc_stop();
|
||||||
|
|
||||||
bool serial_svc_is_started();
|
bool serial_svc_is_started();
|
||||||
|
|
||||||
bool serial_svc_update_tx(uint8_t* data, uint8_t data_len);
|
bool serial_svc_update_tx(uint8_t* data, uint16_t data_len);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue