[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