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