1.1 输入子系统
1.输入子系统的设备相关
输入子系统包含多种输入设备:按键、网络、触摸屏、等等外设
枚举变量列举设备类型 typedef enmu { INPUT_EVENT_TYPE_KEY, INPUT_EVENT_TYPE_TOUCH, ......\\等等 }INPUT_EVENT_TYPE;
输入设备抽象
typedef struct InputEvent{ INPUT_EVENT_TYPE type; //输入事件类型 按键 触摸 网络 标准输入 TIME_T time; //记录发生输入事件的时间 tick数量 conut++ int ix; //针对触摸屏幕的x坐标 int iy; //针对触摸屏幕的y坐标 int ikey; //针对按键的按键码 char str[INPUT_BUF_LEN];//针对网络输入的字符串 int iPressure; //针对触摸屏的压力值 }InputEvent, *PInputEvent;
统一输入事件设备操作结构体:
//输入事件抽象 typedef struct InputDevice{ char *name; //设备名字 int GetInputEvent(PInputEvent pInputEvent); //获取输入事件 int DeviceInit(); //设备初始化 int DeviceUninit(); //设备反初始化 相当于exit() struct InputDevice *pNext; //链表 “挂载多个设备” }InputDevice, *PInputDevice;
2:输入子系统的数据相关
1.为了防止输入设备的数据输入读取不及时导致的数据丢失现象,我们应该构造应该环形缓冲区来保存数据
2.对于裸机:由中断解析数据放入环形缓冲区
对于OS:由任务解析数据放入环形缓冲区
3.业务系统从环形缓冲区中读取数据
3:实现环形缓冲区
环形缓冲区三要素:读位置 写位置 缓冲区大小
//定义环形buffer 环形缓冲区实际上是多个连续的结构体数组 每个结构体数组的大小是InputEvent结构体的大小 typedef struct { InputEvent Buffer[10]; //可用宏定义 volatile unsigned int pW; //写指针 volatile unsigned int rW; //读指针 /指针类型volatile定义表示不可轻易变化 无符号整型 }InputEventBuffer; //写buffer int PutInputEvent(InputEventBuffer *pInputEventBuffer, InputEvent *pInputEvent) { int i =(pInputEventBuffer->pW + 1) % BUFFER_SIZE; //计算下一个写入位置的索引 //判断环形缓冲区是否已满,如果已满则返回-1 if (i == pInputEventBuffer->pR) { //如果下一个写入位置等于读指针,则缓冲区已满 return -1; } //将输入事件复制到环形缓冲区的下一个写入位置 pInputEventBuffer->Buffer[pInputEventBuffer->pW] = *pInputEvent; //更新环形缓冲区的写入指针 pInputEventBuffer->pW = i; return 0; } //读buffer //读环形buffer 读环形buffer的函数,需要传入一个环形缓冲区的指针和一个输出参数,用于存储读取的输入事件。 输出参数用全局变量g_inputbuffer来存储读取的输入事件? int GetInputEvent(InputEventBuffer *pInputEventBuffer, InputEvent *ptInputEvent) { /* 防御式编程 */ if (!ptInputEvent) return -1; //判断环形缓冲区是否为空,如果为空则返回-1 if (pInputEventBuffer->pW == pInputEventBuffer->pR) { //如果写入指针等于读指针,则缓冲区为空