Пользователь
0,0
рейтинг
2 марта 2013 в 15:10

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

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



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


Так лучше, не правда ли?

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

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



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



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

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

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

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

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

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

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

UPD:
А вот как это выглядит в жизни (прошу прощения за качество):


Павел Громов @PaGrom
карма
13,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (103)

  • +49
    Вставать и переворачивать эту махину, мне правда тоже надоело, но не моторчик же приделывать к ней, верно?

    Нет, не верно и, да, черт побери, именно решение с автоматизацией ротации экрана ждал увидеть в этом топике, кроме уже расписанного определения положения, конечно же :)
    • +3
      Да я бы с удовольствием сделал, не весил бы телевизор 10.4 килограмма. Моторчик неслабенький нужен. Да и шуметь он будет и неизвестно как быстро поворачивать. Если бы был обычный мониторчик, то я бы всерьез задумался. Как вариант можно под стол поместить педальки от велосипеда и цепной механизм.)
      • +1
        Вы таки подумайте на счет мотора… К тому же уже существуют моторы для поворота спутниковых антенн, которые при должной сноровке можно приспособить для телевизора.
      • +1
        Можно попробовать блоки и рычаги)
        • 0
          Кстати, в свое время мы с отцом сделали электродрель из моторчика дворника автобуса. Так вот этот моторчик вполне легко эту штуку и удержит и повернет.

          UPD Промахнулся немного, это ответ на сообщение PaGrom
        • +1
          Достаточно будет редуктора.
        • 0
          хм… minecraft?
      • 0
        Нужен неслабенький моторчик или редуктор.
        Большая шестерня диаметром 200 на телевизор. маленькая, диаметром 10 на мотор (ну или редуктор посложнее).
        Ну и чтобы сохранять вертикальность/горизонтальность, нужно сделать два концевика-упора в граничных положениях.
        • +4
          Редуктор лучше тогда уж червячный использовать. Там и передаточное отношение повыше значит двигатель можно взять послабее, и нет передачи вращения в обратную сторону, а значит телевизор будет зафиксирован от случайных проворотов даже при выключеном двигателе.
          image
          • 0
            Как раз начал думать в сторону червячных. Поэтому пока мой взгляд упал на механизм стеклодъемников от ВАЗов.

      • 0
        Возьмите серву автомодельную. Для мощных вариантов 20кг * см рядовая тяга, а учитывая, что на поворот надо усилие много меньшее…
  • +1
    while (1) { write(fd, "hello!\n", 7);

    Зачем каждый раз писать хелло?
    • +2
      так стандарт же )))
    • +4
      Там все равно что писать. Вот зачем sleep(1), когда спокойно хватило бы и sleep(1000). Да и можно было прицепиться на служебные пины RTS CTS и вообще ничего не писать в порт, и обойтись без цикла. Но и так неплохо.
      • +2
        Не хватило бы. Там sleep секунды принимает. Хм, насчет служебных пинов я и не подумал. Возможно, попробую таким образом. Спасибо.
  • +5
    Ожидал в топике увидеть фото указанной махины.
    • +2
      Добавил в пост.
  • +3
    Чего только не придумаешь, когда лень сделать 2 скриптика и вывести их в быстрый запуск\меню\ещё куда-нибудь на видное место.
    • +8
      лень — двигатель прогресса
    • 0
      В Windows есть утилитка autorotate (у мониторов Samsung), там на хоткеях подвешено.
      • 0
        не только у самсунговских мониторов такое есть.
        • +2
          Вроде это просто стандартный хоткей, да. Ctrl + Alt + [стрелка; направление стрелки будет указывать на верхнюю часть изображения]

          Особенно хорошо это замечаешь, когда долго работал с убунтой и по привычке пытаешься переключить рабочий стол.
    • +1
      На этой лени делают бизнес всякие эплы и иже с ними.
    • НЛО прилетело и опубликовало эту надпись здесь
  • –23
    Офтоп, не используйте жесткие диски серии WD****RX серии, 14 штук в ремонте, всем и года нет!
  • +1
    А какое разрешение на телевизоре? Не слишком крупные пиксели для монитора? Я пробовал некоторое время сидеть за телевизором, показалось очень неудобно, как-то недостаточно чёткости, что ли. Правда у меня он ещё раза в полтора больше по диагонали.
    • 0
      1920х1080. Небольшое, но если не сидеть в 20 сантиметрах от него, то пиксели не видно.
      • 0
        Тогда 2 монитора он заменить все таки не сможет, разрешение намного важнее диагонали.
      • 0
        Работаю на расстоянии 70-80 см от экрана, очень удобно диагональ таже и разрешение тоже
  • +4
    Я понимаю, что вся эта работа была проделана потому, что нужно было повернуть экран вертикально. Но, я вот для себя пустое место в Sublime Text решаю с помощью: View -> Layout -> Columns: 2. На большом экране — очень удобно.
    • +1
      Это удобно, если редактируешь одновременно несколько файлов. Если один длинный, то в вертикальном положении удобнее. Еще, ктстати, очень классно серфить в инете. На хабре порой можно всю статью без скроллинга прочитать.
      • +1
        А если во время серфинга видео на ютубе? Кручу-верчу посмотреть хочу?
        • 0
          Зачем? И так вполне смотрибельно.

          • +20
            И правда, а я дурак на черные полосы на 16:10 жалуюсь.
            • +5
              Вертикальное видео, настало твое время!
              • +12
                Для справки, врдуг кто не в теме.


                • +2
                  Где бы не появилось это видео, свою порцию плюсиков оно всегда соберет.
          • +13
            Издалека похоже на очень большой смартфон.
            • +4
              LG вдохновились.
          • 0
            Для вас тогда не актуально))
            www.youtube.com/watch?v=Bt9zSfinwFA
      • 0
        Так можно же один файл в двух панелях открыть.
      • 0
        А мне на мониторе углов обзора не хватает, ipsку однозначно будут вертеть
  • 0
    Хм, телевизор вместо монитора… у меня сломался сейчас монитор и я тоже использую телевизор (кстати тоже филипс и тоже на 32, но модель другая), но почему-то глаза стали уставать достаточно сильно =(((
    • 0
      Тоже филипс, тоже 32. Мой совет уменьшить контраст и яркость на сколько будет комфортно, а для просмотра видео просто включать режим кино с пульта, все в одном режиме не получилось или глаза устают или для фильмов темно — переключаю.
  • +2
    Split page, не?
    А от такого вертикального положения, когда нужно смотреть снизу вверх, взвоет в первую очередь шея.
  • +6
    удобно так смотреть снизу-вверх? шея не устает? как впечатления, поделитесь
    • +1
      Сначала было не совсем удобно, а сейчас привык. Главное не сидеть впритык. Как можно заметить по последней фотографии, телевизор наклоняется под своим весом. Таким образом взгляд падает почти перпендикулярно в любую точку экрана. Амплитуда вертения головой максимум 2 сантиметра. Шея ниразу не уставала и не болела. В общем, только положительные впечатления.)
  • +1
    Грех не велик, но мудрость какова! Конструкция внушает.
  • 0
    о! у меня вопрос как ты подключаешь телек (всмысле hdmi, vga или ещё как-то?) и в связи с этим — не залезает ли у тебя часть изображения слева под рамку?

    опрашивал знакомых. 5 из 5 сказали что залезает значительнй кусок видимой области экрана под рамку, отчего трудно пользоваться при работе телеком как моником. было ли такое у тебя и как ты поборол?
    • 0
      И по hdmi подключал, и по vga. Так и не понял, о какой рамке Вы говорите. Все отлично видно, ничто никуда не уползает.
    • +2
      Погуглите HDMI overscan, думаю, это решит проблему.
      • 0
        о! спасибо — а то не знал куда копать.
        • 0
          Сам узнал об этом при подключении Raspberry Pi, там отдельный параметр в конфигах отвечает именно за эту проблему (т.е. Вы не одиноки :)
          • 0
            да. я уже настроил всё на телеке. ещё раз большое спасибо!
            правда работать с текстом на моём телевизоре всё равно нельзя. но хоть куски картинки не будут пропадать.
  • +1
    strcpy(buf, "");
    Сильно.
    • 0
      Немножко говнокода.) Спасибо, что напомнили. Заменил на memset(buf, 0, sizeof(buf)).
      • +1
        В варианте strcpy(buf, "") это можно заменить на buf[0] = '\0', сэкономим несколько тактов :)
        • 0
          *buf = 0 тогда уж. коротко и ясно.
          Правда, я не знаю, как читается из serial — если без завершающего нуля, то тогда нужно самому его вставлять вместо strlen:
          int n = read(fd, buf, sizeof buf);
          buf[n] = 0;
          if(n > 0)…

          Но судя по всему, смотреть, что в buf, вообще не нужно и оперировать лишь условием: «прочитали ли что-то или нет» (n > 0).
  • +2
    >код представляет собой узкий столбец с левой стороны экрана. Почти две трети экрана остаются пустыми и ничем незадействованными.

    Может быть это будет для вас шоком, но окна можно не разворачивать на полный экран.
    • +1
      Шутку оценил. Только как это поможет коду занимать больше пространства? Даже если не разворачивать, остальное место все равно не будет полезно израсходовано.
      • 0
        Обычно стремятся минимизировать количество переключений между окнами, с помощью нескольких мониторов, тайлов, и так далее, а не чтобы один метод на 120 строк влез в разрешение. При чем не только программисты — любой журнал, по сути, похож на классический двухпанельник.
      • +1
        А значит колбасу такую на стене держать это «эффективно»?
      • 0
        Вот понемногу в поисках альтернативы нетбинс или плагина для него же, что бы открытые файлы были вертикально, а не горизонтально, зачем все везде пихают вкладки сверху, если большинство программистов пишет не широко, но листинг получается длинным.А так ты всегда видишь что открыто, особенно когда много файлов открыто, табы не отрезают кусок высоты и по ширине бы как раз заполнили бы пусто место.А если бы ещё как в Kate, каждый открытый файл подсвечивало разными цветами…
        • +1
          Не хочу агитировать/рекламировать (хотя оно того стоит), но в PhpStorm можно табы в любую сторону спихнуть :) Как-то так это выглядит у меня в процессе работы: take.ms/dPNWd :)
  • +2
    Привет от «того парня». Дребезг контактов не беспокоит?
    • 0
      Всмысле? Какой дребезг?
      • НЛО прилетело и опубликовало эту надпись здесь
    • 0
      Нет, не беспокоит. Задержка в цикле стоит 1 секунда. За это время все стабилизируется.
    • +1
      Решается программно (исходя из предположения, что монитор не вращается, как мельница)
  • 0
    Объясните чем удобней?
    • 0
      Да я вроде уже объяснил. И в статье и в комментах. Что именно Вам непонятно?
      • 0
        Видно я пропустил, ибо заметил только тот факт, что Вас смущает пустое пространство.
        • 0
          Повторю еще раз: таким образом более рационально используется пространство как при кодинге, так и при веб-серфинге.
          • 0
            Как при кодинге это помогает? Писать методы с сотней строк? Куда рациональней сделать редактор длиной в ~120 символов рабочей области, и в оставшемся месте поместить документацию/скайп и другие вещи.
            • +1
              Я привык распологать такую информацию на соседних рабочих столах. Тут уже дело вкуса. Я никому не навязывал свое мнение.
            • +1
              (как и топикстартер)

              А зачем? Есть же разные столы.
              У меня, например, кодинг обычно идёт на втором столе, отладка (если в терминале) — на третьем, веб и документация — на четвёртом, скайп с пиджином и почтой — на пятом, а всякие графические приложения — вообще на шестом. Мне для переключения не надо кучу раз жать Alt+Tab и смотреть, куда попадёт — достаточно ткнуть LWin+F№ (я себе сделал именно так) и сразу оказаться где надо.
  • +2
    В плане программирования «широкоформатный» монитор удобен тем, что кроме непосредственно кода удобно по сторонам разместить еще:
    — дерево файлов проекта либо список открытых фалов — это удобнее, чем список вкладок сверху, так позволяет держать перед глазами и переключаться на большее число файлов (например редактируется код, шаблон верстки и файлы локализации, при этом надо периодически обращаться к файлам из других проектов)
    — дерево методов/переменных (у вас я смотрю SublimeText2, он справа отображает миниатюрное изображение файла исходника), но на мой взгляд, удобнее подход, когда справа выводится список методов либо узлов верстки, по которым осуществляешь навигацию. Это умеет не только Eclipse, но даже и Kate под линуксом.

    Кроме того, часто в коде строки оказываются весьма длинными из-за длинных имен переменных либо классов в случае верстки. И оказывается что пространства по горизонтали не так уж и много…
    • 0
      В сублиме можно слева открыть дерево файлов. Код все-равно будет помещаться. Насчет дерева методов/переменных не знаю, никогда не пользовался подобным. Возможно Вы правы, но сублима полностью устраивает. Правило плохого тона — писать такие длинные строки. Если такой случай будет, никто не мешает перевести монитор в горизонтальное положение.
    • 0
      Насчет дерева методов: как такового постоянно висящего перед глазами дерева нет, но по Ctrl+R вылезает поле со списком методов и прочего с возможностью неточного поиска, что весьма удобно.
    • 0
      перешел осенью на 27" wqhd
      блин. всеравно места слишком много :). и классы, и БД и файлы в панельках, но для кода слишком широко.
  • +1
    А цвета не искажаются?
    Для теста положил ноутбук на бок — изображение стало темнее.
    • +1
      Нет, не искажаются. Все отлично.
  • 0
    Да… А помню времена, когда в 800x600 в студии кодили, и нормально казалось… Кстати про питон и загрузку в 120% — это прям в точку, быгыггы. Я всегда говорил что хуже яваскрипта в эмбеддед могут быть только системные демоны на питоне.
    • +1
      800x600 — это еще ладно, жить можно. А вот текстовая консоль с кодом 80х25 и иерархия на бумажке рядом — это совсем другие ощущения.
      • +1
        Хуже только код на бумажке и дыросшыватель для перфокарт. :)
        • +1
          Есть ещё вариант с прошивкой программы побитно проволокой…
  • +1
    God bless Emacs and C-x 3 :)
  • +1
    А чего, классно. Даже изолента есть, правда не синяя!
    • +1
      Да, прошу прощения, мой промах.)
  • +1
    Мы на работу себе купили кронштейны для свободного поворота монитора. Выглядит это как-то так:
    image

    Железки называются Ergotron, и стоят, для железок, увы очень много (эта конструкция обошлась в 400$ + 2 * 400$ за каждый монитор).
    С этой штукой и правда стало удобно работать с исходным кодом в портретной ориентации. Но есть одно НО: мониторы должны быть очень качественные, с матрицей IPS, PVA или чем-то подобным. В противном случае, из-за плохих углов обзора по вертикали (которые в портретной ориентации станут горизонтальными), работать будет крайне некомфортно.

    Дома я работаю на 32" телевизоре при разрешении 1920х1080, подключенным через DVI (видюха, поддерживает и HDMI) и HDMI (телевизор). Очень удобно. Конечно, сидеть нужно на расстоянии 1м, а лучше 1.5-2м, иначе пиксели будут видны. Цветопередача у телеков великолепна, ровно как и отзывчивость (TN матрицы туда, естественно, не ставят), так что и для программирования, и для обработки фоток, и для пострелять в монстров девайс годен.
    Но предварительно телевизор нужно настраивать, а именно отключать все улучшайзеры, выкручивать всякие четкости на ноль, отключать шумоподавления, увеличители изображения и прочие заводские фишки, иначе конечное изображение будет мыльное, уходить за границы экрана и т.д.
  • 0
    Хммм, а вы знали что в sublime можно было бы занять это место (по горизонтали) используя клавиши alt+shift+(2|3|4)?

    Несколько вкладок, позволяют очень удобно просматривать код с двух файлов. А представьте как классно тесты писать с 2 вкладками. В одной вкладке тест, в соседней тестируемый метод. А видеть листинг высотой 121 строку (против 66) не часто дает преимущество, имхо.
  • +5
    А зачем одна узкая полоска? :)

    image
    • 0
      На работе именно так и делаю. Для своих проектов мне обычно не требуется редактировать одновременно несколько файлов. Да и, как я уже говорил неоднократно, такое положение удобно не только для кодинга.
  • 0
    С некоторых пор сижу за двумя мониторами: один 23" 1650x1050, другой — 17" 1280x1024, поставленный вертикально.
    На последнем удобно открывать документацию — как раз помещается страница A4.
    Скрытый текст

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

    • +1
      По логике, проблемы возникать должны.
      Смотрите сюда, определяйте порядок субпикселей, а дальше… ну, в линуксах это легко правится настройкой fontconfig. В арче у меня сей процесс делается путем удаления симлинки на файл, где настраивается порядок субпикселей, из $XDG_CONFIG_HOME/fontconfig/conf.d и создания новой симлинки на файл с другим порядком субпикселей, лежащий в $XDG_CONFIG_HOME/fontconfig/conf.avail. При желании сию процедуру можно вписать в скрипты поворота изображения.

      В винде не знаю как)
    • 0
      Спасибо за идею. Себе повернул так же.
  • 0
    Некоторые мониторы умеют отдавать положение поворота через ddccontrol. Я как-то про неё писал.
    • 0
      Это те, в которых предусмотрена возможность поворота. U2412M например.
  • 0
    фотка в вертикальном режиме — LOL
    не проще ли заюзать tiled manager и вставить сбоку другие приложения.
    например браузер, мессенджер и т.п. — и тогда можно будеть смотреть интернеты тестить и кодить одновременно.
  • 0
    Я поступил проще ) купил монитор, который поворот поддерживает из коробки. Правда в нём «всего» 27", но и разрешение пока недоступное для ТВ — 2560х1440. Хотя моторчика для автоповорота в нём тоже нету )
  • 0
    Подскажите какой это эдитор?
  • 0
    Вы не думали об использовании тайлового оконного менеджера?
    blogerator.ru/page/tajlovye-okonnye-menedzhery-windows

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.