Jak automatycznie obracać ekran za pomocą akcelerometru Yoga 900?

3

Yoga 900 ma akcelerometr, który powinien umożliwiać zachowanie automatycznego obracania.

Podczas instalacji https://github.com/hadess/iio-sensor-proxy (Linux *, LightDM) możliwe jest uruchomienie czujnika monitorującego.

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

Z iio-sensor-proxy dane są udostępniane na dbusie. Ma 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. Czy jest możliwe uruchomienie skryptu tylko się budzi na temat niektórych wydarzeń dbus? Najlepiej użyć pętli zdarzeń w demonie, który już istnieje, zamiast tworzyć własny skrypt Pythona lub program C. Coś jak dodanie pliku do /etc/dbus.d/handlers/net/hadess/SensorProxy byłoby naprawdę fajnie.

  2. Jeśli nie ucieknę monitor-sensor Nie wydaje mi się, że wiadomości pojawiają się na dbusie, chociaż iio-sensor-proxy jest rzeczywiście uruchomiony. Czy te wiadomości są wysyłane tylko wtedy, gdy ktoś ich słucha?

[*] Linux V 4.8.1-040801-generic # 201610071031 SMP piątek 7 października 14:34:10 UTC 2016 x86_64 x86_64 x86_64 GNU / Linux

PS: Według powertopa podczas używania monitor-sensor:

14.7 mW      1.5 ms/s       8.8        Process        dbus-monitor

Odpowiedź powinna opisywać kanoniczny sposób radzenia sobie z tym w systemie Linux i być najbardziej przyjaznym rozwiązaniem z punktu widzenia wykorzystania baterii.

Anne van Rossum
źródło

Odpowiedzi:

1

Nie jestem guru Linuksa, ale wygląda na to dbus-monitor jest rzeczywiście narzędziem do użycia.

Odpowiedź na post Jak stworzyć demona, który będzie słuchał skryptu dbus i fire na wiadomości mówi :

Oparte na 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

Po prostu to włóż /etc/init.d/monitor-for-unlock , Zrób to   plik wykonywalny, a następnie utworzyć miękkie łącze w rc2.d

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

Artykuł Monitorowanie magistrali D-Bus dodaje:

Prawdopodobnie najpotężniejszą cechą monitora dbus jest to, że   nie ograniczasz się do używania tylko jednego zegarka na raz. The   poniższy przykład monitoruje jednocześnie wszystkie 3 sygnały Tomboy i   używa awk do analizowania danych wyjściowych z monitora dbus i wyświetlania a   znacząca wiadomość.

#!/bin/bash

OJECT="'org.gnome.Tomboy'"
IFACE="'org.gnome.Tomboy.RemoteControl'"
DPATH="'/org/gnome/Tomboy/RemoteControl'"

WATCH1="type='signal', sender=${OJECT}, interface=${IFACE}, path=${DPATH}, member='NoteAdded'"
WATCH2="type='signal', sender=${OJECT}, interface=${IFACE}, path=${DPATH}, member='NoteSaved'"
WATCH3="type='signal', sender=${OJECT}, interface=${IFACE}, path=${DPATH}, member='NoteDeleted'"

dbus-monitor "${WATCH1}" "${WATCH2}" "${WATCH3}" | \
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) }
'

Oto dane wyjściowe wygenerowane po kliknięciu ikony Tomboy na   utwórz nową notatkę, czekaj na automatyczny zapis, a następnie wybierz   usuń opcję, aby usunąć notatkę.

$ ./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"
harrymc
źródło
Jaki jest wpływ pętli while na procesor? Zakładam, że blokuje się po przeczytaniu, przez wywołanie do czytania (2). Jak to jest dokładnie wdrożone?
Anne van Rossum
Nie mogę na to odpowiedzieć, ale łatwo to sprawdzić.
harrymc
Zaimplementowałem powyższe w postaci skryptu i postaci demona C w github . Wywołuje rozwiązanie dbus-monitor czytać 27276 razy w ciągu 2 minut w porównaniu do 6 razy w przypadku demona C. Wydaje się, że taki skrypt na pewno nie jest taki, jak powinien być zrobiony z perspektywy baterii ...
Anne van Rossum
Te metody były przeznaczone raczej do debugowania niż do produkcji. Ale wydaje się dość łatwe, aby stworzyć skrypt sterowany zdarzeniami - przykład .
harrymc
Mmm. Zinterpretuję twoją uwagę jako „Powinieneś teraz spróbować użyć Pythona. Wszystko jest super proste”. Moim zamiarem w tym pytaniu jest, aby ludzie zrozumieli, jak to zrobić w kanoniczny sposób na Linuksie. Nie próba i błąd.
Anne van Rossum