linux应用程序_1_文本浏览器_8_输入设备_1_input_manager
前面使用的都是串口输入,接下来几篇文章,会抽象出一个输入结构体,并且添加触摸屏输入
本篇先抽象出输入结构体,并完善抽象操作
抽象输入结构体依据:
1、名字
2、输入设备的初始化(打开设备等)、退出(标准输入的方式切换等)
3、获得事件接口
4、链表
typedef struct InputOpr{
char *pcName;
int (*InputInit)(void);
int (*InputExit)(void);
int (*InputGetEvent)(PT_InputEventOpr ptInputEventOpr);
struct InputOpr *ptNext;
}T_InputOpr, *PT_InputOpr;
输入结构体需要获得事件,需要构造出一个事件结构体,依据:
1、输入类型(区别不同输入设备)
2、事件发生时间
3、具体事件(决定事件的动作)
typedef struct InputEvent{
struct timeval tTime;
unsigned int iType;
unsigned int iVal;
}T_InputEventOpr, *PT_InputEventOpr;
抽象操作同其他的manager文件类似,注册、获取结构体、初始化函数等
完整代码
input_manager.h
#ifndef __INPUT_MANAGER_H
#define __INPUT_MANAGER_H
#define INPUT_TYPE_STDIN 0
#define INPUT_TYPE_TS 1
#define INPUT_VAL_PRE 0
#define INPUT_VAL_NEXT 1
#define INPUT_VAL_EXIT 3
#define INPUT_VAL_UNKNOWN -1
#include <sys/time.h>
typedef struct InputEvent{
struct timeval tTime;
unsigned int iType;
unsigned int iVal;
}T_InputEventOpr, *PT_InputEventOpr;
typedef struct InputOpr{
char *pcName;
int (*InputInit)(void);
int (*InputExit)(void);
int (*InputGetEvent)(PT_InputEventOpr ptInputEventOpr);
struct InputOpr *ptNext;
}T_InputOpr, *PT_InputOpr;
int RegisterInputOpr(PT_InputOpr ptInputOpr);
void ShowInputOpr(void);
int GetInputEvent(PT_InputEventOpr ptInputEventOpr);
int ReallyInputInit(void);
int StdinInit(void);
int TsInit(void);
int InputInit(void);
#endif
input_manager.c
#include <input_manager.h>
#include <config.h>
static PT_InputOpr g_ptInputOpr;
int RegisterInputOpr(PT_InputOpr ptInputOpr)
{
PT_InputOpr ptTmp;
if(!g_ptInputOpr)
{
g_ptInputOpr = ptInputOpr;
DBG_PRINT("Register%s\r\n",g_ptInputOpr->pcName);
return 0;
}
ptTmp = g_ptInputOpr;
while(ptTmp->ptNext)
{
ptTmp = ptTmp->ptNext;
}
ptTmp->ptNext = ptInputOpr;
DBG_PRINT("Register%s \r\n",ptTmp->ptNext->pcName);
return 0;
}
int GetInputEvent(PT_InputEventOpr ptInputEventOpr)
{
int iError = 1;
PT_InputOpr ptTmp = g_ptInputOpr;
while(ptTmp)
{
if(ptTmp->InputGetEvent)
{
iError &= ptTmp->InputGetEvent(ptInputEventOpr);
if(!iError)
return 0;
}
ptTmp = ptTmp->ptNext;
}
return -1;
}
int InputInit()
{
int iError = 1;
iError = StdinInit();
#ifndef ONPC
iError &= TsInit();
#endif
return iError;
}
void ShowInputOpr(void)
{
PT_InputOpr ptTmp;
int iCnt = 0;
ptTmp = g_ptInputOpr;
printf("\r\nsupport input\r\n");
while(ptTmp)
{
printf("%d : %s\r\n", ++iCnt, ptTmp->pcName);
ptTmp = ptTmp->ptNext;
}
}
int ReallyInputInit(void)
{
int iError = 1;
PT_InputOpr ptTmp = g_ptInputOpr;
while(ptTmp)
{
if(ptTmp->InputInit)
iError &= ptTmp->InputInit();
ptTmp = ptTmp->ptNext;
}
return iError;
}