/*
 *	cliptimm.h
 *
 *	タイマ管理
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2016 Naoyuki Sawa
 *
 *	* Sat May 30 00:59:40 JST 2015 Naoyuki Sawa
 *	- 1st リリース。
 *	* Wed Nov 18 21:37:53 JST 2015 Naoyuki Sawa
 *	- 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。
 *	* Tue Aug 02 22:11:15 JST 2016 Naoyuki Sawa
 *	- ST_TimMgrFunc.fn の関数プロトタイプを変更しました。
 *	  ST_TimMgrFunc.argフィールドを追加しました。
 *	  これまでは、引数を取る関数をタイマに登録するためには、中継関数を経由する必要が有りました。
 *	  今回の変更によって、引数を取る関数も直接、タイマに登録する事が出来るようになりました。
 */
#ifndef __CLIP_TIMM_H__
#define __CLIP_TIMM_H__
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
/****************************************************************************
 *	定数、構造体
 ****************************************************************************/
//タイマ管理チャネル番号
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)(void* arg);	//+ 0, 4 関数			NULL不可	アプリケーションがTimMgr_AddFunc()を呼び出す前に設定せよ。
	void*				arg;			//+ 4, 4 関数引数		NULL可		アプリケーションがTimMgr_AddFunc()を呼び出す前に設定せよ。
	unsigned short			uItv;			//+ 6, 2 関数インターバル	   0不可	アプリケーションがTimMgr_AddFunc()を呼び出す前に設定せよ。
	unsigned short			uCnt;			//+ 8, 2 関数カウンタ		   0~uCnt	アプリケーションがTimMgr_AddFunc()を呼び出す時に不定値で構わない。
	struct _ST_TimMgrFunc*		pNext;			//+12, 4 次の関数ノード		NULL=終端	アプリケーションがTimMgr_AddFunc()を呼び出す時に不定値で構わない。
} ST_TimMgrFunc;						//=16
/*--------------------------------------------------------------------------*/
//タイマ管理チャネル構造体
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);
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__CLIP_TIMM_H__
