/*****************************************************
timer.c :
  μITRON サンプルプログラム
  Copyright(C) 1998-2002 佐々木芳

タイマタスクの実装

*****************************************************/

#include "hal.h"
#include "itron.h"
#include "event.h"
#include "debug.h"
#include "timer.h"

/* タイマ管理テーブルの確保 */
TIMERSLOT	TimerSlot[NUM_TIMERS];

/*システム起動時からのカウント値*/
DWORD	TimerCount;

/*****************************************************
タイマ制御のＡＰＩ
*****************************************************/
/*****************************************************
////タイマの設定
	タイマは起動しない
*****************************************************/
void timSetTimer(TNO tno,				/*タイマ番号（TNO_xxx)*/
			 TIMEOUT timeout,			/*タイムアウト値（ミリ秒）*/
			 ID		mbxid,				/*メッセージボックスのＩＤ*/
			 int	szMsg,				/*メッセージサイズ*/
			 MSGBLOCK* pMsg)			/*メッセージアドレス*/
{
	DECLARE_MASK;
	SET_MASK;					/* 割込み禁止 */
	TimerSlot[tno].mbxid = mbxid;
	TimerSlot[tno].szMsg = szMsg;
	TimerSlot[tno].pMsg = pMsg;
	TimerSlot[tno].count = 0;
	TimerSlot[tno].timeout = timeout/TIMERUNIT;
	RESTORE_MASK;					/* 割込み許可／禁止状態の復帰 */
}

/*****************************************************
////タイマの無効
*****************************************************/
void timCancelTimer(TNO tno)
{
	DECLARE_MASK;
	SET_MASK;					/* 割込み禁止 */
	TimerSlot[tno].mbxid = 0;
	TimerSlot[tno].szMsg = 0;
	TimerSlot[tno].pMsg = NULL;
	TimerSlot[tno].count = 0;
	TimerSlot[tno].timeout = 0;
	RESTORE_MASK;					/* 割込み許可／禁止状態の復帰 */
}

/*****************************************************
////タイマの起動
*****************************************************/
void timStartTimer(TNO tno)
{
	DECLARE_MASK;
	SET_MASK;					/* 割込み禁止 */
	TimerSlot[tno].count = TimerSlot[tno].timeout;
	RESTORE_MASK;					/* 割込み許可／禁止状態の復帰 */
}

/*****************************************************
////タイマの停止
*****************************************************/
void timStopTimer(TNO tno)
{
	DECLARE_MASK;
	SET_MASK;					/* 割込み禁止 */
	TimerSlot[tno].count = 0;
	RESTORE_MASK;					/* 割込み許可／禁止状態の復帰 */
}


/*****************************************************
//汎用タイマタスク
*****************************************************/
void TimerTask(VP_INT exinf)
{
	ER ercd;
	int i;
	DebugPrintf("\rTimerTask: started.\r");
	TimerCount = 0;
	/*タイマ管理テーブルを初期化*/
	for(i=0; i<NUM_TIMERS; i++){
		timCancelTimer((TNO)i);
	}
	/**/
	while(1){
		tslp_tsk(TIMERUNIT);
		++ TimerCount;
		for(i=0; i<NUM_TIMERS; i++){
			if(TimerSlot[i].count){
				/*起動中のタイマ*/
				if(--TimerSlot[i].count == 0){
					/*タイムアップしたのでメッセージを送る*/
					/*TimerSlot[i].pMsg->mheader.os_rsv = 0;*/
					//ercd = snd_mbx(TimerSlot[i].mbxid, (T_MSG*)TimerSlot[i].pMsg);
					ercd = SendEvent(TimerSlot[i].mbxid, TimerSlot[i].pMsg);
				}
			}
		}
	}
}

