嵌入式linux input模块-stdin

结构体设置

static T_InputOpr g_tStdinOpr = {
	.name          = "stdin",
	.DeviceInit    = StdinDevInit,
	.DeviceExit    = StdinDevExit,
	.GetInputEvent = StdinGetInputEvent,
};

结构体注册

int StdinInit(void)
{
	return RegisterInputOpr(&g_tStdinOpr);
}

stdin初始化-改变stdin输入方式

常规stdin输入,需要回车才能输入,怎么才能不回车直接接受输入呢,这里需要设置

static int StdinDevInit(void)
{
		//常规stdin输入,需要回车才能输入,怎么才能不回车直接接受输入呢,这里需要设置
    struct termios tTTYState;
 
    //get the terminal state
    tcgetattr(STDIN_FILENO, &tTTYState);
 
    //turn off canonical mode
    tTTYState.c_lflag &= ~ICANON;
    //minimum of number input read.
    tTTYState.c_cc[VMIN] = 1;   

    //set the terminal attributes.
    tcsetattr(STDIN_FILENO, TCSANOW, &tTTYState);

	return 0;
}

恢复stdin初始化-恢复原来的stdin输入方式

关闭(恢复)StdinDevInit对stdin输入的设置

static int StdinDevExit(void)
{
	//关闭(恢复)StdinDevInit对stdin输入的设置
    struct termios tTTYState;
 
    //get the terminal state
    tcgetattr(STDIN_FILENO, &tTTYState);
 
    //turn on canonical mode
    tTTYState.c_lflag |= ICANON;
	
    //set the terminal attributes.
    tcsetattr(STDIN_FILENO, TCSANOW, &tTTYState);	
	return 0;
}

获得stdin输入值(上翻、下翻)

使用非阻塞方式(select,time=0)获取stdin输入数据,进行判断,放入定义好的结构体PT_InputEvent里

static int StdinGetInputEvent(PT_InputEvent ptInputEvent)
{
	/* 如果有数据就读取、处理、返回
	 * 如果没有数据, 立刻返回, 不等待
	 */

	/* select, poll 可以参数 UNIX环境高级编程 */


    struct timeval tTV;
    fd_set tFDs;
	char c;
	
    tTV.tv_sec = 0;
    tTV.tv_usec = 0;
    FD_ZERO(&tFDs);
	
    FD_SET(STDIN_FILENO, &tFDs); //STDIN_FILENO is 0
    
    //select这里time设置为0,不休眠,等有数据就执行
    select(STDIN_FILENO+1, &tFDs, NULL, NULL, &tTV);

	//FD_ISSET判断stdin是否有数据输入
    if (FD_ISSET(STDIN_FILENO, &tFDs))
    {
		/* 处理数据 */
		ptInputEvent->iType = INPUT_TYPE_STDIN;
		gettimeofday(&ptInputEvent->tTime, NULL);
		
		c = fgetc(stdin);
		if (c == 'u')
		{
			ptInputEvent->iVal = INPUT_VALUE_UP;
		}
		else if (c == 'n')
		{
			ptInputEvent->iVal = INPUT_VALUE_DOWN;
		}
		else if (c == 'q')
		{
			ptInputEvent->iVal = INPUT_VALUE_EXIT;
		}
		else
		{
			ptInputEvent->iVal = INPUT_VALUE_UNKNOWN;
		}		
		return 0;
    }
	else
	{
		return -1;
	}
}

扩展

1、input_manager.h里InputEvent结构体定义意义,内核input.h里已经有了intput_event定义输入事件的type\code\value,为什么这里又定义了InputEvent结构体:将intput_event的value取出进行判断是否为上翻和下翻

2、input_manager.h里宏的作用:

#ifndef _INPUT_MANAGER_H
#define _INPUT_MANAGER_H
#endif 
这里宏的作用:防止多次定义声明本文件,如果发现已经定义过_INPUT_MANAGER_H宏,则不会再次定义本文件

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值