Skip to content

Commit a92bbec

Browse files
committed
Use semaphore instead of delay
TX functionality is done.
1 parent 021dad8 commit a92bbec

File tree

1 file changed

+36
-18
lines changed

1 file changed

+36
-18
lines changed

libraries/BluetoothSerial/src/BluetoothSerial.cpp

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ const char * _spp_server_name = "ESP32SPP";
4747
static uint32_t _spp_client = 0;
4848
static xQueueHandle _spp_rx_queue = NULL;
4949
static xQueueHandle _spp_tx_queue = NULL;
50+
static SemaphoreHandle_t _spp_tx_done = NULL;
5051
static TaskHandle_t _spp_task_handle = NULL;
5152
static EventGroupHandle_t _spp_event_group = NULL;
5253

@@ -99,6 +100,11 @@ static bool _spp_send_buffer(){
99100
log_e("SPP Write Failed! [0x%X]", err);
100101
return false;
101102
}
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+
}
102108
return true;
103109
}
104110
return false;
@@ -118,8 +124,6 @@ static void _spp_tx_task(void * arg){
118124
packet = NULL;
119125
if(SPP_TX_MAX == _spp_tx_buffer_len || uxQueueMessagesWaiting(_spp_tx_queue) == 0){
120126
_spp_send_buffer();
121-
_spp_tx_buffer_len = 0;
122-
delay(2);
123127
}
124128
} else {
125129
len = packet->len;
@@ -130,16 +134,12 @@ static void _spp_tx_task(void * arg){
130134
data += to_send;
131135
len -= to_send;
132136
_spp_send_buffer();
133-
_spp_tx_buffer_len = 0;
134-
delay(2);
135137
while(len >= SPP_TX_MAX){
136138
memcpy(_spp_tx_buffer, data, SPP_TX_MAX);
137139
_spp_tx_buffer_len = SPP_TX_MAX;
138140
data += SPP_TX_MAX;
139141
len -= SPP_TX_MAX;
140142
_spp_send_buffer();
141-
_spp_tx_buffer_len = 0;
142-
delay(2);
143143
}
144144
if(len){
145145
memcpy(_spp_tx_buffer, data, len);
@@ -149,8 +149,6 @@ static void _spp_tx_task(void * arg){
149149
packet = NULL;
150150
if(uxQueueMessagesWaiting(_spp_tx_queue) == 0){
151151
_spp_send_buffer();
152-
_spp_tx_buffer_len = 0;
153-
delay(2);
154152
}
155153
}
156154
}
@@ -199,6 +197,7 @@ static void esp_spp_cb(esp_spp_cb_event_t event, esp_spp_cb_param_t *param)
199197
if(param->write.cong){
200198
xEventGroupClearBits(_spp_event_group, SPP_CONGESTED);
201199
}
200+
xSemaphoreGive(_spp_tx_done);//we can try to send another packet
202201
log_v("ESP_SPP_WRITE_EVT: %u %s", param->write.len, param->write.cong?"CONGESTED":"FREE");
203202
break;
204203

@@ -244,8 +243,6 @@ static bool _init_bt(const char *deviceName)
244243
}
245244
xEventGroupClearBits(_spp_event_group, 0xFFFFFF);
246245
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);
249246
}
250247
if (_spp_rx_queue == NULL){
251248
_spp_rx_queue = xQueueCreate(RX_QUEUE_SIZE, sizeof(uint8_t)); //initialize the queue
@@ -261,6 +258,15 @@ static bool _init_bt(const char *deviceName)
261258
return false;
262259
}
263260
}
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+
264270
if(!_spp_task_handle){
265271
xTaskCreate(_spp_tx_task, "spp_tx", 4096, NULL, 2, &_spp_task_handle);
266272
if(!_spp_task_handle){
@@ -324,15 +330,27 @@ static bool _stop_bt()
324330
esp_bluedroid_deinit();
325331
btStop();
326332
}
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
331333
_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+
}
336354
return true;
337355
}
338356

0 commit comments

Comments
 (0)