/*
 *	cliptimm.h
 *
 *	タイマ管理
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2015 Naoyuki Sawa
 *
 *	* Sat May 30 00:59:40 JST 2015 Naoyuki Sawa
 *	- 1st リリース。
 */
#ifndef __CLIP_TIMM_H__
#define __CLIP_TIMM_H__
/****************************************************************************
 *	定数、構造体
 ****************************************************************************/
//タイマ管理チャネル番号
enum {
	TimMgrCh_1f,		// 0 1f		　同期タイマ
	TimMgrCh_10ms,		// 1 10ms	　同期タイマ
	TimMgrCh_100ms,		// 2 100ms	　同期タイマ
	TimMgrCh_1s,		// 3 1s		　同期タイマ
	TimMgrCh_1ms,		// 4 1ms	非同期タイマ
	TimMgrCh_SIZE,		// 5
};
/*--------------------------------------------------------------------------*/
//関数ノード構造体
typedef struct _ST_TimMgrFunc {
	void				(*fn)();	//+ 0, 4 関数			NULL=不可	アプリケーションがTimMgr_AddFunc()を呼び出す前に設定せよ。
	unsigned short			uItv;		//+ 4, 2 関数インターバル	   0=不可	アプリケーションがTimMgr_AddFunc()を呼び出す前に設定せよ。
	unsigned short			uCnt;		//+ 6, 2 関数カウンタ		   0~uCnt	アプリケーションがTimMgr_AddFunc()を呼び出す時に不定値で構わない。
	struct _ST_TimMgrFunc*		pNext;		//+ 8, 4 次の関数ノード		NULL=終端	アプリケーションがTimMgr_AddFunc()を呼び出す時に不定値で構わない。
} ST_TimMgrFunc;					//=12
/*--------------------------------------------------------------------------*/
//タイマ管理チャネル構造体
typedef struct _ST_TimMgrCh {
	         unsigned short		uSub;		//+ 0 2 減算値					1000,(uAdd*10),(uAdd*100),(uAdd*1000),0/*終端*/
	volatile unsigned short		uErr;		//+ 2 2 チャネル誤差項				1msチャネルでは使用しない。
	volatile int			uCnt;		//+ 4 4 チャネルカウンタ
	struct _ST_TimMgrFunc*		pNext;		//+ 8 4 関数チェイン
} ST_TimMgrCh;						//=12
/*--------------------------------------------------------------------------*/
//タイマ管理構造体
typedef struct _ST_TimMgr {
	unsigned char	uAdd;				//+ 0    1 加算値		1~65		フレームレートと同じ。
	ST_TimMgrCh	TBL_TimMgrCh[TimMgrCh_SIZE];	//+ 4 12*5 タイマ管理チャネル
} ST_TimMgr;						//=64
/****************************************************************************
 *	アプリケーション用関数
 ****************************************************************************/
void TimMgr_Init(ST_TimMgr* pTimMgr, int uFps);
void TimMgr_AddFunc(ST_TimMgr* pTimMgr, int iCh, ST_TimMgrFunc* pFunc);
int TimMgr_GetCnt(ST_TimMgr* pTimMgr, int iCh);
void TimMgr_Intr(ST_TimMgr* pTimMgr);
void TimMgr_Exec(ST_TimMgr* pTimMgr);
#endif//__CLIP_TIMM_H__
