【问题标题】:Detect key up with LIRCd使用 LIRCd 检测密钥
【发布时间】:2011-10-07 19:22:46
【问题描述】:

我正在使用 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 标签,要是有就好了!

【问题讨论】:

  • 谢谢你的标签,塞巴斯蒂安 :)
  • 你想忽略重复的键,是这样吗?

标签: c controller repeat infrared lirc


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    简而言之:

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

    【讨论】:

    • 是的,这就是我在我的问题中想到的。我只是希望 lirc 中已经存在一些东西可以做到这一点。无论如何,我会把你的答案作为最终答案,即使 karlphilip 的答案和你的一样好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 2012-07-19
    • 2012-04-28
    • 1970-01-01
    相关资源
    最近更新 更多