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

#define OFF 0
#define ON 1

#define N_SEGMENTS 7
#define N_DIGITS_IN_DISPLAY 4

int n;

gpio_num_t gpio_for_segment[N_SEGMENTS] = {
GPIO_NUM_14, // a segment
GPIO_NUM_32, // b segment
GPIO_NUM_15, // c segment
GPIO_NUM_13, // d segment
GPIO_NUM_12, // e segment
GPIO_NUM_26, // f segment
GPIO_NUM_4, // g segment
};

int segment_level[][N_SEGMENTS] = {
  { OFF, ON,  ON,  ON,  ON,  ON,  ON  }, // 0
  { OFF, OFF, OFF, OFF, ON,  ON,  OFF }, // 1
  { ON,  OFF, ON,  ON,  OFF, ON,  ON  }, // 2
  { ON,  OFF, OFF, ON,  ON,  ON,  ON  }, // 3
  { ON,  ON,  OFF, OFF, ON,  ON,  OFF }, // 4
  { ON,  ON,  OFF, ON,  ON,  OFF, ON  }, // 5
  { ON,  ON,  ON,  ON,  ON,  OFF, ON  }, // 6
  { OFF, OFF, OFF, OFF, ON,  ON,  ON  }, // 7
  { ON,  ON,  ON,  ON,  ON,  ON,  ON  }, // 8
  { ON,  ON,  OFF, OFF, ON,  ON,  ON  }, // 9
};

gpio_num_t gpio_for_control[] = {
  GPIO_NUM_27, // digit 1
  GPIO_NUM_25, // digit 2
  GPIO_NUM_33, // digit 3
  GPIO_NUM_2, // digit 4
};

void turnOffDisplay() { //Nose si es O o 0
 for (int i=0; i < N_DIGITS_IN_DISPLAY; i++){
   gpio_reset_pin(gpio_for_control[i]);
   gpio_set_direction(gpio_for_control[i], GPIO_MODE_OUTPUT);
   gpio_set_level(gpio_for_control[i], ON);
}
}

void resetSegments() { 
for (int i=0; i < N_SEGMENTS; i++){
  gpio_reset_pin(gpio_for_segment[i]);
  gpio_set_direction(gpio_for_segment[i], GPIO_MODE_OUTPUT);
  gpio_set_level(gpio_for_segment[i], OFF);
}
}

void initDisplay() {
  resetSegments();
  turnOffDisplay();

  gpio_reset_pin(GPIO_NUM_19);
  gpio_set_direction(GPIO_NUM_19, GPIO_MODE_INPUT);
}

#define DELAY_TIME 10
#define COUNTER_TIME 300

// display task
void display(void *arg)
{
  int number;
  int digit;
  
  while(1) {
    number = n;
    for(int i = 0; i < N_DIGITS_IN_DISPLAY; i++) {
      turnOffDisplay();
      digit = number % 10;
      number /= 10;
      for(int s = 0; s < N_SEGMENTS; s++) {
        gpio_set_level(gpio_for_segment[s], segment_level[digit][s]);
      }
      gpio_set_level(gpio_for_control[i], OFF);
      vTaskDelay(DELAY_TIME / portTICK_PERIOD_MS);
    }
  }
}

// counter task
void counter(void *arg) {
  for (n = 0; n <1000; n++) {
    if (gpio_get_level(GPIO_NUM_19) == OFF) n = 0;
    vTaskDelay(COUNTER_TIME / portTICK_PERIOD_MS);
  }
  for (n; n>-1000; n--) {
    if (gpio_get_level(GPIO_NUM_19) == OFF) n = 0;
    vTaskDelay(COUNTER_TIME / portTICK_PERIOD_MS);
  }
}

extern "C" void app_main() {

  initDisplay();

  xTaskCreate(&display, "displayNumber", 2048,NULL,5,NULL );
  xTaskCreate(&counter, "counter", 2048,NULL,5,NULL );
}
esp:VIN
esp:GND.2
esp:D13
esp:D12
esp:D14
esp:D27
esp:D26
esp:D25
esp:D33
esp:D32
esp:D35
esp:D34
esp:VN
esp:VP
esp:EN
esp:3V3
esp:GND.1
esp:D15
esp:D2
esp:D4
esp:RX2
esp:TX2
esp:D5
esp:D18
esp:D19
esp:D21
esp:RX0
esp:TX0
esp:D22
esp:D23
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
sevseg1:A
sevseg1:B
sevseg1:C
sevseg1:D
sevseg1:E
sevseg1:F
sevseg1:G
sevseg1:DP
sevseg1:DIG1
sevseg1:DIG2
sevseg1:DIG3
sevseg1:DIG4
sevseg1:COM
sevseg1:CLN