diff -r 115e93bf8796 -r 1659bd3c7a2b main/task_out.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main/task_out.c Sat Apr 01 21:06:59 2023 +0200 @@ -0,0 +1,151 @@ +/** + * @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); + } +}