freertos开发空气检测仪之输入子系统结构体设计

freertos开发空气检测仪之输入子系统结构体设计

本篇文章带来本篇带来空气检测仪项目之输入子系统结构体设计。

在这个项目中,有使用一个按键,仿照高手代码进行编程,抽象对应的结构体如下

input_system.h

复制代码
#ifndef __INPUT_SYSTEM_H
#define __INPUT_SYSTEM_H

#ifndef NULL
#define NULL (void *)0
#endif

#define TIME_T int
#define INPUT_BUF_LEN 20

/* 事件类型 */
typedef enum
{
	INPUT_EVENT_TYPE_KEY,
	INPUT_EVENT_TYPE_TOUCH,
	INPUT_EVENT_TYPE_NET,
	INPUT_EVENT_TYPE_STDIO
} INPUT_EVENT_TYPE;

/* 按键状态*/
typedef enum
{
	KEY_STATE_PRESSED,		 /* 按下 */
	KEY_STATE_RELEASED,		 /* 弹起 */
	KEY_STATE_LONG_PRESS,	 /* 长按 */
	KEY_STATE_LONG_RELEASED, /* 长按弹起 */
	KEY_STATE_REPEAT,		 /* 长按连发 */
	KEY_STATE_DOUBLE_CLICK,	 /* 双击 */
	KEY_STATE_MULTI_CLICK	 /* 多击 */
} KEY_STATE;

/* 输入事件结构体扩展 */
typedef struct InputEvent {

    TIME_T time;                /* 事件时间戳 */
    INPUT_EVENT_TYPE eType;     /* 事件类型 */
    
    /* 通用事件数据 */
    union {
        /* 按键事件数据 */
        struct {
            int iKey;           /* 按键代码 */
            KEY_STATE eState;   /* 按键状态 */
            int iDuration;      /* 持续时间(ms),用于长按判断 */
            int iClickCount;    /* 点击次数,用于多击判断 */
        } key;
        
        /* 触摸事件数据 */
        struct {
            int iX;
            int iY;
            int iPressure;
        } touch;
        
        /* 网络事件数据 */
        struct {
            int iEventCode;
            char strData[INPUT_BUF_LEN];
        } net;
        
        /* 标准输入事件数据 */
        struct {
            char strInput[INPUT_BUF_LEN];
        } stdio;
    } data;
    
} InputEvent, *PInputEvent;


typedef struct InputDevice
{
	char *name;
	int (*GetInputEvent)(PInputEvent ptInputEvent);
	int (*DeviceInit)(void);
	int (*DeviceExit)(void);
	struct InputDevice *pNext;
} InputDevice, *PInputDevice;

/**********************************************************************
 * 函数名称: AddInputDevices
 * 功能描述: 注册多个输入设备
 * 输入参数: 无
 * 输出参数: 无
 * 返 回 值: 无
 ***********************************************************************/
void AddInputDevices(void);

/**********************************************************************
 * 函数名称: InitInputDevices
 * 功能描述: 初始化所有的输入设备
 * 输入参数: 无
 * 输出参数: 无
 * 返 回 值: 无
 ***********************************************************************/
void InitInputDevices(void);

/**********************************************************************
 * 函数名称: InputDeviceRegister
 * 功能描述: 注册一个输入设备
 * 输入参数: ptInputDevice-输入设备
 * 输出参数: 无
 * 返 回 值: 无
 ***********************************************************************/
void InputDeviceRegister(PInputDevice ptInputDevice);

#endif /* __INPUT_SYSTEM_H */

使用共用体设计

在上述的代码片段中,使用了union共用体进行设计,主要原因是节省内存空间,

输入事件在某个时刻只能是一种类型: 不可能同时是按键事件和触摸事件

不可能同时是网络事件和标准输入事件 这种互斥性非常适合使用共用体,因为同一时间只需要存储一种事件的数据。

总结

本篇文件设计了对应的输入事件设计,进行代码的规划整合,下一篇文章将带来InputEvent的按键示例。

本文完!!

参考网络博文

Linux struct input_event如何区分并解析鼠标键盘触摸屏事件-开发者社区-阿里云

相关推荐
余俊晖9 小时前
多模态大模型后训练强化学习训练方法:Shuffle-R1
人工智能·自然语言处理·多模态
没有医保李先生9 小时前
esp32和stm32的工程宏定义
stm32·单片机·嵌入式硬件
黄焖鸡能干四碗9 小时前
网络安全建设实施方案(Word文件参考下载)
大数据·网络·人工智能·安全·web安全·制造
2301_819414309 小时前
C++与区块链智能合约
开发语言·c++·算法
Zaly.10 小时前
【Python刷题】LeetCode 1727 重新排列后的最大子矩阵
算法·leetcode·矩阵
未来之窗软件服务10 小时前
为何模型越强、幻觉越大、工业越弱[AI人工智能(六十二)]—东方仙盟
人工智能·仙盟创梦ide·东方仙盟
不想看见40410 小时前
Valid Parentheses栈和队列--力扣101算法题解笔记
开发语言·数据结构·c++
炸膛坦客10 小时前
单片机/C/C++八股:(十五)内存对齐、结构体内存对齐
c语言·开发语言·单片机
做怪小疯子10 小时前
蚂蚁暑期 319 笔试
算法·职场和发展
云上的云端10 小时前
vLLM-Ascend operator torchvision::nms does not exist 问题解决
人工智能·pytorch·深度学习