/*****************************************************
display5.c : Edited at 2002,11,3 by K.Sasaki
  μITRON サンプルプログラム
  Copyright(C) 1998-2002 佐々木芳

ボタンのデバンス処理（チャタリング除去）

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

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


/*ボタンダウン通知用メッセージ領域確保*/
MSGHEADER EventButtonDown ={
	{0},				/*T_MSG os_rsv*/
	EV_BUTTON_DOWN,		/*id*/
	0,					/*sub*/
	0					/*length*/
};
/*ボタンアップ通知用メッセージ領域確保*/
MSGHEADER EventButtonUp ={
	{0},				/*T_MSG os_rsv*/
	EV_BUTTON_UP,		/*id*/
	0,					/*sub*/
	0					/*length*/
};

/*****************************************************
//ボタン押下検出タスク
//・２０ミリ秒ごとに起床
	６０ミリ秒以上同じ状態が続いたら、ボタン状態変化を確定する
	（チャタリングを除去）
*****************************************************/
typedef enum{
	BS_STABLE,
	BS_CHANGE,
}BUTTON_TASK_STATE;
void ButtonTask(VP_INT exinf)
{
	BUTTON_TASK_STATE state = BS_STABLE;
	ER ercd;
	BOOL preStat, curStat, fixStat;
	int DetectTime = 3;			//20*3=60msec
	int DetectCount = 0;
	SYSTIM systim = 0;
	CMTRACE("app: ButtonTask started.\n");
	fixStat = preStat = halGetPushButton(0);

	while(1){
		ercd = tslp_tsk(20/*20ミリ秒*/);
		get_tim(&systim);
		curStat = halGetPushButton(0);
		//CMTRACE("app: ButtonTask: %d, ercd = %d\n", curStat, ercd);
		//CMTRACE("app: ButtonTask: %d\n", curStat);
		switch(state){
		case BS_STABLE:
			if(preStat != curStat){
				preStat = curStat;
				DetectCount = DetectTime;
				state = BS_CHANGE;
				//CMTRACE("app: ButtonTask: 状態→BS_CHANGE(%d)\n", curStat);
			}
			break;
		case BS_CHANGE:
			if(preStat == curStat){
				if(--DetectCount == 0){
					state = BS_STABLE;
					//CMTRACE("app: ButtonTask: 状態→BS_STABLE(%d)\n", curStat);
					if(fixStat != preStat){
						//新しい状態（UP/DOWN)を確定ー＞通知
						fixStat = preStat;
						SendEvent(MID_Display,
							fixStat ? (MSGBLOCK*)&EventButtonDown : (MSGBLOCK*)&EventButtonUp);
						CMTRACE("app: ButtonTask: %s @%d\n",
							curStat ? "DOWN" : "UP", systim);
					}
				}
			}else{
				preStat = curStat;
				DetectCount = DetectTime;
			}
			break;
		}
		
	}
}
