コード例 #1
0
ファイル: modem.py プロジェクト: freesmartphone/framework
class CinterionMc75(AbstractModem):
    #=========================================================================#

    def __init__(self, *args, **kwargs):
        AbstractModem.__init__(self, *args, **kwargs)

        self._channelmap = {"ogsmd.misc": 1, "ogsmd.unsolicited": 2}

        # VC 1
        self._channels["MISC"] = MiscChannel(self.pathfactory,
                                             "ogsmd.misc",
                                             modem=self)
        # VC 2
        self._channels["UNSOL"] = UnsolicitedResponseChannel(
            self.pathfactory, "ogsmd.unsolicited", modem=self)
        # VC 3
        # GPRS

        # configure channels
        self._channels["UNSOL"].setDelegate(
            UnsolicitedResponseDelegate(self._object, mediator))

        # muxer object
        self._muxeriface = None

    def _modemOn(self):
        """
        Lowlevel initialize this modem.
        """
        logger.debug("reset-cycling modem")
        writeToFile(MODEM_SYSFS_POWER_PATH, "0\n")
        sleep(1)
        writeToFile(MODEM_SYSFS_POWER_PATH, "1\n")
        sleep(1)
        logger.debug("reset cycle complete")
        sleep(2)
        # FIXME open device node and listen for \r\n^SYSSTART\r\n
        return True

    def _modemOff(self):
        """
        Lowlevel deinitialize this modem.
        """
        writeToFile(MODEM_SYSFS_POWER_PATH, "0\n")

    def channel(self, category):
        """
        Return proper outgoing channel for command category.
        """
        if category in ("UnsolicitedMediator", "NetworkMediator"):
            return self._channels["UNSOL"]
        else:
            return self._channels["MISC"]

    def pathfactory(self, name):
        """
        Allocate a new channel from the MUXer.

        Overridden for internal purposes.
        """
        logger.info("Requesting new channel from multiplexer")

        if self._muxeriface is None:
            muxer = self._bus.get_object("org.freesmartphone.omuxerd",
                                         "/org/freesmartphone/GSM/Muxer")
            self._muxeriface = Interface(muxer, "org.freesmartphone.GSM.MUX")
            # power on modem
            if not self._modemOn():
                self._muxeriface = None
                return ""  # FIXME: emit error?
            if not self._muxeriface.HasAutoSession():
                # abyss needs an open session before we can allocate channels
                self._muxeriface.OpenSession(True, 98, MODEM_DEVICE_PATH,
                                             115200)
        pts, vc = self._muxeriface.AllocChannel(name, self._channelmap[name])
        return str(pts)

    def dataPort(self):
        return self.pathfactory("ogsmd.gprs")
