//----------------------------------------------------
/**
	\file		ctk/inc/wpin.h
	\ingroup	visualization
	\ingroup	all

	\brief		Okno pro zadani PINu
				<<< ALL >>>

	\author		ConTeK s.r.o., Petr Cernin
	\version	01.00
	\date		00.00.0000
*/
//----------------------------------------------------

#ifndef _WPIN_H_
#define _WPIN_H_

#include <hwmodel.h>
#include <ctktypes.h>
#include <datadef.h>
#include <wnd.h>

//!	Datovy typ pinu

typedef uint32_t	wpin_t;


//----------------------------------------------------
/**
	\brief	callback volany v ramci obsluhy okna
			pro zadavani pinu pri stisku klavesy Enter

	\note	Funkce by mela zkontrolovat cislo PIN (porovnat
			jej s nastavenymi piny) a vratit cislo urovne.
			Pokud se PIN neni platny, pak funkce musi vratit 0

			Funkce by mela PINy kontrolovat od nejvyssi urovne
			k nejnizsi urovni (aby pri duplicitnich PINech byla
			vzdy vybrana vyssi uroven)

	\param	param je parametr predany funkci wPinInit()
*/
//----------------------------------------------------

typedef  uint8_t (* wPinCheckProc_t) (const wpin_t _pin, const wndparam_t _param);


//----------------------------------------------------
/**
	\brief	callback volany pri stisku klavesy
			Enter nebo ESC.

	\note	Parametr funkce je nasledujici hodnota:

			0     .. neplatne heslo,
			1..5  .. uroven PINu,
			255   .. stisknuto ESC.

	\param	param je parametr predany funkci wPinInit()
*/
//----------------------------------------------------

typedef  void (* wPinExitProc_t) (const uint8_t _level, const wndparam_t _param);


#define PIN_DIGITS	6U			//!< Pocet cislic PINu

//----------------------------------------------------
//! Struktura kontextu automatu okna pro zadavani pinu

typedef struct _WPIN_CTX
{
	char_t			Text[PIN_DIGITS + 1];		//!< text pinu
	uint8_t			CurPos;						//!< pozice kurzoru (zleva)
	bool_t			CurVisible;					//!< priznak zobrazeneho kurzoru
	wPinCheckProc_t	CheckCallback;				//!< Callback rutina pro kontrolu pinu
	wPinExitProc_t	ExitCallback;				//!< Callback rutina volana pri opusteni okna
	wndparam_t		Param;						//!< parametr callbacku
	stringindex_t	TitleText;					//!< Text titulku
	stringindex_t	InfoText;					//!< Text zobrazeny v pravem hornim rohu, nebo 0

} WPIN_CTX;


//----------------------------------------------------
/**
	\brief	Rutina obsluhy udalosti okna pro zadani pinu
*/
//----------------------------------------------------

void wPinEvent(WPIN_CTX * const _ctx, const wndevent_t _event, wndinfo_t _info);


//----------------------------------------------------
/**
	\brief	Inicializace okna pro zadani pinu

	\param	checkCallback	callback volany pro kontrolu pinu
	\param	exitCallback	callback volany pri stisku ESC nebo Enter
*/
//----------------------------------------------------

void wPinInit(WPIN_CTX * const _ctx, wPinCheckProc_t _checkCallback,
	wPinExitProc_t _exitCallback, const wndparam_t _param, const stringindex_t _titleText,
	const stringindex_t _infoText);

#endif // #ifndef _WPIN_H_
