#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"

//PROTÓTIPO DE FUNÇÕES===================================================
void app_main(void);
void Task_dis7seg(void *pvParameter);

//DEFINIÇÕES E CONSTATNTES
#define delay(value) vTaskDelay(value/portTICK_PERIOD_MS)


//WOKWI
#define LED_A GPIO_NUM_21
#define LED_B GPIO_NUM_22
#define LED_C GPIO_NUM_23
#define LED_D GPIO_NUM_27
#define LED_E GPIO_NUM_14
#define LED_F GPIO_NUM_13
#define LED_G GPIO_NUM_12


#define GPIO_OUTPUT_PIN_SEL ((1ULL<<LED_A) | (1ULL<<LED_B) | (1ULL<<LED_C) | (1ULL<<LED_D) | (1ULL<<LED_E) | (1ULL<<LED_F) | (1ULL<<LED_G))//VARIÁVEIS

//VARIÁVEIS
int statusLeds=0;



void Task_dis7seg(void *pvParameter){

	//CONFIGURANDO SAÍDAS
	gpio_config_t io_config = {};//variável descritora
	io_config.intr_type = GPIO_INTR_DISABLE;//desabilita interrupção externa
	io_config.mode = GPIO_MODE_OUTPUT;//configura GPIO como saídas
	io_config.pin_bit_mask = GPIO_OUTPUT_PIN_SEL;//carrega GPIOs configuradas
	gpio_config(&io_config);//configura GPIO conforme descritor

	gpio_set_level(LED_A, 1);
	gpio_set_level(LED_B, 1);
	gpio_set_level(LED_C, 1);
	gpio_set_level(LED_D, 1);
	gpio_set_level(LED_E, 1);
	gpio_set_level(LED_F, 1);
	gpio_set_level(LED_G, 1);
	delay(1000);

	while(1){
		printf("============================================================\n");
		printf("Status LED: %d\n", statusLeds);
		switch(statusLeds){
			case 0:
				gpio_set_level(LED_A, 0);
				gpio_set_level(LED_B, 0);
				gpio_set_level(LED_C, 0);
				gpio_set_level(LED_D, 0);
				gpio_set_level(LED_E, 0);
				gpio_set_level(LED_F, 0);
				gpio_set_level(LED_G, 1);
				break;
			case 1:
				gpio_set_level(LED_A, 1);
				gpio_set_level(LED_B, 0);
				gpio_set_level(LED_C, 0);
				gpio_set_level(LED_D, 1);
				gpio_set_level(LED_E, 1);
				gpio_set_level(LED_F, 1);
				gpio_set_level(LED_G, 1);
				break;
			case 2:
				gpio_set_level(LED_A, 0);
				gpio_set_level(LED_B, 0);
				gpio_set_level(LED_C, 1);
				gpio_set_level(LED_D, 0);
				gpio_set_level(LED_E, 0);
				gpio_set_level(LED_F, 1);
				gpio_set_level(LED_G, 0);
				break;
			case 3:
				gpio_set_level(LED_A, 0);
				gpio_set_level(LED_B, 0);
				gpio_set_level(LED_C, 0);
				gpio_set_level(LED_D, 0);
				gpio_set_level(LED_E, 1);
				gpio_set_level(LED_F, 1);
				gpio_set_level(LED_G, 0);
				break;
			case 4:
				gpio_set_level(LED_A, 1);
				gpio_set_level(LED_B, 0);
				gpio_set_level(LED_C, 0);
				gpio_set_level(LED_D, 1);
				gpio_set_level(LED_E, 1);
				gpio_set_level(LED_F, 0);
				gpio_set_level(LED_G, 0);
				break;
			case 5:
				gpio_set_level(LED_A, 0);
				gpio_set_level(LED_B, 1);
				gpio_set_level(LED_C, 0);
				gpio_set_level(LED_D, 0);
				gpio_set_level(LED_E, 1);
				gpio_set_level(LED_F, 0);
				gpio_set_level(LED_G, 0);
				break;
			case 6:
				gpio_set_level(LED_A, 0);
				gpio_set_level(LED_B, 1);
				gpio_set_level(LED_C, 0);
				gpio_set_level(LED_D, 0);
				gpio_set_level(LED_E, 0);
				gpio_set_level(LED_F, 0);
				gpio_set_level(LED_G, 0);
				break;
			case 7:
				gpio_set_level(LED_A, 0);
				gpio_set_level(LED_B, 0);
				gpio_set_level(LED_C, 0);
				gpio_set_level(LED_D, 1);
				gpio_set_level(LED_E, 1);
				gpio_set_level(LED_F, 1);
				gpio_set_level(LED_G, 1);
				break;
			case 8:
				gpio_set_level(LED_A, 0);
				gpio_set_level(LED_B, 0);
				gpio_set_level(LED_C, 0);
				gpio_set_level(LED_D, 0);
				gpio_set_level(LED_E, 0);
				gpio_set_level(LED_F, 0);
				gpio_set_level(LED_G, 0);
				break;
			case 9:
				gpio_set_level(LED_A, 0);
				gpio_set_level(LED_B, 0);
				gpio_set_level(LED_C, 0);
				gpio_set_level(LED_D, 0);
				gpio_set_level(LED_E, 1);
				gpio_set_level(LED_F, 0);
				gpio_set_level(LED_G, 0);
				break;
			default:
				gpio_set_level(LED_A, 1);
				gpio_set_level(LED_B, 1);
				gpio_set_level(LED_C, 1);
				gpio_set_level(LED_D, 1);
				gpio_set_level(LED_E, 1);
				gpio_set_level(LED_F, 1);
				gpio_set_level(LED_G, 1);
				break;
		}
		statusLeds++;
		if(statusLeds==10){
			statusLeds=0;
		}
		delay(2000);
	}
}

void app_main(void){
    xTaskCreate(Task_dis7seg, " BLINK ", 2048, NULL, 2, NULL);
}