IDENTIFICATION!!!!!!!

This commit is contained in:
2026-03-19 20:59:29 +01:00
parent 81b589df21
commit a5f4b71163
4 changed files with 25 additions and 14 deletions

View File

@@ -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?

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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;