linux应用程序_1_文本浏览器_8_输入设备_1_input_manager

本文详细介绍了在Linux环境下,如何设计并实现一个通用的输入管理器。该管理器能够抽象处理不同的输入设备,如串口和触摸屏,通过定义输入结构体和事件结构体,实现设备初始化、事件获取等功能。文章提供了完整的代码示例,包括输入设备注册、事件获取及初始化过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值