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

📄 onetouch_control.c

📁 基于linux的串口声波屏驱动
💻 C
字号:
++/* * Trivial control program to get information and turn the device off/onn */#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <X11/Xlib.h>#include <X11/Xproto.h>#include <X11/extensions/XI.h>#include <X11/extensions/XInput.h>#include "onetouch.h"char *prgname;static int devinfo(Display *disp, int arg){    XExtensionVersion *ext;    XDeviceInfo *info;    int infolen, i;    ext = XGetExtensionVersion(disp, INAME);    printf("%s: %s", INAME, ext->present ? "Present" : "Absent");    if (ext->present)	printf(" (version %i.%i)", ext->major_version, ext->minor_version);    printf("\n");    XFree(ext);    info = XListInputDevices(disp, &infolen);    for (i=0; i<infolen; i++) {	printf("Device %s (id %i): %i classes, use is %s\n",	       info[i].name, (int)(info[i].id),	       info[i].num_classes,	       info[i].use == IsXKeyboard ? "keyboard" :	       (info[i].use == IsXPointer ? "pointer" :		(info[i].use == IsXExtensionDevice ? "extension" :		 "unknown")));    }    XFreeDeviceList(info);    return 0;}static int finddevice(Display *disp){    XDeviceInfo *info;    int infolen, i;    info = XListInputDevices(disp, &infolen);    for (i=0; i<infolen; i++) {	if (info[i].use != IsXExtensionDevice)	    continue;	if (strstr(info[i].name, "touch"))	    break;	if (strstr(info[i].name, "Touch"))	    break;    }    if (i == infolen)	i = -1 /* not found */;    else	i = info[i].id;    /* XFreeDeviceList(info); */    return i;}/* another helper */XLedFeedbackControl *findleds(Display *disp, int id, XDevice *dev,			      XFeedbackState **stateptrptr){    XFeedbackState *list, *ptr;    int nfb, i;        list = XGetFeedbackControl(disp, dev, &nfb);    if (!list) return NULL;    for (ptr = list, i = 0; i<nfb; i++) {	if (ptr->class == LedFeedbackClass) {	    /* let's assume there's only one */	    *stateptrptr = list;	    return (XLedFeedbackControl *)ptr;	}	ptr = (XFeedbackState *)((unsigned long)ptr + ptr->length);    }    return NULL;}/* get led status */static int getleds(Display *disp, int arg){    XDevice *dev;    int id = finddevice(disp);    XFeedbackState *list;    XLedFeedbackControl *leds;    if (id < 0) {	fprintf(stderr, "%s: can't find a touch screen\n", prgname);	return 1;    }    dev = XOpenDevice(disp, id);    leds = findleds(disp, id, dev, &list);    if (!leds) {	fprintf(stderr, "%s: can't find feedback or can't find leds\n",		prgname);	return 1;    }    printf("leds: 0x%04x (mask 0x%04x)\n", leds->led_values, leds->led_mask);    XFreeFeedbackList(list);    return 0;}/* light the led and return */static int doled(Display *disp, int arg){    XDevice *dev;    int id = finddevice(disp);    XFeedbackState *list;    XLedFeedbackControl *leds;    if (id < 0) {	fprintf(stderr, "%s: can't find a touch screen\n", prgname);	return 1;    }    dev = XOpenDevice(disp, id);    leds = findleds(disp, id, dev, &list);    if (!leds) {	fprintf(stderr, "%s: can't find feedback or can't find leds\n",		prgname);	return 1;    }    leds->led_values = arg;    leds->led_mask = ~0;    XChangeFeedbackControl(disp, dev, DvLed,			   (XFeedbackControl *)leds);    XFreeFeedbackList(list);    return 0;}/* light the led and wait for it to get cleared */int doledwait(Display *disp, int arg){    XDevice *dev;    int retval, id = finddevice(disp);    XFeedbackState *list;    XLedFeedbackControl *leds;    if (id < 0) {	fprintf(stderr, "%s: can't find a touch screen\n", prgname);	return 1;    }    dev = XOpenDevice(disp, id);    retval = doled(disp, arg);    if (retval) return retval;    while (1) {	usleep(200 * 1000);	leds = findleds(disp, id, dev, &list);	if (!leds) {	    fprintf(stderr, "%s: can't find feedback or can't find leds\n",		    prgname);	    return 1;	}	if ( !(leds->led_values & leds->led_mask & arg))		    break;	XFreeFeedbackList(list);    }    return 0;}struct commands {    char *name;    int (*f)(Display *disp, int arg);    int arg;} commands[] = {    {"devinfo",   devinfo,     0},    {"getleds",   getleds,     0},    {"on",        doled,       OTLED_RECALIBRATE},    {"off",       doled,       OTLED_OFF},    {"raw",       doled,       OTLED_UNCALIBRATE},    {"b1",        doled,       OTLED_BUTTON1},    {"b2",        doled,       OTLED_BUTTON2},    {"b3",        doled,       OTLED_BUTTON3},    {"b2once",    doledwait,   OTLED_BUTTON2ONCE},    {"b3once",    doledwait,   OTLED_BUTTON3ONCE},    {NULL,}};int main (int argc, char **argv){    Display *disp;    struct commands *cmd;    int retval = 0;    if (argc != 2) {	fprintf(stderr, "%s: Use \"%s <cmd>\"\n", argv[0], argv[0]);	fprintf(stderr, "   cmds:");	for (cmd = commands; cmd->name; cmd++)	    fprintf(stderr, " %s%c", cmd->name, cmd[1].name ? ',' : '.');	fprintf(stderr, "\n");	exit(1);    }    prgname = argv[0];    /* Open display, once for all */    disp = XOpenDisplay(NULL);    if (!disp) {	fprintf(stderr, "%s: can't open display\n", argv[0]);	exit(1);    }    for (cmd = commands; cmd->name; cmd++)	if (!strcmp(argv[1], cmd->name)) {	    retval =  cmd->f(disp, cmd->arg);	    break;	}    XCloseDisplay(disp);    if (!cmd->name)	return main(1, argv); /* recycle the error message */    return retval;}

⌨️ 快捷键说明

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