From 11d15fb03c5e7f14a83d90e69d6d2e35f713b33b Mon Sep 17 00:00:00 2001 From: leo Date: Mon, 11 Apr 2022 15:57:42 +0200 Subject: [PATCH] gatt profile handler --- components/APlib/include/APlib.h | 6 +- components/BTlib/BTlib.c | 176 ++++++++++++ components/BTlib/CMakeLists.txt | 3 + components/BTlib/include/BTlib.h | 48 ++++ default_conf.csv | 2 +- main/CO2_Sense.c | 8 +- nvs.bin | Bin 24576 -> 24576 bytes partitions.csv | 2 +- sdkconfig | 468 ++++++++++++++++++++++++++++++- 9 files changed, 703 insertions(+), 10 deletions(-) create mode 100644 components/BTlib/BTlib.c create mode 100644 components/BTlib/CMakeLists.txt create mode 100644 components/BTlib/include/BTlib.h diff --git a/components/APlib/include/APlib.h b/components/APlib/include/APlib.h index a7603b4..17e9138 100644 --- a/components/APlib/include/APlib.h +++ b/components/APlib/include/APlib.h @@ -4,9 +4,9 @@ #include "nvs_flash.h" #include "esp_wifi.h" -#define C_WIFI_MODE_AP 1 -#define C_WIFI_MODE_OFF 0 -#define C_WIFI_NEED_HTTP 0b11 +#define C_WL_MODE_AP 1 +#define C_WL_MODE_OFF 0 +#define C_WL_NEED_HTTP 0b11 void wifi_init_softap(wifi_config_t* wifi_config); wifi_config_t wifi_config_generator(char SSID[32], char pass[32], uint8_t channel); diff --git a/components/BTlib/BTlib.c b/components/BTlib/BTlib.c new file mode 100644 index 0000000..688ad3f --- /dev/null +++ b/components/BTlib/BTlib.c @@ -0,0 +1,176 @@ +#include +#include "BTlib.h" +#include "esp_log.h" +#include "esp_bt.h" +#include "esp_bt_main.h" +#include "esp_gap_ble_api.h" +#include "esp_gatts_api.h" +#include "esp_gatt_common_api.h" + +#define ADV_CONFIG_FLAG (1 << 0) +#define SCAN_RSP_CONFIG_FLAG (1 << 1) + +static uint8_t adv_config_done = 0; + +static struct gatts_profile_inst env_sense_profile_tab[1] = { + [ENVIRONMENTAL_SENSING_IDX] = { + .gatts_cb = gatts_profile_event_handler, + .gatts_if = ESP_GATT_IF_NONE, + }, +}; + +uint16_t env_handle_table[ENV_IDX_NB]; + +static uint8_t service_uuid[2] = { + ENVIRONMENTAL_SENSING_UUID & 0xFF, + ENVIRONMENTAL_SENSING_UUID & 0xFF00 >> 8, +}; + +static esp_ble_adv_data_t env_sense_adv_data = { + .set_scan_rsp = false, + .include_name = true, + .include_txpower = true, + .min_interval = 0x0006, + .max_interval = 0x0010, + .appearance = 0x00, + .manufacturer_len = 0, //TEST_MANUFACTURER_DATA_LEN, + .p_manufacturer_data = NULL, //&test_manufacturer[0], + .service_data_len = 0, + .p_service_data = NULL, + .service_uuid_len = sizeof(service_uuid), + .p_service_uuid = service_uuid, + .flag = (ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT), +}; + +static esp_ble_adv_params_t adv_params = { + .adv_int_min = 0x20, + .adv_int_max = 0x40, + .adv_type = ADV_TYPE_IND, + .own_addr_type = BLE_ADDR_TYPE_PUBLIC, + .channel_map = ADV_CHNL_ALL, + .adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY, +}; + + +static const uint16_t primary_service_uuid = ESP_GATT_UUID_PRI_SERVICE; +static const uint16_t env_service_uuid = ENVIRONMENTAL_SENSING_UUID; +static const uint16_t char_dec_uuid = ESP_GATT_UUID_CHAR_DECLARE; +static const uint16_t char_co2_uuid = 0x0c39; +static const uint8_t char_prop_read_write_notify = ESP_GATT_CHAR_PROP_BIT_WRITE | ESP_GATT_CHAR_PROP_BIT_READ | ESP_GATT_CHAR_PROP_BIT_NOTIFY; + +static const uint8_t CO2_char_val[]={ + 0x00, 0x00, // Flags (RFU) + 0x01, // Sampling function : Instantaneous + 30, // Measurement period : 30s TODO + 30, // Update Interval : 30s TODO + 0x01, // Application : Air + 0xFF, // Mesurement Uncertainty : TODO + }; + +static const esp_gatts_attr_db_t gatt_db[ENV_IDX_NB] = +{ + // Service Declaration + [ENV_IDX_SVC] = + {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&primary_service_uuid, ESP_GATT_PERM_READ, + sizeof(uint16_t), sizeof(env_service_uuid), (uint8_t *)&env_service_uuid}}, + + /* Characteristic Declaration */ + [CO2_IDX_MEAS_CHAR] = + {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&char_dec_uuid, ESP_GATT_PERM_READ, + CHAR_DECLARATION_SIZE, CHAR_DECLARATION_SIZE, (uint8_t *)&char_prop_read_write_notify}}, + + /* Characteristic Value */ + [CO2_IDX_MEAS_VAL] = + {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&char_co2_uuid, ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE, + GATTS_CHAR_VAL_LEN_MAX, sizeof(CO2_char_val), (uint8_t *)&CO2_char_val}}, + + /* Client Characteristic Configuration Descriptor */ + /*[IDX_CHAR_CFG_A] = TODO + {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&character_client_config_uuid, ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE, + sizeof(uint16_t), sizeof(heart_measurement_ccc), (uint8_t *)heart_measurement_ccc}}, + */ +}; + + +static char device_name[] = "prout"; + +void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t* param){ + +} + +void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t* param){ + +} + +void gatts_profile_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t* param){ + switch(event){ + case ESP_GATTS_REG_EVT: + ESP_ERROR_CHECK(esp_ble_gap_set_device_name(device_name)); + ESP_ERROR_CHECK(esp_ble_gap_config_adv_data(&env_sense_adv_data)); + adv_config_done |= ADV_CONFIG_FLAG; + //ESP_ERROR_CHECK(esp_ble_gap_config_adv_data(&scan_rsp_data)); + //adv_config_done |= SCAN_RSP_CONFIG_FLAG; + ESP_ERROR_CHECK(esp_ble_gatts_create_attr_tab(gatt_db, gatts_if, ENV_IDX_NB, ENVIRONMENTAL_SENSING_IDX)); + break; + case ESP_GATTS_READ_EVT: + ESP_LOGI("bt", "read event NI"); + break; + case ESP_GATTS_WRITE_EVT: + ESP_LOGI("bt", "write event NI"); + break; + case ESP_GATTS_EXEC_WRITE_EVT: + ESP_LOGI("bt", "write exec event NI"); + break; + case ESP_GATTS_MTU_EVT: + ESP_LOGI("bt", "MTU event NI"); + break; + case ESP_GATTS_CONF_EVT: + ESP_LOGI("bt", "conf event NI"); + break; + case ESP_GATTS_START_EVT: + ESP_LOGI("bt", "start event NI"); + break; + case ESP_GATTS_CONNECT_EVT: + ESP_LOGI("bt", "connect event"); + esp_ble_conn_update_params_t conn_params = {0}; + memcpy(conn_params.bda, param->connect.remote_bda, sizeof(esp_bd_addr_t)); + conn_params.latency = 0; + conn_params.max_int = 0x20; + conn_params.min_int = 0x10; + conn_params.timeout = 400; + esp_ble_gap_update_conn_params(&conn_params); + break; + case ESP_GATTS_DISCONNECT_EVT: + ESP_LOGI("bt", "disconnect event"); + esp_ble_gap_start_advertising(&adv_params); + break; + case ESP_GATTS_CREAT_ATTR_TAB_EVT: + if(param->add_attr_tab.status != ESP_GATT_OK){ + ESP_LOGE("bt", "create attribute table failed, error code=0x%x", param->add_attr_tab.status); + } + else if(param->add_attr_tab.num_handle != ENV_IDX_NB){ + ESP_LOGE("bt", "wrong num hanbdle tab"); + } + else{ + ESP_LOGI("bt", "creationg tab"); + memcpy(env_handle_table, param->add_attr_tab.handles, sizeof(env_handle_table)); + esp_ble_gatts_start_service(env_handle_table[ENV_IDX_SVC]); + } + break; + default: + ESP_LOGI("bt", "GATTS, non implemented event"); + break; + } +} + +void initBle(void){ + ESP_LOGI("initBle", "starting bluetooth"); + esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); + ESP_ERROR_CHECK(esp_bt_controller_init(&bt_cfg)); + ESP_ERROR_CHECK(esp_bt_controller_enable(ESP_BT_MODE_BLE)); + ESP_ERROR_CHECK(esp_bluedroid_init()); + ESP_ERROR_CHECK(esp_bluedroid_enable()); + ESP_ERROR_CHECK(esp_ble_gatts_register_callback(gatts_event_handler)); + ESP_ERROR_CHECK(esp_ble_gap_register_callback(gap_event_handler)); + ESP_ERROR_CHECK(esp_ble_gatts_app_register(SENSOR_BLE_APP_ID)); +} diff --git a/components/BTlib/CMakeLists.txt b/components/BTlib/CMakeLists.txt new file mode 100644 index 0000000..b4a4cf8 --- /dev/null +++ b/components/BTlib/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRCS "BTlib.c" + INCLUDE_DIRS "include" + REQUIRES bt) diff --git a/components/BTlib/include/BTlib.h b/components/BTlib/include/BTlib.h new file mode 100644 index 0000000..e8235d4 --- /dev/null +++ b/components/BTlib/include/BTlib.h @@ -0,0 +1,48 @@ +#include "esp_gap_ble_api.h" +#include "esp_gatts_api.h" + +#define C_WL_MODE_BLE 0b100 + +#define SENSOR_BLE_APP_ID 0x69 +#define ENVIRONMENTAL_SENSING_IDX 0 + +#define ENVIRONMENTAL_SENSING_UUID 0x181A + +#define CHAR_DECLARATION_SIZE (sizeof(uint8_t)) +#define GATTS_CHAR_VAL_LEN_MAX 500 + +enum{ + ENV_IDX_SVC, + CO2_IDX_MEAS_CHAR, + CO2_IDX_MEAS_VAL, + + T_IDX_MEAS_CHAR, + T_IDX_MEAS_VAL, + + HUM_IDX_MEAS_CHAR, + HUM_IDX_MEAS, + ENV_IDX_NB, +}; + +struct gatts_profile_inst { + esp_gatts_cb_t gatts_cb; + uint16_t gatts_if; + uint16_t app_id; + uint16_t conn_id; + uint16_t service_handle; + esp_gatt_srvc_id_t service_id; + uint16_t char_handle; + esp_bt_uuid_t char_uuid; + esp_gatt_perm_t perm; + esp_gatt_char_prop_t property; + uint16_t descr_handle; + esp_bt_uuid_t descr_uuid; +}; + + +void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t* param); +void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t* param); +void gatts_profile_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t* param); + + +void initBle(void); diff --git a/default_conf.csv b/default_conf.csv index bbcb5f0..edff8e1 100644 --- a/default_conf.csv +++ b/default_conf.csv @@ -2,7 +2,7 @@ key,type,encoding,value main,namespace,, name,data,string,CO2Sense -wireless_conf,data,u8,1 +wireless_conf,data,u8,4 ap_ssid,data,string,CO2Sense ap_pass,data,string,testtest sensor_conf,data,u16,22 diff --git a/main/CO2_Sense.c b/main/CO2_Sense.c index 52d6724..2533cca 100644 --- a/main/CO2_Sense.c +++ b/main/CO2_Sense.c @@ -19,6 +19,7 @@ #include "scd4x_i2c.h" #include "sensirion_i2c_hal.h" #include "scd4x_data.h" +#include "BTlib.h" #define LED1_PIN CONFIG_LED_1_PIN #define LED2_PIN CONFIG_LED_2_PIN @@ -39,7 +40,7 @@ void app_main(void){ init_led_driver(conf->leds, LED_NUMBER); // init server stuff if wifi enabled - if(conf->wireless & C_WIFI_NEED_HTTP){ + if(conf->wireless & C_WL_NEED_HTTP){ ESP_LOGI("main", "%i", conf->wireless); // init tcpip ESP_ERROR_CHECK(esp_netif_init()); @@ -53,9 +54,12 @@ void app_main(void){ } // start wifi switch(conf->wireless){ - case C_WIFI_MODE_AP: + case C_WL_MODE_AP: wifi_init_softap(conf->wifi_config); break; + case C_WL_MODE_BLE: + initBle(); + break; } // start sensor diff --git a/nvs.bin b/nvs.bin index 2806b38d9f8c96e1104d216b7351ae40f2c7dbd6..12dcf1bd46d56c7cb6bad8d990cc9157c9236378 100644 GIT binary patch delta 34 qcmZoTz}Rqral#T&nJIj4%QK5ob5e_o