/*******************************************************************/
/* メニュー・アラーム処理部(menu.h)                                */
/* void alarm_check(void):アラームの処理                           */
/* int time_change(int *time_dat, int type):設定時刻の変更         */
/* int time_set(void):時計の時刻の変更                             */
/* int hour_type_12(void):時刻を12時間表示に設定                   */
/* int hour_type_24(void):時刻を24時間表示に設定                   */
/* int alarm_time_set(void):アラームの時刻の変更                   */
/* int set_alarm_on(void):アラームを有効にする                     */
/* int set_alarm_off(void):アラームを無効にする                    */
/* int set_keytype_a(void):キー設定をAタイプにする                 */
/* int set_keytype_b(void):キー設定をBタイプにする                 */
/* int exit_ok(void):終了する                                      */
/* int turn_back(void):メニューを開く前に戻る                      */
/* int cancel(void):処理をキャンセルする                           */
/* int menu_action(int type):メニューの項目に応じた処理を行う      */
/* void menu_write(menu_body *write_menu):メニュー項目を表示する   */
/* void menu_area_write(int action):メニュー画面の表示・消去       */
/* int menu_select(menu_body *(*menu_pointer), int menu_type)      */
/*  :メニューの項目の選択処理を行う                                */
/* int config_menu(void):メニューの処理を行う                      */
/*******************************************************************/

#ifndef _MENU_H_
#define _MENU_H_

#ifndef ALL_KEY_PRESS
#define X_KEY (KEY_X1 | KEY_X2 | KEY_X3 | KEY_X4)
#define Y_KEY (KEY_Y1 | KEY_Y2 | KEY_Y3 | KEY_Y4)
#define OTHER_KEY (KEY_START | KEY_A | KEY_B)
#define ALL_KEY_PRESS (key_press_check() & (X_KEY | Y_KEY | OTHER_KEY))
#endif

#include <sys/bios.h>
#include <stdio.h>
#include <stdlib.h>
#include "chara.h"
#include "se.h"


/* メニューの最大項目数 */
#define MENU_ITEM_MAX 5

/* 各メニューの項目数 */
#define ROOT_ITEM_MAX 5 /* メイン */
#define CLOCK_ITEM_MAX 3 /* 時計設定 */
#define HOUR_ITEM_MAX 2 /* 時間表示設定 */
#define ALARM_ITEM_MAX 3 /* アラーム設定 */
#define ALARM_SET_ITEM_MAX 2 /* アラームの有効・無効の設定 */
#define KEY_ITEM_MAX 2 /* キー設定 */
#define EXIT_ITEM_MAX 2 /* 終了確認 */

/* メニューの識別用 */
#define MENU_NULL 0 /* なし */
#define MENU_root 1 /* メイン */
#define MENU_clock_config 2 /* 時計設定 */
#define MENU_hour_select 3 /* 時間表示設定 */
#define MENU_alarm_config 4 /* アラーム設定 */
#define MENU_alarm_set 5 /* アラームの有効・無効の設定 */
#define MENU_key_select 6 /* キー設定 */
#define MENU_exit_select 7 /* 終了確認 */

/* 選択項目から戻る際の動作 */
#define MENU_NO_ACTION 0 /* 何もしない */
#define MENU_BACK 1 /* １つ前のメニューに戻る */
#define MENU_RETURN 2 /* メニューを閉じる */
#define MENU_EXIT 3 /* 終了する */

/* 選択による処理 */
#define ACTION_TIME_SET 0 /* 時計の時刻設定 */
#define ACTION_HOUR_12 1 /* 時刻を12時間表示にする */
#define ACTION_HOUR_24 2 /* 時刻を24時間表示にする */
#define ACTION_ALARM_SET 3 /* アラームの時刻設定 */
#define ACTION_ALARM_ON 4 /* アラームを有効にする */
#define ACTION_ALARM_OFF 5 /* アラームを無効にする */
#define ACTION_KEY_A 6 /* キー設定をAタイプにする */
#define ACTION_KEY_B 7 /* キー設定をBタイプにする */
#define ACTION_BACK 8 /* １つ前のメニューに戻る */
#define ACTION_RETURN 9 /* メニューを閉じる */
#define ACTION_EXIT 10 /* 終了する */
#define ACTION_RESTART 11 /* ゲームを再スタートする */
#define ACTION_WATCH 12 /* 時計モードに移行する */

