From a5f4b7116332a005580a10f4139bd13a936a6015 Mon Sep 17 00:00:00 2001 From: Drath Date: Thu, 19 Mar 2026 20:59:29 +0100 Subject: [PATCH] IDENTIFICATION!!!!!!! --- README.md | 1 - include/light_driver.h | 3 ++- main/light_driver.c | 32 +++++++++++++++++++++----------- main/zigbee.c | 3 ++- 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 77baa7d..c6baa97 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,6 @@ Generalnie co ma dzialac to juz dziala, thank fuck. Ja pierdole ale api do zigbe ### TODO - hardware - weird start up behavior - - identyfikacja, niby opcjonalna ale fajny bajer - factory reset zigbee zeby bylo legitnie, dzwonisz po `esp_zb_factory_reset();` - status LED zeby bylo legitnie (pokazuje factory reset i OTA kiedys) - ota? diff --git a/include/light_driver.h b/include/light_driver.h index 770db95..c0e8f25 100644 --- a/include/light_driver.h +++ b/include/light_driver.h @@ -8,8 +8,9 @@ #include "esp_err.h" #include "stdbool.h" -void light_driver_task(void *pvParameter); void light_driver_set_level(uint8_t level); void light_driver_set_power(bool power); +void light_driver_identify(void); +void light_driver_task(void *pvParameter); #endif //LIGHT_DRIVER_H \ No newline at end of file diff --git a/main/light_driver.c b/main/light_driver.c index 264ab77..1f5c86b 100644 --- a/main/light_driver.c +++ b/main/light_driver.c @@ -16,6 +16,7 @@ static const uint8_t light_gpio = 15; static const uint16_t light_pwm_freq = 65000; static const ledc_timer_bit_t light_pwm_resolution = LEDC_TIMER_10_BIT; static const double light_lowest_duty_pct = 0.05; // lowest duty percentage where the LEDs still light up nice +static const uint8_t light_identify_level_delta = 60; /* no need to tweak this stuff */ static const ledc_channel_t light_ledc_channel = LEDC_CHANNEL_0; @@ -27,6 +28,12 @@ SemaphoreHandle_t light_sem = NULL; static uint8_t light_target_level = 0; static uint16_t gamma_lut[ZIGBEE_LIGHT_LEVELS + 1]; +uint16_t light_driver_get_level(void) { + xSemaphoreTake(light_sem, portMAX_DELAY); + const uint16_t lvl = light_target_level; + xSemaphoreGive(light_sem); + return MIN(254, lvl); +} void light_driver_set_level(const uint8_t level) { xSemaphoreTake(light_sem, portMAX_DELAY); @@ -34,11 +41,17 @@ void light_driver_set_level(const uint8_t level) { xSemaphoreGive(light_sem); } -uint16_t get_level(void) { - xSemaphoreTake(light_sem, portMAX_DELAY); - const uint16_t lvl = light_target_level; - xSemaphoreGive(light_sem); - return MIN(254, lvl); +void light_driver_set_power(const bool power) { + light_driver_set_level(power ? light_driver_get_level() : 0); +} + +void light_driver_identify(void) { + const uint8_t level = light_driver_get_level(); + light_driver_set_level(MIN(level + light_identify_level_delta, 254)); + vTaskDelay(pdMS_TO_TICKS(350)); + light_driver_set_level(MAX(level - light_identify_level_delta, 0)); + vTaskDelay(pdMS_TO_TICKS(350)); + light_driver_set_level(level); } void light_driver_task(void *pvParameter) { @@ -61,6 +74,7 @@ void light_driver_task(void *pvParameter) { ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer)); ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel)); + ESP_ERROR_CHECK(ledc_fade_func_install(0)); static uint8_t prev_level = 0; // pre-compute gamma table @@ -81,8 +95,8 @@ void light_driver_task(void *pvParameter) { ESP_LOGI(TAG, "ledc driver initialized, f=%d Hz, %d step resolution", light_pwm_freq, light_brightness_steps); light_driver_set_level(0); - while (true) { - const uint16_t tgt = get_level(); + while (true) { // NOLINT ye its a loop + const uint16_t tgt = light_driver_get_level(); if (tgt != prev_level) { const int diff = tgt - prev_level; const int abs_diff = abs(diff); @@ -98,8 +112,4 @@ void light_driver_task(void *pvParameter) { } vTaskDelay(pdMS_TO_TICKS(20)); } -} - -void light_driver_set_power(const bool power) { - light_driver_set_level(power ? get_level() : 0); } \ No newline at end of file diff --git a/main/zigbee.c b/main/zigbee.c index 04e521d..51ca527 100644 --- a/main/zigbee.c +++ b/main/zigbee.c @@ -50,6 +50,7 @@ static esp_err_t zigbee_attribute_handler(const esp_zb_zcl_set_attr_value_messag case ESP_ZB_ZCL_CLUSTER_ID_IDENTIFY: ESP_LOGI(TAG, "Identify requested"); + light_driver_identify(); break; case ESP_ZB_ZCL_CLUSTER_ID_ON_OFF: @@ -163,7 +164,7 @@ void zigbee_endpoint_init(esp_zb_ep_list_t *ep_list, esp_zb_cluster_list_t *clus } /* appearently you cant rename this? */ -void esp_zb_app_signal_handler(const esp_zb_app_signal_t* signal_s) { +void esp_zb_app_signal_handler(esp_zb_app_signal_t* signal_s) { uint32_t* p_sg_p = signal_s->p_app_signal; const esp_err_t err_status = signal_s->esp_err_status; const esp_zb_app_signal_type_t sig_type = *p_sg_p;