|
54 | 54 | /******************************************************************************
|
55 | 55 | DEFINE PRIVATE CONSTANTS
|
56 | 56 | ******************************************************************************/
|
57 |
| -#define BT_SCAN_QUEUE_SIZE_MAX (8) |
| 57 | +#define BT_SCAN_QUEUE_SIZE_MAX (16) |
58 | 58 | #define BT_GATTS_QUEUE_SIZE_MAX (2)
|
59 | 59 | #define BT_CHAR_VALUE_SIZE_MAX (20)
|
60 | 60 |
|
@@ -267,7 +267,7 @@ void modbt_init0(void) {
|
267 | 267 | static esp_gatt_status_t status = ESP_GATT_ERROR;
|
268 | 268 |
|
269 | 269 | static esp_ble_scan_params_t ble_scan_params = {
|
270 |
| - .scan_type = BLE_SCAN_TYPE_PASSIVE, |
| 270 | + .scan_type = BLE_SCAN_TYPE_ACTIVE, |
271 | 271 | .own_addr_type = BLE_ADDR_TYPE_PUBLIC,
|
272 | 272 | .scan_filter_policy = BLE_SCAN_FILTER_ALLOW_ALL,
|
273 | 273 | .scan_interval = 0x50,
|
@@ -804,6 +804,28 @@ STATIC mp_obj_t bt_read_scan(mp_obj_t self_in) {
|
804 | 804 | }
|
805 | 805 | STATIC MP_DEFINE_CONST_FUN_OBJ_1(bt_read_scan_obj, bt_read_scan);
|
806 | 806 |
|
| 807 | +STATIC mp_obj_t bt_get_advertisements(mp_obj_t self_in) { |
| 808 | + bt_event_result_t bt_event; |
| 809 | + |
| 810 | + STATIC const qstr bt_scan_info_fields[] = { |
| 811 | + MP_QSTR_mac, MP_QSTR_addr_type, MP_QSTR_adv_type, MP_QSTR_rssi, MP_QSTR_data, |
| 812 | + }; |
| 813 | + |
| 814 | + mp_obj_t advs = mp_obj_new_list(0, NULL); |
| 815 | + while (xQueueReceive(xScanQueue, &bt_event, (TickType_t)0)) { |
| 816 | + mp_obj_t tuple[5]; |
| 817 | + tuple[0] = mp_obj_new_bytes((const byte *)bt_event.scan.scan_rst.bda, 6); |
| 818 | + tuple[1] = mp_obj_new_int(bt_event.scan.scan_rst.ble_addr_type); |
| 819 | + tuple[2] = mp_obj_new_int(bt_event.scan.scan_rst.ble_evt_type & 0x03); // FIXME |
| 820 | + tuple[3] = mp_obj_new_int(bt_event.scan.scan_rst.rssi); |
| 821 | + tuple[4] = mp_obj_new_bytes((const byte *)bt_event.scan.scan_rst.ble_adv, ESP_BLE_ADV_DATA_LEN_MAX); |
| 822 | + |
| 823 | + mp_obj_list_append(advs, mp_obj_new_attrtuple(bt_scan_info_fields, 5, tuple)); |
| 824 | + } |
| 825 | + return advs; |
| 826 | +} |
| 827 | +STATIC MP_DEFINE_CONST_FUN_OBJ_1(bt_get_advertisements_obj, bt_get_advertisements); |
| 828 | + |
807 | 829 | STATIC mp_obj_t bt_resolve_adv_data(mp_obj_t self_in, mp_obj_t adv_data, mp_obj_t data_type) {
|
808 | 830 | mp_buffer_info_t bufinfo;
|
809 | 831 | uint8_t data_len;
|
@@ -995,7 +1017,7 @@ STATIC mp_obj_t bt_set_advertisement (mp_uint_t n_args, const mp_obj_t *pos_args
|
995 | 1017 | mp_get_buffer_raise(args[3].u_obj, &uuid_bufinfo, MP_BUFFER_READ);
|
996 | 1018 | adv_data.service_uuid_len = uuid_bufinfo.len;
|
997 | 1019 | adv_data.p_service_uuid = uuid_bufinfo.buf;
|
998 |
| - if (adv_data.service_uuid_len != 16) { |
| 1020 | + if (adv_data.service_uuid_len % 16) { |
999 | 1021 | nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "incorrect service UUID length"));
|
1000 | 1022 | }
|
1001 | 1023 | }
|
@@ -1355,6 +1377,7 @@ STATIC const mp_map_elem_t bt_locals_dict_table[] = {
|
1355 | 1377 | { MP_OBJ_NEW_QSTR(MP_QSTR_isscanning), (mp_obj_t)&bt_isscanning_obj },
|
1356 | 1378 | { MP_OBJ_NEW_QSTR(MP_QSTR_stop_scan), (mp_obj_t)&bt_stop_scan_obj },
|
1357 | 1379 | { MP_OBJ_NEW_QSTR(MP_QSTR_get_adv), (mp_obj_t)&bt_read_scan_obj },
|
| 1380 | + { MP_OBJ_NEW_QSTR(MP_QSTR_get_advertisements), (mp_obj_t)&bt_get_advertisements_obj }, |
1358 | 1381 | { MP_OBJ_NEW_QSTR(MP_QSTR_resolve_adv_data), (mp_obj_t)&bt_resolve_adv_data_obj },
|
1359 | 1382 | { MP_OBJ_NEW_QSTR(MP_QSTR_connect), (mp_obj_t)&bt_connect_obj },
|
1360 | 1383 | { MP_OBJ_NEW_QSTR(MP_QSTR_set_advertisement), (mp_obj_t)&bt_set_advertisement_obj },
|
|
0 commit comments