#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_timer.h"
#define LED_RED_PIN GPIO_NUM_13
#define LED_GREEN_PIN GPIO_NUM_5
#define LED_BLUE_PIN GPIO_NUM_4
typedef enum{
OFF,
ON,
BLINK
}MODE;
typedef struct{
const char *name;
gpio_num_t pin;
bool isActiveHigh;
int frequency;
MODE Mode;
int state;
}LED;
void ledInit(LED *led){
gpio_reset_pin(led->pin);
gpio_set_direction(led->pin, GPIO_MODE_OUTPUT);
}
void ledProcess(LED *led){
bool levelState;
if(led->isActiveHigh){
levelState = led->state ? 1 : 0;
}else{
levelState = led->state ? 0 : 1;
}
gpio_set_level(led->pin, levelState);
int64_t now = esp_timer_get_time()/1000; //get time per Ms
printf("[%lld ms] %s %s \n", now, led->name, led->state ? "ON" : "OFF");
}
void ledOff(LED *led){
led->state = 0;
ledProcess(led);
}
void ledOn(LED *led){
led->state = 1;
ledProcess(led);
}
void ledToggle(LED *led){
led->state = !led->state;
ledProcess(led);
}
void ledRun(LED *led){
while(1){
switch(led->Mode){
case OFF:
ledOff(led);
vTaskDelay(pdMS_TO_TICKS(1000));
break;
case ON:
ledOn(led);
vTaskDelay(pdMS_TO_TICKS(1000));
break;
case BLINK:
int delayToggle = (int)(1000 / (led->frequency*2));
ledToggle(led);
vTaskDelay(pdMS_TO_TICKS(delayToggle));
break;
}
}
}
void ledHandler(void *param){
LED *led = (LED *)param;
ledRun(led);
}
void app_main(void) {
static LED ledRed = {"RED", LED_RED_PIN, 0, 10, BLINK, 0};
static LED ledGreen = {"GREEN", LED_GREEN_PIN, 1, 5, BLINK, 0};
static LED ledBlue = {"BLUE", LED_BLUE_PIN, 1, 2, BLINK, 0};
ledInit(&ledRed);
ledInit(&ledGreen);
ledInit(&ledBlue);
xTaskCreate(ledHandler, "RED LED", 2048, &ledRed, 1, NULL);
xTaskCreate(ledHandler, "GREEN LED", 2048, &ledGreen, 1, NULL);
xTaskCreate(ledHandler, "BLUE LED", 2048, &ledBlue, 1, NULL);
}