bz home

Использование пультов дистанционного управления под OS/2

Как бы использовать пульты от всякой бытовой электроники под OS/2 — таким вопросом я занялся незадолго до покупки дивана в кабинет. Это что же такое получится? Сяду смотреть кино как белый человек на диван, а на каждый чих к клавиатуре бегать? Опять же управлять громкостью нонче модно колесом мыши с нажатым Control (спасибо AMOUSE), но это занимает обе руки и делать потише уже схватившись за телефон — рук не хватает, а локтем в клавиатуру тыкать тоже не того.

Так и появился этот проект zIR.

С помощью него можно на любой поддерживаемый пульт задать действия, причём разные в зависимости от того, что у нас происходит в настоящее время в компьютере.

Теперь у меня громкость регулируется любым пультом, валяющимся в комнате (какой первый под руку попадётся), все видео и аудио плееры с пультов же перематывают, делают паузы и останавливаются. Для видео конечно же сделаны дополнительные удобства, типа переключения в полноэкранный режим и так далее.

Возможности

zIR позволяет использовать пульты управления бытовой радиоаппаратурой для гибкого и разнообразного управления программами в OS/2. Аналогами являются такие пакеты, как WinLIRC и собственно LIRC.

Кратко возможности:

В сущности Rexx-скрипты позволяют делать уже что угодно, расширяя базовую функциональность до практически беспредельного уровня. Например, с помощью дополнительного пакета APMT, широко известного в узких кругах, можно и мышью рулить, и с диалогами в WPS работать, и так далее.

Ну и естественно некоторые ограничения:

Скриншоты

Тут вроде бы положено скриншоты давать... Уж и не знаю, как тут можно на экране показать. Вот, например, как выглядит изменение уровня громкости (хоть основное, что тут видно — это просто рабочий стол):

zIR_volume.gif

Слева вверху типичный OSD, внизу тот самый ProgressBar. Это стандартная реакция, если не нравится, то Rexx в руки и переделать по своему желанию.

Архитектура

Вот так это всё организовано:

IR-приёмник я спаял сам, по мотивам обсуждения подобного в on-line журнале Cooler. Вот принципиальная схема:

irreceiver_scheme.png
IR Receiver
                   +---------------------------+----------------o DCD
  IC1 (TSOP 1738)  |                          .|.
  +------+         |          IC2 (78L05)     | | R1 (4k7)
  | DATA +---------+          +-----------+   |_|
  |      |                    |           |    |        | /|
  |    + +--------------+-----+OUT      IN+----+--------|< |----o RTS
  |      |              | +   |    GND    |             | \|
  |    - +---+       -------  +-----+-----+           D1 (1N4148)
  |      |   |   C1  -------        |
  +------+   |  (4.7mF) |           |
             +----------+-----------+---------------------------o GND

Детальки были куплены в Чип-н-Дипе за сумму приблизительно 50 рэ, включая разъём COM-порта (в ценах 2003 года). Всё вместе спаяно навесным монтажом, плата для трёх деталек не понадобилась.

Дальше ждали некоторые неожиданности. Штатный драйвер com-порта OS/2 не поддерживает ожидание сигнала DCD, по которому данным датчиком передаётся полезный сигнал. А точность измерения импульсов нужна весьма неплохая, до 50 мс. Поллинг давал жуткие результаты и занимал изрядно системных ресурсов. Пришлось сделать свой драйвер, состоящий из двух частей: собственно драйвер, который ловит импульсы от IR-приёмника, и R3-часть, которая занимается декодированием импульсов. Для написания драйвера была выбрана среда DR2 от zuko, которая обладает массой достоинств:

zIRd (zIR Deamon) является самой обычной пользовательской программой, хоть и работающей на максимальном приоритете. Именно в его конфигурации описываются пульты и кнопки на пультах. Результаты он выдаёт в Pipe (по-умолчанию \PIPE\ZIR) в виде строк "Пульт/Кнопка". На этом пульто- и аппаратнозависимая часть заканчивается и каждый волен делать с полученными результатами всё, что сочтёт нужным.

Моим способом обработки полученных результатов является zIRc — zIR Control Center. Это самое что ни на есть обычное приложение для OS/2, слушающее входной Pipe (по-умолчанию \PIPE\ZIR) и выполняющее на события, пришедшие от нажатий кнопок на пульте, соответствующие им действия. Кто посылает эти события — ему без разницы. Следовательно можно расширять данный комплекс любыми другими поставщиками событий откуда только фантазии хватит. Как я уже упомянул выше, предполагалось сделать zIRc в двух вариантах: vio и PM. Пока есть работающий только для vio. Конфигурационный файл текстовый, понятный для человека.

zIRc поддерживает так называемые Контекстные скрипты, запуск которых происходит только в определённом контексте. Обычно это наличие какой-либо запущенной программы (например, аудио-проигрыватель) и/или какой-либо программы, являющейся активной в данный момент (например, видео-проигрыватель). С помощью этого подхода очень просто написать скрипт на Rexx, который будет управлять соответствующим приложением, в нём же описать, когда этот скрипт должен вызываться, и не думать при этом о взаимодействии с другими программами, контекстами и т.п. Получается просто и удобно. Примеры таких скриптов прилагаются.

Установка и настройка

Шаги по установке

  1. Сделать IR-приёмник, подключить его к com-порту.
  2. Установить DR2 согласно его скупых инструкций (у меня он живёт в C:\OS2\BOOT\DR2).
  3. Распаковать irrd, настроить на нужный com-порт и обеспечить его запуск в удобном месте и удобное время (у меня делается строчкой в CONFIG.SYS при запуске подсистемы DR2: "DEVICE=C:\OS2\BOOT\DR2\dr2krnl.sys irrd.dr2", но грузить можно хоть вручную).
  4. Распаковать zIRd, поправить конфиги, настроить их на имеющиеся в наличии пульты, запустить. Убедиться, что работает.
  5. Распаковать zIRc, настроить нужные действия на нужные пульты/кнопки, запустить.
  6. Убедиться что всё работает и радоваться жизни.

Конфигурирование zIRd

будет позже

Конфигурирование zIRc

будет позже