/**
 * @brief           TIMR Primitive Header
 * @author          AXELL CORPORATION
 * @description     TIMR Primitive提供ヘッダ。<p>TIMR Primitive使用時に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 _TIMRPRM_H_
#define _TIMRPRM_H_
/* DOM-IGNORE-END */

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

#ifdef __cplusplus
extern "C" {
#endif

#if AG903_LIB_USE_GVD
/** TIMRチャンネル数<p>
	GVD使用時はch7をGVDが占有 */
#define AG903_TIMR_CH_NUM			(7)
#else
/** TIMRチャンネル数 */
#define AG903_TIMR_CH_NUM			(8)
#endif

/** TIMRイベント数 */
#define AG903_TIMR_EVENT_NUM		(64)

/** TIMR出力端子数 */
#define AG903_TIMR_EXTOUT_NUM		(4)

/** 出力パルス幅（Max値）*/
#define AG903_TIMR_PLUSEWIDTH_MAX	(0xFFFFF)

/** TIMnINMOD/TIMnRSTTRG RES設定値 */
enum _AG903_TimrInmodResType {
	AG903_TIMR_RES_SYSCLK = 0,		/** システムクロック */
	AG903_TIMR_RES_RESEVE,			/** 予約 */
	AG903_TIMR_RES_TICK0,			/** TICK0 */
	AG903_TIMR_RES_TICK1,			/** TICK1 */
};

/** TIMnCTRL MOD設定値 */
enum _AG903_TimrTIMnCtrlMod {
	AG903_TIMR_CTRLMOD_STOP = 0,	/** 動作停止 */
	AG903_TIMR_CTRLMOD_REIN,		/** ロータリーエンコーダ入力 */
	AG903_TIMR_CTRLMOD_PWMIN,		/** PWM 入力 */
	AG903_TIMR_CTRLMOD_RESEVE,		/** 予約 */
	AG903_TIMR_CTRLMOD_TICKCNT,		/** クロック/TICK 計測 */
	AG903_TIMR_CTRLMOD_EVENTCNT,	/** 内部イベント計測 */
	AG903_TIMR_CTRLMOD_PLUSECNT,	/** 入力端子パルス計測 */
	AG903_TIMR_CTRLMOD_LEVELCNT,	/** 入力端子レベル計測 */
	AG903_TIMR_CTRLMOD_MODENUM,		/** モード数 */
};

/** TIMnOUTMOD MOD設定値 */
enum _AG903_TimrOutMod {
	AG903_TIMR_OUTMOD_DISABLE = 0,	/** 出力なし */
	AG903_TIMR_OUTMOD_PWM,			/** PWM出力 */
	AG903_TIMR_OUTMOD_PLUSE,		/** パルス出力 */
	AG903_TIMR_OUTMOD_LEVEL,		/** レベル出力 */
	AG903_TIMR_OUTMOD_MODENUM,		/** モード数 */
};

/** TIMnRSTTRG BOOT設定値 */
enum _AG903_TimrRstBoot {
	AG903_TIMR_RSTBOOT_TICKCNT = 0,	/** クロック/TICK 計測 */
	AG903_TIMR_RSTBOOT_EVENTCNT,	/** 内部イベント計測 */
	AG903_TIMR_RSTBOOT_PLUSECNT,	/** 入力端子パルス計測 */
	AG903_TIMR_RSTBOOT_LEVELCNT,	/** 入力端子レベル計測 */
	AG903_TIMR_RSTBOOT_MODENUM,		/** モード数 */
};

/** TIMnRSTTRG EN設定値 */
enum _AG903_TimrRstEn {
	AG903_TIMR_RSTEN_DISABLE = 0,	/** リセットトリガ無効 */
	AG903_TIMR_RSTEN_RESEVE,		/** 予約 */
	AG903_TIMR_RSTEN_EXTPORT,		/** リセットトリガ有効(外部端子) */
	AG903_TIMR_RSTEN_EVENT,			/** リセットトリガ有効(内部イベント) */
	AG903_TIMR_RSTEN_MODENUM,		/** モード数 */
};

#define AG903_TIMR_INTMSK_CM_BIT	(1<<AG903_TIMn_INTMASK_CM_POS)	/** TIMnINTMASK CM-bit */
#define AG903_TIMR_INTMSK_OVF_BIT	(1<<AG903_TIMn_INTMASK_OVF_POS)	/** TIMnINTMASK OVF-bit */

#define AG903_TIMR_TRIGGER_CM_BIT	(1<<AG903_TIMn_TRIGGER_CM_POS)	/** TIMnTRIGGER CM-bit */
#define AG903_TIMR_TRIGGER_OVF_BIT	(1<<AG903_TIMn_TRIGGER_OVF_POS)	/** TIMnTRIGGER OVF-bit */

#define AG903_TIMR_DMAREQ_CM_BIT	(1<<AG903_TIMn_DMAREQ_CM_POS)	/** TIMnDMAREQ CM-bit */
#define AG903_TIMR_DMAREQ_OVF_BIT	(1<<AG903_TIMn_DMAREQ_OVF_POS)	/** TIMnDMAREQ OVF-bit */

#define AG903_TIMR_STAT_CM_BIT		(1<<AG903_TIMn_STAT_CM_POS)		/** TIMnSTAT CM-bit */
#define AG903_TIMR_STAT_OVF_BIT		(1<<AG903_TIMn_STAT_OVF_POS)	/** TIMnSTAT OVF-bit */

/** TIMnINMOD 設定値 */
typedef struct _AG903_TIMRPrmInModeParam{
	uint8_t		eve;	/** EVE 設定値 */
	uint8_t		lo;		/** LO 設定値 */
	uint8_t		ch;		/** CH 設定値 */
	uint8_t		pol;	/** POL 設定値 */
	uint8_t		res;	/** RES 設定値 */
}AG903_TIMRPrmInModeParam;

/** TIMnOUTMOD 設定値 */
typedef struct _AG903_TIMRPrmOutModeParam{
	uint8_t		cm;		/** CM 設定値 */
	uint8_t		ovf;	/** OVF 設定値 */
	uint8_t		ch;		/** CH 設定値 */
	uint8_t		pol;	/** POL 設定値 */
	uint8_t		mod;	/** MOD 設定値 */
}AG903_TIMRPrmOutModeParam;

/** TIMnRSTTRG 設定値 */
typedef struct _AG903_TIMRPrmResetTriggerParam{
	uint8_t		eve;	/** EVE 設定値 */
	uint8_t		lo;		/** LO 設定値 */
	uint8_t		ch;		/** CH 設定値 */
	uint8_t		pol;	/** POL 設定値 */
	uint8_t		res;	/** RES 設定値 */
	uint8_t		boot;	/** BOOT 設定値 */
	uint8_t		en;		/** EN 設定値 */
}AG903_TIMRPrmResetTriggerParam;


void AG903_TIMRPrmSetInMode(uint8_t ch, AG903_TIMRPrmInModeParam* param);
void AG903_TIMRPrmSetOutMode(uint8_t ch, AG903_TIMRPrmOutModeParam* param);
void AG903_TIMRPrmSetResetTrigger(uint8_t ch, AG903_TIMRPrmResetTriggerParam* param);
void AG903_TIMRPrmEnableOneshot(uint8_t ch);
void AG903_TIMRPrmDisableOneshot(uint8_t ch);
void AG903_TIMRPrmSetCntMode(uint8_t ch, uint8_t mode);
void AG903_TIMRPrmGetCntMode(uint8_t ch, uint8_t* mode);
void AG903_TIMRPrmSetCount(uint8_t ch, uint32_t count);
void AG903_TIMRPrmGetCount(uint8_t ch, uint32_t* count);
void AG903_TIMRPrmSetPeriod(uint8_t ch, uint32_t period);
void AG903_TIMRPrmGetPeriod(uint8_t ch, uint32_t* period);
void AG903_TIMRPrmSetMatch(uint8_t ch, uint32_t match);
void AG903_TIMRPrmGetMatch(uint8_t ch, uint32_t* match);
void AG903_TIMRPrmSetPluseWidth(uint8_t ch, uint32_t width);
void AG903_TIMRPrmGetPluseWidth(uint8_t ch, uint32_t* width);
void AG903_TIMRPrmEnableMask(uint8_t ch, uint32_t setbit);
void AG903_TIMRPrmDisableMask(uint8_t ch, uint32_t clrbit);
void AG903_TIMRPrmEnableEventTrigger(uint8_t ch, uint32_t setbit);
void AG903_TIMRPrmDisableEventTrigger(uint8_t ch, uint32_t clrbit);
void AG903_TIMRPrmEnableDmaRequest(uint8_t ch, uint32_t setbit);
void AG903_TIMRPrmDisableDmaRequest(uint8_t ch, uint32_t clrbit);
void AG903_TIMRPrmGetStatus(uint8_t ch, uint32_t* status);
void AG903_TIMRPrmClearStatus(uint8_t ch, uint32_t setbit);
void AG903_TIMRPrmSetBootTrigger(uint8_t chbit);

#ifdef __cplusplus
}
#endif
#endif /* _TIMRPRM_H_ */
