软件总框架
输入管理:
读取多个设备的数据
在工程目录input文件夹下增加input_manager.c,完成输入管理器框架
#include "input_manager.h"
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <semaphore.h>
#include <string.h>
static PInputDevice g_InputDevs = NULL;
void RegisterInputDevice(PInputDevice ptInputDev)
{
ptInputDev->ptNext = g_InputDevs;
g_InputDevs = ptInputDev;
}
void InputInit(void)
{
/* register touchscreen */
extern void TouchscreenRegister(void);
TouchscreenRegister();
/* register netinput */
extern void NetInputRegister(void);
NetInputRegister();
}
static void *input_recv_thread_func(void *data)
{
PInputDevice tInputDev = (PInputDevice)data;
InputEvent tEvent;
int ret;
while (1)
{
/* 读数据 */
ret = tInputDev->GetInputEvent(&tEvent);
if (!ret)
{
/* 保存数据 */
/* 唤醒等待数据的线程 */
pthread_mutex_lock(&g_tMutex);
pthread_cond_wait(&g_tConVar, &g_tMutex);
pthread_mutex_unlock(&g_tMutex);
}
}
}
void InputDeviceInit(void)
{
int ret;
pthread_t tid;
/* for each device ,init,pthread_create */
PInputDevice ptTmp = g_InputDevs;
while (ptTmp)
{
ret = ptTmp->DeviceInit();
if (!ret)
{
ret = pthread_create(&tid, NULL, input_recv_thread_func, ptTmp);
}
ptTmp = ptTmp->ptNext;
}
}
int GetInputEvent(PInputEvent ptInputEvent)
{
/* 无数据则休眠 */
/* 返回数据 */
}
总结:
本节完成以下工作
- InputInit():注册各个输入设备,比如触摸屏设备和网络输入设备。
- InputDeviceInit():使用ptTmp->DeviceInit()初始化所有输入设备,使用pthread_create(&tid, NULL, input_recv_thread_func, ptTmp)创建所有输入设备线程。比如初始化创建触摸屏设备和网络输入设备,创建触摸屏设备线程和网络输入设备线程。
- GetInputEvent():上层APP获得输入数据。