TPキャリブレーションソースの整理。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@144 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2007-11-12 07:33:57 +00:00
parent 87cbd78ceb
commit 6c3c9f1386

View File

@ -70,8 +70,7 @@ typedef struct CalibWork {
u16 last_x; u16 last_x;
u16 last_y; u16 last_y;
TPData sample[2]; TPData sample[2];
TPCalibrateParam calibrate; TWLTPCalibData calibTemp;
TWLTPCalibData calibData;
}CalibWork; }CalibWork;
// extern data------------------------------------------ // extern data------------------------------------------
@ -85,7 +84,7 @@ static void ReturnMenu(void);
// global variable ------------------------------------- // global variable -------------------------------------
// static variable ------------------------------------- // static variable -------------------------------------
static CalibWork *s_pCw; static CalibWork *s_pTPC;
static GXOamAttr s_oamBak[ 128 ] ATTRIBUTE_ALIGN(32); // OAM バックアップ static GXOamAttr s_oamBak[ 128 ] ATTRIBUTE_ALIGN(32); // OAM バックアップ
// const data ----------------------------------------- // const data -----------------------------------------
@ -191,55 +190,55 @@ static BOOL GetSamplePointNow(TPData *data)
while (TP_RequestRawSampling( &temp )) { }; while (TP_RequestRawSampling( &temp )) { };
if (! temp.touch ) { if (! temp.touch ) {
s_pCw->touch_count = 0; s_pTPC->touch_count = 0;
return FALSE; return FALSE;
} }
if ( temp.validity != TP_VALIDITY_VALID ) { if ( temp.validity != TP_VALIDITY_VALID ) {
s_pCw->touch_count = 0; s_pTPC->touch_count = 0;
return FALSE; return FALSE;
} }
OS_Printf("( %d, %d )\n", temp.x, temp.y); OS_Printf("( %d, %d )\n", temp.x, temp.y);
s_pCw->touch_count++; s_pTPC->touch_count++;
if ( s_pCw->touch_count == 1 ) { if ( s_pTPC->touch_count == 1 ) {
s_pCw->last_x = temp.x; s_pTPC->last_x = temp.x;
s_pCw->last_y = temp.y; s_pTPC->last_y = temp.y;
return FALSE; return FALSE;
} }
// if jump point from last frame, reset count. // if jump point from last frame, reset count.
if ( (s32)(s_pCw->last_x - temp.x) < - OK_RANGE || if ( (s32)(s_pTPC->last_x - temp.x) < - OK_RANGE ||
(s32)(s_pCw->last_x - temp.x) > OK_RANGE ) (s32)(s_pTPC->last_x - temp.x) > OK_RANGE )
{ {
s_pCw->touch_count = 1; s_pTPC->touch_count = 1;
s_pCw->last_x = temp.x; s_pTPC->last_x = temp.x;
s_pCw->last_y = temp.y; s_pTPC->last_y = temp.y;
return FALSE; return FALSE;
} }
if ( (s32)(s_pCw->last_y - temp.y) < - OK_RANGE || if ( (s32)(s_pTPC->last_y - temp.y) < - OK_RANGE ||
(s32)(s_pCw->last_y - temp.y) > OK_RANGE ) (s32)(s_pTPC->last_y - temp.y) > OK_RANGE )
{ {
s_pCw->touch_count = 1; s_pTPC->touch_count = 1;
s_pCw->last_x = temp.x; s_pTPC->last_x = temp.x;
s_pCw->last_y = temp.y; s_pTPC->last_y = temp.y;
return FALSE; return FALSE;
} }
// if the point pressed during OK_COUNT, detect finish. // if the point pressed during OK_COUNT, detect finish.
if ( s_pCw->touch_count == OK_COUNT ) { if ( s_pTPC->touch_count == OK_COUNT ) {
data->x = (u16) ( (temp.x + s_pCw->last_x) / 2 ); data->x = (u16) ( (temp.x + s_pTPC->last_x) / 2 );
data->y = (u16) ( (temp.y + s_pCw->last_y) / 2 ); data->y = (u16) ( (temp.y + s_pTPC->last_y) / 2 );
data->touch = TP_TOUCH_ON; data->touch = TP_TOUCH_ON;
data->validity = TP_VALIDITY_VALID; data->validity = TP_VALIDITY_VALID;
s_pCw->touch_count=0; s_pTPC->touch_count=0;
return TRUE; return TRUE;
} }
s_pCw->last_x = temp.x; s_pTPC->last_x = temp.x;
s_pCw->last_y = temp.y; s_pTPC->last_y = temp.y;
return FALSE; return FALSE;
} }
@ -269,13 +268,13 @@ static BOOL WaitPanelReleaseNow( void )
}; };
if ( temp.touch ) { if ( temp.touch ) {
s_pCw->release_count = 0; s_pTPC->release_count = 0;
return FALSE; return FALSE;
} }
s_pCw->release_count++; s_pTPC->release_count++;
if ( s_pCw->release_count >= INTERVAL_CNT ) { if ( s_pTPC->release_count >= INTERVAL_CNT ) {
s_pCw->release_count = 0; s_pTPC->release_count = 0;
return TRUE; return TRUE;
} else { } else {
return FALSE; return FALSE;
@ -298,62 +297,64 @@ int TP_CalibrationMain( void )
BOOL tp_cancel = FALSE; BOOL tp_cancel = FALSE;
BOOL tp_retry = FALSE; BOOL tp_retry = FALSE;
switch (s_pCw->seq) { switch (s_pTPC->seq) {
case INIT: case INIT:
NNS_G2dCharCanvasClearArea( &gCanvas, TXT_COLOR_WHITE, NNS_G2dCharCanvasClearArea( &gCanvas, TXT_COLOR_WHITE,
0 * 8 , 20 * 8, 32 * 8, 4 * 8 ); 0 * 8 , 20 * 8, 32 * 8, 4 * 8 );
s_pCw->seq = INTERVAL_0; s_pTPC->seq = INTERVAL_0;
PutStringUTF16( 2 * 8, 21 * 8, TXT_COLOR_CYAN, (const u16 *)L"[B]:CANCEL" ); PutStringUTF16( 2 * 8, 21 * 8, TXT_COLOR_CYAN, (const u16 *)L"[B]:CANCEL" );
break; break;
case INTERVAL_0: case INTERVAL_0:
// wait release TouchPanel // wait release TouchPanel
if ( WaitPanelReleaseNow() ) { if ( WaitPanelReleaseNow() ) {
s_pCw->seq = CALIBRATE_1; s_pTPC->seq = CALIBRATE_1;
} }
break; break;
case CALIBRATE_1: case CALIBRATE_1:
// detect first point. // detect first point.
SetPoint8x8( 32, 32 ); SetPoint8x8( 32, 32 );
if ( GetSamplePointNow( &s_pCw->sample[ 0 ] ) ) { if ( GetSamplePointNow( &s_pTPC->sample[ 0 ] ) ) {
OS_Printf( "OK! ( %d, %d )\n", s_pCw->sample[0].x, s_pCw->sample[0].y ); OS_Printf( "OK! ( %d, %d )\n", s_pTPC->sample[0].x, s_pTPC->sample[0].y );
s_pCw->seq = INTERVAL_1; s_pTPC->seq = INTERVAL_1;
} }
break; break;
case INTERVAL_1: case INTERVAL_1:
// wait release TouchPanel // wait release TouchPanel
if ( WaitPanelReleaseNow() ) { if ( WaitPanelReleaseNow() ) {
s_pCw->seq = CALIBRATE_2; s_pTPC->seq = CALIBRATE_2;
} }
break; break;
case CALIBRATE_2: case CALIBRATE_2:
// detect second point. // detect second point.
SetPoint8x8( DISP_X_SIZE - 32, DISP_Y_SIZE - 32 ); SetPoint8x8( DISP_X_SIZE - 32, DISP_Y_SIZE - 32 );
if ( GetSamplePointNow( &s_pCw->sample[ 1 ] ) ) { if ( GetSamplePointNow( &s_pTPC->sample[ 1 ] ) ) {
OS_Printf( "OK! ( %d, %d )\n", s_pCw->sample[1].x, s_pCw->sample[1].y ); TPCalibrateParam calibrate;
OS_Printf( "OK! ( %d, %d )\n", s_pTPC->sample[1].x, s_pTPC->sample[1].y );
// Calculate and set calibration parameter from two detected point. // Calculate and set calibration parameter from two detected point.
(void)TP_CalcCalibrateParam( (void)TP_CalcCalibrateParam(
&s_pCw->calibrate, &calibrate,
s_pCw->sample[0].x, s_pCw->sample[0].y, 32, 32, s_pTPC->sample[0].x, s_pTPC->sample[0].y, 32, 32,
s_pCw->sample[1].x, s_pCw->sample[1].y, DISP_X_SIZE - 32, DISP_Y_SIZE - 32 ); s_pTPC->sample[1].x, s_pTPC->sample[1].y, DISP_X_SIZE - 32, DISP_Y_SIZE - 32 );
TP_SetCalibrateParam( &s_pCw->calibrate ); TP_SetCalibrateParam( &calibrate );
OS_Printf( "Calibrate param: \n" ); OS_Printf( "Calibrate param: \n" );
OS_Printf( "\tx = %d, xDotSize = %d\n", s_pCw->calibrate.x0, s_pCw->calibrate.xDotSize / 0x100 ); OS_Printf( "\tx = %d, xDotSize = %d\n", calibrate.x0, calibrate.xDotSize / 0x100 );
OS_Printf( "\ty = %d, yDotSize = %d\n", s_pCw->calibrate.y0, s_pCw->calibrate.yDotSize / 0x100 ); OS_Printf( "\ty = %d, yDotSize = %d\n", calibrate.y0, calibrate.yDotSize / 0x100 );
OS_Printf( "Check calibrate param\n" ); OS_Printf( "Check calibrate param\n" );
s_pCw->seq = INTERVAL_2; s_pTPC->seq = INTERVAL_2;
} }
break; break;
case INTERVAL_2: case INTERVAL_2:
// Wait release TouchPanel // Wait release TouchPanel
if ( WaitPanelReleaseNow() ) { if ( WaitPanelReleaseNow() ) {
s_pCw->seq = CHECK_PARAM; s_pTPC->seq = CHECK_PARAM;
} }
break; break;
@ -362,7 +363,7 @@ int TP_CalibrationMain( void )
SetPoint8x8( DISP_X_SIZE / 2, DISP_Y_SIZE / 2 ); SetPoint8x8( DISP_X_SIZE / 2, DISP_Y_SIZE / 2 );
if ( GetSamplePointNow( &tpd.raw ) ) { if ( GetSamplePointNow( &tpd.raw ) ) {
TP_GetUnCalibratedPoint( &tpd.disp.x, &tpd.disp.y, DISP_X_SIZE / 2, DISP_Y_SIZE / 2 ); TP_GetUnCalibratedPoint( &tpd.disp.x, &tpd.disp.y, DISP_X_SIZE / 2, DISP_Y_SIZE / 2 );
s_pCw->seq = GET_POINT; s_pTPC->seq = GET_POINT;
NNS_G2dCharCanvasClearArea( &gCanvas, TXT_COLOR_WHITE, NNS_G2dCharCanvasClearArea( &gCanvas, TXT_COLOR_WHITE,
2 * 8 , 21 * 8, 10 * 8, 2 * 8 ); 2 * 8 , 21 * 8, 10 * 8, 2 * 8 );
@ -409,16 +410,16 @@ int TP_CalibrationMain( void )
if( ( pad.trg & PAD_BUTTON_A ) || tp_ok ) { if( ( pad.trg & PAD_BUTTON_A ) || tp_ok ) {
GetSYSMWork()->ncd_invalid = 0; GetSYSMWork()->ncd_invalid = 0;
s_pCw->calibData.data.raw_x1 = s_pCw->sample[0].x; s_pTPC->calibTemp.data.raw_x1 = s_pTPC->sample[0].x;
s_pCw->calibData.data.raw_y1 = s_pCw->sample[0].y; s_pTPC->calibTemp.data.raw_y1 = s_pTPC->sample[0].y;
s_pCw->calibData.data.dx1 = 32; s_pTPC->calibTemp.data.dx1 = 32;
s_pCw->calibData.data.dy1 = 32; s_pTPC->calibTemp.data.dy1 = 32;
s_pCw->calibData.data.raw_x2 = s_pCw->sample[1].x; s_pTPC->calibTemp.data.raw_x2 = s_pTPC->sample[1].x;
s_pCw->calibData.data.raw_y2 = s_pCw->sample[1].y; s_pTPC->calibTemp.data.raw_y2 = s_pTPC->sample[1].y;
s_pCw->calibData.data.dx2 = DISP_X_SIZE - 32; s_pTPC->calibTemp.data.dx2 = DISP_X_SIZE - 32;
s_pCw->calibData.data.dy2 = DISP_Y_SIZE - 32; s_pTPC->calibTemp.data.dy2 = DISP_Y_SIZE - 32;
TSD_SetTPCalibration( &s_pCw->calibData ); TSD_SetTPCalibration( &s_pTPC->calibTemp );
TSD_SetFlagTP( TRUE ); // タッチパネル入力フラグを立てる。 TSD_SetFlagTP( TRUE ); // タッチパネル入力フラグを立てる。
// :::::::::::::::::::::::::::::::::::::::::::::: // ::::::::::::::::::::::::::::::::::::::::::::::
// TWL設定データファイルへの書き込み // TWL設定データファイルへの書き込み
@ -428,7 +429,7 @@ int TP_CalibrationMain( void )
ReturnMenu(); ReturnMenu();
return 0; return 0;
}else if( ( pad.trg & PAD_BUTTON_START ) || tp_retry ) { }else if( ( pad.trg & PAD_BUTTON_START ) || tp_retry ) {
s_pCw->seq = INIT; s_pTPC->seq = INIT;
} }
break; break;
} }
@ -440,11 +441,16 @@ int TP_CalibrationMain( void )
// Bボタンキャンセル // Bボタンキャンセル
if( ( pad.trg & PAD_BUTTON_B ) || tp_cancel ){ if( ( pad.trg & PAD_BUTTON_B ) || tp_cancel ){
(void)TP_CalcCalibrateParam( // キャリブレーションを設定前の状態に戻す。
&s_pCw->calibrate, {
s_pCw->calibData.data.raw_x1, s_pCw->calibData.data.raw_y1, (u16)s_pCw->calibData.data.dx1, (u16)s_pCw->calibData.data.dy1, TPCalibrateParam calibrate;
s_pCw->calibData.data.raw_x2, s_pCw->calibData.data.raw_y2, (u16)s_pCw->calibData.data.dx2, (u16)s_pCw->calibData.data.dy2 ); MI_CpuCopy16( TSD_GetTPCalibration(), &s_pTPC->calibTemp, sizeof(TWLTPCalibData) );
TP_SetCalibrateParam( &s_pCw->calibrate ); (void)TP_CalcCalibrateParam(
&calibrate,
s_pTPC->calibTemp.data.raw_x1, s_pTPC->calibTemp.data.raw_y1, (u16)s_pTPC->calibTemp.data.dx1, (u16)s_pTPC->calibTemp.data.dy1,
s_pTPC->calibTemp.data.raw_x2, s_pTPC->calibTemp.data.raw_y2, (u16)s_pTPC->calibTemp.data.dx2, (u16)s_pTPC->calibTemp.data.dy2 );
TP_SetCalibrateParam( &calibrate );
}
ReturnMenu(); ReturnMenu();
return 0; return 0;
} }
@ -456,8 +462,9 @@ int TP_CalibrationMain( void )
// メニューに戻る // メニューに戻る
static void ReturnMenu( void ) static void ReturnMenu( void )
{ {
Free( s_pCw ); // キャリブレーション用変数の開放 // キャリブレーション用変数の開放
s_pCw = NULL; Free( s_pTPC );
s_pTPC = NULL;
OS_Printf("Free :CalibWork\n"); OS_Printf("Free :CalibWork\n");
MachineSettingInit(); MachineSettingInit();
} }
@ -478,11 +485,11 @@ void TP_CalibrationInit( void )
DisplayInit(); DisplayInit();
s_pCw = Alloc( sizeof(CalibWork) ); // キャリブレーション用変数の確保 s_pTPC = Alloc( sizeof(CalibWork) ); // キャリブレーション用変数の確保
if( s_pCw == NULL ) { if( s_pTPC == NULL ) {
OS_Panic("ARM9- Fail to allocate memory...\n"); OS_Panic("ARM9- Fail to allocate memory...\n");
} }
SVC_CpuClear( 0x0000, s_pCw, sizeof(CalibWork), 16 ); SVC_CpuClear( 0x0000, s_pTPC, sizeof(CalibWork), 16 );
SVC_CpuClear( 0x0000, &tpd, sizeof(TpWork), 16 ); SVC_CpuClear( 0x0000, &tpd, sizeof(TpWork), 16 );
GX_SetVisiblePlane ( GX_PLANEMASK_BG0 | GX_PLANEMASK_OBJ ); GX_SetVisiblePlane ( GX_PLANEMASK_BG0 | GX_PLANEMASK_OBJ );
@ -490,7 +497,7 @@ void TP_CalibrationInit( void )
GX_DispOn(); GX_DispOn();
GXS_DispOn(); GXS_DispOn();
s_pCw->seq = INIT; s_pTPC->seq = INIT;
} }