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

📄 mou_yopy.c

📁 神龙卡开发原代码
💻 C
字号:
/* * Microwindows touch screen driver for G.Mate YOPY * * Copyright (c) 2000 Century Software Embedded Technologies * * Requires /dev/yopy-ts kernel mouse driver. */#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <errno.h>#include <fcntl.h>#include <math.h>#include <sys/ioctl.h>#include "device.h"/* file descriptor for touch panel */static int pd_fd = -1;/* Hack extern to used when hiding the mouse cursor * There needs to be a better way to do this*/extern SCREENDEVICE scrdev;static int cal[7];typedef struct {        int x, y;} XYPOINT;#define TRANSFORMATION_UNITS_PER_PIXEL 4static int GetPointerCalibrationData(void){  /*   * Read the calibration data from the calibration file.   * Calibration file format is seven coefficients separated by spaces.   */    /* Get pointer calibration data from this file */  const char cal_filename[] = "/etc/ts.conf";  int items;  FILE* f = fopen(cal_filename, "r");  if ( f == NULL )    {      EPRINTF("Error %d opening pointer calibration file %s.\n",	      errno, cal_filename);      return -1;    }  items = fscanf(f, "%d %d %d %d %d %d %d",		 &cal[0], &cal[1], &cal[2], &cal[3], &cal[4], &cal[5], &cal[6]);  if ( items != 7 )    {      EPRINTF("Improperly formatted pointer calibration file %s.\n",	      cal_filename);      return -1;    }#ifdef TEST  EPRINTF("a=%d b=%d c=%d d=%d e=%d f=%d s=%d\n",	  cal[0], cal[1], cal[2], cal[3], cal[4], cal[5], cal[6]);#endif  return 0;}static XYPOINT DeviceToScreen(XYPOINT p){  /*   * Transform device coordinates to screen coordinates.   * Take a point p in device coordinates and return the corresponding   * point in screen coodinates.   * This can scale, translate, rotate and/or skew, based on the coefficients   * calculated above based on the list of screen vs. device coordinates.   */    static XYPOINT prev;  /* set slop at 3/4 pixel */  const short slop = TRANSFORMATION_UNITS_PER_PIXEL * 3 / 4;  XYPOINT new, out;    /* transform */  new.x = (cal[0] * p.x + cal[1] * p.y + cal[2]) / cal[6];  new.y = (cal[3] * p.x + cal[4] * p.y + cal[5]) / cal[6];    /* hysteresis (thanks to John Siau) */  if ( abs(new.x - prev.x) >= slop )    out.x = (new.x | 0x3) ^ 0x3;  else    out.x = prev.x;    if ( abs(new.y - prev.y) >= slop )    out.y = (new.y | 0x3) ^ 0x3;  else    out.y = prev.y;    prev = out;    return out;}static int PD_Open(MOUSEDEVICE *pmd){  /*   * open up the touch-panel device.   * Return the fd if successful, or negative if unsuccessful.   */    pd_fd = open("/dev/yopy-ts", O_NONBLOCK);  if (pd_fd < 0) {    EPRINTF("Error %d opening touch panel\n", errno);    return -1;  }    GetPointerCalibrationData();  GdHideCursor(&scrdev);    return pd_fd;}static void PD_Close(void){  /* Close the touch panel device. */  if (pd_fd >= 0)    close(pd_fd);  pd_fd = -1;}static int PD_GetButtonInfo(void){  /* get "mouse" buttons supported */  return MWBUTTON_L;}static void PD_GetDefaultAccel(int *pscale,int *pthresh){  /*   * Get default mouse acceleration settings   * This doesn't make sense for a touch panel.   * Just return something inconspicuous for now.   */  *pscale = 3;  *pthresh = 5;}static int PD_Read(MWCOORD *px, MWCOORD *py, MWCOORD *pz, int *pb){  /* read a data point */  unsigned long data;  int bytes_read;  XYPOINT transformed;  bytes_read = read(pd_fd, &data, sizeof(data));  if (bytes_read != sizeof(data)) {    if (errno == EINTR || errno == EAGAIN) {      return 0;    }    return 0;  }	  transformed.x = (data & 0x3ff);  transformed.y = (data >> 10) & 0x3ff;	  transformed = DeviceToScreen(transformed);	  transformed.x >>= 2;  transformed.y >>= 2;  *px = transformed.x;  *py = transformed.y;  *pb = (((data >> 31) & 0x1) ? MWBUTTON_L : 0);  *pz = 0;  if(! *pb )    return 3;			/* only have button data */  else     return 2;			/* have full set of data */}MOUSEDEVICE mousedev = {  PD_Open,  PD_Close,  PD_GetButtonInfo,  PD_GetDefaultAccel,  PD_Read,  NULL};#ifdef TESTint main(int argc, char ** v){  MWCOORD x, y, z;  int	b;  int result;  int mouse = -1;  DPRINTF("Opening touch panel...\n");    if((result=PD_Open(0)) < 0)    DPRINTF("Error %d, result %d opening touch-panel\n", errno, result);    while(1) {    result = PD_Read(&x, &y, &z, &b);    if( result > 0) {      if(mouse != b) {	mouse = b;	if(mouse) 	  DPRINTF("Pen Down\n");	else	  DPRINTF("Pen Up\n");      }      DPRINTF("%d,%d,%d,%d,%d\n", result, x, y, z, b);    }  }}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -