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

	\brief		Funkce pro seriovou komunikaci protokol CNP
				<<< ALL >>>
			
	\author		ConTeK s.r.o., Ing. Vladimir Kastner
	\version	01.01
	\date		12.01.2007
*/
//----------------------------------------------------

#ifndef _UCNP1A_H_
#define _UCNP1A_H_

#include <ctktypes.h>
#include <comm.h>

//----------------------------------------------------
/**
	\brief	Definice CNP1A protokolu
			+-------+-------+----------+----------+
			| DNode | SNode | DtLength |  *data*  |
			+-------+-------+----------+----------+
			    1       1        2        DtLength Bytes
*/
//----------------------------------------------------

typedef uint8_t			bnode_t;		//!< typ adresy site <1..255>, 0 = all = broadcast
typedef uint16_t		wlength_t;		//!< typ delky dat zpravy

#ifdef MSVC
//#pragma pack(show)
#pragma pack(push,1)
//#pragma pack(show)
#endif // MSVC

typedef struct
{
	bnode_t		DNode;					//!< adresa cilove stanice
	bnode_t		SNode;					//!< adresa odesilajici stanice
	wlength_t	DtLength;				//!< delka odesilanych dat Data[DtLength]

//	uint8_t		Data[0];				//!< data zpravy

#ifndef MSVC
} __attribute__((packed)) CNP1AMESS;
#else
} CNP1AMESS;
#endif // MSVC


typedef struct
{
	bnode_t		DNode;					//!< adresa cilove stanice
	bnode_t		SNode;					//!< adresa odesilajici stanice
	wlength_t	DtLength;				//!< delka odesilanych dat Data[DtLength]

//	uint8_t		Data[0];				//!< data zpravy

} CNP1AMESSu;


#ifdef MSVC
#pragma pack(pop)
//#pragma pack(show)
#endif // MSVC

//----------------------------------------------------
//! Struktura kontextu automatu vysilace a prijimace

typedef struct 
{
	COMMDESC *			Cmm;			//!< ukazatel na ovladac seriove komunikace

	bnode_t				Node;			//!< node komunikacniho uzlu

	cmSend_t			Send;			//!< ukazatel na Send linkove vrstvy
	cmRecv_t			Recv;			//!< ukazetel na Recv linkove vrstvy 

} CNP1ADESC;


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

	\param	_cnp1a		Struktura kontextu automatu
	\param	_cmm		Adresa knihovny fyzicke vrstvy
	\param	_node		Adresa komunikacniho uzlu
*/
//----------------------------------------------------

bool_t Cnp1AInitialize(CNP1ADESC * const _cnp1a, COMMDESC * const _cmm, const bnode_t _node);


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

	\param	_cnp1a		Struktura kontextu automatu
*/
//----------------------------------------------------

void Cnp1AFinalize(const CNP1ADESC * const _cnp1a);

#endif // _UCNP1A_H_
