#include "ble_manager.h" #include "board_config.h" #include "ble_hid.h" #include "esp_log.h" #include "sdkconfig.h" #if BOARD_BLE_ENABLED #include "driver/gpio.h" #include "esp_hid_gap.h" #include "esp_hid_common.h" #include "host/ble_hs.h" #include "nimble/nimble_port.h" #include "nimble/nimble_port_freertos.h" #include "store/config/ble_store_config.h" static const char *TAG = "ble_manager"; #define BLE_DEVICE_NAME CONFIG_ESP_BLE_DEVICE_NAME static ble_status_cb_t s_status_cb; static bool s_connected; static void on_hid_status(bool connected) { s_connected = connected; gpio_set_level(BOARD_PIN_LED, connected ? 1 : 0); if (s_status_cb != NULL) { s_status_cb(connected); } } static void nimble_host_task(void *param) { (void)param; nimble_port_run(); nimble_port_freertos_deinit(); } void ble_store_config_init(void); #endif /* BOARD_BLE_ENABLED */ void ble_manager_set_status_cb(ble_status_cb_t cb) { #if BOARD_BLE_ENABLED s_status_cb = cb; #else (void)cb; #endif } bool ble_manager_is_connected(void) { #if BOARD_BLE_ENABLED return s_connected; #else return false; #endif } void ble_manager_init(void) { #if BOARD_BLE_ENABLED esp_err_t ret; gpio_reset_pin(BOARD_PIN_LED); gpio_set_direction(BOARD_PIN_LED, GPIO_MODE_OUTPUT); gpio_set_level(BOARD_PIN_LED, 0); ESP_LOGI(TAG, "init esp_hid_gap (NimBLE)"); ret = esp_hid_gap_init(HIDD_BLE_MODE); if (ret != ESP_OK) { ESP_LOGE(TAG, "esp_hid_gap_init failed: %d", ret); return; } ret = esp_hid_ble_gap_adv_init(ESP_HID_APPEARANCE_KEYBOARD, BLE_DEVICE_NAME); if (ret != ESP_OK) { ESP_LOGE(TAG, "esp_hid_ble_gap_adv_init failed: %d", ret); return; } ret = ble_hid_init(on_hid_status); if (ret != 0) { ESP_LOGE(TAG, "ble_hid_init failed: %d", ret); return; } ble_store_config_init(); ble_hs_cfg.store_status_cb = ble_store_util_status_rr; ret = esp_nimble_enable(nimble_host_task); if (ret != ESP_OK) { ESP_LOGE(TAG, "esp_nimble_enable failed: %d", ret); return; } ESP_LOGI(TAG, "BLE HID keyboard started as \"%s\"", BLE_DEVICE_NAME); #else ESP_LOGI("ble_manager", "BLE disabled by board config"); #endif }