//----------------------------------------------------
/**
	\file		ctk/inc/framstor.h
	\ingroup	hardware
	\ingroup	all

	\brief		Knihovna pro zabezpeceny pristup k datum ve FRAM pameti
				<<< ALL >>>
			
	\author		ConTeK s.r.o., Ing. Petr Cernin
	\version	01.01
	\date		12.01.2007
*/
//----------------------------------------------------

#ifndef _FRAMSTOR_H_
#define _FRAMSTOR_H_

//----------------------------------------------------
/**
	\brief	Knihovna zajistuje nasledujici:
			1) kontrolu platnosti obsahu FRAM
			2) inicializaci dat ve FRAM
			3) nacteni dat z FRAM
			4) ulozeni vsech parametru do FRAM
*/
//----------------------------------------------------

#include <ctktypes.h>

// Adresa dat ve FRAM
#define DATA_HEADER_ADDR		64
#define DATA_PERSISTENT_0_ADDR	(DATA_HEADER_ADDR + sizeof( DATA_HEADER))
#define DATA_PERSISTENT_1_ADDR	(DATA_HEADER_ADDR + sizeof( DATA_HEADER) + sizeof( DATA_PERSISTENT ))


//----------------------------------------------------
/**
	\brief	Zahlavi dat ulozenych ve FRAM
			Po resetu se kontroluje toto zahlavi ulozene
			na adrese DATA_CONFIG_HEADER_ADDR. Pokud neni platne, pak
			se provede inicializace FRAM
*/
//----------------------------------------------------

typedef struct
{
	uint16_t				Magic;			// Cislo MAGIC_NUMBER
	uint16_t				Version;		// Verze dat
	uint8_t					Selector;		// Platna polozka Data[]

} DATA_HEADER;


//----------------------------------------------------
/**
	\brief	Kontext automatu pro pristup k datum ve FRAM
*/
//----------------------------------------------------

typedef struct 
{
	volatile bool_t		flRunning;		// je inicializovano, po ininializaci na TRUE, pred ukoncenim FALSE
	volatile uint8_t	State;			// Stav automatu
	uint8_t			Command;		// Prikaz

	uint16_t		Timer;

	DATA_HEADER		Header;
	DATA_PERSISTENT	Data;

} FRAMSTORDESC;


//----------------------------------------------------
/**
	\brief	Krok automatu pro pristup k parametrum ve FRAM

	\param	framStorD	struktura kontextu automatu
*/
//----------------------------------------------------

void FramStorageTick( FRAMSTORDESC * framStorD );


//----------------------------------------------------
/**
	\brief	Funkce pro testovani, zda je mozne automatu
			predat prikaz (tj. zavolat napr. FramStorageWriteCode)

	\param	framStorD	struktura kontextu automatu

	\return	TRUE	automat je schopen akceptovat dalsi prikaz
			FALSE	automat neni schopen
*/
//----------------------------------------------------

bool_t FramStorageReady( FRAMSTORDESC * framStorD );


//----------------------------------------------------
/**
	\brief	Funkce pro spusteni sekvence zapisu 
			stavu z RAM do FRAM
	\param	framStorD	struktura kontextu automatu
*/
//----------------------------------------------------

void FramStorageWriteState( FRAMSTORDESC * framStorD );


//----------------------------------------------------
/**
	\brief	Inicializace automatu pro pristup k parametrum ve FRAM

	\param	framStorD	struktura kontextu automatu
	\param	setDefault	FALSE normalni inicializace
						TRUE nakopirovani default parametru
*/
//----------------------------------------------------

bool_t FramStorageInitialize( FRAMSTORDESC * framStorD, bool_t setDefault );


//----------------------------------------------------
/**
	\brief Ukonceni cinnosti automatu

	\param	framStorD	struktura kontextu automatu
*/
//----------------------------------------------------

void FramStorageFinalize( FRAMSTORDESC * framStorD );


#endif // _FRAMSTOR_H_

