#include "BTlib_nimble.h" #include "nimble/ble.h" #include "esp_nimble_hci.h" #include "nimble/nimble_port.h" #include "services/gap/ble_svc_gap.h" #include "services/gatt/ble_svc_gatt.h" #include "nimble/nimble_port_freertos.h" static uint8_t ble_addr_type; static void ble_advertise(void){ ESP_ERROR_CHECK(ble_gap_adv_set_fields(&adv_fields)); ESP_ERROR_CHECK(ble_gap_adv_start(ble_addr_type, NULL, BLE_HS_FOREVER, &adv_params, ble_gap_event, NULL)); } static int ble_gap_event(struct ble_gap_event *event, void* arg){ switch(event->type){ case BLE_GAP_EVENT_CONNECT: ESP_LOGI(NIMBLE_LOG_TAG, "connect event"); if(event->connect.status) ble_advertise(); conn_handle = event->connect.conn_handle; break; case BLE_GAP_EVENT_DISCONNECT: ESP_LOGI(NIMBLE_LOG_TAG, "disconnect event"); ble_advertise(); break; case BLE_GAP_EVENT_ADV_COMPLETE: ESP_LOGI(NIMBLE_LOG_TAG, "adv complete"); ble_advertise(); break; case BLE_GAP_EVENT_SUBSCRIBE: ESP_LOGI(NIMBLE_LOG_TAG, "subscribe event notify : %b", notify_state); if(event->subscribe.attr_handle == es_hrm_handle) notify_state = event->subscribe.cur_notify; break; case BLE_GAP_EVENT_MTU: ESP_LOGI(NIMBLE_LOG_TAG, "MTU event"); break; } return ESP_OK; } static int gatt_svr_init(void){ ble_svc_gap_init(); ble_svc_gatt_init(); int res; res = ble_gatts_count_cfg(gatt_svr_svcs); if(res) return res; res = ble_gatts_add_svcs(gatt_svr_svcs); return res; } static void ble_on_sync(void){ //TODO ESP_LOGI(NIMBLE_LOG_TAG, "on sync event"); ble_advertise(); } static void ble_on_reset(int reason){ ESP_LOGI(NIMBLE_LOG_TAG, "on reset event %d", reason); } static void ble_host_task(void* param){ nimble_port_run(); // return on stop nimble_port_freertos_deinit(); } void initBle(configuration_data_t* main_conf){ ESP_ERROR_CHECK(esp_nimble_hci_and_controller_init()); nimble_port_init(); ble_hs_cfg.sync_cb = ble_on_sync; ble_hs_cfg.reset_cb = ble_on_reset; ESP_ERROR_CHECK(gatt_srv_init()); ESP_ERROR_CHECK(ble_svc_gap_device_name_set(main_conf->hostname)); nimble_port_freertos_init(ble_host_task); }