main/task_out.c

changeset 9
1659bd3c7a2b
child 30
7448b8dd4288
--- /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);
+    }
+}

mercurial