blob: e9cce1e2bd04e982abeaa3a463929c407595e9c2 [file] [log] [blame]
Steven Michalske2a9486d2015-08-06 22:35:21 -07001#!/usr/bin/env python
cliechtifab09872009-02-07 00:25:44 +00002
3# portable serial port access with python
4# this is a wrapper module for different platform implementations
cliechti89b4af12002-02-12 23:24:41 +00005#
cliechtif5716442010-01-02 03:06:21 +00006# (C) 2001-2010 Chris Liechti <cliechti@gmx.net>
cliechti89b4af12002-02-12 23:24:41 +00007# this is distributed under a free software license, see license.txt
8
Steven Michalske2a9486d2015-08-06 22:35:21 -07009VERSION = '3.0a'
cliechti89b4af12002-02-12 23:24:41 +000010
cliechti0bfe5252008-06-21 01:36:52 +000011import sys
12
cliechti4ff97242008-06-21 18:14:46 +000013if sys.platform == 'cli':
cliechti39cfb7b2011-08-22 00:30:07 +000014 from serial.serialcli import *
cliechti89b4af12002-02-12 23:24:41 +000015else:
cliechti4ff97242008-06-21 18:14:46 +000016 import os
cliechtifab09872009-02-07 00:25:44 +000017 # chose an implementation, depending on os
cliechti0bfe5252008-06-21 01:36:52 +000018 if os.name == 'nt': #sys.platform == 'win32':
cliechti39cfb7b2011-08-22 00:30:07 +000019 from serial.serialwin32 import *
cliechti0bfe5252008-06-21 01:36:52 +000020 elif os.name == 'posix':
cliechti39cfb7b2011-08-22 00:30:07 +000021 from serial.serialposix import *
cliechti0bfe5252008-06-21 01:36:52 +000022 elif os.name == 'java':
cliechti39cfb7b2011-08-22 00:30:07 +000023 from serial.serialjava import *
cliechti0bfe5252008-06-21 01:36:52 +000024 else:
cliechti330185e2011-08-18 22:45:17 +000025 raise ImportError("Sorry: no implementation for your platform ('%s') available" % (os.name,))
26
cliechti89b4af12002-02-12 23:24:41 +000027
cliechtie542b362011-03-18 00:49:16 +000028protocol_handler_packages = [
29 'serial.urlhandler',
30 ]
cliechti109486b2009-08-02 00:00:11 +000031
cliechtie3ab3532009-08-05 12:40:38 +000032def serial_for_url(url, *args, **kwargs):
cliechtie542b362011-03-18 00:49:16 +000033 """\
cliechti330185e2011-08-18 22:45:17 +000034 Get an instance of the Serial class, depending on port/url. The port is not
35 opened when the keyword parameter 'do_not_open' is true, by default it
36 is. All other parameters are directly passed to the __init__ method when
37 the port is instantiated.
cliechtie542b362011-03-18 00:49:16 +000038
39 The list of package names that is searched for protocol handlers is kept in
cliechti330185e2011-08-18 22:45:17 +000040 ``protocol_handler_packages``.
cliechtie542b362011-03-18 00:49:16 +000041
42 e.g. we want to support a URL ``foobar://``. A module
43 ``my_handlers.protocol_foobar`` is provided by the user. Then
44 ``protocol_handler_packages.append("my_handlers")`` would extend the search
45 path so that ``serial_for_url("foobar://"))`` would work.
46 """
cliechti9b1d3ad2009-08-02 23:47:04 +000047 # check remove extra parameter to not confuse the Serial class
48 do_open = 'do_not_open' not in kwargs or not kwargs['do_not_open']
49 if 'do_not_open' in kwargs: del kwargs['do_not_open']
cliechtiaaf778a2009-08-05 17:59:15 +000050 # the default is to use the native version
51 klass = Serial # 'native' implementation
cliechti9b1d3ad2009-08-02 23:47:04 +000052 # check port type and get class
cliechtiaaf778a2009-08-05 17:59:15 +000053 try:
54 url_nocase = url.lower()
55 except AttributeError:
cliechti2a6d5332011-03-04 02:08:32 +000056 # it's not a string, use default
cliechtiaaf778a2009-08-05 17:59:15 +000057 pass
cliechti109486b2009-08-02 00:00:11 +000058 else:
cliechti2a6d5332011-03-04 02:08:32 +000059 if '://' in url_nocase:
60 protocol = url_nocase.split('://', 1)[0]
cliechtie542b362011-03-18 00:49:16 +000061 for package_name in protocol_handler_packages:
62 module_name = '%s.protocol_%s' % (package_name, protocol,)
63 try:
64 handler_module = __import__(module_name)
65 except ImportError:
66 pass
67 else:
68 klass = sys.modules[module_name].Serial
69 break
cliechti2a6d5332011-03-04 02:08:32 +000070 else:
cliechtie542b362011-03-18 00:49:16 +000071 raise ValueError('invalid URL, protocol %r not known' % (protocol,))
cliechtiaaf778a2009-08-05 17:59:15 +000072 else:
73 klass = Serial # 'native' implementation
cliechti9b1d3ad2009-08-02 23:47:04 +000074 # instantiate and open when desired
cliechti109486b2009-08-02 00:00:11 +000075 instance = klass(None, *args, **kwargs)
76 instance.port = url
cliechti9b1d3ad2009-08-02 23:47:04 +000077 if do_open:
cliechti109486b2009-08-02 00:00:11 +000078 instance.open()
79 return instance