/**
 * @brief           UART Manager Header
 * @author          AXELL CORPORATION
 * @description     UART Manager提供ヘッダ。<p>UART Manager使用時にincludeして下さい。
 * @note            none
 * @history         2017_02_22  初版
 * @history         2017_10_26  Ver2.0
*/
/* DOM-IGNORE-BEGIN */
/*
 * This program was created by AXELL CORPORATION.
 * Copyright (C) 2017 AXELL CORPORATION, all rights reserved.
 */

#ifndef _UARTMGR_H_
#define _UARTMGR_H_
/* DOM-IGNORE-END */

#include <stdint.h>
#include "lib_common/AG903_common.h"

#ifdef __cplusplus
extern "C" {
#endif

/** CLK_FTPの周波数 [Hz] */
#define AG903_UART_CLK			(100000000)

/** 送信バッファサイズ */
#define AG903_UART_BUFSIZE		(512)

/** パリティ指定 （なし）*/
#define AG903_UART_PARITY_NON	(0)
/** パリティ指定 （奇数）*/
#define AG903_UART_PARITY_ODD	(1)
/** パリティ指定 （偶数）*/
#define AG903_UART_PARITY_EVEN	(2)

/** ストップビット指定 （1ビット）*/
#define AG903_UART_STOPBIT_1	(1)
/** ストップビット指定 （2ビット）*/
#define AG903_UART_STOPBIT_2	(2)
/** ストップビット指定 （1.5ビット）*/
#define AG903_UART_STOPBIT_1_5	(3)

/** データビット指定 （5ビット）*/
#define AG903_UART_DATBIT_5		(5)
/** データビット指定 （6ビット）*/
#define AG903_UART_DATBIT_6		(6)
/** データビット指定 （7ビット）*/
#define AG903_UART_DATBIT_7		(7)
/** データビット指定 （8ビット）*/
#define AG903_UART_DATBIT_8		(8)

/** フロー制御指定 （なし）*/
#define AG903_UART_FLOW_NON		(0)
/** フロー制御指定 （RTS/CTS）*/
#define AG903_UART_FLOW_CTS		(1)

/** 初期設定値 （ボー・レート）*/
#define AG903_UART_DFLT_BAUD	(9600)
/** 初期設定値 （パリティ）*/
#define AG903_UART_DFLT_PARITY	(AG903_UART_PARITY_NON)
/** 初期設定値 （ストップビット）*/
#define AG903_UART_DFLT_STOPBIT	(AG903_UART_STOPBIT_1)
/** 初期設定値 （データビット）*/
#define AG903_UART_DFLT_DATBIT	(AG903_UART_DATBIT_8)
/** 初期設定値 （フロー制御）*/
#define AG903_UART_DFLT_FLOW	(AG903_UART_FLOW_NON)

/** リセットFIFO指定 （RXFIFO）*/
#define AG903_UART_RESET_RXFIFO	(1<<0)
/** リセットFIFO指定 （TXFIFO）*/
#define AG903_UART_RESET_TXFIFO	(1<<1)

/** イベント指定ビット （RS485受信タイムアウト）*/
#define AG903_UART_RCVTIMEOUT_BIT	(1<<0)
/** イベント指定ビット （RS485キャラクタ間受信タイムアウト）*/
#define AG903_UART_CHARATIMEOUT_BIT	(1<<1)

/** イベント検出ビット （送信完了）*/
#define AG903_UART_EVENT_SNDEND		(1<<0)
/** イベント検出ビット （送信データなし）*/
#define AG903_UART_EVENT_SNDEMPTY	(1<<1)
/** イベント検出ビット （受信データ有）*/
#define AG903_UART_EVENT_DATARDY	(1<<2)
/** イベント検出ビット （受信タイムアウト）*/
#define AG903_UART_EVENT_RCVTIMEOUT	(1<<3)
/** イベント検出ビット （Break受信）*/
#define AG903_UART_EVENT_BREAK		(1<<4)
/** イベント検出ビット （RS485受信タイムアウト）*/
#define AG903_UART_EVENT_RS485_RTO	(1<<5)
/** イベント検出ビット （RS485キャラクタ間受信タイムアウト）*/
#define AG903_UART_EVENT_RS485_CTO	(1<<6)
/** イベント検出ビット （オーバーラン）*/
#define AG903_UART_EVENT_OVERRUN	(1<<8)
/** イベント検出ビット （パリティエラー）*/
#define AG903_UART_EVENT_PARITYERR	(1<<9)
/** イベント検出ビット （フレーミングエラー）*/
#define AG903_UART_EVENT_FRAMINGERR	(1<<10)
/** イベント検出ビット （FIFOデータエラー）*/
#define AG903_UART_EVENT_FIFOERR	(1<<11)

/** UARTハンドル */
typedef uint32_t	AG903_UARTMgrHandle;

/** コールバック関数の型。<p>
    handleはUARTハンドル、eventはイベント検出ビットです。<p>
    eventのBitアサインは以下の通りです。<p>
    <table>
    <tr><th>bit</th><th>内容</th></tr>
    <tr><td>31:12</td><td>reserve</td></tr>
    <tr><td>11</td><td>FIFOデータエラー</td></tr>
    <tr><td>10</td><td>フレーミングエラー</td></tr>
    <tr><td>9</td><td>パリティエラー</td></tr>
    <tr><td>8</td><td>オーバーランエラー</td></tr>
    <tr><td>7</td><td>reserve</td></tr>
    <tr><td>6</td><td>RS485キャラクタ間受信タイムアウト</td></tr>
    <tr><td>5</td><td>RS485受信タイムアウト</td></tr>
    <tr><td>4</td><td>Break受信</td></tr>
    <tr><td>3</td><td>受信データ有（タイムアウト）</td></tr>
    <tr><td>2</td><td>受信データ有</td></tr>
    <tr><td>1</td><td>送信データなし(DMA)</td></tr>
    <tr><td>0</td><td>送信完了(PIO)</td></tr>
    </table> */
typedef void (*AG903_UARTMgrClbk)(AG903_UARTMgrHandle* handle, uint32_t event);

/** UART設定パラメータ<p>
    parity は右から指定します。 AG903_UART_PARITY_NON , AG903_UART_PARITY_EVEN , AG903_UART_PARITY_ODD<p>
    stopbit は右から指定します。 AG903_UART_STOPBIT_1 , AG903_UART_STOPBIT_1_5 , AG903_UART_STOPBIT_2<p>
    databit は右から指定します。 AG903_UART_DATBIT_5 , AG903_UART_DATBIT_6 , AG903_UART_DATBIT_7 , AG903_UART_DATBIT_8<p>
    flow は右から指定します。 AG903_UART_FLOW_NON , AG903_UART_FLOW_CTS */
typedef struct _AG903_UARTMgrParam {
	uint32_t	baud;		/** ボー・レート [bps] */
	uint8_t		parity;		/** パリティ (なし/Even/Odd) */
	uint8_t		stopbit;	/** ストップビット数 (1/1.5/2) */
	uint8_t		databit;   	/** データビット数 (5/6/7/8) */
	uint8_t		flow;		/** フロー制御 (なし/CTS,RTS) */
} AG903_UARTMgrParam;

/** RS485設定パラメータ<p>
    event は以下の各bitに”1”を指定するとイベントが有効になります。<p>
    <table>
    <tr><th>bit</th><th>内容</th></tr>
    <tr><td>1</td><td>キャラクタ間受信タイムアウト</td></tr>
    <tr><td>0</td><td>受信タイムアウト</td></tr>
    </table> */
typedef struct _AG903_UARTMgrRs485Param {
	uint32_t	setuptime;	/** セットアップ時間 [clk] */
	uint32_t	holdtime;	/** ホールド時間 [clk] */
	uint32_t	rcvtime;	/** 受信時間 [clk] */
	uint32_t	interval;	/** キャラクタ間隔 [clk] */
	uint32_t	timeout;	/** 受信タイムアウト値 [clk] */
	uint32_t	event;	    /** Timeout Event設定 */
} AG903_UARTMgrRs485Param;


int32_t	AG903_UARTMgrInit(uint8_t ch);
int32_t	AG903_UARTMgrGetHandle(uint8_t ch, AG903_UARTMgrHandle** handle);
int32_t	AG903_UARTMgrReleaseHandle(AG903_UARTMgrHandle* handle);
int32_t	AG903_UARTMgrSetCallback(AG903_UARTMgrHandle* handle, AG903_UARTMgrClbk clbk);
int32_t AG903_UARTMgrSetParam(AG903_UARTMgrHandle*handle, AG903_UARTMgrParam* param);
int32_t AG903_UARTMgrSetRs485Param(AG903_UARTMgrHandle*handle, AG903_UARTMgrRs485Param *param);
int32_t AG903_UARTMgrSend(AG903_UARTMgrHandle* handle, uint8_t* buf, uint32_t size, _Bool dma);
int32_t AG903_UARTMgrReceive(AG903_UARTMgrHandle* handle, _Bool dma);
int32_t AG903_UARTMgrGetReceiveData(AG903_UARTMgrHandle* handle, uint8_t* buf, uint32_t size);
int32_t AG903_UARTMgrStopSend(AG903_UARTMgrHandle* handle);
int32_t AG903_UARTMgrStopReceive(AG903_UARTMgrHandle* handle);
int32_t AG903_UARTMgrResetFifo(AG903_UARTMgrHandle* handle, uint8_t rstbit);
int32_t AG903_UARTMgrSetBreak(AG903_UARTMgrHandle* handle, _Bool enable);

#ifdef __cplusplus
}
#endif
#endif /* _UARTMGR_H_ */
