#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <piece.h>

static unsigned char vbuff[DISP_X * DISP_Y];

static void (*pfn)();		//タイマコールバックが呼び出す関数のアドレス。	←←←←←P/ECE開発環境の「run.bat」を使用すると、プログラムが終了する前にこのアドレスが上書きされて、プログラムがハングアップします。「r.exe」ならば大丈夫です。
static volatile int tmrCnt;	//タイマ割り込み関数でカウントアップする変数。

static void TimerCallback() {
	//pfnに格納されている関数を呼び出す。
	(*pfn)();
}

static void TimerFunction() {
	tmrCnt++;
}

void pceAppInit() {
	int t0;
	//初期化
	pceAppSetProcPeriod(100);
	pceLCDSetBuffer(vbuff);
	pceLCDDispStart();
	//タイマコールバックが呼び出す関数のアドレスを設定する。
	pfn = TimerFunction;
	//タイマコールバックを開始する。
	pceTimerSetCallback(0, PCE_TT_PERIODIC, 100, TimerCallback);
	//5秒間処理を返さずに、タイマ割り込み関数でカウントアップする変数を表示する。
	t0 = pceTimerGetCount();						//┐
	do {									//│
		memset(vbuff, 0, sizeof vbuff);					//│
		pceFontSetPos(0, 0);						//├P/ECEがこの間を処理している間に、P/ECE開発環境の「run.bat」で、プログラムを転送しようとすると、高確率でP/ECEがハングアップします。「r.exe」ならば大丈夫です。
		pceFontPrintf("pceAppInit:%d", tmrCnt);				//│
		pceLCDTrans();							//│
	} while((unsigned)(pceTimerGetCount() - t0) < 5000);			//┘
}

void pceAppProc(int cnt) {
	int t0;
	//ボタンが押されたら終了する。
	if(pcePadGetDirect()) {
		pceAppReqExit(0);
		return;
	}
	//5秒間処理を返さずに、タイマ割り込み関数でカウントアップする変数を表示する。
	t0 = pceTimerGetCount();						//┐
	do {									//│
		memset(vbuff, 0, sizeof vbuff);					//│
		pceFontSetPos(0, 0);						//├P/ECEがこの間を処理している間に、P/ECE開発環境の「run.bat」で、プログラムを転送しようとすると、高確率でP/ECEがハングアップします。「r.exe」ならば大丈夫です。
		pceFontPrintf("pceAppProc:%d", tmrCnt);				//│
		pceLCDTrans();							//│
	} while((unsigned)(pceTimerGetCount() - t0) < 5000);			//┘
}

void pceAppExit() {
	int t0;
	//5秒間処理を返さずに、タイマ割り込み関数でカウントアップする変数を表示する。
	t0 = pceTimerGetCount();						//┐
	do {									//│
		memset(vbuff, 0, sizeof vbuff);					//│
		pceFontSetPos(0, 0);						//├P/ECEがこの間を処理している間に、P/ECE開発環境の「run.bat」で、プログラムを転送しようとすると、高確率でP/ECEがハングアップします。「r.exe」ならば大丈夫です。
		pceFontPrintf("pceAppExit:%d", tmrCnt);				//│
		pceLCDTrans();							//│
	} while((unsigned)(pceTimerGetCount() - t0) < 5000);			//┘
	//タイマコールバックを終了する。
	pceTimerSetCallback(0, PCE_TT_NONE, 0, NULL);
}

