[Из песочницы] Извращенный подход к использованию мыши при создании тифлоплеера

2e4b4efe637147388e3fe8ed20b16f99.jpg

Вы когда-нибудь сталкивались с ситуацией, в которой вам нужно срочно реализовать какую-то задачу, но у вас нет необходимых для этого знаний? Знания, конечно, можно обрести, но что если для этого может не хватить времени в рамках этой задачи? А еще нередко можно упереться в нехватку финансов, оборудования или возможности приобрести нужные вещи. В таких ситуациях стоит просто посмотреть вокруг — иногда самые банальные и примитивные вещи могут стать ключем к реализации.

Вступление


Для начала — что такое тифлоплеер? Тифлоплеер — специальный плеер, позволяющий воспроизводить (некоторые модели — и записывать) аудио книги для слепых и слабовидящих.

Собственно, для чего он мне понадобился? Так сложилось, что родители моей мамы в данный момент почти ничего не видят. На это у них у всех свои причины и печальные истории и они не для этого места. Кроме того что это абсолютно ужасно в бытовом плане, это еще отобрало у них возможность заниматься одной из самых любимых вещей — читать. Потеряли зрение они не синхронно и изначально по-своему справлялись с этой проблемой. Но потом и эта возможность пропала. Тогда было решено качать аудиокниги и слушать их на всяких плеерах/колонках/магнитофонах, используя флешки или карты sd. Но в этих девайсах со временем обнаружились неприятные детали — когда переставлялась флешка или карта, плеер часто считал что это то же самое и начинал новую книгу с того места в котором закончил старую. И так происходило со всеми купленными, даже с теми, что дорогие. Да и сами махинации с картами и флешками не самые простые для тех, кто не видит. Поэтому, будучи «тыжпрограммистом», я попробовал это исправить.

«Аппаратная» реализация


Было очевидно, что в создаваемой системе надо записывать время и файл окончания последней книги. Ну и больше ничего. Сам по себе я программирую на C#, но в тот момент набирали популярность микрокомпьютеры типа Raspberry Pi. Собственно с малины и начал. Но, или из-за своей ужасной лени, или из-за отсутствия знаний в той области у меня ничего не вышло (давно было дело, теперь понимаю, насколько ничтожная это была задача). Потом пробовал разные варианты, и с той и с другой стороны. Был и hdmi медиаплеер и другие игрушки в этом стиле, но все не складывалось никак. С каждым днем, в принципе, подкатывало понимание того что 89 лет это не 19 и у меня каждый день на счету. Пришлось решиться на быстрый и сердитый вариант.

Собственно быстротой и сердитостью было движение в сторону C# и Windows. Но нужно было найти какое-то устройство на винде. Миникомпьютеры с виндой иногда встречаются, но стоят дорого да и не всегда дают полный набор того что было надо (ну и времени разбираться с нюансами не было), так что после определенных махинаций было решено использовать старый нетбук. Для того чтобы слабо видящий человек смог его включить понадобилось пару кустарных доработок. Была припаяна большая красная кнопка вместо кнопки включения.

268370464bf3493c84a077e26ec721ef.jpg

Дальше возникал самый важный вопрос — элементы управления. Мышь это слишком тяжело, клавиатура тем более. Эйр стик с медиаплееера отлично работал, но тоже был бы сложноват. И вот, как-то раз, размышляя об этом всем в разговоре с коллегой, я понял что мышь — идеальный вариант в моей ситуации. То-есть не совсем мышь, а ее кнопки.

Исходя из идеи, надо было 7 функций:

  1. Играть
  2. Пауза
  3. Следующий трек (часть книги)
  4. Предыдущий трек (часть книги)
  5. Следующая книга
  6. Предыдущая книга
  7. Регулировка громкости


По сути, мне нужна была мышь на 6 кнопок. После анализа, а так же понимания того факта что C# обрабатывает только 5 кнопок (не особо пробовал придумать как решить этот вопрос, так как 5 достаточно), первые два пункта были объединены. А для громкости было использовано колесико.

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

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

c64910ce622b45baa1d3c25e80f9977e.jpg

К моему счастью так случилось, что один хороший человек работал в дизайнерской студии, где мне могли вырезать то, что мне нужно было из дерева. Через пару дней я получил красивую коробку. К сожалению, мы немного друг друга не так поняли, и она осталась без крышки для отсека батарейки. Но это мелочи (хотя до сих пор не решил этот вопрос). Дальше было много паятельно/вырезательно/поклейной работы. Я банально припаял кнопки вместо кнопок мыши (не без проблем, из-за качества платы).

0caf9426729b4b6f9f246fb99eefa681.JPG

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

c9c0f8344a5a4e9ea3e540db8204c383.jpg

4aa31ae0d973403ca0f14dbdd6ccfa36.jpg

f8e5ffbe8ed64100ad5b96500db10b62.jpg

24c23840b51c4790a2950974bb31675e.jpg

«Программная» реализация


Все что осталось сделать — написать программу. Как я и подозревал, она заняла около 20 минут. Алгоритм (хотя скорее просто общие тезисы о том, как это работает) выглядит следующим образом:

  1. В специально забитой папке (костыли) мы ищем папки с книгами (тут работает даже вложенность папок).
  2. У каждой книги есть аудио файл заголовка (записанный на микрофон или вырезанный из начала книги).
  3. Это все показывается на мониторе большими контрастными буквами (даже монитор есть, хотя смысла в нем не много)
  4. Когда это все работает активная книга читает свое название бесконечное количество раз, пока пользователь не переключит на другую книгу, или не включит активную.
  5. Если книга на паузе или остановлена, или переключена на другую без остановки — она записывается в лог файл с которого будет читаться в момент следующего включения этой книги (ради этого оно все и было).
  6. Ну и еще — чтобы книгу добавить надо вставить флешку и выбрать папку с книгой. Что выглядит не тяжело, даже когда ты приходишь в гости раз в пол года


Листинг программы не буду показывать. В нем то по сути нет особого смысла, особой сложности, паттернов проектирования и остального. Строчек кода имеющих смысл там 60 штук, 25 из которых это сгенерированный код xaml. Хотя если вдруг кому-то это понадобится — могу добавить.

Но думаю надо сказать пару слов о том, как оно все живет в винде — несколько ключей реестра позволяют запускать приложение вместо explorer.exe. Свойства окна там maxemized, topmost=true. Вот и все. Все лишние службы отключены, ни намека на антивирус и службу обновлений — только то, что надо (в принципе, так и работает большинство автоматов обслуживания).

Итого вышло что-то типа этого:

8ea66944f8474dbd9e7c1358b3954bb2.jpg

Вместо заключения


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

В общем, вот и все. Спасибо за внимание.

© Geektimes