2010-06-08 24 views
2

Je suis coincé en train de lire un fichier dans/sys/qui contient l'intensité lumineuse en Lux du capteur de lumière ambiante sur mon téléphone Nokia N900.Comment interroger un fichier dans/sys

See thread on talk.maemo.org here

J'ai essayé d'utiliser pyinotify pour interroger le fichier, mais cela semble une sorte de mal pour moi car le fichier est alway « process_IN_OPEN », « process_IN_ACCESS » et « process_IN_CLOSE_NOWRITE »

Je veux essentiellement pour obtenir les changements le plus tôt possible et si quelque chose a changé déclencher un événement, exécutez une classe ...

Voici le code que j'ai essayé, ce qui fonctionne, mais pas comme je m'y attendais (j'espérais process_IN_MODIFY à déclencher):

#!/usr/bin/env python 

import os, time, pyinotify 
import pyinotify 

ambient_sensor = '/sys/class/i2c-adapter/i2c-2/2-0029/lux' 

wm = pyinotify.WatchManager() # Watch Manager 
mask = pyinotify.ALL_EVENTS 

def action(self, the_event): 
    value = open(the_event.pathname, 'r').read().strip() 
    return value 

class EventHandler(pyinotify.ProcessEvent): 
    ... 
    def process_IN_MODIFY(self, event): 
    print "MODIFY event:", action(self, event) 
    ... 

#log.setLevel(10) 
notifier = pyinotify.ThreadedNotifier(wm, EventHandler()) 
notifier.start() 

wdd = wm.add_watch(ambient_sensor, mask) 
wdd 

time.sleep(5) 

notifier.stop() 

Mise à jour 1:

Mmmh, je suis venu sans avoir la moindre idée s'il existe un mécanisme spécial est le suivant:

f = open('/sys/class/i2c-adapter/i2c-2/2-0029/lux') 
while True: 
    value = f.read() 
    print value 
    f.seek(0) 

Ceci, enveloppé dans un propre fil, pourrait à l'astuce, mais est-ce que quelqu'un a un moyen plus intelligent, moins encombrant CPU et plus rapide pour obtenir la dernière valeur?

Répondre

1

Étant donné que le fichier/sys/est un pseudo-fichier qui présente une vue sur une valeur de système d'exploitation volatile et sous-jacente, il est logique qu'un événement modify ne soit jamais déclenché. Comme le fichier est "modifié" par le dessous, il ne suit pas la sémantique habituelle du système de fichiers.

Si un événement de modification n'est jamais déclenché, l'utilisation d'un package comme pinotify ne vous mènera nulle part. Il vaudrait mieux rechercher un mécanisme spécifique à la plate-forme.

Réponse de mise à jour 1:

Depuis l'exécution Maemo N900 supporte GFileMonitor, vous feriez bien de vérifier si elle peut fournir l'événement asynchrone que vous désirez.

Le temps d'attente - comme je le sais si vous le savez - est un gaspillage. Sur un téléphone, il peut vraiment drainer une batterie. Vous devriez au moins dormir dans votre boucle occupée.

0

Mmmh, je suis venu sans avoir la moindre idée s'il existe un mécanisme spécial est le suivant:

f = open('/sys/class/i2c-adapter/i2c-2/2-0029/lux') 
while True: 
    value = f.read() 
    print value 
    f.seek(0) 

Ceci, enveloppé dans un propre fil, pourrait à l'affaire, mais quelqu'un at-il une façon plus intelligente , moins de CPU-monopolisant et moyen plus rapide d'obtenir la dernière valeur?

Cheers Bjoern