/* 変更する時刻の種別 */
#define SET_CLOCK_TIME 0 /* 時計 */
#define SET_ALARM_TIME 1 /* アラーム */

/* 時刻変更処理の戻り値 */
#define ACTION_CANCEL 0 /* 取消 */
#define ACTION_OK 1 /* 決定 */

/* アラームのモード（キャラクタ表示用） */
#define ALM_A 0 /* アラーム中（ポーズ１） */
#define ALM_B 1 /* アラーム中（ポーズ２） */
#define ALM_ON 2 /* アラーム有効 */
#define ALM_ALL 3 /* 全キャラクタ表示用 */

/* アラームの状態 */
#define ALARM_OFF 0 /* アラーム無効 */
#define ALARM_ON 1 /* アラーム有効 */
#define ALARM_START 2 /* アラーム時間内 */
#define ALARM_END 3 /* アラーム終了 */
#define ALARM_STOP 4 /* アラーム中止 */

/* アラームのデータ */
struct {
	int alarm_time[2]; /* アラームの時刻 [0]:時 [1]:分 */
	int alarm_mode; /* アラームの状態 */
	int char_mode; /* アラームキャラクタの状態 */
	int second_check; /* １秒のカウント用 */
} alarm_set;

/* メニューの各項目のデータ */
typedef struct {
	char *index; /* 項目名 */
	int action; /* 選択時の動作 */
	int child; /* 選択後に開かれるメニュー */
} menu_item;

/* メニュー本体のデータ */
typedef struct {
	char *title; /* メニュー名 */
	int  parent; /* 戻る先のメニュー */
	menu_item item[MENU_ITEM_MAX]; /* 各項目のデータ */
	int item_max; /* 項目の数 */
} menu_body;

/* キーの設定 */
int left_key = (KEY_X4 | KEY_B); /* 左方向キー */
int right_key = (KEY_X2 | KEY_A); /* 右方向キー */


/**********************************/
/* アラームのチェック・処理を行う */
/**********************************/
void alarm_check(void)
{
	/* 前回のチェックから１秒たっていなければ処理は行わない */
	if (alarm_set.second_check == rtc_get_datetime(6)) return;
	alarm_set.second_check = rtc_get_datetime(6);

	/* アラームのモードをチェックする */
	switch (alarm_set.alarm_mode)
	{

	/* アラーム無効 */
	case ALARM_OFF:
		break;

	/* アラーム有効 */
	case ALARM_ON:

		/* アラーム時間かをチェックする */
		/* （アラーム時間でなければアラーム有効マークを表示する） */
		if ((alarm_set.alarm_time[0] != rtc_get_datetime(4))
		 || (alarm_set.alarm_time[1] != rtc_get_datetime(5)))
		{
			chr_write(&alarm_dat[ALM_ON], WRITE);
			break;
		}
		else
		{
			alarm_set.char_mode = ALM_A;
			alarm_set.alarm_mode = ALARM_START;
		}

	/* アラーム時間 */
	case ALARM_START:

		/* アラーム音を１秒おきに発生させる */
		/* （１秒ごとアラームキャラクタの２つのポーズを交互に表示させるので */
		/*   ポーズ２の時のみアラーム音を発生させる） */
		if (alarm_set.char_mode == ALM_B) sound_on(ALARM_SOUND);
		else sound_off();

		/* アラームキャラクタを表示する */
		chr_write(&alarm_dat[alarm_set.char_mode], WRITE);
		alarm_set.char_mode ^= (ALM_A ^ ALM_B);

		/* アラーム時間が終わったかをチェックする */
		if ((alarm_set.alarm_time[0] != rtc_get_datetime(4))
		 || (alarm_set.alarm_time[1] != rtc_get_datetime(5)))
			alarm_set.alarm_mode = ALARM_END;
		break;

	/* アラーム時間終了 */
	case ALARM_END:

		/* アラームの後処理（音、キャラクタ、モード） */
		sound_off();
		chr_write(&alarm_dat[ALM_ON], WRITE);
		alarm_set.alarm_mode = ALARM_ON;
		break;

	/* アラーム中止（アラームを無効に切り替えた時） */
	case ALARM_STOP:
		chr_write(&alarm_dat[alarm_set.char_mode], DELETE);
		alarm_set.alarm_mode = ALARM_OFF;
		break;
	}
}


