[pkg-fso-commits] [SCM] FSO frameworkd Debian packaging branch, master, updated. milestone4-368-g700ab82

Michael 'Mickey' Lauer mickey at vanille-media.de
Mon Feb 2 18:51:28 UTC 2009


The following commit has been merged in the master branch:
commit ab4a24f465240b1eea8e29d4aeafc09a9a0f4563
Author: Michael 'Mickey' Lauer <mickey at vanille-media.de>
Date:   Sun Nov 30 16:48:32 2008 +0100

    ogsmd: start with support for the CINTERION MC75(i)

diff --git a/ChangeLog b/ChangeLog
index 09b3369..af8eb00 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2008-11-30	Michael Lauer	<mickey at openmoko.org>
+
+	* [ogsmd] Start with CINTERION MC75 support
+
 2008-11-28	Michael Lauer	<mickey at openmoko.org>
 
 	* [ogsmd] Revamped callhandling. Refactored the state-based call handler
diff --git a/framework/subsystems/ogsmd/modems/__init__.py b/framework/subsystems/ogsmd/modems/__init__.py
index e61f540..49d503e 100644
--- a/framework/subsystems/ogsmd/modems/__init__.py
+++ b/framework/subsystems/ogsmd/modems/__init__.py
@@ -18,6 +18,7 @@ theModem = None
 theMediator = None
 
 modemmap = { \
+    "cinterion_mc75":    "CinterionMc75",
     "freescale_neptune": "FreescaleNeptune",
     "muxed4line":        "Muxed4Line",
     "option":            "Option",
@@ -53,6 +54,9 @@ def modemFactory( modemtype ):
     elif modemtype == "option":
         from option.modem import Option as Modem
         import option.mediator as mediator
+    elif modemtype == "cinterion_mc75":
+        from cinterion_mc75.modem import CinterionMc75 as Modem
+        import cinterion_mc75.mediator as mediator
     else:
         assert False, "must never reach this"
         sys.exit( -1 )
diff --git a/framework/patterns/__init__.py b/framework/subsystems/ogsmd/modems/cinterion_mc75/__init__.py
similarity index 100%
copy from framework/patterns/__init__.py
copy to framework/subsystems/ogsmd/modems/cinterion_mc75/__init__.py
diff --git a/framework/subsystems/ogsmd/modems/cinterion_mc75/channel.py b/framework/subsystems/ogsmd/modems/cinterion_mc75/channel.py
new file mode 100644
index 0000000..1adaad0
--- /dev/null
+++ b/framework/subsystems/ogsmd/modems/cinterion_mc75/channel.py
@@ -0,0 +1,116 @@
+#!/usr/bin/env python
+"""
+The Open GSM Daemon -- Python Implementation
+
+(C) 2008 Michael 'Mickey' Lauer <mlauer at vanille-media.de>
+(C) 2008 Openmoko, Inc.
+GPLv2 or later
+
+Package: ogsmd.modems.cinterion_mc75
+Module: channel
+"""
+
+from ogsmd.modems.abstract.channel import AbstractModemChannel
+from ogsmd.gsm.callback import SimpleCallback
+
+import itertools, select
+
+import logging
+logger = logging.getLogger( "ogsmd.modems.cinterion_mc75.channel" )
+
+#=========================================================================#
+class CinterionModemChannel( AbstractModemChannel ):
+#=========================================================================#
+
+    def _hookLowLevelInit( self ):
+        """
+        Low level initialization of channel.
+
+        This is actually an ugly hack which is unfortunately
+        necessary since the multiplexer obviously has problems
+        wrt. to initialization (swallowing first bunch of commands now and then...)
+        To work around this, we send '\x1a\r\n' until we actually get an
+        'OK' from the modem. We try this for 5 times, then we reopen
+        the serial line. If after 10 times we still have no response,
+        we assume that the modem is broken and fail.
+        """
+        for i in itertools.count():
+            logger.debug( "(modem init... try #%d)", i+1 )
+            select.select( [], [self.serial.fd], [], 2 )
+            self.serial.write( "AT\r\n" )
+            r, w, x = select.select( [self.serial.fd], [], [], 2 )
+            if r:
+                try:
+                    buf = self.serial.inWaiting()
+                # FIXME remove catchall here
+                except:
+                    self.serial.close()
+                    path = self.pathfactory( self.name )
+                    if not path: # path is None or ""
+                        return False
+                    self.serial.port = str( path )
+                    self.serial.open()
+                    buf = self.serial.inWaiting()
+                ok = self.serial.read(buf).strip()
+                logger.debug( "read: %s", ok )
+                if "OK" in ok or "AT" in ok:
+                    break
+            logger.debug( "(modem not responding)" )
+            if i == 5:
+                logger.debug( "(reopening modem)" )
+                self.serial.close()
+                path = self.pathfactory( self.name )
+                if not path: # path is None or ""
+                    return False
+                self.serial.port = str( path )
+                self.serial.open()
+
+            if i == 10:
+                logger.warning( "(can't read from modem. giving up)" )
+                self.serial.close()
+                return False
+        logger.info( "%s: responding OK" % self )
+        self.serial.flushInput()
+        return True
+
+#=========================================================================#
+class MiscChannel( CinterionModemChannel ):
+#=========================================================================#
+    def __init__( self, *args, **kwargs ):
+        if not "timeout" in kwargs:
+            kwargs["timeout"] = 60*60
+        CinterionModemChannel.__init__( self, *args, **kwargs )
+        self.callback = None
+
+    def setIntermediateResponseCallback( self, callback ):
+        assert self.callback is None, "callback already set"
+        self.callback = callback
+
+    def handleUnsolicitedResponse( self, response ):
+        if self.callback is not None:
+            self.callback( response )
+        else:
+            print "CALLCHANNEL: UNHANDLED INTERMEDIATE: ", response
+
+#=========================================================================#
+class UnsolicitedResponseChannel( CinterionModemChannel ):
+#=========================================================================#
+
+    def __init__( self, *args, **kwargs ):
+        CinterionModemChannel.__init__( self, *args, **kwargs )
+
+    def _populateCommands( self ):
+        CinterionModemChannel._populateCommands( self )
+
+        c = self._commands["init"]
+        # enable unsolicited codes
+
+        c.append( "+CLIP=1" ) # calling line identification presentation enable
+        c.append( "+COLP=1" ) # connected line identification presentation enable
+        c.append( "+CCWA=1" ) # call waiting: send unsol. code
+        c.append( "+CSSN=1,1") # supplementary service notifications: send unsol. code
+        c.append( "+CRC=1" ) # cellular result codes: extended
+        c.append( "+CSNS=0" ) # single numbering scheme: voice
+        c.append( "+CTZU=1" ) # timezone update
+        c.append( "+CTZR=1" ) # timezone reporting
+        c.append( "+CREG=2" ) # registration information (TODO not all modems support that)
diff --git a/framework/subsystems/ogsmd/modems/option/mediator.py b/framework/subsystems/ogsmd/modems/cinterion_mc75/mediator.py
similarity index 72%
copy from framework/subsystems/ogsmd/modems/option/mediator.py
copy to framework/subsystems/ogsmd/modems/cinterion_mc75/mediator.py
index dc7844a..580ba8e 100644
--- a/framework/subsystems/ogsmd/modems/option/mediator.py
+++ b/framework/subsystems/ogsmd/modems/cinterion_mc75/mediator.py
@@ -1,12 +1,12 @@
 #!/usr/bin/env python
 """
-The Open Device Daemon - Python Implementation
+The Open GSM Daemon -- Python Implementation
 
 (C) 2008 Michael 'Mickey' Lauer <mlauer at vanille-media.de>
 (C) 2008 Openmoko, Inc.
 GPLv2 or later
 
-Package: ogsmd.modems.option
+Package: ogsmd.modems.cinterion_mc75
 Module: mediator
 """
 
diff --git a/framework/subsystems/ogsmd/modems/muxed4line/modem.py b/framework/subsystems/ogsmd/modems/cinterion_mc75/modem.py
similarity index 58%
copy from framework/subsystems/ogsmd/modems/muxed4line/modem.py
copy to framework/subsystems/ogsmd/modems/cinterion_mc75/modem.py
index b53c356..f0516e3 100644
--- a/framework/subsystems/ogsmd/modems/muxed4line/modem.py
+++ b/framework/subsystems/ogsmd/modems/cinterion_mc75/modem.py
@@ -1,57 +1,58 @@
 #!/usr/bin/env python
 """
-The Open Device Daemon - Python Implementation
+The Open GSM Daemon -- Python Implementation
 
 (C) 2008 Michael 'Mickey' Lauer <mlauer at vanille-media.de>
 (C) 2008 Openmoko, Inc.
 GPLv2 or later
 
-Package: ogsmd.modems.muxed4line
+Package: ogsmd.modems.cinterion_mc75
 Module: modem
 """
 
-__version__ = "1.0.0"
-MODULE_NAME = "ogsmd.modems.muxed4line"
+__version__ = "0.0.0"
+MODULE_NAME = "ogsmd.modems.cinterion_mc75"
 
 import mediator
 
 from ogsmd.modems.abstract.modem import AbstractModem
 
-from .channel import CallChannel, UnsolicitedResponseChannel, MiscChannel
+from .channel import UnsolicitedResponseChannel, MiscChannel
 from .unsolicited import UnsolicitedResponseDelegate
 
-from ogsmd.gsm.decor import logged
-from ogsmd.gsm.channel import AtCommandChannel
-
 #=========================================================================#
-class Muxed4Line( AbstractModem ):
+class CinterionMc75( AbstractModem ):
 #=========================================================================#
 
-    @logged
     def __init__( self, *args, **kwargs ):
         AbstractModem.__init__( self, *args, **kwargs )
 
         # VC 1
-        self._channels["CALL"] = CallChannel( self.pathfactory, "ogsmd.call", modem=self )
+        self._channels["MISC"] = MiscChannel( self.pathfactory, "ogsmd.misc", modem=self )
         # VC 2
         self._channels["UNSOL"] = UnsolicitedResponseChannel( self.pathfactory, "ogsmd.unsolicited", modem=self )
         # VC 3
-        self._channels["MISC"] = MiscChannel( self.pathfactory, "ogsmd.misc", modem=self )
-        # VC 4
         # GPRS
 
         # configure channels
         self._channels["UNSOL"].setDelegate( UnsolicitedResponseDelegate( self._object, mediator ) )
 
     def channel( self, category ):
-        if category == "CallMediator":
-            return self._channels["CALL"]
-        elif category == "UnsolicitedMediator":
+        if category == "UnsolicitedMediator":
             return self._channels["UNSOL"]
         else:
             return self._channels["MISC"]
 
-    def pathfactory( self ):
-        """Allocate a new channel from the MUXer."""
+    def pathfactory( self, name ):
+        """
+        Allocate a new channel from the MUXer.
+
+        Overridden for internal purposes.
+        """
+        muxer = self._bus.get_object( "org.pyneo.muxer", "/org/pyneo/Muxer" )
+        return str( muxer.AllocChannel( name, dbus_interface="org.freesmartphone.GSM.MUX" ) )
+
+    def dataPort( self ):
+        # FIXME remove duplication and just use pathfactory
         muxer = self._bus.get_object( "org.pyneo.muxer", "/org/pyneo/Muxer" )
-        return str( muxer.AllocChannel( self.name ) )
+        return muxer.AllocChannel( "ogsmd.gprs", dbus_interface="org.freesmartphone.GSM.MUX" )
diff --git a/framework/subsystems/ogsmd/modems/muxed4line/unsolicited.py b/framework/subsystems/ogsmd/modems/cinterion_mc75/unsolicited.py
similarity index 79%
copy from framework/subsystems/ogsmd/modems/muxed4line/unsolicited.py
copy to framework/subsystems/ogsmd/modems/cinterion_mc75/unsolicited.py
index 8d6d976..83fc002 100644
--- a/framework/subsystems/ogsmd/modems/muxed4line/unsolicited.py
+++ b/framework/subsystems/ogsmd/modems/cinterion_mc75/unsolicited.py
@@ -1,12 +1,12 @@
 #!/usr/bin/env python
 """
-The Open Device Daemon - Python Implementation
+The Open GSM Daemon -- Python Implementation
 
 (C) 2008 Michael 'Mickey' Lauer <mlauer at vanille-media.de>
 (C) 2008 Openmoko, Inc.
 GPLv2 or later
 
-Package: ogsmd.modems.muxed4line
+Package: ogsmd.modems.cinterion_mc75
 Module: unsolicited
 """
 
diff --git a/framework/subsystems/ogsmd/modems/freescale_neptune/mediator.py b/framework/subsystems/ogsmd/modems/freescale_neptune/mediator.py
index 1d63a0f..3798230 100644
--- a/framework/subsystems/ogsmd/modems/freescale_neptune/mediator.py
+++ b/framework/subsystems/ogsmd/modems/freescale_neptune/mediator.py
@@ -12,7 +12,7 @@ Module: mediator
 __version__ = "0.5.0.0"
 MODULE_NAME = "ogsmd.modems.freescale_neptune.mediator"
 
-from ogsmd.modems.abstract import *
+from ogsmd.modems.abstract.mediator import *
 from ogsmd.gsm.decor import logged
 from ogsmd.gsm import const
 from ogsmd.helpers import safesplit
diff --git a/framework/subsystems/ogsmd/modems/muxed4line/modem.py b/framework/subsystems/ogsmd/modems/muxed4line/modem.py
index b53c356..e9f13dd 100644
--- a/framework/subsystems/ogsmd/modems/muxed4line/modem.py
+++ b/framework/subsystems/ogsmd/modems/muxed4line/modem.py
@@ -51,7 +51,16 @@ class Muxed4Line( AbstractModem ):
         else:
             return self._channels["MISC"]
 
-    def pathfactory( self ):
-        """Allocate a new channel from the MUXer."""
+    def pathfactory( self, name ):
+        """
+        Allocate a new channel from the MUXer.
+
+        Overridden for internal purposes.
+        """
+        muxer = self._bus.get_object( "org.pyneo.muxer", "/org/pyneo/Muxer" )
+        return str( muxer.AllocChannel( name, dbus_interface="org.freesmartphone.GSM.MUX" ) )
+
+    def dataPort( self ):
+        # FIXME remove duplication and just use pathfactory
         muxer = self._bus.get_object( "org.pyneo.muxer", "/org/pyneo/Muxer" )
-        return str( muxer.AllocChannel( self.name ) )
+        return muxer.AllocChannel( "ogsmd.gprs", dbus_interface="org.freesmartphone.GSM.MUX" )
diff --git a/framework/subsystems/ogsmd/modems/ti_calypso/channel.py b/framework/subsystems/ogsmd/modems/ti_calypso/channel.py
index f2028e3..cac6e90 100644
--- a/framework/subsystems/ogsmd/modems/ti_calypso/channel.py
+++ b/framework/subsystems/ogsmd/modems/ti_calypso/channel.py
@@ -46,7 +46,7 @@ class CalypsoModemChannel( AbstractModemChannel ):
         This is actually an ugly hack which is unfortunately
         necessary since the TI multiplexer obviously has problems
         wrt. to initialization (swallowing first bunch of commands now and then...)
-        To work around this, we send '\x1a\r\n' until we actually get an
+        To work around this, we send 'ATE0\r\n' until we actually get an
         'OK' from the modem. We try this for 5 times, then we reopen
         the serial line. If after 10 times we still have no response,
         we assume that the modem is broken and fail.
@@ -54,7 +54,7 @@ class CalypsoModemChannel( AbstractModemChannel ):
         for i in itertools.count():
             logger.debug( "(modem init... try #%d)", i+1 )
             select.select( [], [self.serial.fd], [], 0.5 )
-            self.serial.write( "\x1a\r\n" )
+            self.serial.write( "ATE0\r\n" )
             r, w, x = select.select( [self.serial.fd], [], [], 0.5 )
             if r:
                 try:
diff --git a/framework/subsystems/ogsmd/modems/ti_calypso/modem.py b/framework/subsystems/ogsmd/modems/ti_calypso/modem.py
index 369d0ee..9f701e0 100644
--- a/framework/subsystems/ogsmd/modems/ti_calypso/modem.py
+++ b/framework/subsystems/ogsmd/modems/ti_calypso/modem.py
@@ -79,12 +79,12 @@ class TiCalypso( AbstractModem ):
         Overridden for internal purposes.
         """
         muxer = self._bus.get_object( "org.pyneo.muxer", "/org/pyneo/Muxer" )
-        return str( muxer.AllocChannel( name ) )
+        return str( muxer.AllocChannel( name, dbus_interface="org.freesmartphone.GSM.MUX" ) )
 
     def dataPort( self ):
         # FIXME remove duplication and just use pathfactory
         muxer = self._bus.get_object( "org.pyneo.muxer", "/org/pyneo/Muxer" )
-        return muxer.AllocChannel( "ogsmd.gprs" )
+        return muxer.AllocChannel( "ogsmd.gprs", dbus_interface="org.freesmartphone.GSM.MUX" )
 
     def dataOptions( self, category ):
         if category == "ppp":

-- 
FSO frameworkd Debian packaging



More information about the pkg-fso-commits mailing list