捡到h3开发板,做了个视频小车(二),御游追风plus做遥控器

一、前言:现在需要做一个遥控器,来遥控小车。因为之前有买过 30RMB的 御游追风plus手柄,所以打算拿它来试试。

将它插上天嵌h3仅有的一个USB口,发现/dev/input/event0有补枚举出来,来看看输出是什么样子的:

xxd /dev/input/event0

16字节,和usb键盘是一样的。

二:手动检测所有按键,于是得到如下键码图:

三、写了一个程序来检测对不对,要求按下按键就可以输出对应的按键和状态。

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>



#define TYPE_KEY	0X1
#define TYPE_MISC	0X4
#define TYPE_MOVE	0X3

#define CODE_KEY_X	0x134
#define CODE_KEY_B	0x130
#define CODE_KEY_A	0x131
#define CODE_KEY_Y	0x133

#define CODE_KEY_UP_DOWN	0x11
#define CODE_KEY_LEFT_RIGHT	0x10

#define CODE_KEY_L	0x136
#define CODE_KEY_R	0x137
#define CODE_KEY_ZL	0x138
#define CODE_KEY_ZR	0x139
#define CODE_KEY_VOL_DEC	0x13A //音量减
#define CODE_KEY_VOL_INC	0x13B //音量加
#define CODE_KEY_HOME	0xAC


#define CODE_MOVE_LEFT_X	0x0
#define CODE_MOVE_LEFT_Y	0x1
#define CODE_MOVE_RIGHT_X	0x2
#define CODE_MOVE_RIGHT_Y	0x5


//小端存储,交换 short 顺序。
struct yuyou_plus{
	//unsigned short timestamp1;
	unsigned short timestamp1;
	unsigned short timestamp2;
	unsigned short timestamp3;
	unsigned short timestamp4;
	unsigned short type;
	unsigned short code;
	unsigned short value1;
	unsigned short value2;
};