/*******************************************************************/
/* 時刻を変更する                                                  */
/* 戻り値：動作（ACTION_OK、ACTION_CANCELより指定）                */
/* int *time_dat:時刻のデータ                                      */
/* int type:データの種別（SET_CLOCK_TIME、SET_ALARM_TIMEより指定） */
/*******************************************************************/
int time_change(int *time_dat, int type)
{
	int cursor_pos = 0; /* カーソルの位置 */
	int key_check = 0; /* キーの押下状態の確認用 */
	int i; /* ループカウンタ */

	/* メニュー画面を１度全消去してから初期画面を表示する */
	for (i=1; i<(MENU_SIZE_Y - 2); i++)
		text_fill_char(0, i, (MENU_SIZE_X - 2), 0x00);
	text_put_char(3, 2, ':');
	if (type == SET_CLOCK_TIME) text_put_char(6, 2, ':');
	text_put_numeric(1, 2, 2,
	 (NUM_PADSPACE | NUM_ALIGN_RIGHT), time_dat[0]);
	text_put_numeric(4, 2, 2,
	 (NUM_PADZERO | NUM_ALIGN_RIGHT), time_dat[1]);
	if (type == SET_CLOCK_TIME)
		text_put_numeric(7, 2, 2, (NUM_PADZERO | NUM_ALIGN_RIGHT),
		 time_dat[2]);
	text_put_char(2, 1, 0x1f);
	text_put_string(1, 4, "A:OK B:NG");

	while (ALL_KEY_PRESS);

	for (;;)
	{
		/* X1ボタンが押されたら選択部の数を増加させる */
		if ((key_press_check() & KEY_X1) && (key_check == 0))
		{
			key_check = 1;
			time_dat[cursor_pos]++;
			if (time_dat[cursor_pos] > ((cursor_pos == 0) ? 24 : 60))
				time_dat[cursor_pos] -= (cursor_pos == 0) ? 24 : 60;
			text_put_numeric((1 + cursor_pos * 3), 2, 2,
			 (((cursor_pos == 0) ? NUM_PADSPACE : NUM_PADZERO)
			 | NUM_ALIGN_RIGHT), time_dat[cursor_pos]);
		}

		/* X3ボタンが押されたら選択部の数を減少させる */
		if ((key_press_check() & KEY_X3) && (key_check == 0))
		{
			key_check = 1;
			time_dat[cursor_pos]--;
			if (time_dat[cursor_pos] < 0)
				time_dat[cursor_pos] += (cursor_pos == 0) ? 24 : 60;
			text_put_numeric((1 + cursor_pos * 3), 2, 2,
			 (((cursor_pos == 0) ? NUM_PADSPACE : NUM_PADZERO)
			 | NUM_ALIGN_RIGHT), time_dat[cursor_pos]);
		}

		/* X4ボタンが押されたらカーソルを左に移動させる */
		if ((key_press_check() & KEY_X4) && (key_check == 0))
		{
			key_check = 1;
			text_put_char((2 + cursor_pos * 3), 1, 0x00);
			cursor_pos--;
			if (cursor_pos < 0)
				cursor_pos = (2 - ((type == SET_CLOCK_TIME) ? 0 : 1));
			text_put_char((2 + cursor_pos * 3), 1, 0x1f);
		}

		/* X2ボタンが押されたらカーソルを右に移動させる */
		if ((key_press_check() & KEY_X2) && (key_check == 0))
		{
			key_check = 1;
			text_put_char((2 + cursor_pos * 3), 1, 0x00);
			cursor_pos++;
			if (cursor_pos > (2 - ((type == SET_CLOCK_TIME) ? 0 : 1)))
				cursor_pos = 0;
			text_put_char((2 + cursor_pos * 3), 1, 0x1f);
		}

		/* Aボタンが押されたら変更を決定する */
		if ((key_press_check() & KEY_A) && (key_check == 0))
			return ACTION_OK;

		/* Bボタンが押されたら変更を取り消す */
		if ((key_press_check() & KEY_B) && (key_check == 0))
			return ACTION_CANCEL;

		/* 何もボタンが押されていなければ押下状態を解除する */
		if (!(ALL_KEY_PRESS)) key_check = 0;
	}
}


