[pkg-fso-commits] [SCM] framworkd debian packageing branch, master, updated. milestone2-110-g76700a0
Michael 'Mickey' Lauer
mickey at vanille-media.de
Tue Sep 2 10:34:57 UTC 2008
The following commit has been merged in the master branch:
commit e9d9a1994c1947d51eba8d4f7368f40b69b0fc0d
Author: Michael 'Mickey' Lauer <mickey at vanille-media.de>
Date: Wed Aug 27 15:53:57 2008 +0200
odeviced: use kobject uevent netlink socket to implement polling-free power status notifications
diff --git a/ChangeLog b/ChangeLog
index 0977b8e..575aa7f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,19 @@
+2008-08-27 Michael Lauer <mickey at openmoko.org>
+
+ * [odeviced] Implement power status notifications using netlink socket
+
+2008-08-26 Michael Lauer <mickey at openmoko.org>
+
+ * org.freesmartphone.Objects.ListObjectsByInterface is now implemented
+ using introspection.
+
+2008-08-15 Guillaume Chereau <charlie at openmoko.org>
+
+ * [oeventsd] Revamp oevents subsystem to be more flexible using yaml rules
+
2008-08-09 Michael Lauer <mickey at vanille-media.de>
- * Implement basic USSD support
+ * [ogsmd] Implement basic USSD support
2008-08-03 Michael Lauer <mickey at vanille-media.de>
diff --git a/framework/subsystems/odeviced/kernel26.py b/framework/subsystems/odeviced/kernel26.py
index 1619b46..1dee099 100644
--- a/framework/subsystems/odeviced/kernel26.py
+++ b/framework/subsystems/odeviced/kernel26.py
@@ -8,12 +8,17 @@ GPLv2 or later
"""
MODULE_NAME = "odeviced.kernel26"
-__version__ = "0.9.2"
+__version__ = "0.9.3"
from helpers import DBUS_INTERFACE_PREFIX, DBUS_PATH_PREFIX, readFromFile, writeToFile, cleanObjectName
+from framework.config import config
import dbus.service
-import os, time, sys
+
+import gobject
+
+import os, time, sys, socket
+socket.NETLINK_KOBJECT_UEVENT = 15 # not present in earlier versions
import logging
logger = logging.getLogger( MODULE_NAME )
@@ -124,6 +129,73 @@ class PowerSupply( dbus.service.Object ):
logger.info( "%s %s initialized. Serving %s at %s" % ( self.__class__.__name__, __version__, self.interface, self.path ) )
self.node = node
+ self.ueventsock = s = socket.socket( socket.AF_NETLINK, socket.SOCK_DGRAM, socket.NETLINK_KOBJECT_UEVENT )
+ s.bind( ( os.getpid(), 1 ) )
+ self.ueventsockWatch = gobject.io_add_watch( s.fileno(), gobject.IO_IN, self.onUeventActivity )
+ capacityCheckTimeout = config.getInt( MODULE_NAME, "capacity_check_timeout", 60*5 )
+ self.capacityWatch = gobject.timeout_add_seconds( capacityCheckTimeout, self.onCapacityCheck )
+ gobject.idle_add( self.onColdstart )
+
+ self.powerStatus = "unknown"
+ self.online = False
+ self.capacity = 0
+
+ def onUeventActivity( self, source, condition ):
+ data = self.ueventsock.recv( 1024 )
+ logger.debug( "got data from uevent socket: %s" % repr(data) )
+ # split up and check whether this is really for us
+ parts = data.split( '\x00' )
+ name = parts[0]
+ myname = "power_supply/%s" % self.node.split("/")[-1]
+ if name.endswith( myname ):
+ gobject.idle_add( self.handlePropertyChange, dict( [ x.split('=') for x in parts if '=' in x ] ) )
+ return True # call me again
+
+ def onColdstart( self ):
+ data = readFromFile( "%s/uevent" % self.node )
+ parts = data.split( '\n' )
+ gobject.idle_add( self.handlePropertyChange, dict( [ x.split('=') for x in parts if '=' in x ] ) )
+ return False # don't call me again
+
+ def onCapacityCheck( self ):
+ data = readFromFile( "%s/capacity" % self.node )
+ try:
+ capacity = int( data )
+ except ValueError:
+ pass
+ else:
+ self.capacity = capacity # save for later queries
+ if self.online:
+ if capacity > 98:
+ self.sendPowerStatusIfChanged( "Full" )
+ else: # offline
+ if capacity < 5:
+ self.sendPowerStatusIfChanged( "Empty" )
+ elif capacity < 10:
+ self.sendPowerStatusIfChanged( "Critical" )
+ return True # call me again
+
+ def handlePropertyChange( self, properties ):
+ logger.debug( "got property change from uevent socket: %s" % properties )
+ try:
+ self.online = ( properties["POWER_SUPPLY_ONLINE"] == '1' )
+ except KeyError:
+ pass
+ try:
+ powerStatus = properties["POWER_SUPPLY_STATUS"]
+ except KeyError:
+ pass
+ else:
+ # FIXME: what should we do with the "Not Charging" state? It seems to be only a temporary state
+ # occuring during the time the charger has been physically inserted but not been yet enumerated on USB
+ if powerStatus != "Not charging":
+ self.sendPowerStatusIfChanged( powerStatus )
+ return False # don't call me again
+
+ def sendPowerStatusIfChanged( self, powerStatus ):
+ if powerStatus != self.powerStatus:
+ self.PowerStatus( powerStatus )
+
#
# dbus
#
@@ -145,7 +217,6 @@ class PowerSupply( dbus.service.Object ):
if capacity != "N/A":
return int(capacity)
-
energy_full = readFromFile( "%s/energy_full" % self.node )
energy_now = readFromFile( "%s/energy_now" % self.node )
if energy_full == "N/A" or energy_now == "N/A":
@@ -153,6 +224,15 @@ class PowerSupply( dbus.service.Object ):
else:
return 100 * int(energy_now) / int(energy_full)
+ @dbus.service.method( DBUS_INTERFACE, "", "s" )
+ def GetPowerStatus( self ):
+ return self.powerStatus
+
+ @dbus.service.signal( DBUS_INTERFACE, "s" )
+ def PowerStatus( self, status ):
+ self.powerStatus = status
+ logger.info( "power status now %s" % status )
+
#----------------------------------------------------------------------------#
class PowerSupplyApm( dbus.service.Object ):
#----------------------------------------------------------------------------#
--
framworkd debian packageing
More information about the pkg-fso-commits
mailing list