Skip to content

Commit 1e8348b

Browse files
committed
feat: add timeout to message advertising by default
1 parent 169d181 commit 1e8348b

File tree

3 files changed

+94
-22
lines changed

3 files changed

+94
-22
lines changed

library.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"maintainer": true
1616
}
1717
],
18-
"version": "1.1.0",
18+
"version": "1.2.0",
1919
"frameworks": ["espidf", "arduino"],
2020
"platforms": "espressif32",
2121
"build": {

src/simple_radio.cpp

Lines changed: 56 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "freertos/FreeRTOS.h"
77
#include "freertos/event_groups.h"
88
#include "freertos/task.h"
9+
#include "freertos/timers.h"
910
#include "nvs_flash.h"
1011

1112
#include "esp_bt_defs.h"
@@ -28,6 +29,11 @@ const SimpleRadioImpl::Config SimpleRadioImpl::DEFAULT_CONFIG = {
2829
.init_bt_controller = true,
2930
.release_bt_memory = true,
3031
.init_bluedroid = true,
32+
.message_timeout_ms = 1000,
33+
.adv_int_min = 0x0020,
34+
.adv_int_max = 0x0040,
35+
.scan_interval = 0,
36+
.scan_window = 0,
3137
};
3238

3339
SimpleRadioImpl::SimpleRadioImpl() {
@@ -37,6 +43,7 @@ SimpleRadioImpl::SimpleRadioImpl() {
3743
m_last_incomming_len = 0;
3844
m_data_size = 0;
3945
m_data[0] = SIMPLERADIO_BLE_ADV_PROP_TYPE;
46+
m_timeout_timer = nullptr;
4047
}
4148

4249
SimpleRadioImpl::~SimpleRadioImpl() {
@@ -126,6 +133,8 @@ esp_err_t SimpleRadioImpl::begin(uint8_t group, const SimpleRadioImpl::Config& c
126133

127134
scan_params.scan_type = BLE_SCAN_TYPE_PASSIVE;
128135
scan_params.scan_duplicate = BLE_SCAN_DUPLICATE_ENABLE;
136+
scan_params.scan_window = config.scan_window;
137+
scan_params.scan_interval = config.scan_interval;
129138

130139
ret = esp_ble_gap_set_scan_params(&scan_params);
131140
if (ret != ESP_OK) {
@@ -136,13 +145,12 @@ esp_err_t SimpleRadioImpl::begin(uint8_t group, const SimpleRadioImpl::Config& c
136145
setGroup(group);
137146
m_initialized = true;
138147

139-
if (m_data_size > 0) {
140-
esp_err_t raw_adv_ret = esp_ble_gap_config_adv_data_raw(m_data, m_data_size);
141-
if (raw_adv_ret) {
142-
ESP_LOGE(TAG, "config raw adv data failed, error code = %x ", raw_adv_ret);
143-
}
148+
if (config.message_timeout_ms) {
149+
m_timeout_timer = xTimerCreate("sradio_timeout", pdMS_TO_TICKS(config.message_timeout_ms), pdFALSE, nullptr, onTimeout);
144150
}
145151

152+
submitAdvertisingData();
153+
146154
return ESP_OK;
147155

148156
exit_bluedroid_disable:
@@ -208,6 +216,12 @@ void SimpleRadioImpl::end() {
208216
m_cb_keyvalue = nullptr;
209217
m_last_incomming_len = 0;
210218
m_data_size = 0;
219+
220+
if (m_timeout_timer) {
221+
xTimerDelete(m_timeout_timer, 0);
222+
m_timeout_timer = nullptr;
223+
}
224+
211225
m_mutex.unlock();
212226
}
213227

@@ -216,13 +230,19 @@ void SimpleRadioImpl::gapEventHandler(esp_gap_ble_cb_event_t event, esp_ble_gap_
216230

217231
switch (event) {
218232
case ESP_GAP_BLE_ADV_DATA_RAW_SET_COMPLETE_EVT: {
233+
std::lock_guard<std::mutex> l(self.m_mutex);
234+
235+
if (self.m_timeout_timer) {
236+
xTimerReset(self.m_timeout_timer, 0);
237+
}
238+
219239
if (self.m_is_advertising) {
220240
break;
221241
}
222242

223243
static esp_ble_adv_params_t adv_params = {
224-
.adv_int_min = 0x020,
225-
.adv_int_max = 0x040,
244+
.adv_int_min = self.m_used_config.adv_int_min,
245+
.adv_int_max = self.m_used_config.adv_int_max,
226246
.adv_type = ADV_TYPE_NONCONN_IND,
227247
.own_addr_type = BLE_ADDR_TYPE_PUBLIC,
228248
.peer_addr = {},
@@ -233,7 +253,7 @@ void SimpleRadioImpl::gapEventHandler(esp_gap_ble_cb_event_t event, esp_ble_gap_
233253

234254
auto ret = esp_ble_gap_start_advertising(&adv_params);
235255
if (ret != ESP_OK) {
236-
ESP_LOGE(TAG, "gap start scanning error, error code = %x", ret);
256+
ESP_LOGE(TAG, "gap esp_ble_gap_start_advertising error, error code = %x", ret);
237257
break;
238258
}
239259

@@ -309,6 +329,20 @@ void SimpleRadioImpl::gapEventHandler(esp_gap_ble_cb_event_t event, esp_ble_gap_
309329
}
310330
}
311331

332+
void SimpleRadioImpl::onTimeout(TimerHandle_t timer) {
333+
auto& self = SimpleRadio;
334+
335+
self.m_mutex.lock();
336+
if (self.m_is_advertising) {
337+
self.m_is_advertising = false;
338+
auto err = esp_ble_gap_stop_advertising();
339+
if (err != ESP_OK) {
340+
ESP_LOGE(TAG, "failed to stop advertising due tu timeout: %x", err);
341+
}
342+
}
343+
self.m_mutex.unlock();
344+
}
345+
312346
std::function<void(PacketInfo)> SimpleRadioImpl::prepareCallbackLocked(PacketDataType dtype, const uint8_t* data, size_t len) {
313347
using namespace std::placeholders;
314348

@@ -366,13 +400,7 @@ void SimpleRadioImpl::setGroup(uint8_t group) {
366400
}
367401

368402
m_data[0] = (m_data[0] & 0xF0) | group;
369-
370-
if (m_initialized && m_data_size > 0) {
371-
esp_err_t raw_adv_ret = esp_ble_gap_config_adv_data_raw(m_data, m_data_size);
372-
if (raw_adv_ret) {
373-
ESP_LOGE(TAG, "config raw adv data failed, error code = %x ", raw_adv_ret);
374-
}
375-
}
403+
submitAdvertisingData();
376404
}
377405

378406
uint8_t SimpleRadioImpl::group() const {
@@ -400,10 +428,18 @@ void SimpleRadioImpl::setData(PacketDataType dtype, const uint8_t* data, size_t
400428
memcpy(m_data + 1, data, len);
401429
m_data_size = len + 1;
402430

403-
if (m_initialized) {
404-
esp_err_t raw_adv_ret = esp_ble_gap_config_adv_data_raw(m_data, m_data_size);
405-
if (raw_adv_ret) {
406-
ESP_LOGE(TAG, "config raw adv data failed, error code = %x ", raw_adv_ret);
407-
}
431+
submitAdvertisingData();
432+
}
433+
434+
void SimpleRadioImpl::submitAdvertisingData() {
435+
if (!m_initialized || m_data_size == 0) {
436+
return;
437+
}
438+
439+
m_mutex.lock();
440+
esp_err_t raw_adv_ret = esp_ble_gap_config_adv_data_raw(m_data, m_data_size);
441+
if (raw_adv_ret) {
442+
ESP_LOGE(TAG, "config raw adv data failed, error code = %x ", raw_adv_ret);
408443
}
444+
m_mutex.unlock();
409445
}

src/simple_radio.h

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
#pragma once
22

33
#include "esp_gap_ble_api.h"
4+
#include "freertos/FreeRTOS.h"
5+
#include "freertos/timers.h"
6+
7+
#include <atomic>
48
#include <cstring>
59
#include <esp_err.h>
610
#include <functional>
@@ -32,6 +36,33 @@ class SimpleRadioImpl {
3236
// Only works if init_bt_controller == true.
3337
bool release_bt_memory;
3438
bool init_bluedroid;
39+
40+
// Stop advertising message after N ms, so that it won't be received by others
41+
// long after it was "sent".
42+
// Set to 0 to disable.
43+
// Default: 1000 ms
44+
uint16_t message_timeout_ms;
45+
46+
/*!< Minimum advertising interval, "how often" is message transmitted
47+
Range: 0x0020 to 0x4000 Default: N = 0x0020 (12.5 ms)
48+
Time = N * 0.625 msec Time Range: 20 ms to 10.24 sec */
49+
uint16_t adv_int_min;
50+
/*!< Maximum advertising interval "how often" is message transmitted
51+
Range: 0x0020 to 0x4000 Default: N = 0x0040 (25 ms)
52+
Time = N * 0.625 msec Time Range: 20 ms to 10.24 sec Advertising max interval */
53+
uint16_t adv_int_max;
54+
55+
/*!< Scan interval, "how often" to scan for new messages.
56+
Range: 0x0004 to 0x4000 Default: 0x0010 (10 ms)
57+
Time = N * 0.625 msec
58+
Time Range: 2.5 msec to 10.24 seconds*/
59+
uint16_t scan_interval;
60+
/*!< Scan window. The duration of the LE scan. LE_Scan_Window
61+
shall be less than or equal to LE_Scan_Interval
62+
Range: 0x0004 to 0x4000 Default: 0x0010 (10 ms)
63+
Time = N * 0.625 msec
64+
Time Range: 2.5 msec to 10240 msec */
65+
uint16_t scan_window;
3566
};
3667

3768
static const Config DEFAULT_CONFIG;
@@ -101,10 +132,13 @@ class SimpleRadioImpl {
101132

102133
private:
103134
static void gapEventHandler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t* param);
135+
static void onTimeout(TimerHandle_t timer);
136+
137+
void submitAdvertisingData();
104138

105139
std::function<void(PacketInfo)> prepareCallbackLocked(PacketDataType dtype, const uint8_t* data, size_t len);
106140

107-
bool m_initialized;
141+
std::atomic<bool> m_initialized;
108142
bool m_ignore_repeated_messages;
109143
bool m_is_advertising;
110144

@@ -120,6 +154,8 @@ class SimpleRadioImpl {
120154
PacketNumberCallbackT m_cb_number;
121155
PacketKeyValueCallbackT m_cb_keyvalue;
122156

157+
TimerHandle_t m_timeout_timer;
158+
123159
mutable std::mutex m_mutex;
124160
};
125161

0 commit comments

Comments
 (0)