From 97a4808bf2e4e133ee610405508f5abd6330fed4 Mon Sep 17 00:00:00 2001 From: Youness Alaoui Date: Mon, 30 Nov 2015 16:17:55 -0500 Subject: [PATCH] Add a wrapper around serial to monkey patch support for custom baudrates This fixes T316. The monkey patch (https://en.wikipedia.org/wiki/Monkey_patch) replaces the set_special_baudrate from 2.6 by the function from 2.7 which fixes setting 250000 baudrate on linux. See T316 for more details on the actual patch --- Cura/gui/firmwareInstall.py | 3 ++- Cura/util/machineCom.py | 2 +- Cura/util/serialWrapper.py | 38 +++++++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 Cura/util/serialWrapper.py diff --git a/Cura/gui/firmwareInstall.py b/Cura/gui/firmwareInstall.py index 61894669..7c370cae 100644 --- a/Cura/gui/firmwareInstall.py +++ b/Cura/gui/firmwareInstall.py @@ -5,7 +5,8 @@ import wx import threading import sys import time -import serial + +from Cura.util import serialWrapper as serial from Cura.avr_isp import stk500v2 from Cura.avr_isp import ispBase diff --git a/Cura/util/machineCom.py b/Cura/util/machineCom.py index 0178bfb9..d01f233d 100644 --- a/Cura/util/machineCom.py +++ b/Cura/util/machineCom.py @@ -15,7 +15,7 @@ import threading import platform import Queue as queue -import serial +from Cura.util import serialWrapper as serial from Cura.avr_isp import stk500v2 from Cura.avr_isp import ispBase diff --git a/Cura/util/serialWrapper.py b/Cura/util/serialWrapper.py new file mode 100644 index 00000000..f41c686f --- /dev/null +++ b/Cura/util/serialWrapper.py @@ -0,0 +1,38 @@ +# Serial wrapper around pyserial that adds support for custom baudrates (250000) +# on linux, when pyserial is < 2.7 + +from serial import * +import os +if os.name == 'posix': + import serial.serialposix + + if 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 -- 2.30.2