/*****************************************************
Display5.c : Edited at 1998,6,22 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"



//各セグメントの位置を計算する
//	==0==
//	5	1
//	==6==
//	4	2
//	==3== 7
//					    0     1     2     3     4     5     6     7     8     9
BYTE num_pattern[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x27, 0x7f, 0x6f,
					  0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71	//	;a,b,c,d,e,f
};

void DisplayDecimal(int num)
{
	WORD stat = num_pattern[(num/10)%10]<<8 | num_pattern[num%10];
	halSetSegLED(stat);
}

void DisplayHexDecimal(int num)
{
	WORD stat = num_pattern[(num>>4)&0x0f]<<8 | num_pattern[num&0x0f];
	DebugPrintf("%02x\r", num);
	halSetSegLED(stat);
}


/*タイムアウト通知用メッセージ領域確保*/
MSGHEADER EventClockTic ={
	{0},	/*T_MSG os_rsv*/
	EV_TIC,	/*id*/
	0,		/*sub*/
	0		/*length*/
};

/*****************************************************
//表示タスク
*****************************************************/
typedef enum{
	DS_CLOCK,
	DS_VOLUME,
}DISPLAY_TASK_STATE;
void DisplayTask(VP_INT exinf)
{
	DISPLAY_TASK_STATE state = DS_CLOCK;
	ER ercd;
	MSGBLOCK *pMsg;
	int seconds = 0;
	DisplayDecimal(seconds);
	DebugPrintf("\rDisplayTask: started.\r");

	/*タイマ定義*/
	timSetTimer(TNO_Display_tic,		/*タイマ番号*/
			TIME_1SEC,					/*タイムアウト値*/
			MID_Display,				/*通知メッセージを受け取るメイルボックスID*/
			sizeof(EventClockTic),		/*メッセージサイズ*/
			(MSGBLOCK*)&EventClockTic	/*通知メッセージのアドレス*/
			);
	timStartTimer(TNO_Display_tic);	/*タイマ起動*/
	while(1){
		//ercd = rcv_mbx(MID_Display, &pMsg);
		ercd = WaitEvent(MID_Display, &pMsg);
		if(ercd == E_OK){
			switch(state){
			case DS_CLOCK:
				switch(pMsg->mheader.id){
				case EV_TIC:
					++ seconds;
					DisplayDecimal(seconds);
					timStartTimer(TNO_Display_tic);	/*次のタイムアウト起動*/
					break;
				case EV_BUTTON_DOWN:
					DisplayHexDecimal(halGetVolume(0));
					state = DS_VOLUME;
					break;
				case EV_BUTTON_UP:
					break;
				}
				break;
			case DS_VOLUME:
				switch(pMsg->mheader.id){
				case EV_TIC:
					++ seconds;
					DisplayHexDecimal(halGetVolume(0));
					timStartTimer(TNO_Display_tic);	/*次のタイムアウト起動*/
					break;
				case EV_BUTTON_DOWN:
					break;
				case EV_BUTTON_UP:
					DisplayDecimal(seconds);
					state = DS_CLOCK;
					break;
				}
				break;
			}
		}else{
			DebugPrintf("DisplayTask: rcv_msg ercd = %04xh\r", ercd);
		}
	}
}



