// Definicoes
#define COLOR_SENSOR 2
// Variaveis persistentes
// Representam as cores dos blocos
persistent int amarelo;
persistent int azul;
persistent int vermelho;
persistent int verde;
void CalibrarCores(){
  // Variaveis auxiliares
  int i;
  // Espera por um bloco amarelo
  printf ("\nBloco amarelo");
  while (!start_button());
  printf ("\nCalibrando..");
  amarelo = 0;
  for (i=0; i<50; i++){
      amarelo = amarelo + analog(COLOR_SENSOR);
      sleep(0.05);
  }
  amarelo = (int) amarelo / 50;
  beep();
  printf ("\nBloco amarelo:  %d", amarelo);
  sleep(1.5);
  // Espera por um bloco azul
  printf ("\nBloco azul");
  while (!start_button());
  printf ("\nCalibrando..");
  azul = 0;
  for (i=0; i<50; i++){
      azul = azul + analog(COLOR_SENSOR);
      sleep(0.05);
  }
  azul = azul/50;
  beep();
  printf ("\nBloco azul:     %d", azul);
  sleep(1.5);
  // Espera por um bloco vermelho
  printf ("\nBloco vermelho");
  while (!start_button());
  printf ("\nCalibrando..");
  vermelho = 0;
  for (i=0; i<50; i++){
      vermelho = vermelho + analog(COLOR_SENSOR);
      sleep(0.05);
  }
  vermelho = vermelho/50;
  beep();
  printf ("\nBloco vermelho: %d", vermelho);
  sleep(1.5);
  // Espera por um bloco verde
  printf ("\nBloco verde");
  while (!start_button());
  printf ("\nCalibrando..");
  verde = 0;
  for (i=0; i<50; i++){
      verde = verde + analog(COLOR_SENSOR);
      sleep(0.05);
  }
  verde = verde/50;
  beep();
  printf ("\nBloco verde:    %d", verde);
  sleep(1.5);
  beep();
  printf ("\nCores Calibradas");
  sleep(1.0);
  printf ("\nBloco amarelo:  %d", amarelo);
  sleep(1.5);
  printf ("\nBloco azul:     %d", azul);
  sleep(1.5);
  printf ("\nBloco vermelho: %d", vermelho);
  sleep(1.5);
  printf ("\nBloco verde:    %d", verde);
  sleep(1.5);
}
/*
 * Metodo para identificar a cor de um determinado bloco
 *
 */
void IdentificarCor(){
  // Variaveis auxiliares
  int tmp_cor, cor;
  int erro_atual, tmp_erro;
  int i;
  // Espera pelo bloco
  printf ("\nMostre o bloco");
  while (!start_button());
  // Calcula a cor
  printf ("\nCalculando..");
  tmp_cor = 0;
  for (i=0; i<50; i++){
      tmp_cor = tmp_cor + analog(COLOR_SENSOR);
      sleep(0.05);
  }
  tmp_cor = tmp_cor/50;
  printf ("\nValor: %d", tmp_cor);
  sleep(1.5);
  // Calcula a variacao para a cor amarela
  erro_atual = tmp_cor - amarelo;
  if (erro_atual < 0)
    erro_atual = erro_atual * (-1);
  // Define a cor do bloco como amarela
  cor = amarelo;
  // Calcula a variacao para a cor azul
  tmp_erro = tmp_cor - azul;
  if (tmp_erro < 0)
    tmp_erro = tmp_erro * (-1);
  // Testa se o erro eh menor
  if (tmp_erro < erro_atual){
      // Define a nova cor
      cor = azul;
      erro_atual = tmp_erro;
  }
  // Calcula a variacao para a cor vermelho
  tmp_erro = tmp_cor - vermelho;
  if (tmp_erro < 0)
    tmp_erro = tmp_erro * (-1);
  // Testa se o erro eh menor
  if (tmp_erro < erro_atual){
      // Define a nova cor
      cor = vermelho;
      erro_atual = tmp_erro;
  }
  // Calcula a variacao para a cor verde
  tmp_erro = tmp_cor - verde;
  if (tmp_erro < 0)
    tmp_erro = tmp_erro * (-1);
  // Testa se o erro eh menor
  if (tmp_erro < erro_atual)
    // Define a nova cor
    cor = verde;
  // Imprime qual eh a cor do bloco
  if (cor == amarelo){
      beep();
      printf ("\nCor: AMARELO");
  }
  else{
      if (cor == azul){
          beep();
          printf ("\nCor: AZUL");
      }
      else{
          if (cor == vermelho){
              beep();
              printf ("\nCor: VERMELHO");
          }
          else{
              beep();
              printf ("\nCor: VERDE");
          }
      }
  }
  sleep(1.5);
}