//------------------------------------------------------------ LeerTableta() // static void LeerTableta(int i) { static unsigned char uchBuf[64]; static int nLength; static WACOMSTATE state = WACOMSTATE_INIT; //Lectura de un paquete if ( ( nLength = WacomReadRaw(ghTablet,uchBuf,sizeof(uchBuf)) ) < 0) return; //Interpretacion del paquete if (WacomParseData(ghTablet,uchBuf,nLength,&state)) return; //Lectura secuencial de los distintos valores del estado actual de la tableta if (state.uValid & BIT(WACOMFIELD_PROXIMITY)) gAbsState[WACOMFIELD_PROXIMITY].nValue = state.values[WACOMFIELD_PROXIMITY].nValue; if (state.uValid & BIT(WACOMFIELD_POSITION_X)) gAbsState[WACOMFIELD_POSITION_X].nValue = state.values[WACOMFIELD_POSITION_X].nValue; if (state.uValid & BIT(WACOMFIELD_POSITION_Y)) gAbsState[WACOMFIELD_POSITION_Y].nValue = state.values[WACOMFIELD_POSITION_Y].nValue; if (state.uValid & BIT(WACOMFIELD_PRESSURE)) gAbsState[WACOMFIELD_PRESSURE].nValue = state.values[WACOMFIELD_PRESSURE].nValue; /* for (i=WACOMFIELD_TOOLTYPE; i<WACOMFIELD_MAX; ++i) if (state.uValid & BIT(i)) gAbsState[i].nValue = state.values[i].nValue; } Para leer todos los campos*/ /* Call the user defined callback function */ if (gCallback) gCallback(i); }
//------------------------------------------------------------ LeerTableta() // int LeerTableta() { unsigned char uchBuf[64]; int nLength; WACOMSTATE state = WACOMSTATE_INIT; if ( ( nLength = WacomReadRaw(ghTablet,uchBuf,sizeof(uchBuf)) ) < 0) return 0; //Lectura de un paquete if (WacomParseData(ghTablet,uchBuf,nLength,&state)) return 0; //Interpretacion del paquete //Lectura secuencial de los distintos valores del estado actual de la tableta if (state.uValid & BIT(WACOMFIELD_PROXIMITY)) gAbsState[WACOMFIELD_PROXIMITY].nValue = state.values[WACOMFIELD_PROXIMITY].nValue; if (state.uValid & BIT(WACOMFIELD_POSITION_X)) gAbsState[WACOMFIELD_POSITION_X].nValue = state.values[WACOMFIELD_POSITION_X].nValue; if (state.uValid & BIT(WACOMFIELD_POSITION_Y)) gAbsState[WACOMFIELD_POSITION_Y].nValue = state.values[WACOMFIELD_POSITION_Y].nValue; if (state.uValid & BIT(WACOMFIELD_PRESSURE)) gAbsState[WACOMFIELD_PRESSURE].nValue = state.values[WACOMFIELD_PRESSURE].nValue; return 1; }
void FetchTablet(WACOMTABLET hTablet) { char chOut[128]; unsigned char uchBuf[64]; int i, nLength, nRow=gnSerialDataRow, nErrors=0; WACOMSTATE state = WACOMSTATE_INIT; int input_fd; input_fd = open("/sys/devices/platform/wac_android/input", O_RDWR); if (input_fd < 0) { perror("Couldn't open wac_android input file\n"); return; } while (1) { nLength = WacomReadRaw(hTablet,uchBuf,sizeof(uchBuf)); if (nLength < 0) { /*snprintf(chOut,sizeof(chOut),"ReadRaw: %10d (%d)", nLength,++nErrors); fprintf(stderr,"%s\n", chOut);*/ sleep(1); continue; } if ((i=WacomParseData(hTablet,uchBuf,nLength,&state))) { /*snprintf(chOut,sizeof(chOut), "ParseData: %10d %-40s (%d)", i,strerror(errno),++nErrors); fprintf(stderr,"%s\n", chOut);*/ continue; } //fprintf(stdout, "WacomField\n"); for (i=WACOMFIELD_TOOLTYPE; i<WACOMFIELD_MAX; ++i) { if (state.uValid & BIT(i)) { if (i == WACOMFIELD_RELWHEEL) { gAbsState[i].nValue += state.values[i].nValue; } else { gAbsState[i].nValue = state.values[i].nValue; } //fprintf(stdout, "index: %d value %d\n", i, gAbsState[i].nValue); } } //fprintf(stdout, "WacomButton\n"); for (i=WACOMBUTTON_LEFT; i<WACOMBUTTON_MAX; ++i) { gKeyState[i].nValue = state.values[WACOMFIELD_BUTTONS].nValue & (1 << i) ? 1 : 0; //fprintf(stdout, "index: %d value %d\n", i, gKeyState[i].nValue); } // tooltype = 1 when tip is in range; tooltype = 4 when eraser is in range int tooltype = gAbsState[WACOMFIELD_TOOLTYPE].nValue; // proximity = 1 when stylus is in range int proximity = gAbsState[WACOMFIELD_PROXIMITY].nValue; // buttons = 32 when either tip or eraser is being pressed // buttons = 64 when only side button is being pressed // buttons = 96 if both tip and side button are being pressed int buttons = gAbsState[WACOMFIELD_BUTTONS].nValue; int x = gAbsState[WACOMFIELD_POSITION_X].nValue; int y = gAbsState[WACOMFIELD_POSITION_Y].nValue; // pressure values 0 - 255 int pressure = gAbsState[WACOMFIELD_PRESSURE].nValue; // touch value = 1 when either tip or eraser is touching int touch = gKeyState[WACOMBUTTON_TOUCH].nValue; // side = 1 when side button is being pressed int side = gKeyState[WACOMBUTTON_STYLUS].nValue; sprintf(chOut, "%d %d %d %d %d %d %d %d %d", tooltype, proximity, buttons, x, y, pressure, touch, side, 0); int err = write(input_fd, chOut, strlen(chOut)); if (err < 0) perror("error writing to driver"); //err = fsync(input_fd); //if (err < 0) perror("error syncing to driver"); fprintf(stderr, "%s\n", chOut); } }
int GetFirstValid(WACOMTABLET hTablet, float *lX, float *lY, int *lB, long *lT) { char chOut[128]; unsigned char uchBuf[64]; int i, nLength, nErrors = 0; WACOMSTATE state = WACOMSTATE_INIT; long curr_time; int j = 0; int valid = 0; // printf("GFV\n"); while (!valid) { nLength = WacomReadRaw(hTablet, uchBuf, sizeof (uchBuf)); for (i = 0; i < nLength; ++i) { snprintf(chOut, sizeof (chOut), "%02X", uchBuf[i]); //wacscrn_output(nRow,i*3,chOut); } for (i = 0; i < nLength; ++i) { snprintf(chOut, sizeof (chOut), "%c", isprint(uchBuf[i]) ? uchBuf[i] : '.'); //wacscrn_output(nRow,60 + i,chOut); } if ((i = WacomParseData(hTablet, uchBuf, nLength, &state))) { snprintf(chOut, sizeof (chOut), "ParseData: %10d %-40s (%d)", i, strerror(errno), ++nErrors); /*wacscrn_output(23,0,chOut); wacscrn_refresh();*/ //continue; } if (state.uValid & BIT(5)) { int prox = state.values[2].nValue; if (prox == 1) { int X, Y, B; X = state.values[4].nValue; Y = state.values[5].nValue; B = state.values[WACOMFIELD_BUTTONS].nValue & (1 << 5) ? 1 : 0; *lT = delay; *lX = X; *lY = 33440 - Y; *lB = B; valid=1; // printf("valid=%d\n",valid); } } /*int fd = WacomGetFileDescriptor(hTablet); int unused[100]; int imp = read(fd, &unused, 50); if (imp==0) { we_stop = 1; } else { lseek(fd, -imp, SEEK_CUR); } printf("fd=%d,imp=%d,we_stop=%d\n",fd,imp,we_stop);*/ } //printf("j=%d\n",j); return j; }