/**********************************************/
/* 時計の時刻を設定する                       */
/* 戻り値：処理後の動作（MENU_NO_ACTIONのみ） */
/**********************************************/
int time_set(void)
{
	static int now_time[3]; /* 現在の時刻 [0]:時 [1]:分 [2]:秒 */
	int i; /* ループカウンタ */

	/* 現在の時刻をセットして時刻の変更処理を行う */
	for (i=0; i<3; i++) now_time[i] = rtc_get_datetime(i + 4);
	if (time_change(now_time, 0) == ACTION_CANCEL) return MENU_NO_ACTION;
	for (i=0; i<3; i++) rtc_set_datetime((i + 4), now_time[i]);
	time_write();
	return MENU_NO_ACTION;
}


/*****************************************/
/* 時間表示を12時間表示にする            */
/* 戻り値：処理後の動作（MENU_BACKのみ） */
/*****************************************/
int hour_type_12(void)
{
	/* 時間表示モードを12時間表示に設定する */
	hour_mode = hour_12;
	time_write();
	return MENU_BACK;
}


/*****************************************/
/* 時間表示を24時間表示にする            */
/* 戻り値：処理後の動作（MENU_BACKのみ） */
/*****************************************/
int hour_type_24(void)
{
	/* 時間表示モードを24時間表示に設定する */
	hour_mode = hour_24;
	time_write();
	return MENU_BACK;
}


/**********************************************/
/* アラームの時刻を設定する                   */
/* 戻り値：処理後の動作（MENU_NO_ACTIONのみ） */
/**********************************************/
int alarm_time_set(void)
{
	static int set_time[2]; /* アラーム時刻 [0]:時 [1]:分 */

	/* アラーム時刻の変更処理を行う */
	set_time[0] = alarm_set.alarm_time[0];
	set_time[1] = alarm_set.alarm_time[1];
	if (time_change(set_time, 1) == ACTION_CANCEL) return MENU_NO_ACTION;
	alarm_set.alarm_time[0] = set_time[0];
	alarm_set.alarm_time[1] = set_time[1];
	return MENU_NO_ACTION;
}


/*****************************************/
/* アラームを有効にする                  */
/* 戻り値：処理後の動作（MENU_BACKのみ） */
/*****************************************/
int set_alarm_on(void)
{
	/* アラームを有効に設定してアラームマークを表示する */
	alarm_set.alarm_mode = ALARM_ON;
	alarm_check();
	return MENU_BACK;
}


/*****************************************/
/* アラームを無効にする                  */
/* 戻り値：処理後の動作（MENU_BACKのみ） */
/*****************************************/
int set_alarm_off(void)
{
	/* アラームを無効に設定してアラームマークを消去する */
	alarm_set.alarm_mode = ALARM_STOP;
	alarm_check();
	return MENU_BACK;
}


/*****************************************/
/* キー設定をAタイプに設定する           */
/* 戻り値：処理後の動作（MENU_BACKのみ） */
/*****************************************/
int set_keytype_a(void)
{
	/* X4、Bボタンを左方向、X2、Aボタンを右方向に設定する */
	left_key = (KEY_X4 | KEY_B);
	right_key = (KEY_X2 | KEY_A);
	return MENU_BACK;
}


/*****************************************/
/* キー設定をBタイプに設定する           */
/* 戻り値：処理後の動作（MENU_BACKのみ） */
/*****************************************/
int set_keytype_b(void)
{
	/* X1〜4ボタンを左方向、A、Bボタンを右方向に設定する */
	left_key = (KEY_X1 | KEY_X2 | KEY_X3 | KEY_X4);
	right_key = (KEY_A | KEY_B);
	return MENU_BACK;
}


/*****************************************/
/* 終了する                              */
/* 戻り値：処理後の動作（MENU_EXITのみ） */
/*****************************************/
int exit_ok(void)
{
	return MENU_EXIT;
}


