#include "includes.h"

extern tsEDK 	EDK;
extern tsAppCB  appCB;
void FilterMuxInput(void)
{
	static char muxch=0;
	
	switch (muxch)
	{
	  case (0):
	  	    MUX_CH1;
			wait_us_range(500);					
			FilterInput5(L1_PIN);
		break;
	  
	  case (1):
	  	    MUX_CH2;
			wait_us_range(500);					
			FilterInput5(L1_PIN);
		break;

	  case (2):
	  	    MUX_CH3;
			wait_us_range(500);					
			FilterInput5(L1_PIN);
		break;

	  case (3):
	  	    MUX_CH4;
			wait_us_range(500);					
  			FilterInput5(L1_PIN);
		break;
//zatím nepoužito
/*	  case (4):
 	  	    MUX_CH5;
			wait_us_range(500);					
  			FilterInput5(L2_PIN);
		break;
		
	  case (5):
 	  	    MUX_CH6;
			wait_us_range(500);					
  			FilterInput5(L2_PIN);
		break;
		
	  case (6):
	  	    MUX_CH7;
			wait_us_range(500);					
  			FilterInput5(L2_PIN);
		break;
		
	  case (7):
 	  	    MUX_CH8;
			wait_us_range(500);					
  			FilterInput5(L2_PIN);
		break;
*/		
					   
	  
	  default: break;
	}
	
	muxch++;
	if (muxch == 4) muxch=0; 
}


/************************************************************************************/
// SyncOutput
// generuje synchronizacni signal do pinu IN1 - ve vsech rezimech krome EDK-ACS
// perioda volani funkce je 10ms, perioda sync signalu pak 200ms
/************************************************************************************/
void SyncOutput(void)
{

#ifndef GR_EXT8
	// nacteni binarnich vstupu
    // nacitani vstupu provadet jen kdyz neni na svorce aktivni sync signal
	// nutno pro spravnou funkci nacitat takto predem
	if (!(EDK.io_flag & FLAG_SYNC_OUT))			// pouze pokud neni nastaven flag
	{											// pokud je nastaven tak je vstup IN1 prepnut na vystupni
       FilterInput1(PIN_INPUT1);
	
	   if(!(EDK.input.state & EDK_IN_READER2))	// pokud neni osazen jumper READER2 tak filtrovat INPUT2
        {
		  FilterInput2(PIN_INPUT2);
		}
	}


	// poklud neni osazen jumper READER2, generovat a detekovat vlastni sync signal		
   if(!(EDK.input.state & EDK_IN_READER2))			
    {
	  if (!EDK.counter.sync_out--)			// generovani SYNC-OUT signalu - interval 200ms
 	   {
   	     EDK.counter.sync_out = SYNC_OUT_DIVIDER_PRESET;
		 

		 if (!(EDK.io_flag & FLAG_SYNC_OUT))	// osetreni misto XOR
		  EDK.io_flag |= FLAG_SYNC_OUT;
		 else
		  EDK.io_flag &= ~FLAG_SYNC_OUT;
		   
	   

	     if (EDK.io_flag & FLAG_SYNC_OUT)		// generovani sync signalu do vstupu IN1
	      {
	       IN1_DIR_PIN = 1;					// pin IN1 prepnout na vystup
	       IN1_PIN = 0;						// IN1 do log.0, ve stavu log.1 jej podrzi pull-up
	      }
	     else
	      {
	       IN1_DIR_PIN = 0;					// pin IN1 prepnout zpet na vstup
	       IN1_PIN = 1;						// vstupni buffer nastavit do log.1, pin ve stavu log.1 drzi externi pull-up
	      }
	   
	    }			// konec if(!(EDK.input.state & EDK_IN_READER2))	
	  }				// konec intervalu 200ms if (!EDK.counter.sync_out--)	



	
// obsluha vstupu IN2 nesmi byt podminena internim casovacem 200ms ale musi se podridit externimu signalu
   if(EDK.input.state & EDK_IN_READER2)		// je osazen jumper reader2, detekovat externi sync signal		
	{
	  EDK.old_sync_level = EDK.sync_level;

	  if (PIN_INPUT2)					 // nacist aktualni stav vsupu IN2
	  { 
	   EDK.io_flag |= FLAG_SYNC_IN;		 // podle stavu vstupu 
	   EDK.sync_level = 1;				 // aktualizovat stav flagu
	  }
	  else								 // aktualizovat flag
	   {
	   	EDK.io_flag &= ~FLAG_SYNC_IN;	
	   	EDK.sync_level = 0;				 // aktualizovat stav flagu
	   }
	}


//**********************************************
// cteni karty se spousti timto casovacem
	if(!(EDK.input.state & EDK_IN_READER2))						// neni osazen jumper reader2, cte se na kladnou uroven
	{
	    EDK.old_sync_level = EDK.sync_level;					
 	    
		if (EDK.io_flag & FLAG_SYNC_OUT)
		 EDK.sync_level = 1;
		else
		 EDK.sync_level = 0;	
		 
		 
 			 
	   if (!EDK.old_sync_level && EDK.sync_level)				// cte se na nabeznou hranu vlastniho sync signalu
		{
			#ifdef BLOCK_CARD_IF_BUZZER 						// je zde moznost blokovat cteni karty pokud je aktivni pipak
			  if (!gCard.isbusy && !EDK.counter.buzzer_time)	// protoze je slysitelne pulzovani pipaku dane buzenim RFID pole
			#else
		  	  if (!gCard.isbusy)						  		// zabrani opakovanemu volani funkce pokud jeste probiha
			#endif
		    {												
			   AddReq(PRIORITY_TASK_HIGH | READ_CARD_ID, 0,0);	// zaloz pozadavek na cteni karty
		    }																
		}
	}
	 else 														// pokud je osazen jumper reader2, cte se na uroven LOW
	 {
	   if (EDK.old_sync_level && !EDK.sync_level)				// cte se na sestupnou hranu ale externiho signalu do IN2
		{
		  #ifdef BLOCK_CARD_IF_BUZZER 							// je zde moznost blokovat cteni karty pokud je aktivni pipak
		    if (!gCard.isbusy && !EDK.counter.buzzer_time)		// protoze je slysitelne pulzovani pipaku dane buzenim RFID pole
		  #else
		    if (!gCard.isbusy)						  			// zabrani opakovanemu volani funkce pokud jeste probiha
		  #endif
		   {												
			 AddReq(PRIORITY_TASK_HIGH | READ_CARD_ID, 0,0);	// zaloz pozadavek na cteni karty
		   }																
		}
	 }
#else 
// GR_EXT8 pouze funkce Filterinput!!

	FilterInput1(PIN_INPUT1);
    FilterInput2(PIN_INPUT2);
    FilterInput3(PIN_INPUT3);
    FilterInput4(PIN_INPUT4);
	
	FilterMuxInput();			
#endif  // GR_EXT8


}
