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如何区分并解析鼠标键盘触摸屏事件-开发者社区-阿里云

相关推荐
颜酱1 分钟前
05 | 召回前置准备:根据业务数据库生成各数据库(读取配置阶段)
前端·人工智能·后端
Infedium19 分钟前
英特物理AI仿真赋能制造!打破传统有限元瓶颈,研发提效降本翻倍
人工智能·制造
天国梦30 分钟前
2026英语教学系统选型实战:AI如何让备课效率提升42%?天学网技术落地全解析
人工智能·学习
code bean1 小时前
【C#】 `Channel<T>` 深度解析:生产者-消费者模式的现代解法
数据结构·c#
hqyjzsb1 小时前
AI证书和传统证书有什么区别?
人工智能·金融·数据挖掘·数据分析·aigc·创业创新·学习方法
阿里云大数据AI技术1 小时前
阿里云 Elasticsearch 9.4 Agent Builder 实战
人工智能·elasticsearch·agent
用户7783366132111 小时前
serpbase + Cloudflare R2 边缘持久化实战
前端·人工智能
东方小月1 小时前
从零开发一个 Coding Agent(三):EventStream 事件流通道设计与实现
前端·人工智能·后端
中微极客1 小时前
降维算法75倍加速:从PCA到稀疏字典学习的工程实践
人工智能·学习·算法
代码青铜1 小时前
三步给 Codex 接上一个真正的后端:无需写代码,让 AI 自动搭建完整应用
人工智能