/*******************************************/
/* メニューを閉じる                        */
/* 戻り値：処理後の動作（MENU_RETURNのみ） */
/*******************************************/
int turn_back(void)
{
	return MENU_RETURN;
}


/*****************************************/
/* １つ前のメニューに戻る                */
/* 戻り値：処理後の動作（MENU_BACKのみ） */
/*****************************************/
int cancel(void)
{
	return MENU_BACK;
}


/*****************************************************************/
/* 選択された項目に応じた動作へ移行する                          */
/* 戻り値：動作後の処理                                          */
/*         （MENU_NO_ACTION、MENU_BACK、MENU_RETURN、MENU_EXIT、 */
/*           ACTION_RESTART、ACTION_WATCHより指定）              */
/* int type:動作の種類                                           */
/*****************************************************************/
int menu_action(int type)
{
	switch (type)
	{
	case ACTION_TIME_SET:
		return time_set();
	case ACTION_HOUR_12:
		return hour_type_12();
	case ACTION_HOUR_24:
		return hour_type_24();
	case ACTION_ALARM_SET:
		return alarm_time_set();
	case ACTION_ALARM_ON:
		return set_alarm_on();
	case ACTION_ALARM_OFF:
		return set_alarm_off();
	case ACTION_KEY_A:
		return set_keytype_a();
	case ACTION_KEY_B:
		return set_keytype_b();
	case ACTION_BACK:
		return cancel();
	case ACTION_RETURN:
		return turn_back();
	case ACTION_EXIT:
		return exit_ok();
	case ACTION_RESTART:
		return type;
	case ACTION_WATCH:
		return type;
	}
}


/**************************************************************/
/* メニュー項目を表示する                                     */
/* menu_body *write_menu:表示するメニューのデータへのポインタ */
/**************************************************************/
void menu_write(menu_body *write_menu)
{
	int i; /* ループカウンタ */

	/* メニュー画面を全消去する */
	for (i=0; i<(MENU_SIZE_Y - 2); i++)
		text_fill_char(0, i, (MENU_SIZE_X - 2), 0x00);

	/* メニュー項目とカーソルを表示する */
	text_put_string(0, 0, write_menu->title);
	for (i=0; i<write_menu->item_max; i++)
		text_put_string(2, (i + 2), write_menu->item[i].index);
	text_put_char(0, 2, 0x10);
}


/********************************************/
/* メニュー画面の表示・消去を行う           */
/* int action:動作（WRITE、DELETEより指定） */
/********************************************/
void menu_area_write(int action)
{
	switch (action)
	{
	/* メニュー画面を表示する */
	case WRITE:

		/* メイン画面をメイン画面用バッファに保存してから */
		/* メニュー画面をメニュー画面用バッファより表示する */
		screen_get_char(SCREEN2, MENU_POS_X, MENU_POS_Y,
		 MENU_SIZE_X, MENU_SIZE_Y, field_buffer);
		screen_set_char(SCREEN2, (MENU_POS_X + 1), (MENU_POS_Y + 1),
		 (MENU_SIZE_X - 2), (MENU_SIZE_Y - 2), text_buffer);

		/* メニューの枠を表示する */
		screen_fill_char(SCREEN2, MENU_POS_X, MENU_POS_Y, 1, 1,
		 menu_char.corner_dat[0]);
		screen_fill_char(SCREEN2, (MENU_POS_X + MENU_SIZE_X - 1),
		 MENU_POS_Y, 1, 1, menu_char.corner_dat[1]);
		screen_fill_char(SCREEN2, MENU_POS_X, (MENU_POS_Y + MENU_SIZE_Y - 1),
		 1, 1, menu_char.corner_dat[2]);
		screen_fill_char(SCREEN2, (MENU_POS_X + MENU_SIZE_X - 1),
		 (MENU_POS_Y + MENU_SIZE_Y - 1), 1, 1, menu_char.corner_dat[3]);
		screen_fill_char(SCREEN2, (MENU_POS_X + 1), MENU_POS_Y,
		 (MENU_SIZE_X -2), 1, menu_char.line_dat[1]);
		screen_fill_char(SCREEN2, (MENU_POS_X + MENU_SIZE_X - 1),
		 (MENU_POS_Y + 1), 1, (MENU_SIZE_Y - 2), menu_char.line_dat[2]);
		screen_fill_char(SCREEN2, MENU_POS_X, (MENU_POS_Y + 1),
		 1, (MENU_SIZE_Y - 2), menu_char.line_dat[0]);
		screen_fill_char(SCREEN2, (MENU_POS_X + 1),
		 (MENU_POS_Y + MENU_SIZE_Y - 1), (MENU_SIZE_X - 2), 1,
		 menu_char.line_dat[3]);
		break;

	/* メニュー画面を消去する */
	case DELETE:

		/* メニュー画面をメニュー画面用バッファに保存してから */
		/* メイン画面をメイン画面用バッファより表示する */
		screen_get_char(SCREEN2, (MENU_POS_X + 1), (MENU_POS_Y + 1),
		 (MENU_SIZE_X - 2), (MENU_SIZE_Y - 2), text_buffer);
		screen_set_char(SCREEN2, MENU_POS_X, MENU_POS_Y,
		 MENU_SIZE_X, MENU_SIZE_Y, field_buffer);
		break;
	}
}


