@@ -47,6 +47,7 @@ const char * _spp_server_name = "ESP32SPP";
47
47
static uint32_t _spp_client = 0 ;
48
48
static xQueueHandle _spp_rx_queue = NULL ;
49
49
static xQueueHandle _spp_tx_queue = NULL ;
50
+ static SemaphoreHandle_t _spp_tx_done = NULL ;
50
51
static TaskHandle_t _spp_task_handle = NULL ;
51
52
static EventGroupHandle_t _spp_event_group = NULL ;
52
53
@@ -99,6 +100,11 @@ static bool _spp_send_buffer(){
99
100
log_e (" SPP Write Failed! [0x%X]" , err);
100
101
return false ;
101
102
}
103
+ _spp_tx_buffer_len = 0 ;
104
+ if (xSemaphoreTake (_spp_tx_done, portMAX_DELAY) != pdTRUE){
105
+ log_e (" SPP Ack Failed!" );
106
+ return false ;
107
+ }
102
108
return true ;
103
109
}
104
110
return false ;
@@ -118,8 +124,6 @@ static void _spp_tx_task(void * arg){
118
124
packet = NULL ;
119
125
if (SPP_TX_MAX == _spp_tx_buffer_len || uxQueueMessagesWaiting (_spp_tx_queue) == 0 ){
120
126
_spp_send_buffer ();
121
- _spp_tx_buffer_len = 0 ;
122
- delay (2 );
123
127
}
124
128
} else {
125
129
len = packet->len ;
@@ -130,16 +134,12 @@ static void _spp_tx_task(void * arg){
130
134
data += to_send;
131
135
len -= to_send;
132
136
_spp_send_buffer ();
133
- _spp_tx_buffer_len = 0 ;
134
- delay (2 );
135
137
while (len >= SPP_TX_MAX){
136
138
memcpy (_spp_tx_buffer, data, SPP_TX_MAX);
137
139
_spp_tx_buffer_len = SPP_TX_MAX;
138
140
data += SPP_TX_MAX;
139
141
len -= SPP_TX_MAX;
140
142
_spp_send_buffer ();
141
- _spp_tx_buffer_len = 0 ;
142
- delay (2 );
143
143
}
144
144
if (len){
145
145
memcpy (_spp_tx_buffer, data, len);
@@ -149,8 +149,6 @@ static void _spp_tx_task(void * arg){
149
149
packet = NULL ;
150
150
if (uxQueueMessagesWaiting (_spp_tx_queue) == 0 ){
151
151
_spp_send_buffer ();
152
- _spp_tx_buffer_len = 0 ;
153
- delay (2 );
154
152
}
155
153
}
156
154
}
@@ -199,6 +197,7 @@ static void esp_spp_cb(esp_spp_cb_event_t event, esp_spp_cb_param_t *param)
199
197
if (param->write .cong ){
200
198
xEventGroupClearBits (_spp_event_group, SPP_CONGESTED);
201
199
}
200
+ xSemaphoreGive (_spp_tx_done);// we can try to send another packet
202
201
log_v (" ESP_SPP_WRITE_EVT: %u %s" , param->write .len , param->write .cong ?" CONGESTED" :" FREE" );
203
202
break ;
204
203
@@ -244,8 +243,6 @@ static bool _init_bt(const char *deviceName)
244
243
}
245
244
xEventGroupClearBits (_spp_event_group, 0xFFFFFF );
246
245
xEventGroupSetBits (_spp_event_group, SPP_CONGESTED);
247
- // ((xEventGroupGetBits(_spp_event_group) & SPP_CONGESTED) == SPP_CONGESTED);
248
- // ((xEventGroupWaitBits(_spp_event_group, SPP_CONGESTED, pdFALSE, pdTRUE, portMAX_DELAY) & SPP_CONGESTED) == SPP_CONGESTED);
249
246
}
250
247
if (_spp_rx_queue == NULL ){
251
248
_spp_rx_queue = xQueueCreate (RX_QUEUE_SIZE, sizeof (uint8_t )); // initialize the queue
@@ -261,6 +258,15 @@ static bool _init_bt(const char *deviceName)
261
258
return false ;
262
259
}
263
260
}
261
+ if (_spp_tx_done == NULL ){
262
+ _spp_tx_done = xSemaphoreCreateBinary ();
263
+ if (_spp_tx_done == NULL ){
264
+ log_e (" TX Semaphore Create Failed" );
265
+ return false ;
266
+ }
267
+ xSemaphoreTake (_spp_tx_done, 0 );
268
+ }
269
+
264
270
if (!_spp_task_handle){
265
271
xTaskCreate (_spp_tx_task, " spp_tx" , 4096 , NULL , 2 , &_spp_task_handle);
266
272
if (!_spp_task_handle){
@@ -324,15 +330,27 @@ static bool _stop_bt()
324
330
esp_bluedroid_deinit ();
325
331
btStop ();
326
332
}
327
- vTaskDelete (_spp_task_handle);
328
- vEventGroupDelete (_spp_event_group);
329
- vQueueDelete (_spp_rx_queue);
330
- vQueueDelete (_spp_tx_queue);// todo: free all queued packets
331
333
_spp_client = 0 ;
332
- _spp_rx_queue = NULL ;
333
- _spp_tx_queue = NULL ;
334
- _spp_task_handle = NULL ;
335
- _spp_event_group = NULL ;
334
+ if (_spp_task_handle){
335
+ vTaskDelete (_spp_task_handle);
336
+ _spp_task_handle = NULL ;
337
+ }
338
+ if (_spp_event_group){
339
+ vEventGroupDelete (_spp_event_group);
340
+ _spp_event_group = NULL ;
341
+ }
342
+ if (_spp_rx_queue){
343
+ vQueueDelete (_spp_rx_queue);
344
+ _spp_rx_queue = NULL ;
345
+ }
346
+ if (_spp_tx_queue){
347
+ vQueueDelete (_spp_tx_queue);// todo: free all queued packets
348
+ _spp_tx_queue = NULL ;
349
+ }
350
+ if (_spp_tx_done) {
351
+ vSemaphoreDelete (_spp_tx_done);
352
+ _spp_tx_done = NULL ;
353
+ }
336
354
return true ;
337
355
}
338
356
0 commit comments