Touch Panel Keyboard

Тщательно ознакомившись с функционалом Android-планшетов, собрав из своего настольного 22" Wide монитора — Touch Screen Monitor, а так же огорченный
отсутствием удобного Touch функционала в Операционных системах для настольных PC (Win\Linux) решил воплотить в жизнь Отдельную Touch Panel Keyboard.
Идея была в реализации «проста»:
Берем любую удобную Touch Panel и из координат нажатия делаем Эмуляцию нажатия кнопок на клавиатуре.
Соответственно расположение активных областей Touch Panel соответствовало статической кнопке.
Используем функционал как клавиатуру, мышь и сочетание активных клавишь для Операционной системы.
Тем самым отказавшись от мышки и клавиатуры в текущем понимании.
Апогеем данной реализации, хотелось бы видеть — динамичные слои, смена функций в зависимости от активного окна.
Конечно смущенный идеями которые болтались в Интернете, Я изначально нацелился собрать нечто такое:


http://web.artlebedev.ru/everything/optimus/tactus/
Но как показала практика, автор репродукций концепта не зря до сих пор не выпустил его на рынок (концепт датирован 01.01.2008) — на то есть масса причин.
Итак:
Направление Движения
Поиск компонент подходящих под реализацию прототипа, показал несколько прискорбных фактов:
- Найти подходящий монитор и touch panel для реализации увы крайне сложно, т.к. рынок wide мониторов не стандартного размера (не 4:3\16:10\16:9, а 25:6 и т.п.) практически отсутствует.
- Рынок нестандартных типо-размеров MultiTouch, как впрочем и стандартных с диагональю более 10" и штучным заказом — так же отсутствует, и даже хуже, в типо размере от 10" до 15" практически отсутствует возможность приобрести MonoTouch Panel.
Заказ и сборка
После долгих скитаний, раздумий и споров Мой выбор пал на Open Frame монитор 12.1 Inch TFT LCD16:9 Resolution: 1280 x 800 5 Wire Touch Screen.LILLIPUT 12.1" LCD KIT
Одним из факторов выбора именно 12.1" был типо размер, 10" мало, а вот 12.1" максимально близко к Клавиатуре функциональность которой хотелось бы повторить и расширить. (Размер 275.82L x 178W x 5.2H) и что самое интересное, 5 мм толщины, это для LED экземпляра и без учета контроллера.
После долгих переговоров (за что отдельное спасибо Мы знаем кому) были заказаны 2 варианта с CCFL и LED подсветкой. В итоге мне попал Набор с CCFL подсветкой с которым Я и продолжил упражняться.
И вместе с 12.1" монитором мне досталась Resestive Panel с контроллером 5 Wire в исполнении Стекло 2.8 мм толщиной и размером 275x178 мм.
С Чего же начать?
Touch Panel была подключена, без монитора, установлен драйверe eGalaxTouch, который увидел контроллер и начал успешно работать.
Но в итоге Я получаю просто Touch Panel — которая смахивает на гигантский TouchPad любого бука. Надо что делать с «перехватом» координат.
В наборе юного установщика драйверовe eGalaxTouch присутствовал любезно вложенный файл UserGuide.chm — в котором так же был раздел «Interface to eGalaxTouch Device Driver.» и «Packet Format for eGalaxTouch Touchscreen controller». С этого Я и начал свой поиск.
Т.к. в лоб понять как применить написанное Я не мог, Я пошел в поисковик и наткнулся на замечательный проект JooJoo и замечательные наработки JooJoo Touch Provider for MultiTouchVista. Порывшись в исходниках, Я обнаружил DllImport(«xtkutility.dll») и обработку координат в классе TouchHandlerForm после вызова EGalaxTouch.EnumerateTouchscreenCallback() в отдельном потоке.
Ура… начало есть, осталось найти только в себе запас энтузиазма и вспомнить как писать на C# (с учетом того, что в мою бытность программиста C# почему-то назывался Pascal, потом Visual C++, но никак не C#). Делая поправку на мою экспертизу программиста и отсутствие опыта… Я все же написал Код, который выгляд вот так (в самой важной своей части):
.....
void WorkerThread()
{
var cb = new EGalaxTouch.EnumerateTouchscreenCallback(EnumerateTouchscreenCallback);
EGalaxTouch.EnumerateTouchInstance(IntPtr.Zero, IntPtr.Zero, cb);
}
.....
TouchHandlerForm frm = new TouchHandlerForm();
EGalaxTouch.RegisterTPNotifyMessage(hDevice, frm.Handle, 0x0400 + 100);
Application.Run(frm);
.....
if (m.Msg != 0x464)
{
base.WndProc(ref m);
return;
}
iCx = LoWord((uint) m.LParam.ToInt32());
iCy = HiWord((uint) m.LParam.ToInt32());
.....
var sim = new InputSimulator();
if ((iCx >= 518 & iCx <= 640 ) & (iCy >= 1120 & iCy <= 1350)) { sim.Keyboard.KeyPress(WindowsInput.Native.VirtualKeyCode.VK_R );
.....
Да для «эммулирования» нажатия клавиш и мыши Я использовал наработки проекта Windows Input Simulator, хотя осваивать keybd_event уже начал, но понял что лучше чем в указанном проекте мне не написать.
Работу Soft части можно увидеть на ролике тут
Но до написания Soft части, Я все же решил собрать подобие корпуса, что бы хоть как то оживить функционал «будущего».
Т.к. пластика под рукой не было, дерева тоже, да и работа с таким материалом без дополнительных знаний и опыта затруднительна, был выбран самый доступный материал в доме — КАРТОН!
Не долго думая Я начала изготавливать изделие:




Но куда же изделие без Покраски, в оригинальный черный цвет!?
Для покраски был использована инновационная краска «о вот и краски сына пригодились, не только ими по обоям рисовать».




И конечно же увлекательное занятие отрисовка и распечатка слоя функциональности. Кроме классической Клавиатуры, первичный функционал содержал несколько «вкусностей»:

- Область Масштабируемого движения Мышки по всему рабочему столу (слева вверху)
- Область с функциональность TouchPad — увеличен до 2/3 от верхнего участка
- Не распределенные области справа от клавиатуры (6)
- Область Кнопок Мыши (Left Click, Left Down, Right Click)
- Областьперелистыванияокон Win+Tab \ Win+Tab+Shift
- Область Клавиатуры
Еще не много работы инструментом и получается:




Финальный ролик с круговым обзором плохого качества тут
Итог
Получился однослойный, статичный, с подключением по USB, но вполне рабочий вариант.
Touch Panel Keyboard обладает потенциалом функциональности и требует доработки. В частности были идеи собрать все это в пластике с подсветкой свето-диодами, с заменой слоев. Слой планировалось печатать на прозрачной пленке.
Повторить опыт можно имея не дорогие компоненты, которые на текущий момент стали доступнее.
Самое главное — Resestive touch panel (читайте одно касание) не является блокирующим фактором при работе с областью Клавиатура, а весь специфичный функционал требующий нажатия более 1-й кнопки легко реализуется в программном коде(Ctrl+Del+Alt — это всего лишь область на тач панели).
Что же касается вопросов — можно ли играть в игры с такой реализацией, да можно, Но для игр требуется более тщательная проработка областей, как показывает опыт Android-планшетов с Resestive touch panel — есть интересные интерфейсные решения для управления и FPS, TPS, RTS, TBS и RPG.
Что дальше
А дальше попробуем пересобрать данный проект и в качестве слоя отображения Клавиатуры и всего остального использовать — LCD монитор.
Пока альтернативный планы развития оставлены напосле:
[*]Использовать аналогичную реализацию, но Touch Panel подключить к Arduino (любой реализации от free до ...) тем самым переложить на плечи Arduino перевод областей касания в интерпретации Keyboard и Mouse, а так же использовать возможность Arduino сразу становиться HID USB Keyboard & Mouse.
[*]Пере собрать корпус для точно такой же реализации, вероятно это Оргстекло стилизованное под клавиатуру из многих концептов существующих на просторах Интернета.
[*]Собрать воедино реализацию по пункту 1 в корпусе пункта 2 (данного плана)
В итоге может получится забавное устройство.
Это перепост статьи с www.habrahabr.ru. Перепост и перевод размещен с согласия автора GreenGo




