Add bed temperature control to printer interface. Only show when we get an bed temperatur reading. Fixed #124
parent
560b1f8c39
commit
1b360728e7
|
@ -4,7 +4,8 @@ import __init__
|
||||||
import wx, os, platform, types, webbrowser, threading, time, re
|
import wx, os, platform, types, webbrowser, threading, time, re
|
||||||
import wx.wizard
|
import wx.wizard
|
||||||
|
|
||||||
from gui import machineCom
|
from gui import firmwareInstall
|
||||||
|
from util import machineCom
|
||||||
from util import profile
|
from util import profile
|
||||||
|
|
||||||
class InfoPage(wx.wizard.WizardPageSimple):
|
class InfoPage(wx.wizard.WizardPageSimple):
|
||||||
|
@ -132,7 +133,7 @@ class FirmwareUpgradePage(InfoPage):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def OnUpgradeClick(self, e):
|
def OnUpgradeClick(self, e):
|
||||||
if machineCom.InstallFirmware(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../firmware/default.hex")):
|
if firmwareInstall.InstallFirmware(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../firmware/default.hex")):
|
||||||
self.GetParent().FindWindowById(wx.ID_FORWARD).Enable()
|
self.GetParent().FindWindowById(wx.ID_FORWARD).Enable()
|
||||||
|
|
||||||
def OnSkipClick(self, e):
|
def OnSkipClick(self, e):
|
||||||
|
|
|
@ -0,0 +1,88 @@
|
||||||
|
from __future__ import absolute_import
|
||||||
|
import __init__
|
||||||
|
|
||||||
|
import os, glob, wx, threading, sys, time
|
||||||
|
|
||||||
|
from serial import Serial
|
||||||
|
|
||||||
|
from avr_isp import stk500v2
|
||||||
|
from avr_isp import ispBase
|
||||||
|
from avr_isp import intelHex
|
||||||
|
|
||||||
|
from util import machineCom
|
||||||
|
from util import profile
|
||||||
|
|
||||||
|
class InstallFirmware(wx.Dialog):
|
||||||
|
def __init__(self, filename, port = None):
|
||||||
|
super(InstallFirmware, self).__init__(parent=None, title="Firmware install", size=(250, 100))
|
||||||
|
if port == None:
|
||||||
|
port = profile.getPreference('serial_port')
|
||||||
|
|
||||||
|
sizer = wx.BoxSizer(wx.VERTICAL)
|
||||||
|
|
||||||
|
self.progressLabel = wx.StaticText(self, -1, 'Reading firmware...')
|
||||||
|
sizer.Add(self.progressLabel, 0, flag=wx.ALIGN_CENTER)
|
||||||
|
self.progressGauge = wx.Gauge(self, -1)
|
||||||
|
sizer.Add(self.progressGauge, 0, flag=wx.EXPAND)
|
||||||
|
self.okButton = wx.Button(self, -1, 'Ok')
|
||||||
|
self.okButton.Disable()
|
||||||
|
self.okButton.Bind(wx.EVT_BUTTON, self.OnOk)
|
||||||
|
sizer.Add(self.okButton, 0, flag=wx.ALIGN_CENTER)
|
||||||
|
self.SetSizer(sizer)
|
||||||
|
|
||||||
|
self.filename = filename
|
||||||
|
self.port = port
|
||||||
|
|
||||||
|
threading.Thread(target=self.OnRun).start()
|
||||||
|
|
||||||
|
self.ShowModal()
|
||||||
|
self.Destroy()
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
def OnRun(self):
|
||||||
|
hexFile = intelHex.readHex(self.filename)
|
||||||
|
wx.CallAfter(self.updateLabel, "Connecting to machine...")
|
||||||
|
programmer = stk500v2.Stk500v2()
|
||||||
|
programmer.progressCallback = self.OnProgress
|
||||||
|
if self.port == 'AUTO':
|
||||||
|
for self.port in machineCom.serialList():
|
||||||
|
try:
|
||||||
|
programmer.connect(self.port)
|
||||||
|
break
|
||||||
|
except ispBase.IspError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
programmer.connect(self.port)
|
||||||
|
except ispBase.IspError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if programmer.isConnected():
|
||||||
|
wx.CallAfter(self.updateLabel, "Uploading firmware...")
|
||||||
|
try:
|
||||||
|
programmer.programChip(hexFile)
|
||||||
|
wx.CallAfter(self.updateLabel, "Done!")
|
||||||
|
except ispBase.IspError as e:
|
||||||
|
wx.CallAfter(self.updateLabel, "Failed to write firmware.\n" + str(e))
|
||||||
|
|
||||||
|
programmer.close()
|
||||||
|
wx.CallAfter(self.okButton.Enable)
|
||||||
|
return
|
||||||
|
wx.MessageBox('Failed to find machine for firmware upgrade\nIs your machine connected to the PC?', 'Firmware update', wx.OK | wx.ICON_ERROR)
|
||||||
|
wx.CallAfter(self.Close)
|
||||||
|
|
||||||
|
def updateLabel(self, text):
|
||||||
|
self.progressLabel.SetLabel(text)
|
||||||
|
self.Layout()
|
||||||
|
|
||||||
|
def OnProgress(self, value, max):
|
||||||
|
wx.CallAfter(self.progressGauge.SetRange, max)
|
||||||
|
wx.CallAfter(self.progressGauge.SetValue, value)
|
||||||
|
|
||||||
|
def OnOk(self, e):
|
||||||
|
self.Close()
|
||||||
|
|
||||||
|
def OnClose(self, e):
|
||||||
|
self.Destroy()
|
||||||
|
|
|
@ -11,7 +11,7 @@ from gui import alterationPanel
|
||||||
from gui import validators
|
from gui import validators
|
||||||
from gui import preferencesDialog
|
from gui import preferencesDialog
|
||||||
from gui import configWizard
|
from gui import configWizard
|
||||||
from gui import machineCom
|
from gui import firmwareInstall
|
||||||
from gui import printWindow
|
from gui import printWindow
|
||||||
from gui import simpleMode
|
from gui import simpleMode
|
||||||
from gui import projectPlanner
|
from gui import projectPlanner
|
||||||
|
@ -278,7 +278,7 @@ class mainWindow(configBase.configWindowBase):
|
||||||
self.Close()
|
self.Close()
|
||||||
|
|
||||||
def OnDefaultMarlinFirmware(self, e):
|
def OnDefaultMarlinFirmware(self, e):
|
||||||
machineCom.InstallFirmware(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../firmware/default.hex"))
|
firmwareInstall.InstallFirmware(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../firmware/default.hex"))
|
||||||
|
|
||||||
def OnCustomFirmware(self, e):
|
def OnCustomFirmware(self, e):
|
||||||
dlg=wx.FileDialog(self, "Open firmware to upload", os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST)
|
dlg=wx.FileDialog(self, "Open firmware to upload", os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST)
|
||||||
|
@ -288,7 +288,7 @@ class mainWindow(configBase.configWindowBase):
|
||||||
if not(os.path.exists(filename)):
|
if not(os.path.exists(filename)):
|
||||||
return
|
return
|
||||||
#For some reason my Ubuntu 10.10 crashes here.
|
#For some reason my Ubuntu 10.10 crashes here.
|
||||||
machineCom.InstallFirmware(filename)
|
firmwareInstall.InstallFirmware(filename)
|
||||||
|
|
||||||
def OnFirstRunWizard(self, e):
|
def OnFirstRunWizard(self, e):
|
||||||
configWizard.configWizard()
|
configWizard.configWizard()
|
||||||
|
|
|
@ -6,7 +6,7 @@ import ConfigParser
|
||||||
|
|
||||||
from gui import configBase
|
from gui import configBase
|
||||||
from gui import validators
|
from gui import validators
|
||||||
from gui import machineCom
|
from util import machineCom
|
||||||
from util import profile
|
from util import profile
|
||||||
|
|
||||||
class preferencesDialog(configBase.configWindowBase):
|
class preferencesDialog(configBase.configWindowBase):
|
||||||
|
|
|
@ -4,9 +4,9 @@ import __init__
|
||||||
import wx, threading, re, subprocess, sys, os
|
import wx, threading, re, subprocess, sys, os
|
||||||
from wx.lib import buttons
|
from wx.lib import buttons
|
||||||
|
|
||||||
from gui import machineCom
|
|
||||||
from gui import icon
|
from gui import icon
|
||||||
from gui import toolbarUtil
|
from gui import toolbarUtil
|
||||||
|
from util import machineCom
|
||||||
from util import profile
|
from util import profile
|
||||||
from util import gcodeInterpreter
|
from util import gcodeInterpreter
|
||||||
|
|
||||||
|
@ -82,6 +82,7 @@ class printWindow(wx.Frame):
|
||||||
self.sendList = []
|
self.sendList = []
|
||||||
self.printIdx = None
|
self.printIdx = None
|
||||||
self.temp = None
|
self.temp = None
|
||||||
|
self.bedTemp = None
|
||||||
self.bufferLineCount = 4
|
self.bufferLineCount = 4
|
||||||
self.sendCnt = 0
|
self.sendCnt = 0
|
||||||
|
|
||||||
|
@ -109,6 +110,11 @@ class printWindow(wx.Frame):
|
||||||
h = self.connectButton.GetSize().GetHeight()
|
h = self.connectButton.GetSize().GetHeight()
|
||||||
self.temperatureSelect = wx.SpinCtrl(self.panel, -1, '0', size=(21*3,21), style=wx.SP_ARROW_KEYS)
|
self.temperatureSelect = wx.SpinCtrl(self.panel, -1, '0', size=(21*3,21), style=wx.SP_ARROW_KEYS)
|
||||||
self.temperatureSelect.SetRange(0, 400)
|
self.temperatureSelect.SetRange(0, 400)
|
||||||
|
self.bedTemperatureLabel = wx.StaticText(self.panel, -1, "BedTemp:")
|
||||||
|
self.bedTemperatureSelect = wx.SpinCtrl(self.panel, -1, '0', size=(21*3,21), style=wx.SP_ARROW_KEYS)
|
||||||
|
self.bedTemperatureSelect.SetRange(0, 400)
|
||||||
|
self.bedTemperatureLabel.Show(False)
|
||||||
|
self.bedTemperatureSelect.Show(False)
|
||||||
|
|
||||||
self.sizer.Add(self.connectButton, pos=(0,1))
|
self.sizer.Add(self.connectButton, pos=(0,1))
|
||||||
#self.sizer.Add(self.loadButton, pos=(1,1))
|
#self.sizer.Add(self.loadButton, pos=(1,1))
|
||||||
|
@ -118,6 +124,8 @@ class printWindow(wx.Frame):
|
||||||
|
|
||||||
self.sizer.Add(wx.StaticText(self.panel, -1, "Temp:"), pos=(0,3))
|
self.sizer.Add(wx.StaticText(self.panel, -1, "Temp:"), pos=(0,3))
|
||||||
self.sizer.Add(self.temperatureSelect, pos=(0,4))
|
self.sizer.Add(self.temperatureSelect, pos=(0,4))
|
||||||
|
self.sizer.Add(self.bedTemperatureLabel, pos=(0,5))
|
||||||
|
self.sizer.Add(self.bedTemperatureSelect, pos=(0,6))
|
||||||
|
|
||||||
self.directControlPanel = wx.Panel(self.panel)
|
self.directControlPanel = wx.Panel(self.panel)
|
||||||
self.sizer.Add(self.directControlPanel, pos=(1,3), span=(5,4))
|
self.sizer.Add(self.directControlPanel, pos=(1,3), span=(5,4))
|
||||||
|
@ -162,6 +170,7 @@ class printWindow(wx.Frame):
|
||||||
self.cancelButton.Bind(wx.EVT_BUTTON, self.OnCancel)
|
self.cancelButton.Bind(wx.EVT_BUTTON, self.OnCancel)
|
||||||
|
|
||||||
self.Bind(wx.EVT_SPINCTRL, self.OnTempChange, self.temperatureSelect)
|
self.Bind(wx.EVT_SPINCTRL, self.OnTempChange, self.temperatureSelect)
|
||||||
|
self.Bind(wx.EVT_SPINCTRL, self.OnBedTempChange, self.bedTemperatureSelect)
|
||||||
|
|
||||||
self.Layout()
|
self.Layout()
|
||||||
self.Fit()
|
self.Fit()
|
||||||
|
@ -195,6 +204,10 @@ class printWindow(wx.Frame):
|
||||||
self.progress.SetValue(self.printIdx)
|
self.progress.SetValue(self.printIdx)
|
||||||
if self.temp != None:
|
if self.temp != None:
|
||||||
status += 'Temp: %d\n' % (self.temp)
|
status += 'Temp: %d\n' % (self.temp)
|
||||||
|
if self.bedTemp != None and self.bedTemp > 0:
|
||||||
|
status += 'Bed Temp: %d\n' % (self.bedTemp)
|
||||||
|
self.bedTemperatureLabel.Show(True)
|
||||||
|
self.bedTemperatureSelect.Show(True)
|
||||||
self.statsText.SetLabel(status.strip())
|
self.statsText.SetLabel(status.strip())
|
||||||
self.Layout()
|
self.Layout()
|
||||||
|
|
||||||
|
@ -238,6 +251,9 @@ class printWindow(wx.Frame):
|
||||||
def OnTempChange(self, e):
|
def OnTempChange(self, e):
|
||||||
self.sendCommand("M104 S%d" % (self.temperatureSelect.GetValue()))
|
self.sendCommand("M104 S%d" % (self.temperatureSelect.GetValue()))
|
||||||
|
|
||||||
|
def OnBedTempChange(self, e):
|
||||||
|
self.sendCommand("M140 S%d" % (self.bedTemperatureSelect.GetValue()))
|
||||||
|
|
||||||
def LoadGCodeFile(self, filename):
|
def LoadGCodeFile(self, filename):
|
||||||
if self.printIdx != None:
|
if self.printIdx != None:
|
||||||
return
|
return
|
||||||
|
@ -289,6 +305,8 @@ class printWindow(wx.Frame):
|
||||||
wx.CallAfter(self.UpdateButtonStates)
|
wx.CallAfter(self.UpdateButtonStates)
|
||||||
if 'T:' in line:
|
if 'T:' in line:
|
||||||
self.temp = float(re.search("[0-9\.]*", line.split('T:')[1]).group(0))
|
self.temp = float(re.search("[0-9\.]*", line.split('T:')[1]).group(0))
|
||||||
|
if 'B:' in line:
|
||||||
|
self.bedTemp = float(re.search("[0-9\.]*", line.split('B:')[1]).group(0))
|
||||||
wx.CallAfter(self.UpdateProgress)
|
wx.CallAfter(self.UpdateProgress)
|
||||||
if self.printIdx == None:
|
if self.printIdx == None:
|
||||||
if line == '': #When we have a communication "timeout" and we're not sending gcode, then read the temperature.
|
if line == '': #When we have a communication "timeout" and we're not sending gcode, then read the temperature.
|
||||||
|
|
|
@ -9,7 +9,7 @@ from gui import sliceProgessPanel
|
||||||
from gui import validators
|
from gui import validators
|
||||||
from gui import preferencesDialog
|
from gui import preferencesDialog
|
||||||
from gui import configWizard
|
from gui import configWizard
|
||||||
from gui import machineCom
|
from gui import firmwareInstall
|
||||||
from gui import printWindow
|
from gui import printWindow
|
||||||
from gui import icon
|
from gui import icon
|
||||||
from util import profile
|
from util import profile
|
||||||
|
@ -136,7 +136,7 @@ class simpleModeWindow(configBase.configWindowBase):
|
||||||
prefDialog.Show(True)
|
prefDialog.Show(True)
|
||||||
|
|
||||||
def OnDefaultMarlinFirmware(self, e):
|
def OnDefaultMarlinFirmware(self, e):
|
||||||
machineCom.InstallFirmware(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../firmware/default.hex"))
|
firmwareInstall.InstallFirmware(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../firmware/default.hex"))
|
||||||
|
|
||||||
def OnCustomFirmware(self, e):
|
def OnCustomFirmware(self, e):
|
||||||
dlg=wx.FileDialog(self, "Open firmware to upload", os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST)
|
dlg=wx.FileDialog(self, "Open firmware to upload", os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST)
|
||||||
|
@ -146,7 +146,7 @@ class simpleModeWindow(configBase.configWindowBase):
|
||||||
if not(os.path.exists(filename)):
|
if not(os.path.exists(filename)):
|
||||||
return
|
return
|
||||||
#For some reason my Ubuntu 10.10 crashes here.
|
#For some reason my Ubuntu 10.10 crashes here.
|
||||||
machineCom.InstallFirmware(filename)
|
firmwareInstall.InstallFirmware(filename)
|
||||||
|
|
||||||
def OnFirstRunWizard(self, e):
|
def OnFirstRunWizard(self, e):
|
||||||
configWizard.configWizard()
|
configWizard.configWizard()
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
import __init__
|
import __init__
|
||||||
|
|
||||||
import os, glob, wx, threading, sys, time
|
import os, glob, sys, time
|
||||||
|
|
||||||
from serial import Serial
|
from serial import Serial
|
||||||
|
|
||||||
|
@ -29,97 +29,30 @@ def serialList():
|
||||||
pass
|
pass
|
||||||
return baselist+glob.glob('/dev/ttyUSB*') + glob.glob('/dev/ttyACM*') +glob.glob("/dev/tty.usb*")+glob.glob("/dev/cu.*")+glob.glob("/dev/rfcomm*")
|
return baselist+glob.glob('/dev/ttyUSB*') + glob.glob('/dev/ttyACM*') +glob.glob("/dev/tty.usb*")+glob.glob("/dev/cu.*")+glob.glob("/dev/rfcomm*")
|
||||||
|
|
||||||
class InstallFirmware(wx.Dialog):
|
|
||||||
def __init__(self, filename, port = None):
|
|
||||||
super(InstallFirmware, self).__init__(parent=None, title="Firmware install", size=(250, 100))
|
|
||||||
if port == None:
|
|
||||||
port = profile.getPreference('serial_port')
|
|
||||||
|
|
||||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
|
||||||
|
|
||||||
self.progressLabel = wx.StaticText(self, -1, 'Reading firmware...')
|
|
||||||
sizer.Add(self.progressLabel, 0, flag=wx.ALIGN_CENTER)
|
|
||||||
self.progressGauge = wx.Gauge(self, -1)
|
|
||||||
sizer.Add(self.progressGauge, 0, flag=wx.EXPAND)
|
|
||||||
self.okButton = wx.Button(self, -1, 'Ok')
|
|
||||||
self.okButton.Disable()
|
|
||||||
self.okButton.Bind(wx.EVT_BUTTON, self.OnOk)
|
|
||||||
sizer.Add(self.okButton, 0, flag=wx.ALIGN_CENTER)
|
|
||||||
self.SetSizer(sizer)
|
|
||||||
|
|
||||||
self.filename = filename
|
|
||||||
self.port = port
|
|
||||||
|
|
||||||
threading.Thread(target=self.OnRun).start()
|
|
||||||
|
|
||||||
self.ShowModal()
|
|
||||||
self.Destroy()
|
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
def OnRun(self):
|
|
||||||
hexFile = intelHex.readHex(self.filename)
|
|
||||||
wx.CallAfter(self.updateLabel, "Connecting to machine...")
|
|
||||||
programmer = stk500v2.Stk500v2()
|
|
||||||
programmer.progressCallback = self.OnProgress
|
|
||||||
if self.port == 'AUTO':
|
|
||||||
for self.port in serialList():
|
|
||||||
try:
|
|
||||||
programmer.connect(self.port)
|
|
||||||
break
|
|
||||||
except ispBase.IspError:
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
try:
|
|
||||||
programmer.connect(self.port)
|
|
||||||
except ispBase.IspError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if programmer.isConnected():
|
|
||||||
wx.CallAfter(self.updateLabel, "Uploading firmware...")
|
|
||||||
try:
|
|
||||||
programmer.programChip(hexFile)
|
|
||||||
wx.CallAfter(self.updateLabel, "Done!")
|
|
||||||
except ispBase.IspError as e:
|
|
||||||
wx.CallAfter(self.updateLabel, "Failed to write firmware.\n" + str(e))
|
|
||||||
|
|
||||||
programmer.close()
|
|
||||||
wx.CallAfter(self.okButton.Enable)
|
|
||||||
return
|
|
||||||
wx.MessageBox('Failed to find machine for firmware upgrade\nIs your machine connected to the PC?', 'Firmware update', wx.OK | wx.ICON_ERROR)
|
|
||||||
wx.CallAfter(self.Close)
|
|
||||||
|
|
||||||
def updateLabel(self, text):
|
|
||||||
self.progressLabel.SetLabel(text)
|
|
||||||
self.Layout()
|
|
||||||
|
|
||||||
def OnProgress(self, value, max):
|
|
||||||
wx.CallAfter(self.progressGauge.SetRange, max)
|
|
||||||
wx.CallAfter(self.progressGauge.SetValue, value)
|
|
||||||
|
|
||||||
def OnOk(self, e):
|
|
||||||
self.Close()
|
|
||||||
|
|
||||||
def OnClose(self, e):
|
|
||||||
self.Destroy()
|
|
||||||
|
|
||||||
class VirtualPrinter():
|
class VirtualPrinter():
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.readList = ['start\n']
|
self.readList = ['start\n']
|
||||||
self.temp = 0.0
|
self.temp = 0.0
|
||||||
self.targetTemp = 0.0
|
self.targetTemp = 0.0
|
||||||
|
self.bedTemp = 1.0
|
||||||
|
self.bedTargetTemp = 1.0
|
||||||
|
|
||||||
def write(self, data):
|
def write(self, data):
|
||||||
if self.readList == None:
|
if self.readList == None:
|
||||||
return
|
return
|
||||||
print "Send: %s" % (data.rstrip())
|
print "Send: %s" % (data.rstrip())
|
||||||
if 'M104' in data:
|
if 'M104' in data or 'M109' in data:
|
||||||
try:
|
try:
|
||||||
self.targetTemp = float(data[data.find('S')+1:])
|
self.targetTemp = float(data[data.find('S')+1:])
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
if 'M140' in data or 'M190' in data:
|
||||||
|
try:
|
||||||
|
self.bedTargetTemp = float(data[data.find('S')+1:])
|
||||||
|
except:
|
||||||
|
pass
|
||||||
if 'M105' in data:
|
if 'M105' in data:
|
||||||
self.readList.append("ok T:%f/%f\n" % (self.temp, self.targetTemp))
|
self.readList.append("ok T:%f /%f B:%f /%f @:64\n" % (self.temp, self.targetTemp, self.bedTemp, self.bedTargetTemp))
|
||||||
else:
|
else:
|
||||||
self.readList.append("ok\n")
|
self.readList.append("ok\n")
|
||||||
|
|
||||||
|
@ -128,6 +61,7 @@ class VirtualPrinter():
|
||||||
return ''
|
return ''
|
||||||
n = 0
|
n = 0
|
||||||
self.temp = (self.temp + self.targetTemp) / 2
|
self.temp = (self.temp + self.targetTemp) / 2
|
||||||
|
self.bedTemp = (self.bedTemp + self.bedTargetTemp) / 2
|
||||||
while len(self.readList) < 1:
|
while len(self.readList) < 1:
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
n += 1
|
n += 1
|
Loading…
Reference in New Issue