15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#! python
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# Python Serial Port Extension for Win32, Linux, BSD, Jython
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# see __init__.py
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# This module implements a special URL handler that uses the port listing to
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# find ports by searching the string descriptions.
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# (C) 2011 Chris Liechti <cliechti@gmx.net>
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# this is distributed under a free software license, see license.txt
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# URL format:    hwgrep://regexp
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)import serial
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)import serial.tools.list_ports
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class Serial(serial.Serial):
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    """Just inherit the native Serial port implementation and patch the open function."""
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    def setPort(self, value):
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        """translate port name before storing it"""
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        if isinstance(value, basestring) and value.startswith('hwgrep://'):
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            serial.Serial.setPort(self, self.fromURL(value))
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        else:
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            serial.Serial.setPort(self, value)
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    def fromURL(self, url):
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        """extract host and port from an URL string"""
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        if url.lower().startswith("hwgrep://"): url = url[9:]
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        # use a for loop to get the 1st element from the generator
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        for port, desc, hwid in serial.tools.list_ports.grep(url):
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            return port
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        else:
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            raise serial.SerialException('no ports found matching regexp %r' % (url,))
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    # override property
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    port = property(serial.Serial.getPort, setPort, doc="Port setting")
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)if __name__ == '__main__':
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    #~ s = Serial('hwgrep://ttyS0')
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    s = Serial(None)
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    s.port = 'hwgrep://ttyS0'
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    print s
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
46