mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-04-21 21:29:41 +08:00
67 lines
2.5 KiB
Python
67 lines
2.5 KiB
Python
# 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.
|