@@ -57,32 +57,23 @@ static EventGroupHandle_t _spp_event_group = NULL;
57
57
58
58
typedef struct {
59
59
size_t len;
60
- uint8_t * data;
60
+ uint8_t data[] ;
61
61
} spp_packet_t ;
62
62
63
63
static esp_err_t _spp_queue_packet (uint8_t *data, size_t len){
64
64
if (!data || !len){
65
65
log_w (" No data provided" );
66
66
return ESP_FAIL;
67
67
}
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 );
69
69
if (!packet){
70
70
log_w (" SPP TX Packet Malloc Failed!" );
71
71
return ESP_FAIL;
72
72
}
73
73
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);
83
75
if (xQueueSend (_spp_tx_queue, &packet, portMAX_DELAY) != pdPASS) {
84
76
log_w (" SPP TX Queue Send Failed!" );
85
- free (packet->data );
86
77
free (packet);
87
78
return ESP_FAIL;
88
79
}
@@ -119,7 +110,6 @@ static void _spp_tx_task(void * arg){
119
110
if (packet->len <= (SPP_TX_MAX - _spp_tx_buffer_len)){
120
111
memcpy (_spp_tx_buffer+_spp_tx_buffer_len, packet->data , packet->len );
121
112
_spp_tx_buffer_len+=packet->len ;
122
- free (packet->data );
123
113
free (packet);
124
114
packet = NULL ;
125
115
if (SPP_TX_MAX == _spp_tx_buffer_len || uxQueueMessagesWaiting (_spp_tx_queue) == 0 ){
@@ -144,7 +134,6 @@ static void _spp_tx_task(void * arg){
144
134
if (len){
145
135
memcpy (_spp_tx_buffer, data, len);
146
136
_spp_tx_buffer_len += len;
147
- free (packet->data );
148
137
free (packet);
149
138
packet = NULL ;
150
139
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)
204
193
case ESP_SPP_DATA_IND_EVT:// connection received data
205
194
log_v (" ESP_SPP_DATA_IND_EVT len=%d handle=%d" , param->data_ind .len , param->data_ind .handle );
206
195
// 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);
207
197
208
198
if (_spp_rx_queue != NULL ){
209
199
for (int i = 0 ; i < param->data_ind .len ; i++){
@@ -341,10 +331,15 @@ static bool _stop_bt()
341
331
}
342
332
if (_spp_rx_queue){
343
333
vQueueDelete (_spp_rx_queue);
334
+ // ToDo: clear RX queue when in packet mode
344
335
_spp_rx_queue = NULL ;
345
336
}
346
337
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);
348
343
_spp_tx_queue = NULL ;
349
344
}
350
345
if (_spp_tx_done) {
0 commit comments