393 lines
8.6 KiB
C
Executable File
393 lines
8.6 KiB
C
Executable File
/**
|
||
Copyright Novatek Microelectronics Corp. 2009. All rights reserved.
|
||
|
||
@file GxTouch.c
|
||
@ingroup mIPRJAPKeyIO
|
||
|
||
@brief Scan Touch Panel
|
||
|
||
@note Nothing.
|
||
|
||
@date 2009/04/22
|
||
*/
|
||
|
||
|
||
//#include "kernel.h"
|
||
#include "GxInput.h"
|
||
#include "DxInput.h"
|
||
#include "Gesture.h"
|
||
#include "Calibrate.h"
|
||
//#include "Debug.h"
|
||
#include <stdlib.h>
|
||
#include "touch/touch_inc.h"
|
||
|
||
#include <stdlib.h>
|
||
#include <string.h>
|
||
#include <stdio.h>
|
||
#include <sys/time.h>
|
||
#include <sys/ioctl.h>
|
||
#include <unistd.h>
|
||
#include <sys/wait.h>
|
||
#include <time.h>
|
||
#include <fcntl.h>
|
||
|
||
#include "linux/rtc.h"
|
||
#include <errno.h>
|
||
|
||
|
||
///////////////////////////////////////////////////////////////////////////////
|
||
#define __MODULE__ GxTouch
|
||
#define __DBGLVL__ 2 // 0=FATAL, 1=ERR, 2=WRN, 3=UNIT, 4=FUNC, 5=IND, 6=MSG, 7=VALUE, 8=USER
|
||
#define __DBGFLT__ "*" //*=All, [mark]=CustomClass
|
||
#include <kwrap/debug.h>
|
||
///////////////////////////////////////////////////////////////////////////////
|
||
|
||
#define MOVE_MARGIN_DEFAULT_X 1
|
||
#define MOVE_MARGIN_DEFAULT_Y 1
|
||
|
||
#define TOUCH_AND_HOLD_DEFAULT_DELAY_TIME 24 // 20ms * 24 * TOUCH_TIMER_CNT = 20 * 24 * 1 = 480ms
|
||
#define TOUCH_AND_HOLD_DEFAULT_REPEAT_RATE 6 // 20ms * 6 * TOUCH_TIMER_CNT = 20 * 6 * 1 = 120ms
|
||
|
||
static INT32 g_iMoveMarginX = MOVE_MARGIN_DEFAULT_X;
|
||
static INT32 g_iMoveMarginY = MOVE_MARGIN_DEFAULT_Y;
|
||
static UINT32 g_HoldDelayTime = TOUCH_AND_HOLD_DEFAULT_DELAY_TIME;
|
||
static UINT32 g_HoldRepeatRate = TOUCH_AND_HOLD_DEFAULT_REPEAT_RATE;
|
||
|
||
|
||
BOOL g_bDumpTouch = FALSE;
|
||
static BOOL g_bIsPenDown = FALSE;
|
||
// -------------------------------------------------------------------
|
||
// Static variables
|
||
// -------------------------------------------------------------------
|
||
static GX_CALLBACK_PTR g_fpTouchCB = NULL;
|
||
static UINT32 g_ClickInterval = 20; // 20ms * 20 * TOUCH_TIMER_CNT = 20 *20 * 1 = 400ms
|
||
static INT32 g_Touchfd = 0;
|
||
|
||
/**
|
||
Detect touch panel
|
||
|
||
@param void
|
||
@return void
|
||
*/
|
||
#if (__DBGLVL__ > 1)
|
||
static void ShowTouchData(PGX_TOUCH_DATA pTouchData)
|
||
{
|
||
DBG_MSG("\r\n");
|
||
|
||
if (pTouchData->Gesture == TP_GESTURE_PRESS) {
|
||
DBG_MSG("PRESS");
|
||
} else if (pTouchData->Gesture == TP_GESTURE_MOVE) {
|
||
DBG_MSG("MOVE");
|
||
} else if (pTouchData->Gesture == TP_GESTURE_RELEASE) {
|
||
DBG_MSG("RELEASE");
|
||
} else if (pTouchData->Gesture == TP_GESTURE_CLICK) {
|
||
DBG_MSG("CLICK");
|
||
} else if (pTouchData->Gesture == TP_GESTURE_DOUBLE_CLICK) {
|
||
DBG_MSG("DOUBLE_CLICK");
|
||
} else if (pTouchData->Gesture == TP_GESTURE_SLIDE_UP) {
|
||
DBG_MSG("SLIDE_UP");
|
||
} else if (pTouchData->Gesture == TP_GESTURE_SLIDE_DOWN) {
|
||
DBG_MSG("SLIDE_DOWN");
|
||
} else if (pTouchData->Gesture == TP_GESTURE_SLIDE_LEFT) {
|
||
DBG_MSG("SLIDE_LEFT");
|
||
} else if (pTouchData->Gesture == TP_GESTURE_SLIDE_RIGHT) {
|
||
DBG_MSG("SLIDE_RIGHT");
|
||
}
|
||
DBG_MSG(" Point(%d,%d)\r\n", pTouchData->Point.x, pTouchData->Point.y);
|
||
}
|
||
#endif
|
||
|
||
int nvt_system(const char* pCommand)
|
||
{
|
||
pid_t pid;
|
||
int status;
|
||
int i = 0;
|
||
|
||
if(pCommand == NULL)
|
||
{
|
||
return (1);
|
||
}
|
||
|
||
if((pid = fork())<0)
|
||
{
|
||
status = -1;
|
||
}
|
||
else if(pid == 0)
|
||
{
|
||
/* close all descriptors in child sysconf(_SC_OPEN_MAX) */
|
||
for (i = 3; i < sysconf(_SC_OPEN_MAX); i++)
|
||
{
|
||
close(i);
|
||
}
|
||
|
||
execl("/bin/sh", "sh", "-c", pCommand, (char *)0);
|
||
_exit(127);
|
||
}
|
||
else
|
||
{
|
||
/*??<3F>{<7B><>SIGCHLD<4C><44>SIG_IGN<47>ާ@?<3F>A?<3F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>status<75><73><EFBFBD>^<5E>ȡAXOS_System?<3F>k<EFBFBD><6B><EFBFBD>`<60>u<EFBFBD>@*/
|
||
while(waitpid(pid, &status, 0) < 0)
|
||
{
|
||
if(errno != EINTR)
|
||
{
|
||
status = -1;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
return status;
|
||
}
|
||
|
||
void GxTouch_Init(void)
|
||
{
|
||
#if defined __FREERTOS
|
||
DetTP_Init();
|
||
#else
|
||
#if 1
|
||
INT32 Ret = 0;
|
||
Ret = nvt_system("modprobe touch_gt911");
|
||
if(0 != Ret)
|
||
{
|
||
DBG_ERR("insmod touch: failed, errno(%d)\n", errno);
|
||
return;
|
||
}else{
|
||
DBG_DUMP("insmod touch: success\n");
|
||
}
|
||
#endif
|
||
g_Touchfd = open("/dev/touch", O_RDWR);
|
||
|
||
if (g_Touchfd < 0)
|
||
{
|
||
DBG_ERR("open [%s] failed\n","/dev/touch");
|
||
return ;
|
||
}else{
|
||
DBG_DUMP("open [%s] success\n","/dev/touch");
|
||
}
|
||
|
||
#endif
|
||
}
|
||
void GxTouch_DetTP(void)
|
||
{
|
||
GX_TOUCH_DATA TouchData;
|
||
static BOOL bIsFirstPenDown = TRUE;
|
||
static IPOINT LastPoint = {0};
|
||
static UINT32 DoubleClickCnt = 0;
|
||
INT32 x = 0, y = 0;
|
||
BOOL bPointChanged = TRUE;
|
||
static UINT32 RepeatCnt = 0;
|
||
|
||
DoubleClickCnt++;
|
||
INT32 Ret = 0;
|
||
#if defined __FREERTOS
|
||
g_bIsPenDown = DetTP_IsPenDown();
|
||
#else
|
||
if(g_Touchfd<0){
|
||
return;
|
||
}
|
||
|
||
|
||
Ret = ioctl(g_Touchfd, IOC_TOUCH_ISPENDOWN, &g_bIsPenDown);
|
||
if (Ret < 0)
|
||
{
|
||
DBG_ERR("pendown ioctl error");
|
||
return;
|
||
}
|
||
#endif
|
||
|
||
if (g_bIsPenDown) {
|
||
#if defined __FREERTOS
|
||
DetTP_GetXY(&x, &y);
|
||
#else
|
||
INT32 xyData[2] = {0};
|
||
Ret = ioctl(g_Touchfd, IOC_TOUCH_GET_XY_VALUE, &xyData);
|
||
if (Ret < 0)
|
||
{
|
||
DBG_ERR("xy ioctl error");
|
||
return;
|
||
}
|
||
#endif
|
||
x=xyData[0];
|
||
y=xyData[1];
|
||
|
||
|
||
CalibrateXY(&x, &y);
|
||
TouchData.Gesture = Ges_SetPress(TRUE, x, y);
|
||
if (bIsFirstPenDown) {
|
||
bIsFirstPenDown = FALSE;
|
||
}
|
||
|
||
if (LastPoint.x != x || LastPoint.y != y) {
|
||
INT32 iXDelta, iYDelta;
|
||
iXDelta = abs(x - LastPoint.x);
|
||
iYDelta = abs(y - LastPoint.y);
|
||
if (iXDelta >= g_iMoveMarginX || iYDelta >= g_iMoveMarginY) {
|
||
bPointChanged = TRUE;
|
||
LastPoint.x = x;
|
||
LastPoint.y = y;
|
||
} else {
|
||
bPointChanged = FALSE;
|
||
}
|
||
} else {
|
||
bPointChanged = FALSE;
|
||
LastPoint.x = x;
|
||
LastPoint.y = y;
|
||
}
|
||
|
||
} else {
|
||
TouchData.Gesture = Ges_SetPress(FALSE, 0, 0);
|
||
bIsFirstPenDown = TRUE;
|
||
//check if it's a "double click"
|
||
if (TouchData.Gesture == TP_GESTURE_CLICK) {
|
||
if (DoubleClickCnt < g_ClickInterval) {
|
||
TouchData.Gesture = TP_GESTURE_DOUBLE_CLICK;
|
||
DoubleClickCnt = g_ClickInterval;
|
||
} else {
|
||
DoubleClickCnt = 0;
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
if (TouchData.Gesture != TP_GESTURE_IDLE) {
|
||
TouchData.Point = LastPoint;
|
||
#if (__DBGLVL__ > 1)
|
||
if (g_bDumpTouch) {
|
||
ShowTouchData(&TouchData);
|
||
}
|
||
#endif
|
||
//just ignore the event when pen is pressing and NOT moving
|
||
if (TouchData.Gesture == TP_GESTURE_MOVE && bPointChanged == FALSE) {
|
||
if (RepeatCnt >= (g_HoldDelayTime + g_HoldRepeatRate)) {
|
||
TouchData.Gesture = TP_GESTURE_HOLD;
|
||
RepeatCnt = g_HoldDelayTime;
|
||
} else {
|
||
RepeatCnt ++;
|
||
return;
|
||
}
|
||
} else {
|
||
RepeatCnt = 0;
|
||
}
|
||
if (TouchData.Gesture > TP_GESTURE_RELEASE && g_fpTouchCB) {
|
||
TP_GESTURE_CODE temp;
|
||
temp = TouchData.Gesture;
|
||
TouchData.Gesture = TP_GESTURE_RELEASE;
|
||
if (g_fpTouchCB) {
|
||
g_fpTouchCB(TOUCH_CB_GESTURE, (UINT32)&TouchData, 0);
|
||
}
|
||
TouchData.Gesture = temp;
|
||
}
|
||
if (TouchData.Gesture == TP_GESTURE_DOUBLE_CLICK && g_fpTouchCB) {
|
||
TP_GESTURE_CODE temp;
|
||
temp = TouchData.Gesture;
|
||
TouchData.Gesture = TP_GESTURE_CLICK;
|
||
if (g_fpTouchCB) {
|
||
g_fpTouchCB(TOUCH_CB_GESTURE, (UINT32)&TouchData, 0);
|
||
}
|
||
TouchData.Gesture = temp;
|
||
}
|
||
if (g_fpTouchCB) {
|
||
g_fpTouchCB(TOUCH_CB_GESTURE, (UINT32)&TouchData, 0);
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
#if 0
|
||
void Touch_OnSystem(int cmd)
|
||
{
|
||
switch (cmd) {
|
||
case SYSTEM_CMD_POWERON:
|
||
if (g_fpTouchCB) {
|
||
(*g_fpTouchCB)(SYSTEM_CB_CONFIG, 0, 0);
|
||
}
|
||
break;
|
||
|
||
case SYSTEM_CMD_POWEROFF:
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
#endif
|
||
|
||
void GxTouch_RegCB(GX_CALLBACK_PTR fpTouchCB)
|
||
{
|
||
g_fpTouchCB = fpTouchCB;
|
||
}
|
||
|
||
BOOL GxTouch_IsPenDown(void)
|
||
{
|
||
return g_bIsPenDown;
|
||
}
|
||
|
||
void GxTouch_SetCtrl(GXTOUCH_CTRL data, UINT32 value)
|
||
{
|
||
switch (data) {
|
||
case GXTCH_DOUBLE_CLICK_INTERVAL:
|
||
g_ClickInterval = value;
|
||
break;
|
||
case GXTCH_MOVE_SENSITIVITY_X:
|
||
g_iMoveMarginX = (INT32)value;
|
||
break;
|
||
case GXTCH_MOVE_SENSITIVITY_Y:
|
||
g_iMoveMarginY = (INT32)value;
|
||
break;
|
||
case GXTCH_CLICK_TH:
|
||
g_uiTPClickTH = (UINT16)value;
|
||
break;
|
||
case GXTCH_SLIDE_TH_HORIZONTAL:
|
||
g_uiSlideHorizontalTH = (UINT16)value;
|
||
break;
|
||
case GXTCH_SLIDE_TH_VERTICAL:
|
||
g_uiSlideVerticalTH = (UINT16)value;
|
||
break;
|
||
case GXTCH_HOLD_DELAY_TIME:
|
||
g_HoldDelayTime = value;
|
||
break;
|
||
case GXTCH_HOLD_REPEAT_RATE:
|
||
g_HoldRepeatRate = value;
|
||
break;
|
||
default:
|
||
DBG_ERR("Ctrl(%d)", data);
|
||
break;
|
||
}
|
||
}
|
||
|
||
UINT32 GxTouch_GetCtrl(GXTOUCH_CTRL data)
|
||
{
|
||
UINT32 getv = 0;
|
||
|
||
switch (data) {
|
||
case GXTCH_DOUBLE_CLICK_INTERVAL:
|
||
getv = g_ClickInterval;
|
||
break;
|
||
case GXTCH_MOVE_SENSITIVITY_X:
|
||
getv = (UINT32)g_iMoveMarginX;
|
||
break;
|
||
case GXTCH_MOVE_SENSITIVITY_Y:
|
||
getv = (UINT32)g_iMoveMarginY;
|
||
break;
|
||
case GXTCH_CLICK_TH:
|
||
getv = g_uiTPClickTH;
|
||
break;
|
||
case GXTCH_SLIDE_TH_HORIZONTAL:
|
||
getv = g_uiSlideHorizontalTH;
|
||
break;
|
||
case GXTCH_SLIDE_TH_VERTICAL:
|
||
getv = g_uiSlideVerticalTH;
|
||
break;
|
||
case GXTCH_HOLD_DELAY_TIME:
|
||
getv = g_HoldDelayTime;
|
||
break;
|
||
case GXTCH_HOLD_REPEAT_RATE:
|
||
getv = g_HoldRepeatRate;
|
||
break;
|
||
default:
|
||
DBG_ERR("Ctrl(%d)", data);
|
||
getv = 0;
|
||
break;
|
||
}
|
||
return getv;
|
||
}
|