main/task_out.c

Thu, 20 Apr 2023 14:01:29 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Thu, 20 Apr 2023 14:01:29 +0200
changeset 35
9827c5a08c63
parent 30
7448b8dd4288
permissions
-rw-r--r--

Version 0.4.2, some code cleanup.

/**
 * @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 = 60,					///< 60 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       = 0,				///< Default 0%
        .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