Wie kann der Bildschirm mit dem Beschleunigungssensor von Yoga 900 automatisch gedreht werden?

1941
Anne van Rossum

Der Yoga 900 verfügt über einen Beschleunigungssensor, der das automatische Rotationsverhalten ermöglichen soll.

Bei der Installation von https://github.com/hadess/iio-sensor-proxy (Linux *, LightDM) ist es möglich, einen Monitor-Sensor auszuführen.

➜ ~ 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 

Damit werden iio-sensor-proxydie Daten auf dbus zur Verfügung gestellt. Es hat die Form:

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. Ist es möglich, ein Skript auszuführen, das nur bei bestimmten Dbus-Ereignissen aktiviert wird? Vorzugsweise verwende ich eine Ereignisschleife in einem bereits vorhandenen Dämon erneut, anstatt ein eigenes Python-Skript oder ein eigenes C-Programm zu erstellen. Etwas wie das Hinzufügen einer Datei /etc/dbus.d/handlers/net/hadess/SensorProxywäre wirklich cool.

  2. Wenn ich nicht laufe monitor-sensor, erscheinen auf dbus keine Meldungen, obwohl iio-sensor-proxytatsächlich ausgeführt wird. Werden diese Nachrichten nur gesendet, wenn jemand auf sie wartet?

[*] Linux V 4.8.1-040801-generisch # 201610071031 SMP Fri Oct 7 14:34:10 UTC 2016 x86_64 x86_64 x86_64 GNU / Linux

PS: Laut Powertop bei Verwendung von monitor-sensor:

14.7 mW 1.5 ms/s 8.8 Process dbus-monitor 

Die Antwort sollte die kanonische Art und Weise beschreiben, wie dies unter Linux gehandhabt werden kann, und aus Sicht der Batterienutzung die freundlichste Lösung sein.

3

1 Antwort auf die Frage

1
harrymc

Ich bin kein Linux-Guru, aber es scheint, als wäre es dbus-monitordas Werkzeug, das ich verwenden kann.

Eine Antwort auf den Beitrag Wie man einen Daemon erstellt, der bei einer Nachricht auf dbus hört und ein Skript auslöst, lautet:

Basierend auf 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 

Stecken Sie das einfach in /etc/init.d/monitor-for-unlock ein, machen Sie es ausführbar und machen Sie dann einen Softlink in rc2.d

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

Der Artikel Monitoring D-Bus fügt hinzu:

Die wohl leistungsstärkste Funktion von dbus-monitor ist die Tatsache, dass Sie nicht nur auf einen Ausdruck der Uhr beschränkt sind. Das folgende Beispiel überwacht gleichzeitig alle 3 Tomboy-Signale und analysiert mit awk die Ausgabe von dbus-monitor und zeigt eine aussagekräftige Meldung an.

#!/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) } ' 

Hier ist die Ausgabe, die generiert wurde, wenn ich auf das Tomboy-Symbol geklickt habe, um eine neue Notiz zu erstellen, auf das automatische Speichern gewartet und dann die Löschoption zum Löschen der Notiz ausgewählt habe.

$ ./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" 
Welchen Einfluss hat die while-Schleife auf die CPU? Ich gehe davon aus, dass es beim Lesen blockiert, über einen Aufruf zum Lesen (2). Wie wird es genau umgesetzt? Anne van Rossum vor 7 Jahren 0
Ich kann das nicht beantworten, aber es ist leicht zu testen. harrymc vor 7 Jahren 0
Ich habe das obige in Form eines Skripts und in Form eines C-Daemons bei [github] (https://github.com/mrquincle/yoga-900-auto-rotate) implementiert. Die dbus-monitor-Lösung ruft in 2 Minuten ** 27276-mal auf, verglichen mit 6-mal mit dem C-Dämon. Scheint, ein Skript wie dieses ist definitiv nicht, wie es aus Batteriesicht getan werden sollte ... Anne van Rossum vor 7 Jahren 0
Diese Methoden waren eher für das Debugging als für die Produktion gedacht. Es scheint jedoch einfach zu sein, ein ereignisgesteuertes Skript zu erstellen - [Beispiel] (http://blog.foxxtrot.net/2010/05/detecting-removable-storage-mounts-using-dbus-and-python.html). harrymc vor 7 Jahren 0
Mmm. Ich interpretiere Ihre Bemerkung als "Sie sollten jetzt versuchen, Python zu verwenden. Es ist alles sehr einfach." Meine Absicht mit dieser Frage ist es, die Leute auf kanonische Weise unter Linux zu verstehen. Nicht Versuch und Irrtum. Anne van Rossum vor 7 Jahren 0
Siehe die Technik im Artikel [Scripting D-Bus] (http://blog.fpmurphy.com/2009/02/dbus-scripting.html). Der abschließende Satz lautet: "Obwohl D-Bus nicht wirklich auf Shell-Scripting ausgelegt wurde, können verschiedene Dienstprogramme für den Zugriff auf System- und Sitzungsdaten über D-Bus verwendet werden." harrymc vor 7 Jahren 0
Ich glaube nicht, dass ich eine kanonische Antwort bekomme. Danke für Ihr Bemühen. Anne van Rossum vor 7 Jahren 0