#include <kd_sfrs.h>
#define NUM_MODOS 4 //Cuantos modos queremos ?

// Variables globales
int modo; // Modo actual

extern unsigned int timer2_seg; // Segundos

extern signed int tem_disp;
extern unsigned int hum_disp;
extern unsigned int vel_disp;
extern unsigned int dir_disp;
extern unsigned int vel_inst;

unsigned int vel_sum; // Sumatorio de velocidades, para hacer la media
unsigned int dir_sum; // Sumatoria de ángulos de dirección del viento

void main()
{

 int temp, temp1, temp2; // Temporales
  

// inits
 
  // Botón
  asm {di;}
  wsr=0;
  int_mask=int_mask|0x80;	// activamos la interrupcion (EXTINT)
  int_mask1=int_mask1&0xDF;	// Desactivamos INT13 (EXT_PIN=0)

  wsr=0;
  ioc1=ioc1 & 0xFD;			//EXT_INT=0 para elegir p2.2
  asm {ei;}

  // Otros
  inits_lcd();
  inits_timer2();
  inits_ad();
  inits_hsi();

  modo=0;
  vel_sum=0;
  dir_sum=0;

//main loop
//   Este bucle se ejecuta cada segundo para tomar las muestras necesarias,
// hacer medias, y mostrarlas en pantalla.

while(1)
  {
	switch (modo)
	{

	// Temperatura. A/D, sin media
	case 0:
		temp=conversio_ad(1);
		// convertir de [0-255] a [-20 - 50]
		temp=((temp*70)/255)-20;
		tem_disp=temp;
  		mostrar_tem();
		visual_tem();
		break;
				
	// Humedad. A/D, sin media
	case 1:
		temp=conversio_ad(2);
		// convertir de [0-255] a [0-100 %]
		temp=(temp*100)/255;
		hum_disp=temp;
		mostrar_hum();
		visual_hum();
		break;
		
	// Velocidad viento. HSI, con nombres, con media
	case 2:
		//   Ya tenemos vel_disp actualizada, ya que se hace en cada
		// iteración del bucle (cada segundo)
		mostrar_vel();
		break;
	
	// Dirección viento. A/D, con nombres, con media
	case 3:
		//   Ya tenemos dir_disp actualizada, ya que se hace en cada
		// iteración del bucle (cada segundo)
		mostrar_dir();
		break;

	// Modo incorrecto
	default:
		show_msg_lcd("Unimplemented mode code",2,1);
		break;
	}


	//   La velocidad (HSI) y dirección (A/D) del viento requieren media, y por tanto
	// hay que mantenerla siempre actualizada, independientemente del modo en el que
	// estemos. 

	temp=conversio_ad(3); // dirección del viento
	// convertir de [0-255] a [0-360 grados]
	// *(360/255). Para evitar desbordamientos,
	temp=(temp*72)/51;

	vel_sum+=vel_inst;    // Acumular
	dir_sum+=temp;        // Acumular
	if (timer2_seg%10==0) // Si han pasado 10 segundos
	{
		vel_disp=vel_sum/10; // Actualizar el valor mostrado
		dir_disp=dir_sum/10;
		vel_sum=0;
		dir_sum=0;
	}

	// Mostrar reloj, común para todos los modos

	show_char_lcd(':',11,2);
	show_char_lcd(':',14,2);
       
	temp=timer2_seg%60; //segundos
	show_value_lcd(temp,2,'0',16,2);
	
	temp=timer2_seg/60; //minutos
	temp%=60;
	show_value_lcd(temp,2,'0',13,2);

	temp=timer2_seg/60;
	temp/=60;//horas
	temp%=24;//hora: de 0 a 23
	show_value_lcd(temp,2,'0',10,2);
	
	//   Esperar hasta que haya pasado un segundo o cambiemos de modo.
	//   Como tomamos muestras cada segundo, no habrá nada nuevo
	// que mostrar en pantalla hasta la siguiente muestra.
	temp1=timer2_seg; temp2=modo;
	while( temp1==timer2_seg && temp2==modo);

	// Si se ha cambiado de modo, borrar la pantalla
	if (temp2!=modo) CLRSCR_LCD();

	// Fin del bucle principal	
  }

}  


//RSI's
void RSIExtInt()
{
  asm{di;}
  modo=(modo+1)%NUM_MODOS;
  asm{ei;}					    
}