Автоматический поворот изображения на мониторе

в 11:10, , рубрики: lifehack, linux, последовательный порт, метки: , , ,

Исторически сложилось так, что у меня нет монитора. Вместо него я использую телевизор. Тридцати двух дюймовый телевизор. И нет, я еще не окосоглазил. Вполне комфотртно за ним работается, заменяет мне сразу 2 монитора. Но есть у него одна неприятная особенность. Когда я открываю свой любимый редактор, код представляет собой узкий столбец с левой стороны экрана. Почти две третьи части экрана остаются пустыми и ничем незадействованными.

Автоматический поворот изображения на мониторе

Я долго с этим мирился, пока не вспомнил про вертикальные мониторы. А почему нет? Чем я хуже? Вот тогда я и решил немного переоборудовать свое рабочее место. Можно было бы сделать крепеж и навсегда перевести монитор в вертикальное положение, но меня это не устраивало по той причине, что на моем «мониторе» я часто смотрю фильмы. А вертикальные фильмы, слава богу, пока еще не снимают. В этот момент появилась идея приобрести поворотный кронштейн и повесить телевизор на стену, чтобы при необходимости его вертеть. Именно так я и поступил.

Автоматический поворот изображения на мониторе
Так лучше, не правда ли?

Жить стало намного удобнее. Надо поработать? Встал со стула, повернул монитор, сел обратно, ввел в терминале команду
xrandr -o left и работай себе с комфортом. Хочешь посмотреть фильмец? Сделай тоже самое, только введи уже xrandr -o normal и расслабляйся.

Все это меня полностью устраивало, пока мне просто не надоело. Надоело вводить эти команды. Вставать и переворачивать эту махину, мне правда тоже надоело, но не моторчик же приделывать к ней, верно? А вот ввод команд я мог автоматизировать без особых затрат. Но как объяснить компьютеру, что монитор был перевернут? Можно было бы заморочиться как, например, вот этот парень, но это никому ненужные сложности. В качестве интрфейса взаимодействия я сразу решил использовать последовательный порт (если нет встроенного, можно прикупить адаптер usb-to-serial). Но как быть с датчиком? А тут дело обстоит еще проще. Я отыскал никому ненужный тюбик от губной помады, вытащил металлический шарик из подшипника и соорудил это:

Автоматический поворот изображения на мониторе

Тюбик, с одной стороны которого размещены 2 контакта, подключенные к пинам TxD и RxD последовательного порта.

Автоматический поворот изображения на мониторе

Внутри тюбика катается металический шарик. Если он скатывается к контактам, то замыкает их, тем самым соединяя пины передачи и приема последовательного порта. Тюбик вешается позади «монитора» под углом в 45 градусов таким образом, что при горизонтальном положении шарик находится в бесконтактном конце тюбика, а при переводе монитора в вертикальный режим, шарик скатывается и замыкает собой контакты.

Осталось написать программную часть. Принцип работы очень просто: в серийный порт пишется слово и сразу же читается. Если программа хоть что-нибудь прочитала, то контакты замкнуты, а значит монитор находится в вертикальном положении. В результате чего выполняется команда xrandr -o left. При повороте обратно в горизонтальное положение происходит аналогичное действие, но с командой xrandr -o normal.

Первый раз я написал скрипт на моем любимом питоне. Это был двухпоточный монстр, который жрал, если верить top, 120% CPU. Почему так происходило, для меня до сих пор остается загадкой. В конце концов я решил переписать программу на С, что помогло незагружать так сильно процессор.

Вот впринципе и все. Осталось лишь добавить программу в автозагрузку.

Решил поделиться этим небольшим лайфхаком с хабросообществом. Вдруг кому пригодится.

Код можно найти на гитхабе.

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

Автор: PaGrom

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js