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 小时前
从入门到辞职|从ChatGPT到OpenClaw,跟上智能时代的进化
前端·人工智能·后端
可观测性用观测云1 小时前
可观测性 4.0:教系统如何思考
人工智能
sunny8651 小时前
Claude Code 跨会话上下文恢复:从 8 次纠正到 0 次的工程实践
人工智能·开源·github
小笼包包仔2 小时前
OpenClaw 多Agent软件开发最佳实践指南
人工智能
smallyoung2 小时前
AgenticRAG:智能体驱动的检索增强生成
人工智能
_skyming_2 小时前
OpenCode 如何做到结果不做自动质量评估,为什么结果还不错?
人工智能
HXhlx2 小时前
CART决策树基本原理
算法·机器学习
南山安2 小时前
手写 Cursor 核心原理:从 Node.js 进程到智能 Agent
人工智能·agent·设计
Wect3 小时前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
掘金安东尼3 小时前
如何为 AI 编码代理配置 Next.js 项目
人工智能