/*=============================================
@   Created by: Topor Zoltan in 2006.
@   http://www.hobbielektronika.hu/
@   
@   Ventillator Controlling System
===============================================*/

#include <16F628.h>

#FUSES XT                 	//Kristály oszcillátor
#FUSES NOWDT                 	//Watch Dog Timer kikapcs
#FUSES NOPUT                 	//Nincs Power Up Timer
#FUSES NOPROTECT             	//Kód nem védett kiolvasás ellen
#FUSES BROWNOUT              	//Brownout-nál restart
#FUSES MCLR                  	//Master Clear pin bekapcs
#FUSES NOLVP                 	//Low voltage programming kikapcs
#FUSES NOCPD                 	//Nincs EE védelem

#use delay(clock=4000000) //4 MHz-es órajel


#define SLEEP_TIME	1440	//1440=60min*24h perc sleep (venti kikapcs)
#define WORK_TIME	5		//5 perc (venti megy)


#define LED_GRN		PIN_A0
#define LED_RED		PIN_A1
#define RELAY_PIN	PIN_A2

#define START_BTN	PIN_B3

#define VENT1_HALL	PIN_B4
#define VENT2_HALL	PIN_B5
#define VENT3_HALL	PIN_B6
#define VENT4_HALL	PIN_B7


int halt_count = 0;
int16 sec_count,min_count,mins;
int16 vent1_c,vent2_c,vent3_c,vent4_c;
int16 vent1_a,vent2_a,vent3_a,vent4_a;
boolean vent1_s,vent2_s,vent3_s,vent4_s;
boolean venti_on,red_led_on,kell_halt;

//================================================================
#int_TIMER0
void TIMER0_isr() 
//================================================================
{
  sec_count++;
  if(sec_count == 3906) {
    sec_count = 0;
	min_count++;
	if (min_count >= 60) {
	  mins++;
	  min_count = 0;
	}
    if (venti_on) {
	    red_led_on = !red_led_on; 
		//--- HA LASSABB LETT ---
		if((vent1_c+5 < vent1_a) || (vent2_c+5 < vent2_a) ||
	       (vent3_c+5 < vent3_a) || (vent4_c+5 < vent4_a)) {
			kell_halt = true;
		}
		//--- HA NEM KELL LEÁLLÍTANI, AKKOR ÁTLAGOT SZÁMOLOK ---
		if(!kell_halt) {
			vent1_a += vent1_c;	vent1_a = vent1_a/2;
		    vent2_a += vent2_c;	vent2_a = vent2_a/2;
		    vent3_a += vent3_c;	vent3_a = vent3_a/2;
		    vent4_a += vent4_c;	vent4_a = vent4_a/2;
		    vent1_c = 0;
		    vent2_c = 0;
		    vent3_c = 0;
		    vent4_c = 0;
		}
		//--- HA ÁTLAG LECSÖKKENT (beragadt az indulásnál, túl lelassult[táp genyó]) ---
		if((vent1_a < 6) || (vent2_a < 6) ||
		   (vent3_a < 6) || (vent4_a < 6)) { kell_halt = true;}
	} //if megy venti
  }
}

//================================================================
void init() {
//================================================================
   
   sec_count = 0;
   min_count = 0;
   mins = 0;
   venti_on = false;
   red_led_on = false;
   kell_halt = false;
   halt_count = 0;
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);

   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);

   port_b_pullups(TRUE);

   set_tris_a(0b00000000);
   set_tris_b(0b11110000);

   output_a(0x00);
   output_b(0x00);

}

//================================================================
void _start() {
//================================================================
  mins = 0;
  min_count = 0;
  red_led_on = false;
  kell_halt = false;
  venti_on = false;
  halt_count = 0;
  vent1_c = 0;
  vent2_c = 0;
  vent3_c = 0;
  vent4_c = 0;

  vent1_a = 6;
  vent2_a = 6;
  vent3_a = 6;
  vent4_a = 6;

  vent1_s = input(VENT1_HALL);
  vent2_s = input(VENT2_HALL);
  vent3_s = input(VENT3_HALL);
  vent4_s = input(VENT4_HALL);
  output_high(RELAY_PIN);
  output_high(LED_GRN);
  output_high(LED_RED);//narancs lesz

  venti_on = true;

}

//================================================================
void _stop() {
//================================================================
  output_low(RELAY_PIN);
  output_low(LED_RED);//zöld lesz

  venti_on = false;
  mins = 0;
  min_count = 0;
}

//================================================================
void _error() {
//================================================================
  _stop();
  output_low(LED_GRN);
  for(;;) {
    output_toggle(LED_RED);
	delay_ms(500);
	if(!input(START_BTN)) {
		//ha megnyomták a startot
		_start();
		break;
	}
  }
}

//================================================================
void check_venti(){
//================================================================
	if(kell_halt) { halt_count++;kell_halt = false; };
	if(halt_count>2) {_error();} //kétszer próbálja, utánna _errorral kiszáll!

	if(vent1_s != input(VENT1_HALL)) { vent1_c++; vent1_s = input(VENT1_HALL); }
	if(vent2_s != input(VENT2_HALL)) { vent2_c++; vent2_s = input(VENT2_HALL); }
	if(vent3_s != input(VENT3_HALL)) { vent3_c++; vent3_s = input(VENT3_HALL); }
	if(vent4_s != input(VENT4_HALL)) { vent4_c++; vent4_s = input(VENT4_HALL); }
}

//================================================================
void main(){
//================================================================
 init();

 output_high(LED_GRN);//zöld lesz

 for(;;) {
	if(!input(START_BTN)) {while(!input(START_BTN)); _start(); }
	output_bit(LED_RED,red_led_on);//narancs / zolden villog
	if(venti_on) check_venti();
	if((mins >= SLEEP_TIME) && (!venti_on)) {
		//ha eltelt az idő ÉS ki volt épp kapcsolva
		_start();
	} else
	if((mins >= WORK_TIME) && (venti_on)) {
		//ha eltelt az idő ÉS be volt kapcsolva...
		_stop();
	}
 }
}
