main/task_out.c

Sun, 16 Apr 2023 12:27:12 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Sun, 16 Apr 2023 12:27:12 +0200
changeset 30
7448b8dd4288
parent 9
1659bd3c7a2b
permissions
-rw-r--r--

Preparations for BLE GATT. Added extra time after INA219 is powered on before measurement. Reduced LEDC frequency to 60 Hz, that makes the LED lights less nervous. Hardware mod on output 4, now needs external pulldown resistor.

/**
 * @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