/****************************************************************************
	Ovladac podsvetleni. Podporuje nastaveni maximalniho a minimalniho podsvetleni
	spolu s casovymi limity pro zhasnuti displeje.

	TODO: Implementovat i vypinani radice displeje pro usporu energie.

*****************************************************************************/

#include "Backlight.h"
#ifndef PCSIM
	#include <ctl_api.h>
	#include <targets/LPC2478.h>
#endif
#include "OS.h"

BACKLIGHT_STATE backlightState = BACKLIGHT_OFF;								//Stav podsvetleni

BACKLIGHT_SETUP_STRUCT currentBacklight = {20, 5, 30001, 90001, 851 ,401 };	//Aktualni nastaveni podsvetleni

int backlightDACCurrent;													//Aktualni hodnota napeti na DAC prevodniku

TIME_STAMP lastRequest;														//Cas uplynuly od posledniho pozadavku na zapnuti

/****************************************************************************
	Vraci informaci o aktualnim stavu podsvetleni

	Vstup: 
		neni

	Vystup
		BACKLIGHT_STATE:	Aktualni stav podsvetleni

*****************************************************************************/
BACKLIGHT_STATE GetBacklightState(void)
{
  return backlightState;
}

/****************************************************************************
	Vnuti DAC prevodniku hodnotu napeti. Prevodnik je schopen nastavit hodnotu
	0-3V3, cemuz odpovida hodnota registru DACR 0-1023. 

	Hodnota cca. 850 a vice odpovida plne zhasnutemu displeji

	Hodnota cca. 400 odpovida plne rozsvicenemu displeji

	Vstup: 
		value:		hodnota

	Vystup
		neni

*****************************************************************************/
void BacklightForceValue(int value)
{
  backlightDACCurrent = value;
  backlightState = BACKLIGHT_ON;
  
}

/****************************************************************************
	Pozadavek na spusteni podsvetleni. Predpoklada se, ze funkce je volana 
	pri kazdem kliknuti na Touch-Screen.

	Vstup: 
		neni

	Vystup
		ANSWER:		YES/NO

*****************************************************************************/
void BacklightRequest(void)
{
  if (backlightState != BACKLIGHT_ON && backlightState != BACKLIGHT_IDLE)		//Pokud neni displej zapnuty a ovladac neni zakazan
  {
    backlightState = BACKLIGHT_RISING;											//Zacni pomalu rozsvecet displej
    
  }
  lastRequest = GetTimeStamp();													//Aktualizuj casovou znacku
}

/****************************************************************************
	Inicializuje podsvetleni na hodnotu "Vypnuto"

	Vstup: 
		neni

	Vystup
		neni

*****************************************************************************/
void BacklightInit(void)
{
	backlightDACCurrent = currentBacklight.DACMinimum;
}

/****************************************************************************
	Ridici smycka ovladace podsvetleni

	Vstup: 
		neni

	Vystup
		neni

*****************************************************************************/
void Backlight(void)
{
  switch(backlightState)
  {
	case BACKLIGHT_IDLE:
		return;														//Ovladac zakazan
	break;
	case BACKLIGHT_OFF:
		break;														//Displej vypnut
	case BACKLIGHT_RISING:
		backlightDACCurrent -= currentBacklight.RampUp;				//Byl zadan pozadavek na rozsviceni, displej se rozsveci po rampe
		if (backlightDACCurrent <= currentBacklight.DACMaximum)		//Pokud byla prekrocena hodnota maximalniho napeti
		{
			backlightState = BACKLIGHT_ON;							//Je displej rozsvicen, prejdi na dalsi stav
		}
		break;
	case BACKLIGHT_ON:
		if (GetElapsedTime(lastRequest) > (unsigned long)currentBacklight.TimeOut)	//Pokud vyprsel cas a nikdo nesahl na displej
		{
		backlightState = BACKLIGHT_FALLING;							//zacni zhasinat podsvetleni
		}
		break;
	case BACKLIGHT_FALLING:
		backlightDACCurrent += currentBacklight.RampDown;			//zhasinej postupne
		if (backlightDACCurrent > currentBacklight.DACMinimum)
		{
			backlightState = BACKLIGHT_OFF;							//POkud je displej zhasnut, prejdi do dalsiho stavu
		}

		break;
	default:
		break;
  }
#ifndef PCSIM
  DACR = ((backlightDACCurrent&1023) << DACR_VALUE_BIT);			//Aktualizuj hodnotu DA prevodniku
#endif
}
