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
3339SimpleRadioImpl::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
4249SimpleRadioImpl::~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
148156exit_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+
312346std::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
378406uint8_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}
0 commit comments