From 53b675040eaf4bcb736a2ab99569282e0aba3de1 Mon Sep 17 00:00:00 2001 From: demik Date: Tue, 18 Jun 2024 11:54:42 +0200 Subject: [PATCH] added half click feature (on BT right click) --- ChangeLog.md | 4 ++++ main/adb.c | 7 +++++-- main/blue.c | 52 ++++++++++++++++++++++++++++++++++++---------------- 3 files changed, 45 insertions(+), 18 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index da4cf11..29daf5f 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,3 +1,7 @@ +## v1.4.7 +- new feature: half click on right BT click (similar to some ADB devices) +- workarounds for v1.4.6 green led regression + ## v1.4.6 - added support for ADB composite devices (Kensignton and some Joysticks) - fixed ADB start and stop bit times (65 µs vs 70 µs, error in AN591) diff --git a/main/adb.c b/main/adb.c index 36e2964..5f09b04 100644 --- a/main/adb.c +++ b/main/adb.c @@ -246,8 +246,11 @@ void adb_task_host(void *pvParameters) { int8_t move = 0; uint8_t state = ADB_S_PROBE; - /* wait a little for the LED tasks to start on the other core */ - vTaskDelay(200 / portTICK_PERIOD_MS); + /* + * wait a little for the LED tasks to start on the other core + * starting IDF 5.2.2, we need this. Looks like the init is now too fast on app core + */ + vTaskDelay(200 / portTICK_PERIOD_MS); /* put green led to steady if BT is disabled. Otherwise BT init will do it */ if (gpio_get_level(GPIO_BTOFF) == 0) diff --git a/main/blue.c b/main/blue.c index aebf3e9..feaed2d 100644 --- a/main/blue.c +++ b/main/blue.c @@ -285,31 +285,48 @@ void blue_h_close(esp_hidh_event_data_t *p) { } static void blue_handle_button(uint8_t buttons) { + static bool locked = false; + static bool releasable = true; static bool status = BLUE_BUTTON_N; // Keep state buttons = buttons & (BLUE_BUTTON_1 | BLUE_BUTTON_2 | BLUE_BUTTON_3); if (status && buttons) return ; - if (status == BLUE_BUTTON_N && buttons == BLUE_BUTTON_N) + if (status == BLUE_BUTTON_N && buttons == BLUE_BUTTON_N && !locked) return ; + if (buttons == BLUE_BUTTON_2 && locked && !releasable) + return ; + if (status == BLUE_BUTTON_N && buttons == BLUE_BUTTON_N && locked) { + releasable = true; + return ; + } /* release button */ - if (status && buttons == BLUE_BUTTON_N) { + if (status && buttons == BLUE_BUTTON_N && !locked) { xTaskNotify(t_click, 0, eSetValueWithOverwrite); status = 0; ESP_LOGD(TAG, "button released"); return ; } - /* press button */ + /* stick button on right click */ + if (status == BLUE_BUTTON_N && buttons == BLUE_BUTTON_2 && !locked) { + xTaskNotify(t_click, 1, eSetValueWithOverwrite); + locked = true; + releasable = false; + ESP_LOGD(TAG, "button locked"); + return ; + } + + /* press button (simple click) */ if (status == BLUE_BUTTON_N && buttons) { xTaskNotify(t_click, 1, eSetValueWithOverwrite); + locked = false; status = 1; ESP_LOGD(TAG, "button pressed"); return ; } - } static void blue_h_init(void) { @@ -346,13 +363,16 @@ void blue_init(void) /* complains about wrong data len on BOOT mode and CCONTROL */ esp_log_level_set("BT_HIDH", ESP_LOG_ERROR); - /* - * at this point, everything but bluetooth is started. - * put green steady, start blinking blue and keep scanning until a device is found - */ + /* + * at this point, everything but bluetooth is started. + * put green steady, start blinking blue and keep scanning until a device is found + * + * starting IDF 5.2.2, sometimes the first xTaskNotify() call may be lost. why ? + */ - xTaskNotify(t_green, LED_ON, eSetValueWithOverwrite); - xTaskNotify(t_blue, LED_FAST, eSetValueWithOverwrite); + xTaskNotify(t_green, LED_ON, eSetValueWithOverwrite); + xTaskNotify(t_green, LED_ON, eSetValueWithOverwrite); + xTaskNotify(t_blue, LED_FAST, eSetValueWithOverwrite); if (adb_is_host()) blue_d_init(); @@ -384,7 +404,7 @@ void blue_h_input(esp_hidh_dev_t *dev, uint8_t *data, uint16_t length) { /* * A friend of mine did this for a beer, it helps a little with high DPI mouses - * This is a precalculated table that looks like a squadhed arctan() + * This is a precalculated table that looks like a squared arctan() */ const unsigned char hid2quad[] = { @@ -467,11 +487,11 @@ void blue_h_input(esp_hidh_dev_t *dev, uint8_t *data, uint16_t length) { } void blue_h_open(esp_hidh_event_data_t *p) { - const uint8_t *bda = NULL; + const uint8_t *bda = NULL; configASSERT(p != NULL); - bda = esp_hidh_dev_bda_get(p->open.dev); - ESP_LOGI(TAG, "opened connection with " ESP_BD_ADDR_STR, ESP_BD_ADDR_HEX(bda)); + bda = esp_hidh_dev_bda_get(p->open.dev); + ESP_LOGI(TAG, "opened connection with " ESP_BD_ADDR_STR, ESP_BD_ADDR_HEX(bda)); /* Dump various info on console */ blue_hid_rm_get(p->open.dev); @@ -482,8 +502,8 @@ void blue_h_open(esp_hidh_event_data_t *p) { } blue_pointers++; - xTaskNotify(t_blue, LED_ON, eSetValueWithOverwrite); - gpio_output_enable(); + xTaskNotify(t_blue, LED_ON, eSetValueWithOverwrite); + gpio_output_enable(); } /* get specific report from report map matching specified usage + type + protocol */