#ifndef FUNCTION_H
#define FUNCTION_H
/*
 * function.h
 *
 * Created: 2.10.2013 17:06:10
 *  Author: Tomáš Feik
 */ 


/*
 * Funkce převede znak na hexa hodnotu
 */
char nibbleToHex(char nibble);

/*
 * Funkce rozdeli byte na 2 hexa hodnoty
 *
 * Vstupni parametr:
 *		Vstupni hodnota
 *		Horni byt
 *		Spodni byt
 */
void byteToHex(char val, char* hn, char* ln);

/*
 *	Vrati nejmensi hodnotu
 *		Porovnavane hodnoty
 */
int findMin(int value1, int value2, int value3);

/*
 * Funkce odešle startovní sekveci k motorum kol
 */
void sendStartSequenceToMotors();

/*
 * Funkce odešle ukončovací sekveci k motorum kol
 */
void sendEndSequenceToMotors();

/*
 * Funkce odešle zadanou rychlost motorum kol
 *
 * Vstupni parametr:
 *		Adresa ultrazvukoveho snimace ze ktereho budeme cist.
 */
void sendSpeedToMotors(int left, int right);

/*
 * Funkce odešle vzdalenost prekazy motorum kol
 *
 * Vstupni parametr:
 *		Vzdalenost prekazky
 */
void sendBarrierDistanceToMotors(int barrierDistance);

/*
 * Funkce odešle data zacatek rizeni k motorum kol
 */
void sendStartToMotors();

/*
 * Funkce odešle data konec rizeni k motorum kol
 */
void sendEndToMotors();

/*
 * Funkce zastavi pohyb robota (odesle pozadavek na nulovou rychlost obou kol)
 */
void Move_Stop();

/*
 * Funkce vrati hodnotu, kterou v pripade blizkosti prekazky nasobi pozadovanou rychlost
 *
 * Vstupni parametr: 
 *		Vzdalenost k nejblizsi prekazce.
 *
 * Vystupni hodnota:
 *		Vrati hodnotu od 0 do 1 ktera upravuje rychlost pohybu v pripade zaznamenani prekazky.
 */
float modifySpeedValue(int barrierDistance);

/*
 * Inicializace mericiho rozsahu snimace SRF 08 na 516mm.
 *
 * Vstupni parametr: 
 *		Adresa ultrazvukoveho snimace.
 */
void SRF_init(unsigned int address);

/*
 * Zahajeni mereni snimace SRF 08, mereno v cm.
 *
 * Vstupni parametr: 
 *		Adresa ultrazvukoveho snimace.
 */
void SRF_start(unsigned int address);

/*
 * Funkce cte hodnotu vzdalenosti prekazky ze snimace SRF 08.
 *
 * Vstupni parametr: 
 *		Adresa ultrazvukoveho snimace ze ktereho budeme cist.
 *
 * Vystupni hodnota:
 *		Funkce vraci vzdalenost prekazky od snimace v cm. Pokud snimac zadnou prekazku nezaznamena pak vrati hodnotu 0.
 */
int SRF_read(unsigned int address);

/*
 * Inicializuje kompas HMC5883L
 * 
 * Vstupni parametr:
 *		Adresa kompasu
 */	
int HMC5883L_init(unsigned int address);

/*
 *	Funkce cte hodnotu z magnetickeho snimace
 *
 *	Vstupni parametr:
 *		Adresa kompasu
 *		Adresa horniho bytu merene osy
 *
 * Vystupni hodnota:
 *		Funkce vraci namerenou hodnotu magnetickeho pole
 */
int HMC5883L_Read(unsigned int address, unsigned int address_MSB);

/*
 *	Funkce vyhodnoti parametry jako stavovy automat a odesle zadanou hodnotu rychlosti kol 
 *	
 *	Vstupni parametr:
 *		Nove namerena hodnota magnetickeho pole osy X
 *		Nove namerena hodnota magnetickeho pole osy Z
 *		Velikost nasobici hodnoty rychlosti zavisle na blizkosti prekazky
 */
void evaluateMeasurementSM(int x, int z, float modifySpeed);

/*
 *	Funkce vyhodnoti parametry jako PSD a odesle zadanou hodnotu rychlosti kol 
 *	
 *	Vstupni parametr:
 *		Nove namerena hodnota magnetickeho pole osy X
 *		Nove namerena hodnota magnetickeho pole osy Z
 *		Predchozi namerena hodnota magnetickeho pole osy X
 *		Predchozi namerena hodnota magnetickeho pole osy Z
 *		Velikost nasobici hodnoty rychlosti zavisle na blizkosti prekazky
 *		Soucet integracnich slozek
 */
void evaluateMeasurementPSD(int x, int z, int xPrev, int zPrev, float modifySpeed, int sumI);

/*
 *	Upravi merenou hodnotu tak, ze ji o konstantu HMC5883L_INTEGRATOR_VALUE problizi ke skutecne merene hodnote
 *
 *	Vstupni parametr:
 *		Vystupni vystupni hodnota
 *		Skutecna namerena hodnota
 */
void HMC5583L_UpdateValue(volatile int* updatedValue, int reallyValue);

/*
 *	Funkce pro odeslání namerenych hodnot z kompasu HMC5883L
 *	Tato funkce slouzi pro testovani
 *
 *	Vstupni parametr:
 *		Adresa kompasu
 *		Adresa horniho bytu osy x
 *		Adresa horniho bytu osy y
 *		Adresa horniho bytu osy z
 */
void sendHMC5883LValues(unsigned int hmc5883l_address, unsigned int x_msb_adress, unsigned int y_msb_adress, unsigned int z_msb_adress);

#endif