[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