китайська за ніч

— за скільки ти вивчиш китайську, щоби здати?
— конспект є?
— є.
— тоді зараз докурю й здам. 
(фрагмент студентського анекдоту)

днями надійшов термін здавати практичну роботу з програмування (python) в коледжі, а старий студент всі різдвяні й новорічні канікули протринькав: грав з дітками, грався сам (bioshock, ghost recon, medal of honor) та хворів на грип…

довелося читати завдання і за два дні інтенсивного гугління й колупання в носі змайструвать отаке доробло:



що це? це спрощений до неможливості симулятор інкапсуляції даних протоколами на кшалт tcp/ip та фільтрування пакетів мережевим екраном... чи щось таке.

навіщо? бо са́ме це було в завданні =) там ще було щось про дизайнерські шаблони (зокрема «стратегія» та «спостерігач», про них українською читайте тут), інкапсуляцію атрибутів і методів (котрий немає в коді, хаха), наслідування тощо.

але… яка з того практична користь? жодної (окрім практикування python).

то навіщо воно тут? собі на згадку.

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

автоповорот екрана для linux

чорнова версія скрипту для автоповороту екрана між портретним та пейзажним режимами для linux — працює.

запуск:

tabletizer --cont

якщо не вказати параметр --cont, скрипт відпрацює один раз і завершиться; --cont [інтервал] запускає циклічне опитування акселерометра зі вказаним інтервалом в секундах (за замовчуванням 1 с).

виявилося, що гістерезис для повороту все ж таки має враховувати всі три осі, а не лише x, як я собі гадав на початку.

залежностей мінімум: xrandr, xinput, grep, sed. перевірено лише на aspire r13 (r7-371t) з arch linux (manjaro kde), але і на інших «трансформерах» та під іншими дистрибутивами теж має працювати (можливо, з невеликими модифікаціями), якщо встановлено відповідні драйвери для linux industrial i/o.

можуть бути вади, пов'язані з кількома моніторами чи робочими просторами (як в kde) — поки що не мав часу все перевірити.



в планах на колись (коли буде натхнення):
  • «причесати» код, особливо в частині перемикання (гістерезис);
  • додати опцію відкривання екранної клавіатури;
  • позбутися залежності від sed (малесенький фрагмент, що я запозичив готовий, треба переписати).
екранна клавіатура onboard досить бідна на опції командного рядка… але відкривати та закривати її програмно таки можна — за допомогою повідомлень dbus.

відкриваємо:

onboard && dbus-send --type=method_call --print-reply --dest=org.onboard.Onboard /org/onboard/Onboard/Keyboard org.onboard.Onboard.Keyboard.Show > /dev/null

"onboard &&" на початку — простіше, ніж перевіряти, чи програму вже запущено.

закриваємо:

dbus-send --type=method_call --print-reply --dest=org.onboard.Onboard /org/onboard/Onboard/Keyboard org.onboard.Onboard.Keyboard.Hide > /dev/null

перемикаємо (toggle):

dbus-send --type=method_call --print-reply --dest=org.onboard.Onboard /org/onboard/Onboard/Keyboard org.onboard.Onboard.Keyboard.ToggleVisible > /dev/null
проблему випадкового монтування сенсорів вирішив: нова версія скрипта test_sensors самотужки шукає потрібний сенсор у теці /sys/bus/iio/devices:



все готово для збирання докупи скрипта автоповороту екрана.

сенсори та linux (продовження)

невеликий проміжний підсумок експериментів з сенсорами на aspire r13: linux (в моєму випадку arch під капотом manjaro) від початку має необхідні драйвери для підсистеми industrial i/o та дає доступ до їх відгуків через дерево підтек і текстових файлів:

/sys/bus/iio/devices/
└ iio:device0/             # магнетометр
  └ ...
└ iio:device1/             # датчик нахилу?
  └ ...
└ iio:device2/             # датчик кутової швидкості?
  └ ...
└ iio:device3/             # акселерометр
  ├ in_accel_x_raw         # вісь x: кут нахилу в площині екрана
  ├ in_accel_y_raw         # вісь y: кут нахилу екрану на себе/від себе 
  ├ in_accel_z_raw         # ?
  └ ...
└ iio:device4/             # ?
  └ ...
└ iio:device5/             # сенсор освітлення
  ├ in_illuminance_raw     # рівень освітленості (підозрюю, що в десятих люкса)
  └ ...

при цьому сам manjaro ніяк ці дані не використовує: вочевидячки, дистрибутив просто не призначений для пристроїв-трансформерів чи планшетів.

тож я накидав невеликий (і дуже чорновий) скрипт оболонки, котрий інтерпретує дані від акселерометра і сенсора освітлення (можливо, поки що не дуже коректно) і дозволяє погратися з ними — себто, покрутити ноутбуком на всі боки й спостерігати, як міняються показники:



що далі? зібрати докупи три різних скрипти, що вже маю:
  • універсальний повертач екрану/тактильного екрану
  • перемикач режиму (пейзаж/портрет)
  • скрипт інтерпретування сенсорів…
…у один автоматичний перемикач режиму ноутбук/планшет залежно від нахилу. отже, як каже один добрий сусіда наприкінці кожного допису — не перемикайтеся =)

поновлення (2018-12-22): халепа! під час завантаження сенсори монтуються до тек device0...device5 суб'єктивно випадковим чином… себто  після перезавантаження акселерометр опинився в теці device5 замість device3… себто треба шукати спосіб динамічно визначати, куди який сенсор змонтовано.
на продовження давнього допису:

lsmod | grep "^hid_sensor"

на aspire r13 видає вельми цікаві штуки: акселерометр, компас, гіроскоп, датчик освітлення (als)…

інша цікавинка:

udevadm info --export-db | grep -C 7 hid_sensor

треба гуглити, як до цього всього дотягнутися зі скрипта оболонки…

поновлення (21 грудня 2018): здається, знайшов…

watch -n 1 cat /sys/bus/iio/devices/iio:device3/in_accel_x_raw

показує посекундно кут нахилу ноутбука навколо поздовжньої осі. кодування, схоже, таке: значення 1—1'000 кодують нахил за годинниковою стрілою, а 64'536—65'535 (насправді це від'ємні 16-бітні цілі, старший біт 1) — нахил проти годинникової стрілки.

залишилося «наскриптувати» простенький сенсор, котрий запускатиме поворот екрану (цю частину вже маю) при нахилі на ±800—1000 за цією шкалою — себто приблизно в портретну орієнтацію.

задачка на інший день.