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.

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"

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.