Обнаружение ключа с LIRCd - PullRequest
3 голосов
/ 18 июля 2011

Я использую 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() - это блокировка , поэтому всякий раз, когда срабатывает таймер, мне нужно его вернуть!

edit : кстати, нет lirc или lircd тег, было бы неплохо иметь!

Ответы [ 2 ]

1 голос
/ 28 июля 2011

Я сделаю это, сохраняя последний полученный код и сравнивая с новым, если коды отличаются, то сохраненный ключ был освобожден.Из того, что я вижу в вашем посте, кажется, что длина кода фиксирована, поэтому у вас не должно быть особых проблем с ее реализацией, как я уже сказал, просто проигнорируйте последний байт (количество повторений).

ИК-передатчики работают, повторяя один и тот же код, удерживая клавишу, поэтому вам нужно знать «защитное время», то есть задержку между повторами.Вы должны проверить эту задержку, чтобы убедиться, что не повторяются никакие повторы, если после этой задержки ничего не происходит, можно предположить, что пользователь отпустил ключ (KEY UP).

Короче:

  1. Прочитайте код
  2. Сохраните его в переменной для сравнения позже
  3. Порт опроса для большего количества кодов, если ничего не приходит и истекло время защиты, тогда KEY UP = true
  4. Получилкод, сравните с сохраненной единицей, если равен метка цикла, равная 3
  5. Если отличается, тогда KEY UP = true, продолжайте цикл до метки 2
1 голос
/ 24 июля 2011

Я использовал lirc / lircd несколько раз раньше, и, насколько я знаю, нет официального способа для обнаружения события key up .

Если вы думаете о том, как работает эта технология, то имеет смысл, что ее нет. Пульт дистанционного управления запрограммирован таким образом, что он сохраняет только один код на кнопку. Поэтому, когда кнопка X нажата, она отправит код X, сообщающий, что кнопка была нажата, а когда кнопка Y нажата, будет отправлен код Y. Устройство на другой стороне (под управлением Lircd), которое получает эту информацию, не может узнать, было ли это событие key down или key up , потому что это не так, как работает система связи , Он только знает, что была нажата кнопка.

Удерживая нажатой кнопку X на ПДУ, вы отправите больше кодов на устройство на другом конце, и ваша задача - отбросить эти повторные сообщения, если они вас не интересуют.

...