使用LIRCd检测按键抬起事件

3
我正在使用LIRCd来捕获我在遥控器上按下的按键,使用正确的配置文件。
根据文档,我必须等待阻塞函数lirc_nextcode()返回,并获得一个很好的行来解码,就像这样:
0000000080bf4bb4 00 CURSOR_DOWN myremote

第一个数字是键值,接下来是按下此键的重复次数(这里为0,因为我仅按下并释放它),然后是键名和我的遥控器名称。

无论如何,我想要做的是检测我的遥控器的向上键。

如果我按下某个按钮一段时间,我会得到以下结果(每200毫秒换行):

0000000080bf4bb4 00 CURSOR_DOWN myremote
0000000080bf4bb4 01 CURSOR_DOWN myremote
0000000080bf4bb4 02 CURSOR_DOWN myremote
0000000080bf4bb4 03 CURSOR_DOWN myremote
0000000080bf4bb4 04 CURSOR_DOWN myremote
0000000080bf4bb4 05 CURSOR_DOWN myremote
0000000080bf4bb4 06 CURSOR_DOWN myremote
0000000080bf4bb4 07 CURSOR_DOWN myremote
0000000080bf4bb4 08 CURSOR_DOWN myremote
0000000080bf4bb4 09 CURSOR_DOWN myremote
0000000080bf4bb4 0a CURSOR_DOWN myremote
// I let go for 1s and press it again:
0000000080bf4bb4 00 CURSOR_DOWN myremote

因此,第二个数字在我长按键时递增,但一旦我松开并再次按下它,它就会重置为0。
我想要的是能够检测到重复停止的时刻。
现在,我可以看出如何实现松开键的检测:如果 lirc_nextcode() 在一定时间内没有响应,那么我可以认为该键已被释放。
我想问你的是:是否有另一种(更合适的)方法来做到这一点?也许通过配置 LIRCd?
或者,如果除了使用计时器没有其他方法可行,那么最佳实现是什么? 实际上,lirc_getcode() 是阻塞的,因此每当计时器响起时,我都需要它返回!
编辑:顺便说一句,没有 lirc 或 lircd 标签,加上会很好!

谢谢标记,Sebastian :) - Gui13
您是想忽略被重复按下的按键,是吗? - karlphillip
2个回答

1

我之前用过 lirc/lircd 几次,据我所知,没有官方的方式 来检测 按键抬起 事件。

如果您考虑一下这项技术如何工作,就会明白为什么会这样。遥控器被编程成只存储每个按钮的一个代码。因此,当按下按钮 X 时,它将发送代码 X 表示按钮已被按下;当按下按钮 Y 是,代码 Y 将被发送。另一端运行 Lircd 的设备接收到这些信息时,没有办法知道这是 按键按下 还是 按键抬起 事件,因为这不是通信系统的工作方式。它只知道按钮被按下了。

在遥控器上长按按钮 X 会向另一端的设备发送更多的代码,因此如果这些重复消息对您没用,那么就需要丢弃它们。


1

我将通过存储上一个接收到的代码并与新代码进行比较来实现它,如果代码不同,则存储的键已释放。根据您在帖子中的描述,代码长度似乎是固定的,因此您应该没有太多问题按照我的说法进行实现,只需忽略最后一个字节(重复计数)。

红外发射器通过重复发送相同的代码来工作,同时保持按键,因此您需要知道“保护时间”,即重复之间的延迟。您应该测试这个延迟以查看是否没有重复出现,如果在此延迟之后没有任何内容,则可以假定用户释放了按键(KEY UP)。

简而言之:

  1. 读取代码
  2. 将其存储在变量中以便以后进行比较
  3. 轮询端口以获取更多代码,如果没有任何内容并且超过保护时间,则KEY UP = true
  4. 获得代码,请与存储的代码进行比较,如果相等,请循环转到标签3
  5. 如果不同,则KEY UP = true,请继续循环到标签2

是的,这就是我在问题中想到的。我只是希望在lirc中已经有一些现成的东西可以做到这一点。无论如何,我会把你的答案作为最终答案,即使karlphilip的答案和你的一样好。 - Gui13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接