📄 s3c2450_touch.cpp
字号:
for (j = 0; j < TSP_SAMPLE_NUM -1; ++j)
{
for (k = j+1; k < TSP_SAMPLE_NUM; ++k)
{
if(x[j]>x[k])
{
temp = x[j];
x[j]=x[k];
x[k]=temp;
}
if(y[j]>y[k])
{
temp = y[j];
y[j]=y[k];
y[k]=temp;
}
}
}
*px = (x[1]+x[2])>>1;
*py = (y[1]+y[2])>>1;
v_pADCregs->ADCTSC = (1<<8)|(1<<7)|(1<<6)|(0<<5)|(1<< 4)|(0<<3)|(0<<2)|(3);
dx = x[2]-x[1];
dy = y[2]-y[1];
RETAILMSG(TS_DBGON,(TEXT("TSP_GetXY: 1- x= %d, y=%d\r\n"),x[0],y[0]));
RETAILMSG(TS_DBGON,(TEXT("TSP_GetXY: 2- x= %d, y=%d\r\n"),x[1],y[1]));
RETAILMSG(TS_DBGON,(TEXT("TSP_GetXY: 3- x= %d, y=%d\r\n"),x[2],y[2]));
RETAILMSG(TS_DBGON,(TEXT("TSP_GetXY: 4- x= %d, y=%d\r\n"),x[3],y[3]));
RETAILMSG(TS_DBGON,(TEXT("TSP_GetXY: *px=%d, *py=%d\r\n"),*px,*py)); //junkim
return ((dx > TSP_INVALIDLIMIT || dy > TSP_INVALIDLIMIT) ? FALSE : TRUE);
}
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
PUBLIC BOOL
DdsiTouchPanelGetDeviceCaps(INT iIndex, LPVOID lpOutput)
{
if ( lpOutput == NULL )
{
ERRORMSG(1, (__TEXT("TouchPanelGetDeviceCaps: invalid parameter.\r\n")));
SetLastError(ERROR_INVALID_PARAMETER);
DebugBreak();
return FALSE;
}
switch ( iIndex )
{
case TPDC_SAMPLE_RATE_ID:
{
TPDC_SAMPLE_RATE *pTSR = (TPDC_SAMPLE_RATE*)lpOutput;
RETAILMSG(TS_DBGON, (TEXT("TouchPanelGetDeviceCaps::TPDC_SAMPLE_RATE_ID\r\n")));
pTSR->SamplesPerSecondLow = TSP_SAMPLE_RATE_LOW;
pTSR->SamplesPerSecondHigh = TSP_SAMPLE_RATE_HIGH;
pTSR->CurrentSampleRateSetting = TSP_CurRate;
RETAILMSG(TS_DBGON,(TEXT("SamplesPerSecondLow= %d, SamplesPerSecondHigh=%d, Setting=%d \r\n"),TSP_SAMPLE_RATE_LOW,TSP_SAMPLE_RATE_HIGH,TSP_CurRate));
}
break;
case TPDC_CALIBRATION_POINT_COUNT_ID:
{
TPDC_CALIBRATION_POINT_COUNT *pTCPC = (TPDC_CALIBRATION_POINT_COUNT*)lpOutput;
RETAILMSG(TS_DBGON, (TEXT("TouchPanelGetDeviceCaps::TPDC_CALIBRATION_POINT_COUNT_ID\r\n")));
pTCPC->flags = 0;
pTCPC->cCalibrationPoints = 5;
}
break;
case TPDC_CALIBRATION_POINT_ID:
//RETAILMSG(TSP_CurRate, (TEXT("TouchPanelGetDeviceCaps::TPDC_CALIBRATION_POINT_ID\r\n")));
return(TSP_CalibrationPointGet((TPDC_CALIBRATION_POINT*)lpOutput));
default:
ERRORMSG(1, (__TEXT("TouchPanelGetDeviceCaps: invalid parameter.\r\n")));
SetLastError(ERROR_INVALID_PARAMETER);
DebugBreak();
return FALSE;
}
return TRUE;
}
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
PUBLIC BOOL
DdsiTouchPanelSetMode(INT iIndex, LPVOID lpInput)
{
BOOL ReturnCode = FALSE;
RETAILMSG(TS_DBGON, (TEXT("::: DdsiTouchPanelSetMode()\r\n")));
switch ( iIndex )
{
case TPSM_SAMPLERATE_LOW_ID:
TSP_CurRate = 0;
v_pPWMregs->TCNTB3 = TSP_SAMPLETICK_LOW;
SetLastError( ERROR_SUCCESS );
ReturnCode = TRUE;
RETAILMSG(TS_DBGON,(TEXT("TPSM_SAMPLERATE_LOW_ID\r\n")));
break;
case TPSM_SAMPLERATE_HIGH_ID:
TSP_CurRate = 1;
v_pPWMregs->TCNTB3 = TSP_SAMPLETICK_HIGH;
SetLastError( ERROR_SUCCESS );
RETAILMSG(TS_DBGON,(TEXT("TPSM_SAMPLERATE_HIGH_ID\r\n")));
ReturnCode = TRUE;
break;
default:
SetLastError( ERROR_INVALID_PARAMETER );
break;
}
return ( ReturnCode );
}
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
PUBLIC BOOL
DdsiTouchPanelEnable(VOID)
{
BOOL r;
UINT32 Irq[3]={-1,OAL_INTR_FORCE_STATIC,0};
r = TSP_VirtualAlloc();
if (r)
{
TSP_PowerOn();
}
// Obtain sysintr values from the OAL for the touch and touch changed interrupts.
//
//RETAILMSG(TS_DBGON, (TEXT("enable touch sysintr.\r\n")));
Irq[0]=-1;Irq[1]=OAL_INTR_FORCE_STATIC;Irq[2]=IRQ_ADC;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &Irq, sizeof(Irq), &gIntrTouch, sizeof(UINT32), NULL))
{
RETAILMSG(1, (TEXT("ERROR: Failed to request the touch sysintr.\r\n")));
gIntrTouch = SYSINTR_UNDEFINED;
return(FALSE);
}
Irq[0]=-1;Irq[1]=OAL_INTR_FORCE_STATIC;Irq[2]=IRQ_TIMER3;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &Irq, sizeof(Irq), &gIntrTouchChanged, sizeof(UINT32), NULL))
{
RETAILMSG(1, (TEXT("ERROR: Failed to request the touch changed sysintr.\r\n")));
gIntrTouchChanged = SYSINTR_UNDEFINED;
return(FALSE);
}
return r;
}
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
PUBLIC VOID
DdsiTouchPanelDisable(VOID)
{
if (v_pADCregs)
{
TSP_PowerOff();
TSP_VirtualFree();
}
}
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
LONG
DdsiTouchPanelAttach(VOID)
{
return (1);
}
LONG
DdsiTouchPanelDetach(VOID)
{
return (0);
}
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
PUBLIC VOID
DdsiTouchPanelPowerHandler(BOOL bOff)
{
RETAILMSG(TS_DBGON, (TEXT("::: DdsiTouchPanelPowerHandler()\r\n")));
if (bOff)
{
TSP_PowerOff();
}
else
{
TSP_PowerOn();
}
}
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
PUBLIC VOID
DdsiTouchPanelGetPoint(TOUCH_PANEL_SAMPLE_FLAGS * pTipStateFlags,
INT * pUncalX,
INT * pUncalY)
{
static INT PrevX=0;
static INT PrevY=0;
INT TmpX = 0;
INT TmpY = 0;
RETAILMSG(TS_DBGON,(TEXT("DdsiTouchPanelGetPoint:: *pUncalX=%d, *pUncalY=%d\r\n"),*pUncalX,*pUncalY));
if (v_pINTregs->SUBSRCPND & (1<<IRQ_SUB_TC)) /* SYSINTR_TOUCH Interrupt Case */
{
*pTipStateFlags = TouchSampleValidFlag;
if ( (v_pADCregs->ADCDAT0 & (1 << 15)) ||
(v_pADCregs->ADCDAT1 & (1 << 15)) )
{
bTSP_DownFlag = FALSE;
DEBUGMSG(ZONE_TIPSTATE, (TEXT("up\r\n")));
RETAILMSG(TS_DBGON,(TEXT("up\r\n")));
v_pADCregs->ADCTSC = 0xD3;
*pUncalX = PrevX;
*pUncalY = PrevY;
RETAILMSG(TS_DBGON,(TEXT("*pUncalX=%d,*pUncalY=%d\r\n"),*pUncalX,*pUncalY));
TSP_SampleStop();
}
else
{
bTSP_DownFlag = TRUE;
*pTipStateFlags |= TouchSampleIgnore;
//if (!TSP_GetXY(&x, &y))
// *pTipStateFlags = TouchSampleIgnore;
//TSP_TransXY(&x, &y);
*pUncalX = PrevX;
*pUncalY = PrevY;
*pTipStateFlags |= TouchSampleDownFlag;
//DEBUGMSG(ZONE_TIPSTATE, (TEXT("down %x %x\r\n"), x, y));
RETAILMSG(TS_DBGON, (TEXT("down %d %d\r\n"), *pUncalX, *pUncalY));
TSP_SampleStart();
}
v_pINTregs->SUBSRCPND = (1<<IRQ_SUB_TC);
v_pINTregs->INTSUBMSK &= ~(1<<IRQ_SUB_TC);
InterruptDone(gIntrTouch);
}
else /* SYSINTR_TOUCH_CHANGED Interrupt Case */
{
// TSP_SampleStart();
if ( (v_pADCregs->ADCDAT0 & (1 << 15)) ||
(v_pADCregs->ADCDAT1 & (1 << 15)) )
{
bTSP_DownFlag = FALSE;
DEBUGMSG(ZONE_TIPSTATE, (TEXT("up\r\n")));
RETAILMSG(TS_DBGON,(TEXT("up\r\n")));
v_pADCregs->ADCTSC = 0xD3;
*pTipStateFlags = TouchSampleValidFlag;
*pUncalX = PrevX;
*pUncalY = PrevY;
RETAILMSG(TS_DBGON,(TEXT("*pUncalX=%d,*pUncalY=%d\r\n"),*pUncalX,*pUncalY));
TSP_SampleStop();
}
else if (bTSP_DownFlag)
{
if (!TSP_GetXY(&TmpX, &TmpY))
*pTipStateFlags = TouchSampleIgnore;
else
{
//TSP_TransXY(&TmpX, &TmpY);
if(Touch_Pen_Filtering(&TmpX, &TmpY))
{
RETAILMSG(TS_DBGON,(TEXT("Valid Touch Pen\r\n")));
*pTipStateFlags = TouchSampleValidFlag | TouchSampleDownFlag;
*pTipStateFlags &= ~TouchSampleIgnore;
}
else // Invalid touch pen
{
RETAILMSG(TS_DBGON, (TEXT("invalid touch pen\r\n")));
*pTipStateFlags = TouchSampleValidFlag;
*pTipStateFlags |= TouchSampleIgnore;
}
*pUncalX = PrevX = TmpX;
*pUncalY = PrevY = TmpY;
RETAILMSG(TS_DBGON,(TEXT("*Final:*pUncalX=%d, *pUncalY=%d\r\n"),*pUncalX,*pUncalY));
}
}
else
{
*pTipStateFlags = TouchSampleIgnore;
RETAILMSG(TS_DBGON,(TEXT("TSP_SampleStop()\r\n")));
TSP_SampleStop();
}
InterruptDone(gIntrTouchChanged);
}
}
#define FILTER_LIMIT 25
static BOOL Touch_Pen_Filtering(INT *px, INT *py)
{
BOOL RetVal = TRUE;
// TRUE : Valid pen sample
// FALSE : Invalid pen sample
static int count = 0;
static INT x[2], y[2];
INT TmpX, TmpY;
INT dx, dy;
count++;
if (count > 2)
{
// apply filtering rule
count = 2;
// average between x,y[0] and *px,y
TmpX = (x[0] + *px) / 2;
TmpY = (y[0] + *py) / 2;
// difference between x,y[1] and TmpX,Y
dx = (x[1] > TmpX) ? (x[1] - TmpX) : (TmpX - x[1]);
dy = (y[1] > TmpY) ? (y[1] - TmpY) : (TmpY - y[1]);
if ((dx > FILTER_LIMIT) || (dy > FILTER_LIMIT)) {
// Invalid pen sample
*px = x[1];
*py = y[1]; // previous valid sample
RetVal = FALSE;
count = 0;
} else {
// Valid pen sample
x[0] = x[1]; y[0] = y[1];
x[1] = *px; y[1] = *py; // reserve pen samples
RetVal = TRUE;
}
} else { // till 2 samples, no filtering rule
x[0] = x[1]; y[0] = y[1];
x[1] = *px; y[1] = *py; // reserve pen samples
RetVal = FALSE; // <- TRUE jylee 2003.03.04
}
return RetVal;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -