//----------------------------------------------------
/**
	\file		ctk/inc/datacom.h
	\ingroup	serial
	\ingroup	all

	\brief		Automat pro komunikaci terminalu s ridicim systemem
				(cteni/zapis parametru)
				<<< ALL >>>
	
	\author		ConTeK s.r.o., Petr Cernin, Pavel Bazika
	\version	01.00
	\date		00.00.0000
*/
//----------------------------------------------------

#ifndef _DATACOM_H_
#define _DATACOM_H_

#include <libsets.h>
#include <ctktypes.h>
#include <datadef.h>
#include <timeticks.h>
#include <uctp.h>

//----------------------------------------------------
/**
	\brief	Callback volany po dokonceni operace zapisu parametru

	\param	code	Kod zapisovaneho parametru
	\param  status  Chybovy kod (tj. jedna z konstant CTPS_xxx)
*/
//----------------------------------------------------

typedef void (* dcmWriteProc_t) (const paramcode_t _code, const uint16_t _status);


//----------------------------------------------------
/**
	\brief	Callback volany po dokonceni operace cteni parametru

	\param	code		Kod cteneho parametru
	\param	status		Chybovy kod (tj. jedna z konstant CTPS_xxx)
	\param	processed	Pocet jiz prectenych parametru
	\param	total		Celkovy pocet ctenych parametru

	\note	V pripade, ze nastane chyba jiz pri prvnim pozadavku MSGID_GET_SWINFO
			pak je tento callback volan s parametry ( 0, status, 0, 1 )
*/
//----------------------------------------------------

typedef void (* dcmReadProc_t) (const paramcode_t _code, const uint16_t _status,
								const uint16_t _processed, const uint16_t _total);


//----------------------------------------------------
/**
	\brief	Callback volany po dokonceni operace update (cteni) parametru

	\param	code		Kod precteneho parametru
	\param	status		Chybovy kod (tj. jedna z konstant CTPS_xxx)
	\param	last		Priznak nastaveny v pripade precteni
						posledniho parametru ze seznamu
*/
//----------------------------------------------------

typedef void (* dcmUpdateProc_t) (const paramcode_t _code, const uint16_t _status, const bool_t _last);


//----------------------------------------------------
/**
	\brief	Callback volany po nacteni informaci o verzi podrizene jednotky

	\param	_swInfo		Nactene informace o verzi

	\return	Pokud vrati FALSE, nebude se pokracovat vycitanim parametru
*/
//----------------------------------------------------

typedef bool_t (* dcmVersionProc_t) (const SWINFODESC * const _swInfo);


//----------------------------------------------------
/**
	\brief	Zjisti, zda je automat datacom spusten

	\return	TRUE, pokud je automat spusten
*/
//----------------------------------------------------

bool_t DataComRunning(void);


//----------------------------------------------------
/**
	\brief	Pozadavek na abort datacom
*/
//----------------------------------------------------

void DataComAbort(void);


//----------------------------------------------------
/**
	\brief	Pozadavek na spusteni datacom

	\note	Po volani inicializace neni treba davat pozadavek ke spusteni.
*/
//----------------------------------------------------

void DataComRestart(void);


//----------------------------------------------------
/**
	\brief	Funkce pro inicializaci seznamu periodickeho update parametru
	\note	Pro zruseni update na prislusnem kanalu je potreba zavolat 
				dcmUpdateInit( id, 0, 0 )

	\param 	id			cislo update kanalu (0..DCM_UPDATE_LIST_COUNT - 1)
	\param	callback	Callback volany po nacteni parametru	
	\param	period		Perioda cteni parametru
*/
//----------------------------------------------------

void DataComUpdateInit(const uint8_t _id, dcmUpdateProc_t _callback, const ticks_t _period);


//----------------------------------------------------
/**
	\brief	Funkce pro pridani parametru do seznamu periodickeho update

	\param 	id			cislo update kanalu (0..DCM_UPDATE_LIST_COUNT - 1)
	\param	code		Kod parametru

	\return Funkce vraci nenulovou hodnotu, pokud se podarilo
	        parametr do seznamu vlozit
*/
//----------------------------------------------------

bool_t DataComUpdateParam(const uint8_t _id, const paramcode_t _code);


//----------------------------------------------------
/**
	\brief	Funkce testuje, zda je mozne zavolat funkci dcmWriteParam

	\return	Funkce vraci nenulovou hodnotu, pokud byl dokoncen
			predchozi zapis a je mozne volat funkci dcmWriteParam
*/
//----------------------------------------------------

bool_t DataComReadyToWrite(void);


//----------------------------------------------------
/**
	\brief	Funkce pro spusteni zapisu parametru
	\note	Pred volanim funkce dcmWriteParam je potreba testovat
			dokonceni predchoziho zapisu funkci dcmReadyToWrite.

	\param	code		Kod zapisovaneho parametru
	\param	data		Zapisovana data
	\param	callback	callback volany po dokonceni pozadavku

*/
//----------------------------------------------------

void DataComWriteParam(const paramcode_t _code, const datavalue_t * const _data, dcmWriteProc_t _callback);


//----------------------------------------------------
/**
	\brief	Funkce pro spusteni precteni vsech parametru

	\param	_versCb		callback volany po nacteni verze podrizene jednotky
	\param	_readCb		callback volany v prubehu cteni parametru
*/
//----------------------------------------------------

void DataComReadAll(dcmVersionProc_t _versCb, dcmReadProc_t _readCb);


//----------------------------------------------------
/**
	\brief	Funkce pro provedeni jednoho kroku automatu
*/
//----------------------------------------------------

void DataComTick(void);


//----------------------------------------------------
/**
	\brief	Funkce pro inicializaci automatu

	\param 	ctp			Kontext automatu master komunikace
*/
//----------------------------------------------------

void DataComInitialize(CTPDESC * const _ctp);


//----------------------------------------------------
/**
	\brief	Funkce pro ukonceni automatu
*/
//----------------------------------------------------

void DataComFinalize(CTPDESC * const _ctp);



#endif // ifndef _DATACOM_H_
