From ae27426dd0c0ce4eaf28ffe28901a5c5733bad1e Mon Sep 17 00:00:00 2001 From: Alexey Zholtikov Date: Sun, 13 Sep 2026 08:06:13 +0300 Subject: [PATCH] feat: added encoder status (increased / reduced) --- README.md | 4 ++-- idf_component.yml | 2 +- include/zh_encoder.h | 3 +++ version.txt | 2 +- zh_encoder.c | 7 +++++-- 5 files changed, 12 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 82c1162..46271d5 100644 --- a/README.md +++ b/README.md @@ -82,11 +82,11 @@ void zh_encoder_event_handler(void *arg, esp_event_base_t event_base, int32_t ev { case ZH_BUTTON_EVENT: zh_encoder_button_event_on_isr_t *button_event = event_data; - printf("Encoder number %d button %s.\n", button_event->encoder_number, (button_event->button_status == 1) ? "released" : "pressed"); + printf("Encoder number %d button was %s.\n", button_event->encoder_number, (button_event->button_status == true) ? "released" : "pressed"); break; case ZH_ENCODER_EVENT: zh_encoder_event_on_isr_t *encoder_event = event_data; - printf("Encoder number %d position %0.3f.\n", encoder_event->encoder_number, encoder_event->encoder_position); + printf("Encoder number %d position %0.3f was %s.\n", encoder_event->encoder_number, encoder_event->encoder_position, (encoder_event->encoder_status == true) ? "increased" : "reduced"); break; default: break; diff --git a/idf_component.yml b/idf_component.yml index 95cfbe9..eebf589 100644 --- a/idf_component.yml +++ b/idf_component.yml @@ -1,6 +1,6 @@ description: ESP32 ESP-IDF component for rotary encoder url: https://github.com/aZholtikov/zh_encoder -version: "3.0.1" +version: "3.1.0" license: "Apache-2.0" maintainers: - "Alexey Zholtikov " diff --git a/include/zh_encoder.h b/include/zh_encoder.h index fca99ea..487c2c9 100644 --- a/include/zh_encoder.h +++ b/include/zh_encoder.h @@ -18,6 +18,8 @@ #pragma once +#include "math.h" +#include "string.h" #include "esp_log.h" #include "driver/gpio.h" #include "driver/pulse_cnt.h" @@ -119,6 +121,7 @@ extern "C" { float encoder_position; /*!< Encoder current position */ uint8_t encoder_number; /*!< Encoder unique number */ + bool encoder_status; /*!< Encoder status (true when position increased, false when position reduced) */ } zh_encoder_event_on_isr_t; /** diff --git a/version.txt b/version.txt index 13d683c..a0cd9f0 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.0.1 \ No newline at end of file +3.1.0 \ No newline at end of file diff --git a/zh_encoder.c b/zh_encoder.c index 27bf3bb..858c830 100644 --- a/zh_encoder.c +++ b/zh_encoder.c @@ -496,6 +496,7 @@ static void IRAM_ATTR _zh_encoder_isr_processing_task(void *pvParameter) while (xQueueReceive(_queue_handle, &encoder_queue, portMAX_DELAY) == pdTRUE) { bool is_value_changed = false; + bool encoder_status = false; zh_encoder_handle_t *encoder_handle = encoder_queue.handle; switch (encoder_queue.watch_point_value) { @@ -508,6 +509,7 @@ static void IRAM_ATTR _zh_encoder_isr_processing_task(void *pvParameter) encoder_handle->encoder_position = encoder_handle->encoder_max_value; } is_value_changed = true; + encoder_status = true; } break; case ZH_ENCODER_DIRECTION_CCW: @@ -529,11 +531,12 @@ static void IRAM_ATTR _zh_encoder_isr_processing_task(void *pvParameter) is_value_changed = false; zh_encoder_event_on_isr_t encoder_data = {0}; encoder_data.encoder_number = encoder_handle->encoder_number; - if (encoder_handle->encoder_position < 0 && encoder_handle->encoder_position > -1e-12) + if (fabsf(encoder_handle->encoder_position) < 1e-6f) { - encoder_handle->encoder_position = 0; + memset(&encoder_handle->encoder_position, 0, sizeof(float)); } encoder_data.encoder_position = encoder_handle->encoder_position; + encoder_data.encoder_status = encoder_status; ZH_ERROR_CHECK_CONT(esp_event_post(ZH_ENCODER, ZH_ENCODER_EVENT, &encoder_data, sizeof(zh_encoder_event_on_isr_t), 1000 / portTICK_PERIOD_MS) == ESP_OK, ++_stats.event_post_error, "Encoder isr processing failed. Failed to post interrupt event."); } _stats.min_stack_size = (uint32_t)uxTaskGetStackHighWaterMark(NULL);