int main(int argc, char *argv[])
{
    struct yuyou_plus in_ev = {0};
    int fd = -1;
    unsigned char type	= 0;
    unsigned char code	= 0;
    unsigned short val	= 0;

    /* 校验传参 */
    if (2 != argc) {
        fprintf(stderr, "usage: %s <input-dev>\n", argv[0]);
        exit(-1);
    }

    /* 打开文件 */
    if (0 > (fd = open(argv[1], O_RDONLY))) {
        perror("open error");
        exit(-1);
    }

    for ( ; ; ) {

        /* 循环读取数据 */
        
	//printf ("\nstruct size:%d\n", sizeof(struct yuyou_plus) );
	//int i = read(fd, &in_ev, sizeof(struct yuyou_plus));
	//int i = read(fd, &in_ev, 16);
	//printf ("\n read size:%d \n", i);

	if (16 != read(fd, &in_ev, 16)) {
		perror("read error");
		exit(-1);
	}


	switch(in_ev.type){
		case TYPE_KEY:{      
        		//printf("type:KEY code:%x value:%d\n",  in_ev.code, in_ev.value1);
				switch(in_ev.code){
					case CODE_KEY_X:{if(in_ev.value1){printf("KEY X pressdown\n");}else{printf("KEY X pressup\n");}}break;
					case CODE_KEY_B:{if(in_ev.value1){printf("KEY B pressdown\n");}else{printf("KEY B pressup\n");}}break;
					case CODE_KEY_Y:{if(in_ev.value1){printf("KEY Y pressdown\n");}else{printf("KEY Y pressup\n");}}break;
					case CODE_KEY_A:{if(in_ev.value1){printf("KEY A pressdown\n");}else{printf("KEY A pressup\n");}}break;

					case CODE_KEY_ZL:{if(in_ev.value1){printf("KEY ZL pressdown\n");}else{printf("KEY ZL pressup\n");}}break;
					case CODE_KEY_ZR:{if(in_ev.value1){printf("KEY ZR pressdown\n");}else{printf("KEY ZR pressup\n");}}break;
					case CODE_KEY_L:{if(in_ev.value1){printf("KEY L pressdown\n");}else{printf("KEY L pressup\n");}}break;
					case CODE_KEY_R:{if(in_ev.value1){printf("KEY R pressdown\n");}else{printf("KEY R pressup\n");}}break;

					case CODE_KEY_VOL_DEC:{if(in_ev.value1){printf("KEY VOLUME DEC pressdown\n");}else{printf("KEY VOLUME DEC pressup\n");}}break;
					case CODE_KEY_VOL_INC:{if(in_ev.value1){printf("KEY VOLUME INC pressdown\n");}else{printf("KEY VOLUME INC pressup\n");}}break;
					case CODE_KEY_HOME:{if(in_ev.value1){printf("KEY HOME pressdown\n");}else{printf("KEY HOME pressup\n");}}break;
					

					default:{}break;
				}
		}break;
		case TYPE_MISC:{
        		//printf("type:MISC code:%d value:%d\n", in_ev.type, in_ev.code, in_ev.value);
		}break;
		case TYPE_MOVE:{
        		//printf("type:MOVE code:%x value:%d\n", in_ev.code, in_ev.value1);
				switch(in_ev.code){
					case CODE_MOVE_LEFT_X: {printf("MOVE LEFT  X (val:%d)\n", in_ev.value1);}break;
					case CODE_MOVE_LEFT_Y: {printf("MOVE LEFT  Y (val:%d)\n", in_ev.value1);}break;
					case CODE_MOVE_RIGHT_X:{printf("MOVE RIGHT X (val:%d)\n", in_ev.value1);}break;
					case CODE_MOVE_RIGHT_Y:{printf("MOVE RIGHT Y (val:%d)\n", in_ev.value1);}break;

					case CODE_KEY_UP_DOWN:{
						static int flag_up_down = 0; // 0: none  1: up  2: down
						if(0xffff==in_ev.value1){
							flag_up_down = 1;
							printf("KEY DIR UP pressdown\n");
						}else if(1==in_ev.value1){
							flag_up_down = 2;
							printf("KEY DIR DOWN pressdown\n");
						}else if(0==in_ev.value1){
							if(1==flag_up_down){
								printf("KEY DIR UP pressup\n");
							}else if(2==flag_up_down){
								printf("KEY DIR DOWN pressup\n");
							}
							flag_up_down = 0;
						}
					}break;
					case CODE_KEY_LEFT_RIGHT:{
						static int flag_left_right = 0; // 0: none  1: left  2: right
						if(0xffff==in_ev.value1){
							flag_left_right = 1;
							printf("KEY DIR LEFT pressdown\n");
						}else if(1==in_ev.value1){
							flag_left_right = 2;
							printf("KEY DIR RIGHT pressdown\n");
						}else if(0==in_ev.value1){
							if(1==flag_left_right){
								printf("KEY DIR LEFT pressup\n");
							}else if(2==flag_left_right){
								printf("KEY DIR RIGHT pressup\n");
							}
							flag_left_right	= 0;
						}
					}break;
					default:{}break;
				}
		}break;
		default:{
			printf("type:%x\n", in_ev.type);	
		}break;
	}
    }
}

四、使用方式:

1、h3开发板上编译:

gcc read_input.c

2、运行:

./a.out /dev/input/event0

五、实际效果:

相关推荐
zhanlang021711 小时前
HTML 零基础入门到企业实战【第五章 5.4】内嵌网页 iframe 标签:嵌入网页、视频、地图实战
前端·html·音视频
TengTaiTech11 小时前
头戴耳机做运动相机外接麦:一颗麦克风同时服务蓝牙通话与 3.5mm 录音的底层重构
数码相机·音视频·蓝牙·qcc
2301_790355971 天前
【技术拆解】短视频配音自动化流程:从文案预处理到 SRT 字幕的 9 个环节
自然语言处理·音视频
大飞哥软件自习室1 天前
视频批量截图并自动拼图是怎么做的:从四步向导、三种截帧模式到等距抽样与日志兜底的实现拆解,附 FFmpeg 调用与线程模型说明
ffmpeg·音视频·批量截图
Black蜡笔小新2 天前
消防控制室/配电房/中控室...视频汇聚平台EasyCVR岗位AI智能监测方案守住关键岗位
大数据·音视频·easycvr
FlightYe3 天前
音视频修炼之容器与协议(四):RTSP详解
android·linux·ffmpeg·音视频·dash
乐橙开放平台3 天前
海康和大华摄像头能统一管理吗?可以通过 GB28181 或视频融合平台接入
网络·后端·物联网·音视频
Mirawork3 天前
Mirawork v0.32.0 更新体验:会话引用、任务分享与音频转写怎么用
人工智能·音视频
熬夜磕代码丶4 天前
RN鸿蒙空间音频实战
华为·音视频·harmonyos
一条破秋裤6 天前
【V4L2采集视频】
音视频