Как автоматически поворачивать экран с помощью акселерометра Yoga 900?

1897
Anne van Rossum

Йога 900 имеет акселерометр, который должен позволить поведение автоповорота.

При установке https://github.com/hadess/iio-sensor-proxy (Linux *, LightDM) можно запустить монитор-датчик.

➜ ~ monitor-sensor Waiting for iio-sensor-proxy to appear +++ iio-sensor-proxy appeared === Has accelerometer (orientation: undefined) === Has ambient light sensor (value: 0.000000, unit: lux) Accelerometer orientation changed: normal Light changed: 49.999999 (lux) Light changed: 79.999998 (lux) Accelerometer orientation changed: left-up Accelerometer orientation changed: normal Accelerometer orientation changed: left-up Accelerometer orientation changed: bottom-up 

С iio-sensor-proxyданными можно ознакомиться на DBus. Имеет вид:

signal time=1479631365.562013 sender=:1.15 -> destination=(null destination) serial=449861 path=/com/ubuntu/Upstart; interface=com.ubuntu.Upstart0_6; member=EventEmitted string "dbus" array [ string "SIGNAL=PropertiesChanged" string "BUS=system" string "INTERFACE=org.freedesktop.DBus.Properties" string "OBJPATH=/net/hadess/SensorProxy" string "SENDER=:1.4" string "ARG0=net.hadess.SensorProxy" ] 
  1. Можно ли запустить скрипт, который просыпается только при определенных событиях dbus? Предпочтительно я использую цикл событий в демоне, который уже существует, вместо того, чтобы создавать свой собственный скрипт Python или программу на Си. Что-то вроде добавления файла /etc/dbus.d/handlers/net/hadess/SensorProxyбыло бы действительно здорово.

  2. Если я не запускаю, monitor-sensorя не вижу сообщений, появляющихся на dbus, даже если iio-sensor-proxyна самом деле запущен. Эти сообщения отправляются только если кто-то их слушает?

[*] Linux V 4.8.1-040801-generic # 201610071031 SMP пт. 7 октября 14:34:10 UTC 2016 x86_64 x86_64 x86_64 GNU / Linux

PS: согласно powertop при использовании monitor-sensor:

14.7 mW 1.5 ms/s 8.8 Process dbus-monitor 

Ответ должен описать канонический способ решения этой проблемы в Linux и быть наиболее дружественным решением с точки зрения использования батареи.

3

1 ответ на вопрос

1
harrymc

Я не гуру Linux, но кажется, что dbus-monitorэто действительно инструмент для использования.

Ответ на пост Как создать демон, который будет слушать сценарий dbus и fire на сообщении :

Основано на https://askubuntu.com/questions/150790/how-do-i-run-a-script-on-a-dbus-signal

#!/bin/bash  interface=org.gnome.ScreenSaver member=ActiveChanged  dbus-monitor --profile "interface='$interface',member='$member'" | while read -r line; do echo $line | grep ActiveChanged && your_script_goes_here done 

Просто вставьте это в /etc/init.d/monitor-for-unlock, сделайте его исполняемым, а затем сделайте мягкую ссылку в rc2.d

chmod +x /etc/init.d/monitor-for-unlock cd /etc/rc2.d ln -s /etc/init.d/monitor-for-unlock . 

Статья Мониторинг D-Bus добавляет:

Вероятно, самая мощная особенность dbus-monitor - это то, что вы не ограничены использованием только одного выражения часов за раз. В следующем примере одновременно отслеживаются все 3 сигнала Tomboy и используется awk для анализа выходных данных dbus-monitor и отображения значимого сообщения.

#!/bin/bash  OJECT="'org.gnome.Tomboy'" IFACE="'org.gnome.Tomboy.RemoteControl'" DPATH="'/org/gnome/Tomboy/RemoteControl'"  WATCH1="type='signal', sender=$, interface=$, path=$, member='NoteAdded'" WATCH2="type='signal', sender=$, interface=$, path=$, member='NoteSaved'" WATCH3="type='signal', sender=$, interface=$, path=$, member='NoteDeleted'"  dbus-monitor "$" "$" "$" | \ awk ' /member=NoteAdded/ { getline; print "Created note " substr($2,7) } /member=NoteSaved/ { getline; print "Added note " substr($2,7) } /member=NoteDeleted/ { getline; print "Deleted note " substr($2,7) } ' 

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

$ ./test Created note //tomboy/3da026dc-f6ee-4637-8a94-bec6e2844824" Added note //tomboy/3da026dc-f6ee-4637-8a94-bec6e2844824" Deleted note //tomboy/3da026dc-f6ee-4637-8a94-bec6e2844824" 
Какое влияние оказывает цикл while на процессор? Я предполагаю, что он блокируется на чтение через вызов read (2). Как это точно реализовано? Anne van Rossum 7 лет назад 0
Я не могу ответить на это, но это легко проверить. harrymc 7 лет назад 0
Я реализовал вышеизложенное в форме сценария и в виде демона C на [github] (https://github.com/mrquincle/yoga-900-auto-rotate). Решение dbus-monitor вызывает ** read ** 27276 раз за 2 минуты по сравнению с 6 раз с демоном C. Кажется, что сценарий, как это определенно не так, как это должно быть сделано с точки зрения батареи ... Anne van Rossum 7 лет назад 0
Эти методы были предназначены для отладки, а не производства. Но кажется, что создать сценарий, управляемый событиями, довольно просто - [пример] (http://blog.foxxtrot.net/2010/05/detecting-removable-storage-mounts-using-dbus-and-python.html). harrymc 7 лет назад 0
Ммм. Я интерпретирую ваше замечание как «Теперь вы должны попытаться использовать Python. Это очень просто». Мое намерение в этом вопросе состоит в том, чтобы люди поняли, как это сделать каноническим способом в Linux. Не методом проб и ошибок. Anne van Rossum 7 лет назад 0
См. Технику в статье [Scripting D-Bus] (http://blog.fpmurphy.com/2009/02/dbus-scripting.html). Его заключительное предложение звучит так: «Хотя D-Bus на самом деле не был разработан с учетом сценариев оболочки, можно использовать различные утилиты для доступа к системным данным и данным сеанса через D-Bus». harrymc 7 лет назад 0
Я не думаю, что получу канонический ответ. Спасибо за ваши старания. Anne van Rossum 7 лет назад 0

Похожие вопросы