input_event中type参数
时间: 2024-05-28 14:14:02 浏览: 16
在 input_event 中,type 参数表示输入事件的类型。它可以取以下几个值:
- EV_SYN:表示同步事件,用于标识输入事件的开始和结束。
- EV_KEY:表示按键事件,用于表示键盘、游戏手柄、遥控器等输入设备的按键事件。
- EV_REL:表示相对位移事件,用于表示鼠标、触摸板等输入设备的相对位移事件。
- EV_ABS:表示绝对位移事件,用于表示触摸屏、数字板等输入设备的绝对位移事件。
- EV_MSC:表示杂项事件,用于表示一些特殊的事件,如时间戳、输入设备的状态等。
type 参数的取值决定了输入事件的具体含义和格式,应用程序需要根据不同的输入设备类型和事件类型来解析输入事件,并做出相应的响应。
相关问题
qt中的结构体struct input_event
在Qt中,`struct input_event`是一个用于输入设备的结构体,定义如下:
```c++
struct input_event {
struct timeval time; // 事件发生的时间戳
__u16 type; // 事件类型
__u16 code; // 事件码
__s32 value; // 事件值
};
```
其中,`time`表示事件发生的时间戳,包括秒数和微秒数;`type`表示事件类型,如键盘事件、鼠标事件等;`code`表示事件码,表示具体的按键或者鼠标动作;`value`表示事件的值,对于按键事件通常是0表示按下,1表示释放,对于鼠标事件通常是表示位移量。
当使用Qt的输入设备相关类(如`QKeyEvent`、`QMouseEvent`等)时,可以通过`struct input_event`的成员变量来获取输入事件的信息。
例如,可以将`struct input_event`的成员变量作为参数传递给设备文件的读取函数,如下面的例子:
```c++
#include <QCoreApplication>
#include <QDebug>
#include <QFile>
#include <linux/input.h> // input_event结构体定义
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 打开输入设备文件
QFile deviceFile("/dev/input/event0");
if (!deviceFile.open(QIODevice::ReadOnly))
{
qWarning() << "Failed to open device file!";
return 1;
}
// 读取输入事件
struct input_event event;
while (deviceFile.read((char *)&event, sizeof(event)) > 0)
{
qDebug() << "Type:" << event.type << " Code:" << event.code << " Value:" << event.value;
}
// 关闭输入设备文件
deviceFile.close();
return 0;
}
```
以上代码中,`/dev/input/event0`是一个输入设备文件路径,可以通过`cat /proc/bus/input/devices`命令来查看。然后,使用`QFile`类打开该文件,进而使用`read`函数读取输入事件。读取到的事件可以通过`struct input_event`的成员变量来获取事件的信息。最后,关闭文件。
注意:以上代码仅为示例,实际使用时需要仔细阅读设备文档并按照要求进行操作。
void key_change_proc(void) {u8 key0 = kb_event.keycode[0]; u8 key_buf[8] = {0,0,0,0,0,0,0,0}; key_not_released = 1; if (kb_event.cnt == 2) //two key press, do not process { } else if(kb_event.cnt == 1) { if(key0 >= CR_VOL_UP ) //volume up/down { key_type = CONSUMER_KEY; u16 consumer_key; if(key0 == CR_VOL_UP){ //volume up consumer_key = MKEY_VOL_UP; } else if(key0 == CR_VOL_DN){ //volume down consumer_key = MKEY_VOL_DN; } blc_gatt_pushHandleValueNotify (BLS_CONN_HANDLE,HID_CONSUME_REPORT_INPUT_DP_H, (u8 *)&consumer_key, 2); } else { key_type = KEYBOARD_KEY; key_buf[2] = key0; blc_gatt_pushHandleValueNotify (BLS_CONN_HANDLE,HID_NORMAL_KB_REPORT_INPUT_DP_H, key_buf, 8); } } else //kb_event.cnt == 0, key release { key_not_released = 0; if(key_type == CONSUMER_KEY) { u16 consumer_key = 0; blc_gatt_pushHandleValueNotify ( BLS_CONN_HANDLE,HID_CONSUME_REPORT_INPUT_DP_H, (u8 *)&consumer_key, 2); } else if(key_type == KEYBOARD_KEY) { key_buf[2] = 0; blc_gatt_pushHandleValueNotify (BLS_CONN_HANDLE,HID_NORMAL_KB_REPORT_INPUT_DP_H, key_buf, 8); //release } } }按条分析各语句的作用
这段代码是一个函数,功能是根据键盘事件发送 HID 报文给 BLE 连接的主机。下面是各语句的作用:
1. `void key_change_proc(void)`:函数定义,返回值类型为 `void`,函数名为 `key_change_proc`,没有输入参数。
2. `u8 key0 = kb_event.keycode[0];`:从 `kb_event` 结构体中取出按下的第一个键的键码并存储在 `key0` 变量中。
3. `u8 key_buf[8] = {0,0,0,0,0,0,0,0};`:初始化一个长度为 8 的数组 `key_buf`,每个元素的值都为 0。
4. `key_not_released = 1;`:将 `key_not_released` 的值设为 1,表示键还没有松开。
5. `if (kb_event.cnt == 2)`:如果按下了两个键,则不处理。
6. `else if(kb_event.cnt == 1)`:如果只按下了一个键,则执行下面的代码块。
7. `if(key0 >= CR_VOL_UP )`:如果按下的键码大于或等于 `CR_VOL_UP`,则说明按下了音量加或音量减键。
8. `key_type = CONSUMER_KEY;`:将 `key_type` 变量的值设为 `CONSUMER_KEY`,表示这是一个消费者键。
9. `u16 consumer_key;`:定义一个 `u16` 类型的变量 `consumer_key`。
10. `if(key0 == CR_VOL_UP){ consumer_key = MKEY_VOL_UP; }`:如果按下的是音量加键,则将 `consumer_key` 的值设为 `MKEY_VOL_UP`。
11. `else if(key0 == CR_VOL_DN){ consumer_key = MKEY_VOL_DN; }`:如果按下的是音量减键,则将 `consumer_key` 的值设为 `MKEY_VOL_DN`。
12. `blc_gatt_pushHandleValueNotify (BLS_CONN_HANDLE,HID_CONSUME_REPORT_INPUT_DP_H, (u8 *)&consumer_key, 2);`:调用 Beken BLE Stack 提供的函数 `blc_gatt_pushHandleValueNotify`,将消费者键报文发送给 BLE 连接的主机。
13. `else`:如果按下的不是音量加或音量减键,则执行下面的代码块。
14. `key_type = KEYBOARD_KEY;`:将 `key_type` 变量的值设为 `KEYBOARD_KEY`,表示这是一个普通键。
15. `key_buf[2] = key0;`:将按下的键码存储在 `key_buf` 数组的第 3 个元素中,因为 HID 报文的前两个字节是保留位。
16. `blc_gatt_pushHandleValueNotify (BLS_CONN_HANDLE,HID_NORMAL_KB_REPORT_INPUT_DP_H, key_buf, 8);`:调用 Beken BLE Stack 提供的函数 `blc_gatt_pushHandleValueNotify`,将普通键报文发送给 BLE 连接的主机。
17. `else`:如果没有按键事件,则执行下面的代码块。
18. `key_not_released = 0;`:将 `key_not_released` 的值设为 0,表示键已经松开。
19. `if(key_type == CONSUMER_KEY)`:如果前一个按键是消费者键,则执行下面的代码块。
20. `u16 consumer_key = 0;`:将 `consumer_key` 的值设为 0。
21. `blc_gatt_pushHandleValueNotify (BLS_CONN_HANDLE,HID_CONSUME_REPORT_INPUT_DP_H, (u8 *)&consumer_key, 2);`:调用 Beken BLE Stack 提供的函数 `blc_gatt_pushHandleValueNotify`,发送一个空的消费者键报文。
22. `else if(key_type == KEYBOARD_KEY)`:如果前一个按键是普通键,则执行下面的代码块。
23. `key_buf[2] = 0;`:将 `key_buf` 数组的第 3 个元素设为 0,表示键已经松开。
24. `blc_gatt_pushHandleValueNotify (BLS_CONN_HANDLE,HID_NORMAL_KB_REPORT_INPUT_DP_H, key_buf, 8);`:调用 Beken BLE Stack 提供的函数 `blc_gatt_pushHandleValueNotify`,发送一个空的普通键报文。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)