
#ifndef WIZFI_H_
#define WIZFI_H_

/* Programový modul pro obsluhu WLAN modulu WizFi210
 * wizfi.h
 *
 * Created:	1.2.2014 20:00:00
 * Author:	David Müller 
 */ 

#include "../_common/common.h"

#define WZF_NO_CID -1										// indikace voné pozice v tabulce connTab

//---------------------------------------------------------
// deklarace spec. znaků pro AT komunukaci
//---------------------------------------------------------

#define CHR_CR 13
#define CHR_LF 10
#define CHR_ESC 27
#define CHR_TAB 9
#define CHR_SPACE ' '
#define CHR_BRK 0
#define ESC_START 'S'
#define ESC_USTART 'u'
#define ESC_END 'E'
#define ESC_ACK 'O'
#define ESC_FAIL 'F'

//---------------------------------------------------------
// definice typů
//---------------------------------------------------------

// stav asociace
typedef enum { WZF_ASSOCIATED, WZF_DISASSOCIATED } wzf_wlanState_t;
// stav komunukace
typedef enum { WZF_IDLE, WZF_REPLY, WZF_DATA, WZF_UDATA } wzf_rcvState_t;
// výsledek operace	
typedef enum { WZF_NORSULT=0, WZF_OK, WZF_ERR, WZF_TIMEOUT, WZF_ACK, WZF_FAIL, WZF_RESET, WZF_DIS } wzf_result_t;
// mód WLAN	
typedef enum { WZF_INFRASTRUCTURE, WZF_ADHOC, WZF_AP } wzf_wlanMode_t;
// výsledek připojení	
typedef enum { WZF_DISCONNECT, WZF_CONNECT } wzf_socketEvent_t;	
// mód DHCP
typedef enum { WZF_DHCP_DISABLE=0, WZF_DHCP_ENABLE=1 } wzf_dhcp_t;	
// typ pro index CID
typedef int8_t cid_t;
// typ pro ip adresu
typedef uint32_t ipAdd_t;
// typ pro obsluhu zpráv
typedef void(*executor_t)(cid_t cid, ipAdd_t sourceIp, char *data);

// struktura záznamu v tabulce connTab
typedef struct
{
	executor_t executor;									// metoda pro vyřízení
	ipAdd_t ip;												// ip adresa
	uint8_t ttd;											// čas do nuceného odpojení
} conn_t;

// typ pro řetězec s délkou uloženou v prvním byte
typedef struct
{
	uint8_t length;
	char text[32];
} text_t;

//---------------------------------------------------------
// deklarace veřejných metod
//---------------------------------------------------------

// test AT komunikace
extern wzf_result_t		wzf_testAT();
// čekání nastavenou dobu (x10ms)
extern void				wzf_wait(uint16_t timeout);			
// obsluha příjmu z UART (data ze soketů a notifikační zprávy)
extern wzf_wlanState_t	wzf_exec(void);
// časování - voláno každých 10ms z hlavního programu
extern void				wzf_tick(void);
// inicializace UART
extern void				wzf_init(void);			
// vyprázdnění UART před zahájením komunukace			
extern void				wzf_start(void);			
// provede sw reset		
extern void				wzf_reset(void);	
// provede nastavení modulu podle zadaných parametrů				
extern wzf_result_t		wzf_setup (
	const ipAdd_t *selfIp, const ipAdd_t *maskIp, const ipAdd_t *gateIp, wzf_dhcp_t dhcp,
	const text_t *ssid, const text_t *psk, const wzf_wlanMode_t mode, const uint8_t txPower);
// připojení/zřízení AP
extern wzf_result_t		wzf_associate(void);	
// odpojení/zrušení AP			
extern wzf_result_t		wzf_disassociate(void);				
// otevře TCP port pro poslech (nenavazuje spojení, tj. přes tento cid se nekomunikuje)
extern wzf_result_t		wzf_openTCPServer(const uint16_t port, const executor_t handler, cid_t *cid);
// otevře poslech na UDP portu
extern wzf_result_t		wzf_openUDPListener(const uint16_t port, const executor_t handler, cid_t *cid);
// otevře TCP spojení se vzdáleným serverem (přes tento cid se bude komunikovat)
extern wzf_result_t		wzf_openTCPClient(const ipAdd_t *ip, const uint16_t port, executor_t handler, cid_t *cid);
// vytvoří soket pro odesílání UDP datagramů
wzf_result_t			wzf_openUDPSender(const ipAdd_t *ip, const uint16_t port, cid_t *cid);
// vyslání dat z prog.úpaměti na indexem definovaný soket
extern wzf_result_t		wzf_send_P(const cid_t cid, const char *data);
// uzavření definovaného spojení/vysílání
extern wzf_result_t		wzf_close(const cid_t cid);
// zahájení vysílání na indexem definovaný soket
extern void				wzf_sendOpen(const cid_t cid);
// vložení řetězce z EEPROM na indexem definovaný soket pro odeslání
extern void				wzf_sendPushText_EE(const char *pcData, const uint8_t len);
// vložení řetězce z prog.paměti na indexem definovaný soket pro odeslání
extern void				wzf_sendPushText_P(const char *src, const uint8_t len);
// vložení ip z EEPROM na indexem definovaný soket pro odeslání
extern void				wzf_sendPushIp_EE(const ipAdd_t *src);
// vložení čísla UInt na indexem definovaný soket pro odeslání
extern void				wzf_sendPushUInt(const uint16_t val);
// vložení čísla Int na indexem definovaný soket pro odeslání
extern void				wzf_sendPushInt(const int16_t val);
// dokončení odeslání
extern wzf_result_t		wzf_sendDo();

#endif /* WIZFI_H_ */