123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- # Copyright (c) 2017 Ultimaker B.V.
- # Cura is released under the terms of the LGPLv3 or higher.
- from UM.Job import Job
- from UM.Logger import Logger
- from .avr_isp.stk500v2 import Stk500v2
- from time import time, sleep
- from serial import Serial, SerialException
- # An async job that attempts to find the correct baud rate for a USB printer.
- # It tries a pre-set list of baud rates. All these baud rates are validated by requesting the temperature a few times
- # and checking if the results make sense. If getResult() is not None, it was able to find a correct baud rate.
- class AutoDetectBaudJob(Job):
- def __init__(self, serial_port):
- super().__init__()
- self._serial_port = serial_port
- self._all_baud_rates = [115200, 250000, 230400, 57600, 38400, 19200, 9600]
- def run(self):
- Logger.log("d", "Auto detect baud rate started.")
- timeout = 3
- programmer = Stk500v2()
- serial = None
- try:
- programmer.connect(self._serial_port)
- serial = programmer.leaveISP()
- except:
- programmer.close()
- for baud_rate in self._all_baud_rates:
- Logger.log("d", "Checking {serial} if baud rate {baud_rate} works".format(serial= self._serial_port, baud_rate = baud_rate))
- if serial is None:
- try:
- serial = Serial(str(self._serial_port), baud_rate, timeout = timeout, writeTimeout = timeout)
- except SerialException as e:
- Logger.logException("w", "Unable to create serial")
- continue
- else:
- # We already have a serial connection, just change the baud rate.
- try:
- serial.baudrate = baud_rate
- except:
- continue
- sleep(1.5) # Ensure that we are not talking to the boot loader. 1.5 seconds seems to be the magic number
- successful_responses = 0
- serial.write(b"\n") # Ensure we clear out previous responses
- serial.write(b"M105\n")
- timeout_time = time() + timeout
- while timeout_time > time():
- line = serial.readline()
- if b"ok T:" in line:
- successful_responses += 1
- if successful_responses >= 3:
- self.setResult(baud_rate)
- return
- serial.write(b"M105\n")
- self.setResult(None) # Unable to detect the correct baudrate.
|