Sat, 15 Apr 2023 13:29:40 +0200
Final release and installed for production.
/** * @file task_out.c * @brief The FreeRTOS task to drive the outputs. */ #include "config.h" static const char *TAG = "task_out"; #define OutputPin1 CONFIG_OUT1_PIN #define OutputPin2 CONFIG_OUT2_PIN #define OutputPin3 CONFIG_OUT3_PIN #define OutputPin4 CONFIG_OUT4_PIN SemaphoreHandle_t xSemaphoreOUT = NULL; ///< Semaphore OUT task OUT_State *out_state; ///< Public state for other tasks extern uint32_t Alarm; extern uint8_t Relay1; extern uint8_t Relay2; extern uint8_t Dimmer3; extern uint8_t Dimmer4; /* * Task to drive the outputs. */ void task_out(void *pvParameter) { int val; ESP_LOGI(TAG, "Starting task OUT %d %d %d %d", Relay1, Relay2, Dimmer3, Dimmer4); xSemaphoreOUT = xSemaphoreCreateMutex(); out_state = malloc(sizeof(OUT_State)); out_state->error = OUT_ERR_NONE; out_state->out1 = 0; out_state->out2 = 0; out_state->out3 = 0; out_state->out4 = 0; gpio_reset_pin(OutputPin1); gpio_reset_pin(OutputPin2); gpio_reset_pin(OutputPin3); gpio_reset_pin(OutputPin4); gpio_set_direction(OutputPin1, GPIO_MODE_OUTPUT); gpio_set_direction(OutputPin2, GPIO_MODE_OUTPUT); /* * Prepare the LEDC PWM channels */ ledc_timer_config_t ledc_timer = { .speed_mode = LEDC_LOW_SPEED_MODE, ///< Use high speed timer .timer_num = LEDC_TIMER_0, ///< Timer 0 .duty_resolution = LEDC_TIMER_10_BIT, ///< 10 bits resolution .freq_hz = 100, ///< 100 Hz .clk_cfg = LEDC_AUTO_CLK ///< Auto select PWM clock }; ledc_timer_config(&ledc_timer); ledc_channel_config_t dimmer_channel3 = { .channel = LEDC_CHANNEL_0, .duty = 0, ///< Default 0% .gpio_num = OutputPin3, ///< Dimmer3 pin .speed_mode = LEDC_LOW_SPEED_MODE, .hpoint = 0, .intr_type = LEDC_INTR_DISABLE, .timer_sel = LEDC_TIMER_0 ///< Timer 0 }; ledc_channel_config(&dimmer_channel3); ledc_channel_config_t dimmer_channel4 = { .channel = LEDC_CHANNEL_1, .duty = 1024, ///< Default 0% (inverted value) .gpio_num = OutputPin4, ///< Dimmer4 pin .speed_mode = LEDC_LOW_SPEED_MODE, .hpoint = 0, .intr_type = LEDC_INTR_DISABLE, .timer_sel = LEDC_TIMER_0 ///< Timer 0 }; ledc_channel_config(&dimmer_channel4); ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, 0); ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0); ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_1, 0); ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_1); /* * Task loop forever. */ ESP_LOGI(TAG, "Starting loop OUT task"); while (1) { if (xSemaphoreTake(xSemaphoreOUT, 25) == pdTRUE) { if (out_state->out1 != Relay1) { out_state->out1 = Relay1; if (Alarm) gpio_set_level(OutputPin1, 0); else gpio_set_level(OutputPin1, Relay1); // ESP_LOGI(TAG, "Relay1 %d %d", OutputPin1, Relay1); } if (out_state->out2 != Relay2) { out_state->out2 = Relay2; if (Alarm) gpio_set_level(OutputPin2, 0); else gpio_set_level(OutputPin2, Relay2); // ESP_LOGI(TAG, "Relay2 %d %d", OutputPin2, Relay2); } if (out_state->out3 != Dimmer3) { if (out_state->out3 < Dimmer3) { out_state->out3++; } else if (out_state->out3 > Dimmer3) { out_state->out3--; } if (Alarm) val = 0; else val = (out_state->out3 * 1024) / 100; //ESP_LOGI(TAG, "Dimmer 3 %d val %d", out_state->out3, val); ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, val); ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0); } if (out_state->out4 != Dimmer4) { if (out_state->out4 < Dimmer4) { out_state->out4++; } else if (out_state->out4 > Dimmer4) { out_state->out4--; } if (Alarm) val = 0; else val = (out_state->out4 * 1024) / 100; //ESP_LOGI(TAG, "Dimmer 4 %d val %d", out_state->out4, val); ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_1, val); ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_1); } xSemaphoreGive(xSemaphoreOUT); } vTaskDelay(20 / portTICK_PERIOD_MS); } }