结构体设置
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宏,则不会再次定义本文件