Использование пультов дистанционного управления под OS/2
Как бы использовать пульты от всякой бытовой электроники под OS/2 — таким вопросом я занялся незадолго до покупки дивана в кабинет. Это что же такое получится? Сяду смотреть кино как белый человек на диван, а на каждый чих к клавиатуре бегать? Опять же управлять громкостью нонче модно колесом мыши с нажатым Control (спасибо AMOUSE), но это занимает обе руки и делать потише уже схватившись за телефон — рук не хватает, а локтем в клавиатуру тыкать тоже не того.
Так и появился этот проект zIR.
С помощью него можно на любой поддерживаемый пульт задать действия, причём разные в зависимости от того, что у нас происходит в настоящее время в компьютере.
Теперь у меня громкость регулируется любым пультом, валяющимся в комнате (какой первый под руку попадётся), все видео и аудио плееры с пультов же перематывают, делают паузы и останавливаются. Для видео конечно же сделаны дополнительные удобства, типа переключения в полноэкранный режим и так далее.
Возможности
zIR позволяет использовать пульты управления бытовой радиоаппаратурой для гибкого и разнообразного управления программами в OS/2. Аналогами являются такие пакеты, как WinLIRC и собственно LIRC.Кратко возможности:
- Поддержка произвольного количества пультов от бытовой радиоаппаратуры. У меня работают пульты Sony (очень хорошо), Panasonic, Shivaki, BBK, Sharp. И всё это одновременно.
- Действия на кнопки пульта:
- Громкость: увеличение, уменьшение, mute
- Запуск произвольной программы с указанными параметрами
- Вызов WatchCat
- Запись строки в Pipe
- Эмуляция нажатий на клавиатуру
- Запуск произвольного Rexx-скрипта с дополнительными функциями среды:
- zircOSD, on screen display
- zircKBD эмуляция клавиатуры
- zircSwitchTo переключение задач
- zircStore сохранение и восстановление переменных
- zircProgressBar индикатор прогресса
- и, наконец, Контекстные скрипты на Rexx, которые запускаются в зависимости от текущего состояния среды!
- OSD (on screen display)
- Набор готовых к использованию контекстных скриптов для управления Z!, WarpVisionCLI, WarpVisionGUI, KMP.
В сущности Rexx-скрипты позволяют делать уже что угодно, расширяя базовую функциональность до практически беспредельного уровня. Например, с помощью дополнительного пакета APMT, широко известного в узких кругах, можно и мышью рулить, и с диалогами в WPS работать, и так далее.
Ну и естественно некоторые ограничения:
- Разные пульты одного и того же производителя могут посылать один и тот же код клавиши. Например, для кнопки Play. Так как пульт себя никак дополнительно не идентифицирует, то такие кнопки не могут быть идентифицированы как разные. Это ограничение принципиально непреодолимо, так как аппаратно реализовано в пультах бытовой аппаратуры. К счастью жить это не особенно мешает, обычно от одинаковых кнопок пусть даже на разных пультах ожидается одинаковая реакция.
- Не поддерживаются пульты стандарта RC-5 (Philips и совместимые), в своё время я не сумел найти адекватной документации на этот протокол, а та что нашлась плохо соответствовала действительности. Так что до кучи не сделал, а мне собственно и не очень нужно было.
- Ожидаются нестыковки на процессорах, которые меняют тактовую частоту во время работы. Это всякие Cool'n'Quiet. Исправить можно, но необходимо тестировать, мне не на чем.
- Нет полностью автоматического режима обучения для новых пультов. Увы, до полной автоматики руки не дошли. И не факт, что дойдут.
- Рюшечки в PM не сделаны, всё в vio. Вообще говоря ожидалось выпустить zIRc в двух ипостасях: vio и PM, где в PM можно было бы всё удобно настроить и вдоволь налюбоваться на бантики, а потом (когда надоест) запустить по тем же конфигурационным файлам vio-версию (хоть в detach) и пусть себе тихо незаметно трудится во благо.
Скриншоты
Тут вроде бы положено скриншоты давать... Уж и не знаю, как тут можно на экране показать. Вот, например, как выглядит изменение уровня громкости (хоть основное, что тут видно — это просто рабочий стол):
Слева вверху типичный OSD, внизу тот самый ProgressBar. Это стандартная реакция, если не нравится, то Rexx в руки и переделать по своему желанию.
Архитектура
Вот так это всё организовано:
- IR-приёмник в COM-порту
- драйвер irrd.dr2, работа с аппаратной частью (реализован под DR2)
- R3-часть драйвера zIRd (zIR Deamon), занимающийся раскодировкой сигналов
- Центр управления zIRc (zIR Control Center), занимающийся реакцией на полученные события.
IR-приёмник я спаял сам, по мотивам обсуждения подобного в on-line журнале Cooler. Вот принципиальная схема:

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, которая обладает массой достоинств:
- не требует перезагрузки компьютера для загрузки драйвера, что экономит огромное количество времени на отладку
- готовый драйвер можно выгрузить и ком-порт готов для использования любыми другими приложениями, максимум его надо переинициализировать; а когда понадобится, драйвер можно загрузить снова — и всё это без перезагрузки операционной системы
- остальные достоинства по большей части связаны с отладкой драйвера, я их опущу, скажу лишь, что разрабатывать драйвера в этой подсистеме значительно удобнее, чем классическим способом.
Моим способом обработки полученных результатов является zIRc — zIR Control Center. Это самое что ни на есть обычное приложение для OS/2, слушающее входной Pipe (по-умолчанию \PIPE\ZIR) и выполняющее на события, пришедшие от нажатий кнопок на пульте, соответствующие им действия. Кто посылает эти события — ему без разницы. Следовательно можно расширять данный комплекс любыми другими поставщиками событий откуда только фантазии хватит. Как я уже упомянул выше, предполагалось сделать zIRc в двух вариантах: vio и PM. Пока есть работающий только для vio. Конфигурационный файл текстовый, понятный для человека.
zIRc поддерживает так называемые Контекстные скрипты, запуск которых происходит только в определённом контексте. Обычно это наличие какой-либо запущенной программы (например, аудио-проигрыватель) и/или какой-либо программы, являющейся активной в данный момент (например, видео-проигрыватель). С помощью этого подхода очень просто написать скрипт на Rexx, который будет управлять соответствующим приложением, в нём же описать, когда этот скрипт должен вызываться, и не думать при этом о взаимодействии с другими программами, контекстами и т.п. Получается просто и удобно. Примеры таких скриптов прилагаются.Установка и настройка
- Драйвер и соответствующая ему подсистема DR2
- Демон с примерами моих конфигов
- zIRc с примерами моих конфигов и контекстными скриптами для Z!, WVGUI, WVCLI и KMP
Шаги по установке
- Сделать IR-приёмник, подключить его к com-порту.
- Установить DR2 согласно его скупых инструкций (у меня он живёт в C:\OS2\BOOT\DR2).
- Распаковать irrd, настроить на нужный com-порт и обеспечить его запуск в удобном месте и удобное время (у меня делается строчкой в CONFIG.SYS при запуске подсистемы DR2: "DEVICE=C:\OS2\BOOT\DR2\dr2krnl.sys irrd.dr2", но грузить можно хоть вручную).
- Распаковать zIRd, поправить конфиги, настроить их на имеющиеся в наличии пульты, запустить. Убедиться, что работает.
- Распаковать zIRc, настроить нужные действия на нужные пульты/кнопки, запустить.
- Убедиться что всё работает и радоваться жизни.
Конфигурирование zIRd
будет позже
Конфигурирование zIRc
будет позже