diff -r 51bf56ba3c10 -r 0bbb006204fc printrun-src/printrun/serialWrapper.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/printrun-src/printrun/serialWrapper.py Fri Jun 03 09:16:07 2016 +0200 @@ -0,0 +1,49 @@ +# Serial wrapper around pyserial that adds support for custom baudrates (250000) +# on linux, when pyserial is < 2.7 + +# This code was copied from the pyserial 2.7 base code. +# Therefore, it follows the license used by pyserial which is the '3-clause BSD license' + +from serial import * +import sys + +if sys.platform.startswith('linux'): + import serial.serialposix + + try: + import pkg_resources + + old_version = float(pkg_resources.get_distribution("pyserial").version) < 2.7 + except: + old_version = True + + if old_version and not hasattr(serial.serialposix, "TCGETS2") and \ + hasattr(serial.serialposix, "set_special_baudrate"): + # Detected pyserial < 2.7 which doesn't support custom baudrates + # Replacing set_special_baudrate with updated function from pyserial 2.7 + + TCGETS2 = 0x802C542A + TCSETS2 = 0x402C542B + BOTHER = 0o010000 + + def set_special_baudrate(port, baudrate): + # right size is 44 on x86_64, allow for some growth + import array + buf = array.array('i', [0] * 64) + + try: + # get serial_struct + FCNTL.ioctl(port.fd, TCGETS2, buf) + # set custom speed + buf[2] &= ~TERMIOS.CBAUD + buf[2] |= BOTHER + buf[9] = buf[10] = baudrate + + # set serial_struct + res = FCNTL.ioctl(port.fd, TCSETS2, buf) + except IOError, e: + raise ValueError('Failed to set custom baud rate (%s): %s' % (baudrate, e)) + + # We need to change the function inside the serialposix module otherwise, it won't + # be called by the code within that module + serial.serialposix.set_special_baudrate = set_special_baudrate