使用LIRCd检测密钥

时间:2011-07-18 15:39:25

标签: c controller repeat infrared lirc

我正在使用LIRCd捕获我在遥控器上按下的键,并使用正确的配置文件 根据文档,我必须等待阻塞函数lirc_nextcode()返回,我得到一个很好的解码行,如下所示:

0000000080bf4bb4 00 CURSOR_DOWN myremote

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

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

如果我按一个按钮一段时间,这就是我得到的(每隔约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标记,会很高兴!

2 个答案:

答案 0 :(得分:1)

之前我已经使用了 lirc / lircd 几次,据我所知没有正式方法来检测 key up 事件

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

按住遥控器上的按钮X将在另一端的设备上发送更多代码,如果您不感兴趣,可以放弃这些重复消息。

答案 1 :(得分:1)

我将通过存储收到的最后一个代码并与新的代码进行比较来实现,如果代码不同,则释放存储密钥。对于我在你的文章中看到的,似乎代码长度是固定的,所以你应该没有很多问题实现它,正如我所说,只是忽略最后一个字节(重复计数)。

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

简而言之:

  1. 阅读代码
  2. 将其存储在var中以便稍后进行比较
  3. 轮询端口以获取更多代码,如果没有任何内容且保护时间已过,则KEY UP = true
  4. 得到一个代码,与存储的代码进行比较,如果相等则进行循环标记3
  5. 如果不同,则KEY UP = true,再循环到标签2