#include <TFT_eSPI.h>
#include <SPI.h>       // this is needed for display

#include <ArduinoTrace.h>

//This display 320 x 240 pixels;
TFT_eSPI tft = TFT_eSPI(); // Invoke custom library with default width and height

#define MAX_GRADS 360
#define NUM_LINES 8
#define PI_DIV_180 0.0174532925 // Macro para eliminar magic number en conversion de grad -> rad

int rm=115;  //radio circulo magenta
int ry=40;   //radio circulo amarillo
int cx=120;  //x_center of the circles
int cy=160;  //y_center of the circles

//------ TODO: additional global variables declaration ----------//
float sx = 0, sy = 1;  
uint16_t x0=0, x1=0, yy0=0, yy1=0;
uint32_t targetTime = millis() - 1000;
uint8_t line = 0, prevline = 12;
boolean initial = true;
//---------------------------------------------------------------//


void setup(void) {
  Serial.begin(115200);
  Serial.println("INICIO:");
  
  tft.init();
  tft.setRotation(0);
  
  // Draw circles:
  tft.drawCircle(cx,cy,rm, TFT_MAGENTA);
  tft.drawCircle(cx,cy,ry, TFT_YELLOW);
}

void loop() {
  // Draw circles:
  tft.drawCircle(cx,cy,rm, TFT_MAGENTA);
  tft.drawCircle(cx,cy,ry, TFT_YELLOW);
      
  //----- TODO: WRITE REQUIRED CODE ------------ ---------//
  if (targetTime < millis() || initial) { // Comprueba si ha pasado 1 segundo
    targetTime += 500; // Actualiza el tiempo objetivo para el próximo segundo
    prevline = line;
    line++;
    if (line > 12)
      line = 0;
    if (prevline > 12)
      prevline = 0;
  }
  initial = false; // Una vez el sistema se ha inicializado, se comporta de manera normal

  // Dibujar la linea que corresponda
  for (int i = 0, j = 0; i < 360; i += (360 / 12), j++) {
    sx = cos((i - 90) * PI_DIV_180);
    sy = sin((i - 90) * PI_DIV_180);
    x0 = sx * ry + cx;
    yy0 = sy * ry + cy;
    x1 = sx * rm + cx;
    yy1 = sy * rm + cy;
    
    // Si la linea evaluada corresponde a la que estaba encendida antes, apagala
    if ((j % 12) == prevline) {
      tft.drawLine(x0, yy0, x1, yy1, TFT_BLACK);
      continue;
    }

    // Enciende la linea que corresponde
    if ((j % 12) == line) {
      tft.drawLine(x0, yy0, x1, yy1, TFT_GREEN);
    }
  }
  //------------------------------------------------------//
}