/***********************************************************************/
/* メニューの選択処理を行う                                            */
/* 戻り値：選択後の動作（MENU_RETURN、MENU_EXIT、                      */
/*                       ACTION_RESTART、ACTION_WATCHより指定）        */
/* menu_body *(*menu_pointer):各メニューへのポインタデータへのポインタ */
/* int menu_type:現在表示されているメニュー                            */
/***********************************************************************/
int menu_select(menu_body *(*menu_pointer), int menu_type)
{
	int cursor_pos = 0; /* カーソルの位置 */
	int key_check = 0; /* キーの押下状態の確認用 */
	int return_code; /* 選択した処理からの戻り値 */

	while(ALL_KEY_PRESS);

	for (;;)
	{
		/* X1ボタンが押されたらカーソルを上に移動する */
		if ((key_press_check() & KEY_X1) && (key_check == 0))
		{
			key_check = 1;
			text_put_char(0, (2 + cursor_pos), 0x00);
			if (cursor_pos > 0) cursor_pos--;
			else cursor_pos = (menu_pointer[menu_type]->item_max - 1);
			text_put_char(0, (2 + cursor_pos), 0x10);
		}

		/* X3ボタンが押されたらカーソルを下に移動する */
		if ((key_press_check() & KEY_X3) && (key_check == 0))
		{
			key_check = 1;
			text_put_char(0, (2 + cursor_pos), 0x00);
			if (cursor_pos < (menu_pointer[menu_type]->item_max - 1))
				cursor_pos++;
			else cursor_pos = 0;
			text_put_char(0, (2 + cursor_pos), 0x10);
		}

		/* Aボタンが押されたら選択された項目に応じた動作を行う */
		if ((key_press_check() & KEY_A) && (key_check == 0))
		{
			key_check = 1;

			/* 次のメニューがあればそのメニューへ移行する */
			if (menu_pointer[menu_pointer[menu_type]
			 ->item[cursor_pos].child] != NULL)
			{
				menu_type = menu_pointer[menu_type]->item[cursor_pos].child;
				menu_write(menu_pointer[menu_type]);
				text_put_char(0, (2 + cursor_pos), 0x00);
				cursor_pos = 0;
				text_put_char(0, (2 + cursor_pos), 0x10);
			}

			/* 次のメニューがなければ項目に応じた動作へ移行する */
			else
			{
				return_code = menu_action(menu_pointer[menu_type]
				 ->item[cursor_pos].action);
				switch (return_code)
				{
				case MENU_NO_ACTION:
					menu_write(menu_pointer[menu_type]);
					break;
				case MENU_BACK:
					menu_type = menu_pointer[menu_type]->parent;
					menu_write(menu_pointer[menu_type]);
					cursor_pos = 0;
					break;
				case MENU_RETURN:
				case MENU_EXIT:
				case ACTION_RESTART:
				case ACTION_WATCH:
					menu_area_write(DELETE);
					while (ALL_KEY_PRESS);
					return return_code;
				}
			}
		}

		/* Bボタンが押されたら１つ前のメニューへ移行する */
		if ((key_press_check() & KEY_B) && (key_check == 0))
		{
			key_check = 1;

			/* 最初のメニューであればメニュー画面を閉じる */
			if (menu_pointer[menu_pointer[menu_type]->parent] == NULL)
			{
				menu_area_write(DELETE);
				while (ALL_KEY_PRESS);
				return MENU_RETURN;
			}

			else {
				menu_type = menu_pointer[menu_type]->parent;
				menu_write(menu_pointer[menu_type]);
				text_put_char(0, (2 + cursor_pos), 0x00);
				cursor_pos = 0;
				text_put_char(0, (2 + cursor_pos), 0x10);
			}
		}

		/* 何もボタンが押されていなければ押下状態を解除する */
		if (!(ALL_KEY_PRESS)) key_check = 0;
	}
}


