2010-06-08 72 views
2

我被卡在/ sys /中,其中包含我的諾基亞N900手機上的環境光線傳感器的強度中的光強度。如何輪詢/ sys中的文件

See thread on talk.maemo.org here

我試圖用pyinotify中輪詢文件,但這個看起來某種我錯了,因爲該文件常是「process_IN_OPEN」,「process_IN_ACCESS」和「process_IN_CLOSE_NOWRITE」

我基本上要得到儘快改變,如果事情發生了轉變觸發一個事件,執行一類...

這是我試過的代碼,它的工作原理,但並不如我所料(我希望的process_IN_MODIFY被觸發):

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

更新1:

Mmmh,所有我想出了無需線索,如果有一個特殊的機制如下:

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

這裹在自己的線程,可以訣竅,但沒有人有更聰明,更少的CPU佔用和更快的方式來獲得最新的價值?

回答

1

由於/ sys/file是一個僞文件,它只是提供了一個底層的易失操作系統值的視圖,所以永遠不會引發修改事件。由於該文件是從下面「修改」它不遵循常規文件系統語義。

如果修改事件永遠不會產生,那麼使用像pinotify這樣的軟件包不會讓你感覺到任何地方。 '會更好地尋找平臺特定的機制。

響應更新1:

由於N900的Maemo運行時支持GFileMonitor,你會做得很好,檢查它是否可以提供你想要的異步事件。

忙於等待 - 正如我所知,你知道 - 是浪費。在手機上,它可以真正耗盡電池。你至少應該睡在忙碌的循環中。

0

Mmmh,所有我想出了無需線索,如果有一個特殊的機制如下:

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

這裹在自己的線程,可以在招,但沒有任何人有一個更聰明,更少的CPU佔用和更快的獲取最新價值的方式?

Cheers Bjoern