Skip to content

Commit 8b048ab

Browse files
authored
Merge pull request #3007 from axhoff/agent/synchronize-ble-receive-queue
Synchronize the ESP32 BLE receive queue
2 parents 6a15e17 + 4d4d7c3 commit 8b048ab

2 files changed

Lines changed: 27 additions & 20 deletions

File tree

src/helpers/esp32/SerialBLEInterface.cpp

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -118,17 +118,24 @@ void SerialBLEInterface::onWrite(BLECharacteristic* pCharacteristic, esp_ble_gat
118118

119119
if (len > MAX_FRAME_SIZE) {
120120
BLE_DEBUG_PRINTLN("ERROR: onWrite(), frame too big, len=%d", len);
121-
} else if (recv_queue_len >= FRAME_QUEUE_SIZE) {
122-
BLE_DEBUG_PRINTLN("ERROR: onWrite(), recv_queue is full!");
123121
} else {
124-
recv_queue[recv_queue_len].len = len;
125-
memcpy(recv_queue[recv_queue_len].buf, rxValue, len);
126-
recv_queue_len++;
122+
Frame frame = {};
123+
frame.len = len;
124+
memcpy(frame.buf, rxValue, len);
125+
126+
if (xQueueSend(recv_queue, &frame, 0) != pdTRUE) {
127+
BLE_DEBUG_PRINTLN("ERROR: onWrite(), recv_queue is full!");
128+
}
127129
}
128130
}
129131

130132
// ---------- public methods
131133

134+
void SerialBLEInterface::clearBuffers() {
135+
xQueueReset(recv_queue);
136+
send_queue_len = 0;
137+
}
138+
132139
void SerialBLEInterface::enable() {
133140
if (_isEnabled) return;
134141

@@ -202,17 +209,11 @@ size_t SerialBLEInterface::checkRecvFrame(uint8_t dest[]) {
202209
}
203210
}
204211

205-
if (recv_queue_len > 0) { // check recv queue
206-
size_t len = recv_queue[0].len; // take from top of queue
207-
memcpy(dest, recv_queue[0].buf, len);
208-
209-
BLE_DEBUG_PRINTLN("readBytes: sz=%d, hdr=%d", len, (uint32_t) dest[0]);
210-
211-
recv_queue_len--;
212-
for (int i = 0; i < recv_queue_len; i++) { // delete top item from queue
213-
recv_queue[i] = recv_queue[i + 1];
214-
}
215-
return len;
212+
Frame frame = {};
213+
if (xQueueReceive(recv_queue, &frame, 0) == pdTRUE) {
214+
memcpy(dest, frame.buf, frame.len);
215+
BLE_DEBUG_PRINTLN("readBytes: sz=%d, hdr=%d", (uint32_t) frame.len, (uint32_t) dest[0]);
216+
return frame.len;
216217
}
217218

218219
if (pServer->getConnectedCount() == 0) deviceConnected = false;

src/helpers/esp32/SerialBLEInterface.h

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
#include <BLEServer.h>
66
#include <BLEUtils.h>
77
#include <BLE2902.h>
8+
#include <freertos/FreeRTOS.h>
9+
#include <freertos/queue.h>
810

911
class SerialBLEInterface : public BaseSerialInterface, BLESecurityCallbacks, BLEServerCallbacks, BLECharacteristicCallbacks {
1012
BLEServer *pServer;
@@ -24,12 +26,13 @@ class SerialBLEInterface : public BaseSerialInterface, BLESecurityCallbacks, BLE
2426
};
2527

2628
#define FRAME_QUEUE_SIZE 4
27-
int recv_queue_len;
28-
Frame recv_queue[FRAME_QUEUE_SIZE];
29+
StaticQueue_t recv_queue_state;
30+
uint8_t recv_queue_storage[FRAME_QUEUE_SIZE * sizeof(Frame)];
31+
QueueHandle_t recv_queue;
2932
int send_queue_len;
3033
Frame send_queue[FRAME_QUEUE_SIZE];
3134

32-
void clearBuffers() { recv_queue_len = 0; send_queue_len = 0; }
35+
void clearBuffers();
3336

3437
protected:
3538
// BLESecurityCallbacks methods
@@ -58,7 +61,10 @@ class SerialBLEInterface : public BaseSerialInterface, BLESecurityCallbacks, BLE
5861
_isEnabled = false;
5962
_last_write = 0;
6063
last_conn_id = 0;
61-
send_queue_len = recv_queue_len = 0;
64+
recv_queue = xQueueCreateStatic(
65+
FRAME_QUEUE_SIZE, sizeof(Frame), recv_queue_storage, &recv_queue_state
66+
);
67+
send_queue_len = 0;
6268
}
6369

6470
/**

0 commit comments

Comments
 (0)