コード例 #2
0
class TiCalypso(AbstractModem):
    #=========================================================================#

    def __init__(self, *args, **kwargs):
        # kernel specific paths
        global SYSFS_CALYPSO_POWER_PATH
        global SYSFS_CALYPSO_RESET_PATH
        global SYSFS_CALYPSO_FLOW_CONTROL_PATH
        kernel_release = os.uname()[2]
        if kernel_release >= "2.6.32":
            SYSFS_CALYPSO_POWER_PATH = "/sys/bus/platform/devices/gta02-pm-gsm.0/power_on"
            SYSFS_CALYPSO_RESET_PATH = "/sys/bus/platform/devices/gta02-pm-gsm.0/reset"
            SYSFS_CALYPSO_FLOW_CONTROL_PATH = "/sys/bus/platform/devices/gta02-pm-gsm.0/flowcontrolled"
            logger.info("Kernel >=2.6.32, gsm sysfs path updated")

        AbstractModem.__init__(self, *args, **kwargs)

        self._channelmap = {
            "ogsmd.call": 1,
            "ogsmd.unsolicited": 2,
            "ogsmd.misc": 3,
            "ogsmd.gprs": 4
        }

        # VC 1
        self._channels["CALL"] = CallChannel(self.pathfactory,
                                             "ogsmd.call",
                                             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
        # FIXME pre-allocate GPRS channel for pppd?

        # configure channels
        self._channels["UNSOL"].setDelegate(
            UnsolicitedResponseDelegate(self._object, mediator))

        # configure behaviour using special commands
        self._data["cancel-outgoing-call"] = "%CHLD=I"

        # muxer mode
        self._muxercommand = config.getValue("ogsmd", "ti_calypso_muxer",
                                             "gsm0710muxd")

        # muxer object
        self._muxeriface = None

    def _modemOn(self):
        """
        Lowlevel initialize this modem.
        """
        logger.debug("reset-cycling modem")
        writeToFile(SYSFS_CALYPSO_POWER_PATH, "0\n")
        sleep(1)
        writeToFile(SYSFS_CALYPSO_RESET_PATH, "0\n")
        sleep(1)
        writeToFile(SYSFS_CALYPSO_POWER_PATH, "1\n")
        sleep(1)
        writeToFile(SYSFS_CALYPSO_RESET_PATH, "1\n")
        sleep(1)
        writeToFile(SYSFS_CALYPSO_RESET_PATH, "0\n")
        sleep(1)
        logger.debug("reset cycle complete")

        device = serial.Serial()
        device.port = DEVICE_CALYPSO_PATH
        device.baudrate = 115200
        device.rtscts = True
        device.xonxoff = False
        device.bytesize = serial.EIGHTBITS
        device.parity = serial.PARITY_NONE
        device.stopbits = serial.STOPBITS_ONE
        device.timeout = 1
        logger.debug("opening port now")
        device.open()
        device.write("\0xf9\0xf9")
        device.flush()
        sleep(0.2)
        device.write("\0x7E\0x03\0xEF\0xC3\0x01\0x70\0x7E")
        device.flush()
        sleep(0.2)
        device.write("\r\nAT\r\n")
        device.flush()
        result = device.read(64)
        logger.debug("got %s", repr(result))
        ok = False
        for retries in xrange(5):
            logger.debug("port open, sending ATE0")
            device.write("ATE0\r\n")
            device.flush()
            result = device.read(64)
            logger.debug("got %s", repr(result))
            if "OK" in result:
                ok = True
                break
        device.close()
        return ok

    def _modemOff(self):
        device = serial.Serial()
        device.port = DEVICE_CALYPSO_PATH
        device.baudrate = 115200
        device.rtscts = True
        device.xonxoff = False
        device.bytesize = serial.EIGHTBITS
        device.parity = serial.PARITY_NONE
        device.stopbits = serial.STOPBITS_ONE
        device.timeout = 1
        logger.debug("opening port now")
        device.open()
        device.write("\0xf9\0xf9")
        device.flush()
        sleep(0.2)
        device.write("\0x7E\0x03\0xEF\0xC3\0x01\0x70\0x7E")
        device.flush()
        sleep(0.2)
        device.write("\r\nAT@POFF\r\n")
        device.flush()
        sleep(0.2)
        writeToFile(SYSFS_CALYPSO_POWER_PATH, "0\n")

    def close(self):  # SYNC
        """
        Close modem.

        Overriden for internal purposes.
        """
        # call default implementation (closing all channels)
        AbstractModem.close(self)
        killall(self._muxercommand)
        # don't let two processes kill the power
        if self._muxercommand != "gsm0710muxd":
            self._modemOff()

    def channel(self, category):
        """
        Return proper channel.

        Overridden for internal purposes.
        """
        if category == "CallMediator":
            return self._channels["CALL"]
        elif category == "UnsolicitedMediator":
            return self._channels["UNSOL"]
        else:
            return self._channels["MISC"]

    def pathfactory(self, name):
        """
        Allocate a new channel from the MUXer.

        Overridden for internal purposes.
        """
        logger.info("Requesting new channel from '%s'", self._muxercommand)

        if self._muxercommand == "gsm0710muxd":
            if self._muxeriface is None:
                muxer = self._bus.get_object("org.pyneo.muxer",
                                             "/org/pyneo/Muxer")
                self._muxeriface = Interface(muxer,
                                             "org.freesmartphone.GSM.MUX")
            return str(self._muxeriface.AllocChannel(name))

        elif self._muxercommand == "fso-abyss":
            if self._muxeriface is None:
                muxer = self._bus.get_object("org.freesmartphone.omuxerd",
                                             "/org/freesmartphone/GSM/Muxer")
                self._muxeriface = Interface(muxer,
                                             "org.freesmartphone.GSM.MUX")
                # power on modem
                if not self._modemOn():
                    self._muxeriface = None
                    return ""  # FIXME: emit error?
                if not self._muxeriface.HasAutoSession():
                    # abyss needs an open session before we can allocate channels
                    self._muxeriface.OpenSession(True, 98, "serial",
                                                 DEVICE_CALYPSO_PATH, 115200)
            pts, vc = self._muxeriface.AllocChannel(name,
                                                    self._channelmap[name])
            return str(pts)

    def dataPort(self):
        return self.pathfactory("ogsmd.gprs")

    def prepareForSuspend(self, ok_callback, error_callback):
        """overridden for internal purposes"""

        # FIXME still no error handling here

        def post_ok(ok_callback=ok_callback):
            writeToFile(SYSFS_CALYPSO_FLOW_CONTROL_PATH, "1")
            ok_callback()

        AbstractModem.prepareForSuspend(self, post_ok, error_callback)

    def recoverFromSuspend(self, ok_callback, error_callback):
        writeToFile(SYSFS_CALYPSO_FLOW_CONTROL_PATH, "0")
        AbstractModem.recoverFromSuspend(self, ok_callback, error_callback)