|
|
@@ -18,11 +18,8 @@ ESP_EVENT_DEFINE_BASE(ESP_HIDH_EVENTS);
|
|
|
static const char *TAG = "ESP_HIDH";
|
|
|
|
|
|
static esp_hidh_dev_head_t s_esp_hidh_devices;
|
|
|
-static esp_timer_handle_t s_esp_hidh_timer;
|
|
|
static SemaphoreHandle_t s_esp_hidh_devices_semaphore = NULL;
|
|
|
|
|
|
-static void esp_hidh_dev_delay_free(void *arg);
|
|
|
-
|
|
|
static inline void lock_devices(void)
|
|
|
{
|
|
|
if (s_esp_hidh_devices_semaphore != NULL) {
|
|
|
@@ -74,17 +71,6 @@ esp_err_t esp_hidh_init(const esp_hidh_config_t *config)
|
|
|
|
|
|
TAILQ_INIT(&s_esp_hidh_devices);
|
|
|
|
|
|
- esp_timer_create_args_t timer_config = {
|
|
|
- .callback = &esp_hidh_dev_delay_free,
|
|
|
- .arg = NULL,
|
|
|
- .name = "hidh_timer"
|
|
|
- };
|
|
|
-
|
|
|
- if ((err = esp_timer_create(&timer_config, &s_esp_hidh_timer)) != ESP_OK) {
|
|
|
- ESP_LOGE(TAG, "%s create timer failed!", __func__);
|
|
|
- return err;
|
|
|
- }
|
|
|
-
|
|
|
s_esp_hidh_devices_semaphore = xSemaphoreCreateMutex();
|
|
|
if (s_esp_hidh_devices_semaphore == NULL) {
|
|
|
ESP_LOGE(TAG, "xSemaphoreCreateMutex failed!");
|
|
|
@@ -108,8 +94,6 @@ esp_err_t esp_hidh_init(const esp_hidh_config_t *config)
|
|
|
if (err != ESP_OK) {
|
|
|
vSemaphoreDelete(s_esp_hidh_devices_semaphore);
|
|
|
s_esp_hidh_devices_semaphore = NULL;
|
|
|
- esp_timer_delete(s_esp_hidh_timer);
|
|
|
- s_esp_hidh_timer = NULL;
|
|
|
}
|
|
|
|
|
|
return err;
|
|
|
@@ -123,11 +107,6 @@ esp_err_t esp_hidh_deinit(void)
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
- if (esp_timer_is_active(s_esp_hidh_timer)) {
|
|
|
- ESP_LOGE(TAG, "Busy, try again later!");
|
|
|
- return ESP_ERR_NOT_FINISHED;
|
|
|
- }
|
|
|
-
|
|
|
if (!TAILQ_EMPTY(&s_esp_hidh_devices)) {
|
|
|
ESP_LOGE(TAG, "Please disconnect all devices first!");
|
|
|
return err;
|
|
|
@@ -151,8 +130,6 @@ esp_err_t esp_hidh_deinit(void)
|
|
|
TAILQ_INIT(&s_esp_hidh_devices);
|
|
|
vSemaphoreDelete(s_esp_hidh_devices_semaphore);
|
|
|
s_esp_hidh_devices_semaphore = NULL;
|
|
|
- esp_timer_delete(s_esp_hidh_timer);
|
|
|
- s_esp_hidh_timer = NULL;
|
|
|
}
|
|
|
return err;
|
|
|
}
|
|
|
@@ -742,20 +719,6 @@ esp_err_t esp_hidh_dev_free_inner(esp_hidh_dev_t *dev)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static void esp_hidh_dev_delay_free(void *arg)
|
|
|
-{
|
|
|
- esp_hidh_dev_t *d = NULL;
|
|
|
- esp_hidh_dev_t *next = NULL;
|
|
|
- lock_devices();
|
|
|
- TAILQ_FOREACH_SAFE(d, &s_esp_hidh_devices, devices, next) {
|
|
|
- if (!d->in_use) {
|
|
|
- TAILQ_REMOVE(&s_esp_hidh_devices, d, devices);
|
|
|
- esp_hidh_dev_resources_free(d);
|
|
|
- }
|
|
|
- }
|
|
|
- unlock_devices();
|
|
|
-}
|
|
|
-
|
|
|
#if CONFIG_BLUEDROID_ENABLED
|
|
|
esp_hidh_dev_t *esp_hidh_dev_get_by_bda(esp_bd_addr_t bda)
|
|
|
{
|
|
|
@@ -805,10 +768,10 @@ esp_hidh_dev_t *esp_hidh_dev_get_by_conn_id(uint16_t conn_id)
|
|
|
|
|
|
/**
|
|
|
* The deep copy data append the end of the esp_hidh_event_data_t, move the data pointer to the correct address. This is
|
|
|
- * a workaround way, it's better to use flexiable array in the interface.
|
|
|
+ * a workaround way, it's better to use flexible array in the interface.
|
|
|
*/
|
|
|
-void esp_hidh_process_event_data_handler(void *event_handler_arg, esp_event_base_t event_base, int32_t event_id,
|
|
|
- void *event_data)
|
|
|
+void esp_hidh_preprocess_event_handler(void *event_handler_arg, esp_event_base_t event_base, int32_t event_id,
|
|
|
+ void *event_data)
|
|
|
{
|
|
|
esp_hidh_event_t event = (esp_hidh_event_t)event_id;
|
|
|
esp_hidh_event_data_t *param = (esp_hidh_event_data_t *)event_data;
|
|
|
@@ -824,19 +787,25 @@ void esp_hidh_process_event_data_handler(void *event_handler_arg, esp_event_base
|
|
|
param->feature.data = (uint8_t *)param + sizeof(esp_hidh_event_data_t);
|
|
|
}
|
|
|
break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void esp_hidh_post_process_event_handler(void *event_handler_arg, esp_event_base_t event_base, int32_t event_id,
|
|
|
+ void *event_data)
|
|
|
+{
|
|
|
+ esp_hidh_event_t event = (esp_hidh_event_t)event_id;
|
|
|
+ esp_hidh_event_data_t *param = (esp_hidh_event_data_t *)event_data;
|
|
|
+
|
|
|
+ switch (event) {
|
|
|
case ESP_HIDH_OPEN_EVENT:
|
|
|
if (param->open.status != ESP_OK) {
|
|
|
- if (s_esp_hidh_timer && !esp_timer_is_active(s_esp_hidh_timer) &&
|
|
|
- esp_timer_start_once(s_esp_hidh_timer, ESP_HIDH_DELAY_FREE_TO) != ESP_OK) {
|
|
|
- ESP_LOGE(TAG, "%s set hidh timer failed!", __func__);
|
|
|
- }
|
|
|
+ esp_hidh_dev_free_inner(param->open.dev);
|
|
|
}
|
|
|
break;
|
|
|
case ESP_HIDH_CLOSE_EVENT:
|
|
|
- if (s_esp_hidh_timer && !esp_timer_is_active(s_esp_hidh_timer) &&
|
|
|
- esp_timer_start_once(s_esp_hidh_timer, ESP_HIDH_DELAY_FREE_TO) != ESP_OK) {
|
|
|
- ESP_LOGE(TAG, "%s set hidh timer failed!", __func__);
|
|
|
- }
|
|
|
+ esp_hidh_dev_free_inner(param->close.dev);
|
|
|
break;
|
|
|
default:
|
|
|
break;
|