智能家居之按键输入(1)

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) {  //如果写入指针等于读指针,则缓冲区为空
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值