diff --git a/main/ui_input.c b/main/ui_input.c index dab1bfb..5ca94a2 100644 --- a/main/ui_input.c +++ b/main/ui_input.c @@ -51,6 +51,10 @@ static encoder_state_t encoder_1_state = {.key = ui_input_raw_key_encoder_1, uint8_t level_byte; int8_t delta = 0; +int64_t ec0_last_time = 0; +int64_t ec1_last_time = 0; +int64_t ec0_interval = 0; +int64_t ec1_interval = 0; static void IRAM_ATTR gpio_isr_handler(void *arg) { xQueueSendFromISR(ui_input_raw_event, NULL, NULL); @@ -149,22 +153,47 @@ static void encoder_value_change(encoder_state_t *state) { s_ui_input_t event = {.value = delta}; if (state->key == ui_input_raw_key_encoder_0) { + ec0_interval = esp_timer_get_time() - ec0_last_time; + if (ec0_interval < 10000) { // 100ms + event.value = event.value * 5; + } else if (ec0_interval < 20000) { // 100ms + event.value = event.value * 4; + } else if (ec0_interval < 50000) { // 100ms + event.value = event.value * 3; + } else if (ec0_interval < 100000) { // 100ms + event.value = event.value * 2; + } + ec0_last_time = esp_timer_get_time(); + if (state->value & 1) { event.key = ui_input_key_computer_volume; } else { - event.key = ui_input_key_display_0_brightness; + event.key = ui_input_key_display_1_brightness; } } else if (state->key == ui_input_raw_key_encoder_1) { if (state->value & 1) { + ec1_interval = esp_timer_get_time() - ec1_last_time; + if (ec1_interval < 20000) { // 100ms + event.value = event.value * 7; + } else if (ec1_interval < 30000) { // 100ms + event.value = event.value * 5; + } else if (ec1_interval < 40000) { // 100ms + event.value = event.value * 3; + } else if (ec1_interval < 50000) { + event.value = event.value * 2; + } + ec1_last_time = esp_timer_get_time(); + event.key = ui_input_key_display_ambient_lighting_level; - led_strip_set_brightness(display_ambient_lighting_level + delta); + led_strip_set_brightness(display_ambient_lighting_level + event.value); gui_change_strip_level(display_ambient_lighting_level); } else { - event.key = ui_input_key_display_1_brightness; + event.key = ui_input_key_display_0_brightness; } } xQueueSend(ui_input_event, &event, NULL); - ESP_LOGI(UI_INPUT_TAG, "key: %d, delta: %d", state->key, delta); + ESP_LOGI(UI_INPUT_TAG, "key: %d, delta: %d. delay: %lld, %lld", state->key, + event.value, ec0_interval, ec1_interval); } static void ui_input_raw_handler(void *arg) { @@ -193,7 +222,7 @@ void ui_input_init(void) { gpio_config(&io_conf); // start encoder task - ui_input_event = xQueueCreate(10, sizeof(s_ui_input_t)); + ui_input_event = xQueueCreate(5, sizeof(s_ui_input_t)); ui_input_raw_event = xQueueCreate(10, 0); // hook isr handler for specific gpio pin