#include "includes.h"

extern tsEDK 	EDK;
extern tsAppCB  appCB;


/******************************************************************************
//	SetBuzzerState
//
//  nastaveni funkce piskace prikazem GUI
******************************************************************************/
void SetBuzzerState(void)
{
	tUInt mask;
    
	if(EDK.buzzer.mask & GUI_BUZZ_MASK)
	 {
	   EDK.output &= ~EDK_OUT_BUZZER;		// nejdrive smazat flag
	 }

		// *********************			
		// funkce LED RED
		// *********************
		switch (EDK.buzzer.mask & GUI_BUZZ_MASK)
		 {
			case GUI_BUZZ_STATIC_MODE: 
  	 			
				if(EDK.buzzer.value == 0x00)							// pokud je VALUE_BEEP 0x00 tak nepiskat
				 {
				   EDK.output &= ~EDK_OUT_BUZZER;
		  		   EDK.counter.buzzer_time = 0;							// cas pipaku = 0
				   EDK.counter.buzzer_cycles = 0;						// inicializovat i pocet pipnuti
				 }
				else
				 {
		  		   EDK.output |= EDK_OUT_BUZZER;						// BUZZER = ON
		  	       EDK.counter.buzzer_time = EDK.buzzer.value;			// doba pipnuti - [x100ms]
				   EDK.counter.buzzer_cycles = 0;						// inicializovat i pocet pipnuti
				 }
			break;


			case GUI_BUZZ_PULSE_MODE: 
					EDK.output |= EDK_OUT_BUZZER;						// BUZZER = ON
		  			EDK.io_flag |= FLAG_BUZZER_PULSE_MODE;				// buzzer pipa

					EDK.counter.buzzer_time = PRESET_BUZZ_PULSE_LENGTH;	// delka pipnuti
		  			EDK.counter.buzzer_cycles = EDK.buzzer.value;		// pocet pipnuti
			break;
			
			
			case GUI_BUZZ_FOLLOW_MODE:	
	 				EDK.io_flag &= ~FLAG_RED_FOLLOW_MODE;					// pred zmenou flagu FOLLOW mode je nutne smazat i stavy ostatnich FOLLOW flagy
	 				EDK.io_flag &= ~FLAG_GRN_FOLLOW_MODE;
	 				EDK.io_flag |= FLAG_BUZZ_FOLLOW_MODE;					// RED kopiruje stav rele
	 		break;
			
			case GUI_BUZZ_NO_ACTION:									// nedelat nic
			  break;													// pokud je EDK.buzzer.mask == 0
			
			default:													// kdyby se sem dostalo nejakou chybou
					EDK.io_flag &= ~FLAG_RED_FOLLOW_MODE;					// smazat vsechny flagy
	 				EDK.io_flag &= ~FLAG_GRN_FOLLOW_MODE;
	 				EDK.io_flag &= ~FLAG_BUZZ_FOLLOW_MODE;	
					EDK.io_flag &= ~FLAG_BUZZER_PULSE_MODE;
					EDK.output &= ~EDK_OUT_BUZZER;						// a zrusit flag piskace
			  break;
			
		 }
									
}



/******************************************************************************
//	UpdateBuzzerState
//
//  aktualizace stavu piskace 
******************************************************************************/
void UpdateBuzzerState(void)
{
  if ( EDK.output & EDK_OUT_BUZZER)				// ovladani Buzzeru
   {
	 if (EDK.input.state & EDK_IN_BUZZER)		// osazen jumper piskac?
	  { 
		BUZZER_ON;								// piskani povoleno
	  }
	   else
	   {
		BUZZER_OFF;								// piskani potlaceno
	   }
   }
   else BUZZER_OFF;
}





/******************************************************************************
//	ProccessBuzzer
//
//  aktualizuje stav piskace podle prijateho prikazu GUI
******************************************************************************/
void ProccessBuzzer(void)
{
  //******************************
  // obsluha pipani piskace
  //******************************
	 if (EDK.io_flag & FLAG_BUZZER_TIMEOUT)						// pokud predchozi cyklus docasoval			
	  {
	   if (EDK.io_flag & FLAG_BUZZER_PULSE_MODE)				// je pozadavek pipat piskacem
   		{
		  EDK.output ^= EDK_OUT_BUZZER;  						// buzzer flip
	
		  EDK.io_flag &= ~FLAG_BUZZER_TIMEOUT;					// smazat flag timeout
		  EDK.counter.buzzer_time = PRESET_BUZZ_PULSE_LENGTH;	// znovu nastavit casovac delky pipnuti

		 // citac poctu pipnuti	
	     if (EDK.counter.buzzer_cycles != 0xff)					// pokud je pocet pipnuti 0xff
	      {														// tak pipa porad
		   if (!EDK.counter.flip_div2--)	 		   
	        {
			 EDK.counter.flip_div2 = 1;
			 EDK.counter.buzzer_cycles--;						// jinak dekrementovat citac
		    }
	      }

		 if (!EDK.counter.buzzer_cycles)
		  {
		      EDK.io_flag &= ~FLAG_BUZZER_PULSE_MODE;			// je provedeno pocet bliknuti, tak ukoncit
 			  EDK.output &= ~EDK_OUT_BUZZER; 					// vypnout pipak po ukonceni cyklu
		  }												
	  }
	   else										// neni pozadavek pipat piskacem
	    {										// ale dobehl casovat delky pipnuti
		  EDK.io_flag &= ~FLAG_BUZZER_TIMEOUT;	// mazat flag , aby sem nevstupovalo opakovane
		  EDK.output &= ~EDK_OUT_BUZZER; 
		}
   }				//if (EDK.io_flag & FLAG_BUZZER_TIMEOUT)

   
}	 