/****************************************************************/
/* メニューの処理を行う                                         */
/* 戻り値：処理後の動作（MENU_RETURN、MENU_EXIT、               */
/*                       ACTION_RESTART、ACTION_WATCHより指定） */
/****************************************************************/
int config_menu(void)
{
	/* 各メニューのデータ */
	static menu_body root; /* メイン */
	static menu_body clock_config; /* 時計設定 */
	static menu_body hour_select; /* 時間表示の設定 */
	static menu_body alarm_config; /* アラーム設定 */
	static menu_body alarm_set; /* アラームの有効・無効の設定 */
	static menu_body key_select; /* キー設定 */
	static menu_body exit_select; /* 終了の確認 */

	/* メニューの項目のデータ */
	/*   メイン */
	static char *root_index[MENU_ITEM_MAX] =
	 {"時計設定", "アラーム設定", "キー設定", "終了", "戻る"};
	static int root_child[MENU_ITEM_MAX] =
	 {MENU_clock_config, MENU_alarm_config, MENU_key_select,
	  MENU_exit_select, MENU_NULL};
	static int root_action[MENU_ITEM_MAX] =
	 {NULL, NULL, NULL, NULL, ACTION_RETURN};

	/*   時計設定 */
	static char *clock_index[MENU_ITEM_MAX] =
	 {"時刻設定", "時間表示切り替え", "戻る"};
	static int clock_child[MENU_ITEM_MAX] =
	 {MENU_NULL, MENU_hour_select, MENU_NULL};
	static int clock_action[MENU_ITEM_MAX] =
	 {ACTION_TIME_SET, NULL, ACTION_BACK};

	/*   時間表示の設定 */
	static char *hour_index[MENU_ITEM_MAX] =
	 {"12時間表示", "24時間表示"};
	static int hour_child[MENU_ITEM_MAX] =
	 {MENU_NULL, MENU_NULL};
	static int hour_action[MENU_ITEM_MAX] =
	 {ACTION_HOUR_12, ACTION_HOUR_24};

	/*   アラーム設定 */
	static char *alarm_index[MENU_ITEM_MAX] =
	 {"アラーム時刻設定", "アラーム切り替え", "戻る"};
	static int alarm_child[MENU_ITEM_MAX] =
	 {MENU_NULL, MENU_alarm_set, MENU_NULL};
	static int alarm_action[MENU_ITEM_MAX] =
	 {ACTION_ALARM_SET, NULL, ACTION_BACK};

	/*   アラームの有効・無効の設定 */
	static char *alarm_set_index[MENU_ITEM_MAX] =
	 {"アラーム有効", "アラーム無効"};
	static int alarm_set_child[MENU_ITEM_MAX] =
	 {MENU_NULL, MENU_NULL};
	static int alarm_set_action[MENU_ITEM_MAX] =
	 {ACTION_ALARM_ON, ACTION_ALARM_OFF};

	/*   キー設定 */
	static char *key_index[MENU_ITEM_MAX] =
	 {"タイプA", "タイプB"};
	static int key_child[MENU_ITEM_MAX] =
	 {MENU_NULL, MENU_NULL};
	static int key_action[MENU_ITEM_MAX] =
	 {ACTION_KEY_A, ACTION_KEY_B};

	/*  終了の確認 */
	static char *exit_index[MENU_ITEM_MAX] =
	 {"はい", "いいえ"};
	static int exit_child[MENU_ITEM_MAX] =
	 {MENU_NULL, MENU_NULL};
	static int exit_action[MENU_ITEM_MAX] =
	 {ACTION_EXIT, ACTION_BACK};

	static menu_body *menu_pointer[8]; /* 各メニューのデータへのポインタ */
	int i; /* ループカウンタ */

	/* メニューのデータへのポインタの設定 */
	menu_pointer[MENU_NULL] = NULL; /* なし */
	menu_pointer[MENU_root] = &root; /* メイン */
	menu_pointer[MENU_clock_config] = &clock_config; /* 時計設定 */
	menu_pointer[MENU_hour_select] = &hour_select; /* 時間表示の設定 */
	menu_pointer[MENU_alarm_config] = &alarm_config; /* アラーム設定 */
	menu_pointer[MENU_alarm_set] = &alarm_set; /* アラームの有効・無効の設定 */
	menu_pointer[MENU_key_select] = &key_select; /* キー設定 */
	menu_pointer[MENU_exit_select] = &exit_select; /* 終了の確認 */

	/* メニューのデータのセット */
	/*   メイン */
	root.title = "メニュー";
	root.parent = MENU_NULL;
	root.item_max = ROOT_ITEM_MAX;
	for (i=0; i<root.item_max; i++)
	{
		root.item[i].index = root_index[i];
		root.item[i].child = root_child[i];
		root.item[i].action = root_action[i];
	}

	/*   時計設定 */
	clock_config.title = "時計設定";
	clock_config.parent = MENU_root;
	clock_config.item_max = CLOCK_ITEM_MAX;
	for (i=0; i<clock_config.item_max; i++)
	{
		clock_config.item[i].index = clock_index[i];
		clock_config.item[i].child = clock_child[i];
		clock_config.item[i].action = clock_action[i];
	}

	/*   時間表示の設定 */
	hour_select.title = "時間表示切り替え";
	hour_select.parent = MENU_clock_config;
	hour_select.item_max = HOUR_ITEM_MAX;
	for (i=0; i<hour_select.item_max; i++)
	{
		hour_select.item[i].index = hour_index[i];
		hour_select.item[i].child = hour_child[i];
		hour_select.item[i].action = hour_action[i];
	}

	/*   アラーム設定 */
	alarm_config.title = "アラーム設定";
	alarm_config.parent = MENU_root;
	alarm_config.item_max = ALARM_ITEM_MAX;
	for (i=0; i<alarm_config.item_max; i++)
	{
		alarm_config.item[i].index = alarm_index[i];
		alarm_config.item[i].child = alarm_child[i];
		alarm_config.item[i].action = alarm_action[i];
	}

	/*   アラームの有効・無効の設定 */
	alarm_set.title = "アラーム切り替え";
	alarm_set.parent = MENU_alarm_config;
	alarm_set.item_max = ALARM_SET_ITEM_MAX;
	for (i=0; i<alarm_set.item_max; i++)
	{
		alarm_set.item[i].index = alarm_set_index[i];
		alarm_set.item[i].child = alarm_set_child[i];
		alarm_set.item[i].action = alarm_set_action[i];
	}

	/*   キー設定 */
	key_select.title = "キー設定";
	key_select.parent = MENU_root;
	key_select.item_max = KEY_ITEM_MAX;
	for (i=0; i<key_select.item_max; i++)
	{
		key_select.item[i].index = key_index[i];
		key_select.item[i].child = key_child[i];
		key_select.item[i].action = key_action[i];
	}

	/*   終了の確認 */
	exit_select.title = "終了しますか？";
	exit_select.parent = MENU_root;
	exit_select.item_max = EXIT_ITEM_MAX;
	for (i=0; i<exit_select.item_max; i++)
	{
		exit_select.item[i].index = exit_index[i];
		exit_select.item[i].child = exit_child[i];
		exit_select.item[i].action = exit_action[i];
	}

	/* メニューの処理を行う */
	menu_area_write(WRITE);
	menu_write(&root);
	return menu_select(menu_pointer, MENU_root);
}


#endif
