@@ -42,6 +42,10 @@ const char * _spp_server_name = "ESP32SPP";
42
42
43
43
#define RX_QUEUE_SIZE 512
44
44
#define TX_QUEUE_SIZE 32
45
+ #define SPP_TX_QUEUE_TIMEOUT 1000
46
+ #define SPP_TX_DONE_TIMEOUT 1000
47
+ #define SPP_CONGESTED_TIMEOUT 1000
48
+
45
49
static uint32_t _spp_client = 0 ;
46
50
static xQueueHandle _spp_rx_queue = NULL ;
47
51
static xQueueHandle _spp_tx_queue = NULL ;
@@ -143,7 +147,7 @@ static esp_err_t _spp_queue_packet(uint8_t *data, size_t len){
143
147
}
144
148
packet->len = len;
145
149
memcpy (packet->data , data, len);
146
- if (xQueueSend (_spp_tx_queue, &packet, portMAX_DELAY ) != pdPASS) {
150
+ if (!_spp_tx_queue || xQueueSend (_spp_tx_queue, &packet, SPP_TX_QUEUE_TIMEOUT ) != pdPASS) {
147
151
log_e (" SPP TX Queue Send Failed!" );
148
152
free (packet);
149
153
return ESP_FAIL;
@@ -156,19 +160,25 @@ static uint8_t _spp_tx_buffer[SPP_TX_MAX];
156
160
static uint16_t _spp_tx_buffer_len = 0 ;
157
161
158
162
static bool _spp_send_buffer (){
159
- if ((xEventGroupWaitBits (_spp_event_group, SPP_CONGESTED, pdFALSE, pdTRUE, portMAX_DELAY) & SPP_CONGESTED) != 0 ){
163
+ if ((xEventGroupWaitBits (_spp_event_group, SPP_CONGESTED, pdFALSE, pdTRUE, SPP_CONGESTED_TIMEOUT) & SPP_CONGESTED) != 0 ){
164
+ if (!_spp_client){
165
+ log_v (" SPP Client Gone!" );
166
+ return false ;
167
+ }
168
+ log_v (" SPP Write %u" , _spp_tx_buffer_len);
160
169
esp_err_t err = esp_spp_write (_spp_client, _spp_tx_buffer_len, _spp_tx_buffer);
161
170
if (err != ESP_OK){
162
171
log_e (" SPP Write Failed! [0x%X]" , err);
163
172
return false ;
164
173
}
165
174
_spp_tx_buffer_len = 0 ;
166
- if (xSemaphoreTake (_spp_tx_done, portMAX_DELAY ) != pdTRUE){
175
+ if (xSemaphoreTake (_spp_tx_done, SPP_TX_DONE_TIMEOUT ) != pdTRUE){
167
176
log_e (" SPP Ack Failed!" );
168
177
return false ;
169
178
}
170
179
return true ;
171
180
}
181
+ log_e (" SPP Write Congested!" );
172
182
return false ;
173
183
}
174
184
@@ -194,13 +204,18 @@ static void _spp_tx_task(void * arg){
194
204
_spp_tx_buffer_len = SPP_TX_MAX;
195
205
data += to_send;
196
206
len -= to_send;
197
- _spp_send_buffer ();
207
+ if (!_spp_send_buffer ()){
208
+ len = 0 ;
209
+ }
198
210
while (len >= SPP_TX_MAX){
199
211
memcpy (_spp_tx_buffer, data, SPP_TX_MAX);
200
212
_spp_tx_buffer_len = SPP_TX_MAX;
201
213
data += SPP_TX_MAX;
202
214
len -= SPP_TX_MAX;
203
- _spp_send_buffer ();
215
+ if (!_spp_send_buffer ()){
216
+ len = 0 ;
217
+ break ;
218
+ }
204
219
}
205
220
if (len){
206
221
memcpy (_spp_tx_buffer, data, len);
@@ -236,9 +251,10 @@ static void esp_spp_cb(esp_spp_cb_event_t event, esp_spp_cb_param_t *param)
236
251
237
252
case ESP_SPP_SRV_OPEN_EVT:// Server connection open
238
253
if (param->srv_open .status == ESP_SPP_SUCCESS) {
239
- log_i (" ESP_SPP_SRV_OPEN_EVT" );
254
+ log_i (" ESP_SPP_SRV_OPEN_EVT: %u " , _spp_client );
240
255
if (!_spp_client){
241
256
_spp_client = param->srv_open .handle ;
257
+ _spp_tx_buffer_len = 0 ;
242
258
} else {
243
259
secondConnectionAttempt = true ;
244
260
esp_spp_disconnect (param->srv_open .handle );
@@ -252,12 +268,13 @@ static void esp_spp_cb(esp_spp_cb_event_t event, esp_spp_cb_param_t *param)
252
268
253
269
case ESP_SPP_CLOSE_EVT:// Client connection closed
254
270
if ((param->close .async == false && param->close .status == ESP_SPP_SUCCESS) || param->close .async ) {
255
- log_i (" ESP_SPP_CLOSE_EVT" );
271
+ log_i (" ESP_SPP_CLOSE_EVT: %u " , secondConnectionAttempt );
256
272
if (secondConnectionAttempt) {
257
273
secondConnectionAttempt = false ;
258
274
} else {
259
275
_spp_client = 0 ;
260
276
xEventGroupSetBits (_spp_event_group, SPP_DISCONNECTED);
277
+ xEventGroupSetBits (_spp_event_group, SPP_CONGESTED);
261
278
}
262
279
xEventGroupClearBits (_spp_event_group, SPP_CONNECTED);
263
280
} else {
@@ -279,11 +296,11 @@ static void esp_spp_cb(esp_spp_cb_event_t event, esp_spp_cb_param_t *param)
279
296
if (param->write .cong ){
280
297
xEventGroupClearBits (_spp_event_group, SPP_CONGESTED);
281
298
}
282
- xSemaphoreGive (_spp_tx_done);// we can try to send another packet
283
299
log_v (" ESP_SPP_WRITE_EVT: %u %s" , param->write .len , param->write .cong ?" CONGESTED" :" " );
284
300
} else {
285
301
log_e (" ESP_SPP_WRITE_EVT failed!, status:%d" , param->write .status );
286
302
}
303
+ xSemaphoreGive (_spp_tx_done);// we can try to send another packet
287
304
break ;
288
305
289
306
case ESP_SPP_DATA_IND_EVT:// connection received data
@@ -323,6 +340,7 @@ static void esp_spp_cb(esp_spp_cb_event_t event, esp_spp_cb_param_t *param)
323
340
}
324
341
xEventGroupClearBits (_spp_event_group, SPP_DISCONNECTED);
325
342
xEventGroupSetBits (_spp_event_group, SPP_CONNECTED);
343
+ xEventGroupSetBits (_spp_event_group, SPP_CONGESTED);
326
344
break ;
327
345
328
346
case ESP_SPP_START_EVT:// server started
@@ -693,7 +711,7 @@ void BluetoothSerial::flush()
693
711
{
694
712
if (_spp_tx_queue != NULL ){
695
713
while (uxQueueMessagesWaiting (_spp_tx_queue) > 0 ){
696
- delay (5 );
714
+ delay (100 );
697
715
}
698
716
}
699
717
}
0 commit comments