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()阻塞的,所以每当计时器崩溃时,我都需要它返回!

编辑:顺便说一句,没有lirclircd标签,会很高兴!

4

2 回答 2

1

我之前使用过lirc/lircd几次,据我所知,没有官方方法可以检测到key up事件。

如果您考虑这项技术是如何工作的,那么它没有是有道理的。遥控器的编程方式是每个按钮只存储一个代码。所以当按钮 X 被按下时,它会发送代码 X 表示按钮被按下,当按钮 Y 被按下时,代码 Y 将被发送。接收此信息的另一端设备(运行 Lircd)无法知道这是按键按下还是按键按下事件,因为这不是通信系统的工作方式。它只知道按下了一个按钮。

按住 RC 上的按钮 X 将在另一端的设备上发送更多代码,如果您不感兴趣,则丢弃这些重复消息是您的工作。

于 2011-07-24T03:05:36.800 回答
1

我将通过存储收到的最后一个代码并与新代码进行比较来做到这一点,如果代码不同,则释放存储的密钥。对于我在您的帖子中看到的内容,代码长度似乎是固定的,所以您应该不会像我所说的那样在实现它时遇到太多问题,只需忽略最后一个字节(重复计数)。

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

简而言之:

  1. 阅读代码
  2. 将其存储在 var 中以供以后比较
  3. 轮询端口以获取更多代码,如果没有任何反应且保护时间已过,则 KEY UP=true
  4. 得到一个代码,与存储的代码进行比较,如果相等,则循环标签 3
  5. 如果不同,则 KEY UP=true,继续循环到标签 2
于 2011-07-28T02:02:38.380 回答