⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s3c2450_touch.cpp

📁 SMDK2416_BSP
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	
	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 + -