feat: 旋转旋钮支持按速度进行增益。
This commit is contained in:
parent
df476e4f9c
commit
ac8520f31f
@ -51,6 +51,10 @@ static encoder_state_t encoder_1_state = {.key = ui_input_raw_key_encoder_1,
|
|||||||
|
|
||||||
uint8_t level_byte;
|
uint8_t level_byte;
|
||||||
int8_t delta = 0;
|
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) {
|
static void IRAM_ATTR gpio_isr_handler(void *arg) {
|
||||||
xQueueSendFromISR(ui_input_raw_event, NULL, NULL);
|
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};
|
s_ui_input_t event = {.value = delta};
|
||||||
if (state->key == ui_input_raw_key_encoder_0) {
|
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) {
|
if (state->value & 1) {
|
||||||
event.key = ui_input_key_computer_volume;
|
event.key = ui_input_key_computer_volume;
|
||||||
} else {
|
} 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) {
|
} else if (state->key == ui_input_raw_key_encoder_1) {
|
||||||
if (state->value & 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;
|
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);
|
gui_change_strip_level(display_ambient_lighting_level);
|
||||||
} else {
|
} else {
|
||||||
event.key = ui_input_key_display_1_brightness;
|
event.key = ui_input_key_display_0_brightness;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
xQueueSend(ui_input_event, &event, NULL);
|
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) {
|
static void ui_input_raw_handler(void *arg) {
|
||||||
@ -193,7 +222,7 @@ void ui_input_init(void) {
|
|||||||
gpio_config(&io_conf);
|
gpio_config(&io_conf);
|
||||||
|
|
||||||
// start encoder task
|
// 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);
|
ui_input_raw_event = xQueueCreate(10, 0);
|
||||||
|
|
||||||
// hook isr handler for specific gpio pin
|
// hook isr handler for specific gpio pin
|
||||||
|
Loading…
Reference in New Issue
Block a user