Linux 标准输入struct input_event使用示例
来源:互联网 发布:java中的注解怎么用 编辑:程序博客网 时间:2024/06/05 02:19
Input_event使用示例
下面贴出一段代码,该代码完成的功能是循环扫描设备列表,寻找你要打开的设备名,打开后非阻塞式的读取输入设备的输入内容。本设备的输入的设备名为”WCH.CN”,具体的设备名可以使用命令查看input列表里找到你的设备名,这里我也只是获取了按键的按下消息,从这部分消息中获取我的文本内容
#include <stdio.h>#include <stdlib.h>#include <pthread.h>#include <unistd.h>#include <string.h>#include <sys/types.h>#include <fcntl.h>#include <errno.h>#include <time.h>#include <linux/input.h>#define INPUT_NAME "WCH.CN"const char chr_table[129] = {[0] = '\0', [1] = '*', [2] = '1', [3] = '2', [4] = '3', [5] = '4', [6] = '5', [7] = '6', [8] = '7', [9] = '8',[10] = '9',[11] = '0', [12] = '-', [13] = '=', [14] = '\b', [15] = '\t', [16] = 'q', [17] = 'w', [18] = 'e', [19] = 'r',[20] = 't', [21] = 'y', [22] = 'u', [23] = 'i', [24] = 'o', [25] = 'p', [26] = '{', [27] = '}', [28] = '\n', [29] = '*',[30] = 'a', [31] = 's', [32] = 'd', [33] = 'f', [34] = 'g', [35] = 'h', [36] = 'j', [37] = 'k', [38] = 'l', [39] = ':',[40] = '"', [41] = '*', [42] = '*', [43] = '\\',[44] = 'z', [45] = 'x', [46] = 'c', [47] = 'v', [48] = 'b', [49] = 'n', [50] = 'm', [51] = ',', [52] = '.', [53] = '/', [54] = '*', [55] = '*', [56] = '*', [57] = ' ', [58] = '*', [59] = '*', [60] = '*', [61] = '*', [62] = '*', [63] = '*',[64] = '*', [65] = '*', [66] = '*', [67] = '*', [68] = '*', [69] = '*', [70] = '*', [71] = '*', [72] = '*', [73] = '*',[74] = '*', [75] = '*', [76] = '*', [77] = '*', [78] = '*', [79] = '*',[80] = '*', [81] = '*', [82] = '*', [83] = '*', [84] = '*',[85] = '*', [86] = '*', [87] = '*', [88] = '*', [89] = '*', [90] = '*', [91] = '*', [92] = '*', [93] = '*', [94] = '*', [95] = '*', [96] = '*', [97] = '*', [98] = '*', [99] = '*', [100] = '*', [101] = '*', [102] = '*', [103] = '*', [104] = '*', [105] = '*',[106] = '*', [107] = '*', [108] = '*',[109] = '*', [110] = '*',[111] = '*', [112] = '*', [113] = '*', [114] = '*', [115] = '*',[116] = '*', [117] = '*', [118] = '*', 119] = '*', [120] = '*',[121] = '*', [122] = '*', [123] = '*', [124] = '*', [125] = '*', [126] = '*', [127] = '*', [128] = '*'};static int open_input( const char *input_name ){ char name[64]; char buf[128]; int fd, flags; int i = 0; for (i = 0; i < 32; i++) { sprintf(name, "/dev/input/event%d", i ); if( access( name, F_OK ) != 0 ) continue; if ((fd = open(name, O_RDONLY, 0)) >= 0) { ioctl(fd, EVIOCGNAME(sizeof(buf)), buf); printf("name:%s \r\n", buf ); if( strstr( buf, input_name ) == NULL ) { close( fd ); continue; } flags = fcntl(fd,F_GETFL,0); flags |= O_NONBLOCK; if( 0 != fcntl(fd,F_SETFL,flags) ) printf("fcntl failed!:%s \r\n", strerror( errno )); printf("open for device:%s \r\n", name ); return fd; } } return -1;}static int input_ready( int fd, int tout ){ fd_set rfd_set; struct timeval tv, *ptv; int nsel; FD_ZERO( &rfd_set ); FD_SET( fd, &rfd_set ); if ( tout == -1 ) { ptv = NULL; } else { tv.tv_sec = 0; tv.tv_usec = tout * 1000; ptv = &tv; } nsel = select( fd+1, &rfd_set, NULL, NULL, ptv ); if ( nsel > 0 && FD_ISSET( fd, &rfd_set ) ) return 1; return 0;}static int read_input( int fd, char *buf , int maxsize ){ struct input_event event; int rc; int n = 0; char *ptr = buf; char ch; int index; int last_key; do{ if( (rc = read(fd, &event, sizeof(event))) < 0) return -1; if( event.type == EV_KEY && event.value == 1 ) { index = event.code & 0xff; if( index == 42 ) { last_key = 42; continue; } if( index < 128 ) { ch = chr_table[index]; if( ch != 0 && ch != '*' ) { // shift key then a -> 'A' if( last_key == 42 ) *ptr++ = ch - ( 'a' - 'A' ); else *ptr++ = ch; last_key = 0; n++; } } } }while( input_ready( fd, 200 ) > 0 && n < maxsize ); *ptr = '\0'; return n;}int main( int argc, char *argv[] ){ int fd = -1; int bRun = 1; char buffer[256]; int len; while( bRun ) { if( fd < 0 ) { //try to open input dev fd = open_input( INPUT_NAME ); if( fd < 0 ) { printf("无输入设备可打开!\r\n"); sleep( 10 ); continue; } printf("设备打开成功,开始接收数据...\r\n"); } if( input_ready( fd, 200 ) > 0 ) { len = read_input( fd, buffer, sizeof( buffer )); if( len < 0 ) { printf("设备已断开!,关闭!\r\n"); fd = -1; continue; } } printf("READ:%s \r\n", buffer); }}
下面附上struct input_event结构的使用代码
/* * Copyright 2002 Red Hat Inc., Durham, North Carolina. * * All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation on the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice (including the * next paragraph) shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NON-INFRINGEMENT. IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * * This is a simple test program that reads from /dev/input/event*, * decoding events into a human readable form. */ /* * Authors: * Rickard E. (Rik) Faith <faith@redhat.com> * */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <fcntl.h> #include <errno.h> #include <time.h> #include <linux/input.h> struct input_event event; int main(int argc, char **argv) { char name[64]; /* RATS: Use ok, but could be better */ char buf[256] = { 0, }; /* RATS: Use ok */ unsigned char mask[EV_MAX/8 + 1]; /* RATS: Use ok */ int version; int fd = 0; int rc; int i, j; char *tmp; #define test_bit(bit) (mask[(bit)/8] & (1 << ((bit)%8))) for (i = 0; i < 32; i++) { sprintf(name, "/dev/input/event%d", i); if ((fd = open(name, O_RDONLY, 0)) >= 0) { ioctl(fd, EVIOCGVERSION, &version); ioctl(fd, EVIOCGNAME(sizeof(buf)), buf); ioctl(fd, EVIOCGBIT(0, sizeof(mask)), mask); printf("%s\n", name); printf(" evdev version: %d.%d.%d\n", version >> 16, (version >> 8) & 0xff, version & 0xff); printf(" name: %s\n", buf); printf(" features:"); for (j = 0; j < EV_MAX; j++) { if (test_bit(j)) { const char *type = "unknown"; switch(j) { case EV_KEY: type = "keys/buttons"; break; case EV_REL: type = "relative"; break; case EV_ABS: type = "absolute"; break; case EV_MSC: type = "reserved"; break; case EV_LED: type = "leds"; break; case EV_SND: type = "sound"; break; case EV_REP: type = "repeat"; break; case EV_FF: type = "feedback"; break; } printf(" %s", type); } } printf("\n"); close(fd); } } if (argc > 1) { sprintf(name, "/dev/input/event%d", atoi(argv[1])); if ((fd = open(name, O_RDWR, 0)) >= 0) { printf("%s: open, fd = %d\n", name, fd); for (i = 0; i < LED_MAX; i++) { event.time.tv_sec = time(0); event.time.tv_usec = 0; event.type = EV_LED; event.code = i; event.value = 0; write(fd, &event, sizeof(event)); } while ((rc = read(fd, &event, sizeof(event))) > 0) { printf("%-24.24s.%06lu type 0x%04x; code 0x%04x;" " value 0x%08x; ", ctime(&event.time.tv_sec), event.time.tv_usec, event.type, event.code, event.value); switch (event.type) { case EV_KEY: if (event.code > BTN_MISC) { printf("Button %d %s", event.code & 0xff, event.value ? "press" : "release"); } else { printf("Key %d (0x%x) %s", event.code & 0xff, event.code & 0xff, event.value ? "press" : "release"); } break; case EV_REL: switch (event.code) { case REL_X: tmp = "X"; break; case REL_Y: tmp = "Y"; break; case REL_HWHEEL: tmp = "HWHEEL"; break; case REL_DIAL: tmp = "DIAL"; break; case REL_WHEEL: tmp = "WHEEL"; break; case REL_MISC: tmp = "MISC"; break; default: tmp = "UNKNOWN"; break; } printf("Relative %s %d", tmp, event.value); break; case EV_ABS: switch (event.code) { case ABS_X: tmp = "X"; break; case ABS_Y: tmp = "Y"; break; case ABS_Z: tmp = "Z"; break; case ABS_RX: tmp = "RX"; break; case ABS_RY: tmp = "RY"; break; case ABS_RZ: tmp = "RZ"; break; case ABS_THROTTLE: tmp = "THROTTLE"; break; case ABS_RUDDER: tmp = "RUDDER"; break; case ABS_WHEEL: tmp = "WHEEL"; break; case ABS_GAS: tmp = "GAS"; break; case ABS_BRAKE: tmp = "BRAKE"; break; case ABS_HAT0X: tmp = "HAT0X"; break; case ABS_HAT0Y: tmp = "HAT0Y"; break; case ABS_HAT1X: tmp = "HAT1X"; break; case ABS_HAT1Y: tmp = "HAT1Y"; break; case ABS_HAT2X: tmp = "HAT2X"; break; case ABS_HAT2Y: tmp = "HAT2Y"; break; case ABS_HAT3X: tmp = "HAT3X"; break; case ABS_HAT3Y: tmp = "HAT3Y"; break; case ABS_PRESSURE: tmp = "PRESSURE"; break; case ABS_DISTANCE: tmp = "DISTANCE"; break; case ABS_TILT_X: tmp = "TILT_X"; break; case ABS_TILT_Y: tmp = "TILT_Y"; break; case ABS_MISC: tmp = "MISC"; break; default: tmp = "UNKNOWN"; break; } printf("Absolute %s %d", tmp, event.value); break; case EV_MSC: printf("Misc"); break; case EV_LED: printf("Led"); break; case EV_SND: printf("Snd"); break; case EV_REP: printf("Rep"); break; case EV_FF: printf("FF"); break; break; } printf("\n"); } printf("rc = %d, (%s)\n", rc, strerror(errno)); close(fd); } } return 0; }
阅读全文
0 0
- Linux 标准输入struct input_event使用示例
- struct input_event
- struct input_event
- struct input_event
- struct input_event
- struct input_event
- linux struct input_event结构体详解
- struct input_event详解
- Linux/Android——输入子系统input_event传递 (二)
- Linux/Android——输入子系统input_event传递 (二)
- Linux/Android——输入子系统input_event传递 (二)
- Linux/Android——输入子系统input_event传递 (二)
- struct input_event结构体定义
- linux键盘input_event浅析
- linux标准库红黑树的使用示例
- input_event
- linux驱动由浅入深系列:输入子系统之三(应用层模拟input_event)
- Linux标准输入、输出
- 网页 视频作为背景(解决google浏览器无法访问本地资源的问题)
- Android三级目录、ListView单选/GridView单选、ListView多选/GridView多选
- android studio导入eclipse项目报错 Error: Some file crunching failed, see logs for details
- sql语句中含有特殊字符的处理方式
- 安卓主线程启动无线循环但是不阻塞的问题
- Linux 标准输入struct input_event使用示例
- java 通过JDBC连接hive
- ES插件
- 你真的了解面试问题的意义吗?-java面试基础篇(1)-jvm
- 欢迎使用CSDN-markdown编辑器
- 数据结构 -- 栈ADT
- HDU 5884 Sort (二分 贪心(k叉哈夫曼树))
- 给自己一个两年
- C# GDI+ 绘图