main/task_out.c

changeset 9
1659bd3c7a2b
child 30
7448b8dd4288
equal deleted inserted replaced
8:115e93bf8796 9:1659bd3c7a2b
1 /**
2 * @file task_out.c
3 * @brief The FreeRTOS task to drive the outputs.
4 */
5
6
7 #include "config.h"
8
9
10 static const char *TAG = "task_out";
11
12
13
14 #define OutputPin1 CONFIG_OUT1_PIN
15 #define OutputPin2 CONFIG_OUT2_PIN
16 #define OutputPin3 CONFIG_OUT3_PIN
17 #define OutputPin4 CONFIG_OUT4_PIN
18
19 SemaphoreHandle_t xSemaphoreOUT = NULL; ///< Semaphore OUT task
20 OUT_State *out_state; ///< Public state for other tasks
21
22 extern uint32_t Alarm;
23 extern uint8_t Relay1;
24 extern uint8_t Relay2;
25 extern uint8_t Dimmer3;
26 extern uint8_t Dimmer4;
27
28
29 /*
30 * Task to drive the outputs.
31 */
32 void task_out(void *pvParameter)
33 {
34 int val;
35
36 ESP_LOGI(TAG, "Starting task OUT %d %d %d %d", Relay1, Relay2, Dimmer3, Dimmer4);
37
38 xSemaphoreOUT = xSemaphoreCreateMutex();
39 out_state = malloc(sizeof(OUT_State));
40 out_state->error = OUT_ERR_NONE;
41 out_state->out1 = 0;
42 out_state->out2 = 0;
43 out_state->out3 = 0;
44 out_state->out4 = 0;
45
46 gpio_reset_pin(OutputPin1);
47 gpio_reset_pin(OutputPin2);
48 gpio_reset_pin(OutputPin3);
49 gpio_reset_pin(OutputPin4);
50
51 gpio_set_direction(OutputPin1, GPIO_MODE_OUTPUT);
52 gpio_set_direction(OutputPin2, GPIO_MODE_OUTPUT);
53
54 /*
55 * Prepare the LEDC PWM channels
56 */
57 ledc_timer_config_t ledc_timer = {
58 .speed_mode = LEDC_LOW_SPEED_MODE, ///< Use high speed timer
59 .timer_num = LEDC_TIMER_0, ///< Timer 0
60 .duty_resolution = LEDC_TIMER_10_BIT, ///< 10 bits resolution
61 .freq_hz = 100, ///< 100 Hz
62 .clk_cfg = LEDC_AUTO_CLK ///< Auto select PWM clock
63 };
64 ledc_timer_config(&ledc_timer);
65
66 ledc_channel_config_t dimmer_channel3 = {
67 .channel = LEDC_CHANNEL_0,
68 .duty = 0, ///< Default 0%
69 .gpio_num = OutputPin3, ///< Dimmer3 pin
70 .speed_mode = LEDC_LOW_SPEED_MODE,
71 .hpoint = 0,
72 .intr_type = LEDC_INTR_DISABLE,
73 .timer_sel = LEDC_TIMER_0 ///< Timer 0
74 };
75 ledc_channel_config(&dimmer_channel3);
76
77 ledc_channel_config_t dimmer_channel4 = {
78 .channel = LEDC_CHANNEL_1,
79 .duty = 1024, ///< Default 0% (inverted value)
80 .gpio_num = OutputPin4, ///< Dimmer4 pin
81 .speed_mode = LEDC_LOW_SPEED_MODE,
82 .hpoint = 0,
83 .intr_type = LEDC_INTR_DISABLE,
84 .timer_sel = LEDC_TIMER_0 ///< Timer 0
85 };
86 ledc_channel_config(&dimmer_channel4);
87
88 ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, 0);
89 ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0);
90 ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_1, 0);
91 ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_1);
92
93 /*
94 * Task loop forever.
95 */
96 ESP_LOGI(TAG, "Starting loop OUT task");
97
98 while (1) {
99
100 if (xSemaphoreTake(xSemaphoreOUT, 25) == pdTRUE) {
101
102 if (out_state->out1 != Relay1) {
103 out_state->out1 = Relay1;
104 if (Alarm)
105 gpio_set_level(OutputPin1, 0);
106 else
107 gpio_set_level(OutputPin1, Relay1);
108 // ESP_LOGI(TAG, "Relay1 %d %d", OutputPin1, Relay1);
109 }
110 if (out_state->out2 != Relay2) {
111 out_state->out2 = Relay2;
112 if (Alarm)
113 gpio_set_level(OutputPin2, 0);
114 else
115 gpio_set_level(OutputPin2, Relay2);
116 // ESP_LOGI(TAG, "Relay2 %d %d", OutputPin2, Relay2);
117 }
118
119 if (out_state->out3 != Dimmer3) {
120 if (out_state->out3 < Dimmer3) {
121 out_state->out3++;
122 } else if (out_state->out3 > Dimmer3) {
123 out_state->out3--;
124 }
125 if (Alarm)
126 val = 0;
127 else
128 val = (out_state->out3 * 1024) / 100;
129 //ESP_LOGI(TAG, "Dimmer 3 %d val %d", out_state->out3, val);
130 ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, val);
131 ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0);
132 }
133 if (out_state->out4 != Dimmer4) {
134 if (out_state->out4 < Dimmer4) {
135 out_state->out4++;
136 } else if (out_state->out4 > Dimmer4) {
137 out_state->out4--;
138 }
139 if (Alarm)
140 val = 0;
141 else
142 val = (out_state->out4 * 1024) / 100;
143 //ESP_LOGI(TAG, "Dimmer 4 %d val %d", out_state->out4, val);
144 ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_1, val);
145 ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_1);
146 }
147 xSemaphoreGive(xSemaphoreOUT);
148 }
149 vTaskDelay(20 / portTICK_PERIOD_MS);
150 }
151 }

mercurial