|
69 | 69 | #define MOD_BT_GATTS_WRITE_EVT (0x0010) |
70 | 70 | #define MOD_BT_GATTC_NOTIFY_EVT (0x0020) |
71 | 71 | #define MOD_BT_GATTC_INDICATE_EVT (0x0040) |
| 72 | +#define MOD_BT_GATTS_SUBSCRIBE_EVT (0x0080) |
72 | 73 |
|
73 | 74 | /****************************************************************************** |
74 | 75 | DEFINE PRIVATE TYPES |
@@ -197,6 +198,7 @@ typedef struct { |
197 | 198 | uint32_t events; |
198 | 199 | uint32_t trans_id; |
199 | 200 | bool read_request; |
| 201 | + uint16_t config; |
200 | 202 | } bt_gatts_char_obj_t; |
201 | 203 |
|
202 | 204 | /****************************************************************************** |
@@ -566,6 +568,13 @@ static void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_ |
566 | 568 | } else { // descriptor |
567 | 569 | if (attr_obj->uuid.len == ESP_UUID_LEN_16 && attr_obj->uuid.uuid.uuid16 == GATT_UUID_CHAR_CLIENT_CONFIG) { |
568 | 570 | uint16_t value = param->write.value[1] << 8 | param->write.value[0]; |
| 571 | + bt_gatts_char_obj_t *char_obj = (bt_gatts_char_obj_t *)attr_obj->parent; |
| 572 | + char_obj->config = value; |
| 573 | + char_obj->events |= MOD_BT_GATTS_SUBSCRIBE_EVT; |
| 574 | + if (char_obj->trigger & MOD_BT_GATTS_SUBSCRIBE_EVT) { |
| 575 | + mp_irq_queue_interrupt(gatts_char_callback_handler, char_obj); |
| 576 | + } |
| 577 | + |
569 | 578 | if (value == 0x0001) { // notifications enabled |
570 | 579 | bt_gatts_char_obj_t *char_obj = (bt_gatts_char_obj_t *)attr_obj->parent; |
571 | 580 | // the size of value[] needs to be less than MTU size |
@@ -1341,11 +1350,18 @@ STATIC mp_obj_t bt_characteristic_events(mp_obj_t self_in) { |
1341 | 1350 | } |
1342 | 1351 | STATIC MP_DEFINE_CONST_FUN_OBJ_1(bt_characteristic_events_obj, bt_characteristic_events); |
1343 | 1352 |
|
| 1353 | +STATIC mp_obj_t bt_characteristic_config(mp_obj_t self_in) { |
| 1354 | + bt_gatts_char_obj_t *self = self_in; |
| 1355 | + return mp_obj_new_int(self->config); |
| 1356 | +} |
| 1357 | +STATIC MP_DEFINE_CONST_FUN_OBJ_1(bt_characteristic_config_obj, bt_characteristic_config); |
| 1358 | + |
1344 | 1359 | STATIC const mp_map_elem_t bt_gatts_char_locals_dict_table[] = { |
1345 | 1360 | // instance methods |
1346 | 1361 | { MP_OBJ_NEW_QSTR(MP_QSTR_value), (mp_obj_t)&bt_characteristic_value_obj }, |
1347 | 1362 | { MP_OBJ_NEW_QSTR(MP_QSTR_callback), (mp_obj_t)&bt_characteristic_callback_obj }, |
1348 | 1363 | { MP_OBJ_NEW_QSTR(MP_QSTR_events), (mp_obj_t)&bt_characteristic_events_obj }, |
| 1364 | + { MP_OBJ_NEW_QSTR(MP_QSTR_config), (mp_obj_t)&bt_characteristic_config_obj }, |
1349 | 1365 | }; |
1350 | 1366 | STATIC MP_DEFINE_CONST_DICT(bt_gatts_char_locals_dict, bt_gatts_char_locals_dict_table); |
1351 | 1367 |
|
@@ -1422,12 +1438,17 @@ STATIC const mp_map_elem_t bt_locals_dict_table[] = { |
1422 | 1438 | { MP_OBJ_NEW_QSTR(MP_QSTR_PROP_AUTH), MP_OBJ_NEW_SMALL_INT(ESP_GATT_CHAR_PROP_BIT_AUTH) }, |
1423 | 1439 | { MP_OBJ_NEW_QSTR(MP_QSTR_PROP_EXT_PROP), MP_OBJ_NEW_SMALL_INT(ESP_GATT_CHAR_PROP_BIT_EXT_PROP) }, |
1424 | 1440 |
|
| 1441 | + // Defined at https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.descriptor.gatt.client_characteristic_configuration.xml |
| 1442 | + { MP_OBJ_NEW_QSTR(MP_QSTR_CHAR_CONFIG_NOTIFY), MP_OBJ_NEW_SMALL_INT(1 << 0) }, |
| 1443 | + { MP_OBJ_NEW_QSTR(MP_QSTR_CHAR_CONFIG_INDICATE), MP_OBJ_NEW_SMALL_INT(1 << 1) }, |
| 1444 | + |
1425 | 1445 | { MP_OBJ_NEW_QSTR(MP_QSTR_NEW_ADV_EVENT), MP_OBJ_NEW_SMALL_INT(MOD_BT_GATTC_ADV_EVT) }, |
1426 | 1446 | { MP_OBJ_NEW_QSTR(MP_QSTR_CLIENT_CONNECTED), MP_OBJ_NEW_SMALL_INT(MOD_BT_GATTS_CONN_EVT) }, |
1427 | 1447 | { MP_OBJ_NEW_QSTR(MP_QSTR_CLIENT_DISCONNECTED), MP_OBJ_NEW_SMALL_INT(MOD_BT_GATTS_DISCONN_EVT) }, |
1428 | 1448 | { MP_OBJ_NEW_QSTR(MP_QSTR_CHAR_READ_EVENT), MP_OBJ_NEW_SMALL_INT(MOD_BT_GATTS_READ_EVT) }, |
1429 | 1449 | { MP_OBJ_NEW_QSTR(MP_QSTR_CHAR_WRITE_EVENT), MP_OBJ_NEW_SMALL_INT(MOD_BT_GATTS_WRITE_EVT) }, |
1430 | 1450 | { MP_OBJ_NEW_QSTR(MP_QSTR_CHAR_NOTIFY_EVENT), MP_OBJ_NEW_SMALL_INT(MOD_BT_GATTC_NOTIFY_EVT) }, |
| 1451 | + { MP_OBJ_NEW_QSTR(MP_QSTR_CHAR_SUBSCRIBE_EVENT), MP_OBJ_NEW_SMALL_INT(MOD_BT_GATTS_SUBSCRIBE_EVT) }, |
1431 | 1452 | // { MP_OBJ_NEW_QSTR(MP_QSTR_CHAR_INDICATE_EVENT), MP_OBJ_NEW_SMALL_INT(MOD_BT_GATTC_INDICATE_EVT) }, |
1432 | 1453 | }; |
1433 | 1454 | STATIC MP_DEFINE_CONST_DICT(bt_locals_dict, bt_locals_dict_table); |
|
0 commit comments