一个简化的鼠标状态机示例

一个简化的鼠标状态机示例

#include <stdbool.h>
#include <stdint.h>

typedef enum {
    MOUSE_UP,
    MOUSE_DOWN,
    MOUSE_FIRST_CLICK,
    MOUSE_SECOND_CLICK,
} MouseState;

typedef enum {
    MOUSE_PRESS,
    MOUSE_RELEASE,
} MouseEventType;

typedef struct {
    MouseEventType type;
    uint8_t button;
} MouseEvent;

MouseState mouse_state = MOUSE_UP;
uint32_t last_click_time = 0;

void process_mouse_event(MouseEvent *event) {
    uint32_t current_time = get_current_time(); // 获取当前时间,单位:毫秒

    switch (mouse_state) {
        case MOUSE_UP:
            if (event->type == MOUSE_PRESS) {
                mouse_state = MOUSE_DOWN;
                // 生成鼠标按下消息
            }
            break;
        case MOUSE_DOWN:
            if (event->type == MOUSE_RELEASE) {
                mouse_state = MOUSE_FIRST_CLICK;
                // 生成鼠标抬起消息
            }
            break;
        case MOUSE_FIRST_CLICK:
            if (event->type == MOUSE_PRESS) {
                mouse_state = MOUSE_SECOND_CLICK;
                // 生成鼠标单击消息
            } else if (current_time - last_click_time > DOUBLE_CLICK_DELAY) {
                mouse_state = MOUSE_UP;
            }
            break;
        case MOUSE_SECOND_CLICK:
            if (event->type == MOUSE_RELEASE) {
                mouse_state = MOUSE_UP;
                // 生成鼠标双击消息
            }
            break;
    }

    if (event->type == MOUSE_PRESS || event->type == MOUSE_RELEASE) {
        last_click_time = current_time;
    }
}

在这个示例中,我们定义了一个鼠标状态机,用于处理鼠标按下、抬起、单击和双击等事件。状态机包括四个状态:MOUSE_UP、MOUSE_DOWN、MOUSE_FIRST_CLICK和MOUSE_SECOND_CLICK。在process_mouse_event函数中,我们根据当前状态和事件类型来更新状态机的状态,并生成相应的鼠标消息。

需要注意的是,这个示例仅用于演示如何实现鼠标状态机,实际应用中需要根据具体的单片机硬件和需求进行调整和优化。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值