Skip to content

Commit 7dd5b05

Browse files
committed
Use single buffer and empty queue on exit
1 parent a92bbec commit 7dd5b05

File tree

1 file changed

+10
-15
lines changed

1 file changed

+10
-15
lines changed

libraries/BluetoothSerial/src/BluetoothSerial.cpp

+10-15
Original file line numberDiff line numberDiff line change
@@ -57,32 +57,23 @@ static EventGroupHandle_t _spp_event_group = NULL;
5757

5858
typedef struct {
5959
size_t len;
60-
uint8_t * data;
60+
uint8_t data[];
6161
} spp_packet_t;
6262

6363
static esp_err_t _spp_queue_packet(uint8_t *data, size_t len){
6464
if(!data || !len){
6565
log_w("No data provided");
6666
return ESP_FAIL;
6767
}
68-
spp_packet_t * packet = (spp_packet_t*)malloc(sizeof(spp_packet_t));
68+
spp_packet_t * packet = (spp_packet_t*)malloc(sizeof(spp_packet_t) + len);
6969
if(!packet){
7070
log_w("SPP TX Packet Malloc Failed!");
7171
return ESP_FAIL;
7272
}
7373
packet->len = len;
74-
packet->data = NULL;
75-
uint8_t * pdata = (uint8_t*)malloc(len);
76-
if(!pdata){
77-
log_w("SPP TX Packet Data Malloc Failed!");
78-
free(packet);
79-
return ESP_FAIL;
80-
}
81-
memcpy(pdata, data, len);
82-
packet->data = pdata;
74+
memcpy(packet->data, data, len);
8375
if (xQueueSend(_spp_tx_queue, &packet, portMAX_DELAY) != pdPASS) {
8476
log_w("SPP TX Queue Send Failed!");
85-
free(packet->data);
8677
free(packet);
8778
return ESP_FAIL;
8879
}
@@ -119,7 +110,6 @@ static void _spp_tx_task(void * arg){
119110
if(packet->len <= (SPP_TX_MAX - _spp_tx_buffer_len)){
120111
memcpy(_spp_tx_buffer+_spp_tx_buffer_len, packet->data, packet->len);
121112
_spp_tx_buffer_len+=packet->len;
122-
free(packet->data);
123113
free(packet);
124114
packet = NULL;
125115
if(SPP_TX_MAX == _spp_tx_buffer_len || uxQueueMessagesWaiting(_spp_tx_queue) == 0){
@@ -144,7 +134,6 @@ static void _spp_tx_task(void * arg){
144134
if(len){
145135
memcpy(_spp_tx_buffer, data, len);
146136
_spp_tx_buffer_len += len;
147-
free(packet->data);
148137
free(packet);
149138
packet = NULL;
150139
if(uxQueueMessagesWaiting(_spp_tx_queue) == 0){
@@ -204,6 +193,7 @@ static void esp_spp_cb(esp_spp_cb_event_t event, esp_spp_cb_param_t *param)
204193
case ESP_SPP_DATA_IND_EVT://connection received data
205194
log_v("ESP_SPP_DATA_IND_EVT len=%d handle=%d", param->data_ind.len, param->data_ind.handle);
206195
//esp_log_buffer_hex("",param->data_ind.data,param->data_ind.len); //for low level debug
196+
//ets_printf("r:%u\n", param->data_ind.len);
207197

208198
if (_spp_rx_queue != NULL){
209199
for (int i = 0; i < param->data_ind.len; i++){
@@ -341,10 +331,15 @@ static bool _stop_bt()
341331
}
342332
if(_spp_rx_queue){
343333
vQueueDelete(_spp_rx_queue);
334+
//ToDo: clear RX queue when in packet mode
344335
_spp_rx_queue = NULL;
345336
}
346337
if(_spp_tx_queue){
347-
vQueueDelete(_spp_tx_queue);//todo: free all queued packets
338+
spp_packet_t *packet = NULL;
339+
while(xQueueReceive(_spp_tx_queue, &packet, 0) == pdTRUE){
340+
free(packet);
341+
}
342+
vQueueDelete(_spp_tx_queue);
348343
_spp_tx_queue = NULL;
349344
}
350345
if (_spp_tx_done) {

0 commit comments

Comments
 (0)