/*
Projeto das cameras - 22-04-2002
Alunos: Francisco do Nascimento
	Zilma Félix
*/

#include <reg51.h>

#define FrClk 12000000
#define FreqTimer0_emHz 100
#define VALOR_TH0 ((65536 - (FrClk / (12 * FreqTimer0_emHz - 8 ))) >>8)
#define VALOR_TL0 ((65536 - (FrClk / (12 * FreqTimer0_emHz - 8 ))) & 0xFF)

int count1 = 0;
int count2 = 0;
int count3 = 0;
int count4 = 0;
int countChavear = 0;

unsigned char deveGravar[4];

sbit cam1 = P0^0;
sbit cam2 = P0^1;
sbit cam3 = P0^2;
sbit cam4 = P0^3;

#define cameras P1

bit teste = 0;
bit testeH = 0;

sbit cL = P2^0;
sbit cH = P2^1;

void timer0_inicializa() 
  {
  TR0 = 0;              // Desliga Timer0
  TMOD |= 0x01;  // Timer 0 programado como timer de 16 bits
  TH0 = VALOR_TH0;  // Programa contagem do Timer0
  TL0 = VALOR_TL0;
  ET0 = 1;      // Habilita interrupcao do timer 0
  TR0 = 1;      // Habilita contagem do timer 0
  }

void timer0_int (void) interrupt 1 using 2
{
  TR0 = 0;              // Desliga Timer0
  TH0 += VALOR_TH0;  // Programa contagem do Timer0
  TL0  += VALOR_TL0;
  TR0 = 1;      // Habilita contagem do timer 0
  
  count1++;
  count2++;
  count3++;
  count4++;
  if (countChavear < 300) {
  	  countChavear++;
  } 

} 

void Filma1() {
    static int estado1 = 0;

   	switch (estado1) {
		case 0: 
			if (cam1) {
				deveGravar[0] = 1;
			    estado1 = 1;
				count1 = 0;
			} 
			break;
		case 1:
			if (cam1) {
			    estado1 = 1;
				count1 = 0;
			} else  if (count1 > 500){
				deveGravar[0] = 0;
				estado1 = 2;
			}
			break;
		case 2:
		    if (cam1) {
			   estado1 = 1;
               count1 = 0;
			} else {
				estado1 = 0;
			}
			break;
	}
}

void Filma2() {
    static int estado2 = 0;

   	switch (estado2) {
		case 0: 
			if (cam2) {
				deveGravar[1] = 1;
			    estado2 = 1;
				count2 = 0;
			} 
			break;
		case 1:
			if (cam2) {
			    estado2 = 1;
				count2 = 0;
			} else  if (count2 > 500){
				deveGravar[1] = 0;
				estado2 = 2;
			}
			break;
		case 2:
		    if (cam2) {
			   estado2 = 1;
               count2 = 0;
			} else {
				estado2 = 0;
			}
			break;
	}
}

void Filma3() {

static int estado3 = 0;

   	switch (estado3) {
		case 0: 
			if (cam3) {
				deveGravar[2] = 1;
			    estado3 = 1;
				count3 = 0;
			} 
			break;
		case 1:
			if (cam3) {
			    estado3 = 1;
				count3 = 0;
			} else  if (count3 > 500){
				deveGravar[2] = 0;
				estado3 = 2;
			}
			break;
		case 2:
		    if (cam3) {
			   estado3 = 1;
               count3 = 0;
			} else {
				estado3 = 0;
			}
			break;
	}

}

void Filma4() {
   static int estado4 = 0;

   	switch (estado4) {
		case 0: 
			if (cam4) {
				deveGravar[3] = 1;
			    estado4 = 1;
				count4 = 0;
			} 
			break;
		case 1:
			if (cam4) {
			    estado4 = 1;
				count4 = 0;
			} else  if (count4 > 500){
				deveGravar[3] = 0;
				estado4 = 2;
			}
			break;
		case 2:
		    if (cam4) {
			   estado4 = 1;
               count4 = 0;
			} else {
				estado4 = 0;
			}
			break;
	}

}

void Chavear(){

	static char cameraAtual = 0;
	int i;
	
	if (countChavear == 300) {

		i = (cameraAtual + 1) % 4;

		while (deveGravar[i] && i!=cameraAtual) {
			i = (i+1) % 4;
		}
		
		if (deveGravar[i]) {
			cameraAtual = i;
			switch (i) {
				case 0: 
					cameras = 0x01;
					break;
				case 1:
					cameras = 0x02;
					break;
				case 2:
					cameras = 0x04;
					break;
				case 3:
					cameras = 0x08;
					break;
			}
			countChavear = 300;
		} else {
			cameras = 0x00;
		}
	}
}

void main(){
	timer0_inicializa();
	EA = 1; // habilita as interrupcoes
	while(1){
		Filma1();
		Filma2();
		Filma3();
		Filma4();
		Chavear();
	}
}


