Refactoring Pronsole to wrap print in a self.log method so that it can be reused and overriden by a web interface or any other non-conosole interface
parent
e1660bd7f0
commit
eb0f808bf4
364
pronsole.py
364
pronsole.py
|
@ -77,7 +77,7 @@ def estimate_duration(g):
|
|||
#TODO:
|
||||
# get device caps from firmware: max speed, acceleration/axis (including extruder)
|
||||
# calculate the maximum move duration accounting for above ;)
|
||||
# print ".... estimating ...."
|
||||
# self.log(".... estimating ....")
|
||||
for i in g:
|
||||
i = i.split(";")[0]
|
||||
if "G4" in i or "G1" in i:
|
||||
|
@ -119,7 +119,7 @@ def estimate_duration(g):
|
|||
|
||||
if z > lastz:
|
||||
layercount +=1
|
||||
#print "layer z: ", lastz, " will take: ", time.strftime('%H:%M:%S', time.gmtime(totalduration-layerbeginduration))
|
||||
#self.log("layer z: ", lastz, " will take: ", time.strftime('%H:%M:%S', time.gmtime(totalduration-layerbeginduration)))
|
||||
layerbeginduration = totalduration
|
||||
|
||||
lastx = x
|
||||
|
@ -128,7 +128,7 @@ def estimate_duration(g):
|
|||
laste = e
|
||||
lastf = f
|
||||
|
||||
#print "Total Duration: " #, time.strftime('%H:%M:%S', time.gmtime(totalduration))
|
||||
#self.log("Total Duration: " #, time.strftime('%H:%M:%S', time.gmtime(totalduration)))
|
||||
return "{0:d} layers, ".format(int(layercount)) + str(datetime.timedelta(seconds = int(totalduration)))
|
||||
|
||||
class Settings:
|
||||
|
@ -228,15 +228,18 @@ class pronsole(cmd.Cmd):
|
|||
self.helpdict["final_command"] = _("Executable to run when the print is finished")
|
||||
self.commandprefixes='MGT$'
|
||||
|
||||
def log(self, *msg):
|
||||
print ''.join(str(i) for i in msg)
|
||||
|
||||
def set_temp_preset(self, key, value):
|
||||
if not key.startswith("bed"):
|
||||
self.temps["pla"] = str(self.settings.temperature_pla)
|
||||
self.temps["abs"] = str(self.settings.temperature_abs)
|
||||
print "Hotend temperature presets updated, pla:%s, abs:%s" % (self.temps["pla"], self.temps["abs"])
|
||||
self.log("Hotend temperature presets updated, pla:%s, abs:%s" % (self.temps["pla"], self.temps["abs"]))
|
||||
else:
|
||||
self.bedtemps["pla"] = str(self.settings.bedtemp_pla)
|
||||
self.bedtemps["abs"] = str(self.settings.bedtemp_abs)
|
||||
print "Bed temperature presets updated, pla:%s, abs:%s" % (self.bedtemps["pla"], self.bedtemps["abs"])
|
||||
self.log("Bed temperature presets updated, pla:%s, abs:%s" % (self.bedtemps["pla"], self.bedtemps["abs"]))
|
||||
|
||||
def scanserial(self):
|
||||
"""scan for available ports. return a list of device names."""
|
||||
|
@ -254,7 +257,7 @@ class pronsole(cmd.Cmd):
|
|||
return baselist+glob.glob('/dev/ttyUSB*') + glob.glob('/dev/ttyACM*') +glob.glob("/dev/tty.*")+glob.glob("/dev/cu.*")+glob.glob("/dev/rfcomm*")
|
||||
|
||||
def online(self):
|
||||
print "Printer is now online"
|
||||
self.log("printer is now online")
|
||||
sys.stdout.write(self.prompt)
|
||||
sys.stdout.flush()
|
||||
|
||||
|
@ -265,7 +268,7 @@ class pronsole(cmd.Cmd):
|
|||
self.help_gcodes()
|
||||
|
||||
def help_gcodes(self):
|
||||
print "Gcodes are passed through to the printer as they are"
|
||||
self.log("Gcodes are passed through to the printer as they are")
|
||||
|
||||
def complete_macro(self, text, line, begidx, endidx):
|
||||
if (len(line.split()) == 2 and line[-1] != " ") or (len(line.split()) == 1 and line[-1]==" "):
|
||||
|
@ -294,7 +297,7 @@ class pronsole(cmd.Cmd):
|
|||
setattr(self.__class__, "do_"+self.cur_macro_name, lambda self, largs, macro = macro:macro(self,*largs.split()))
|
||||
setattr(self.__class__, "help_"+self.cur_macro_name, lambda self, macro_name = self.cur_macro_name: self.subhelp_macro(macro_name))
|
||||
if not self.processing_rc:
|
||||
print "Macro '"+self.cur_macro_name+"' defined"
|
||||
self.log("Macro '"+self.cur_macro_name+"' defined")
|
||||
# save it
|
||||
if not self.processing_args:
|
||||
macro_key = "macro "+self.cur_macro_name
|
||||
|
@ -306,7 +309,7 @@ class pronsole(cmd.Cmd):
|
|||
macro_def += self.cur_macro_def
|
||||
self.save_in_rc(macro_key, macro_def)
|
||||
else:
|
||||
print "Empty macro - cancelled"
|
||||
self.log("Empty macro - cancelled")
|
||||
del self.cur_macro_name, self.cur_macro_def
|
||||
|
||||
def compile_macro_line(self, line):
|
||||
|
@ -321,7 +324,7 @@ class pronsole(cmd.Cmd):
|
|||
|
||||
def compile_macro(self, macro_name, macro_def):
|
||||
if macro_def.strip() == "":
|
||||
print "Empty macro - cancelled"
|
||||
self.log("Empty macro - cancelled")
|
||||
return
|
||||
pycode = "def macro(self,*arg):\n"
|
||||
if "\n" not in macro_def.strip():
|
||||
|
@ -335,7 +338,7 @@ class pronsole(cmd.Cmd):
|
|||
|
||||
def start_macro(self, macro_name, prev_definition = "", suppress_instructions = False):
|
||||
if not self.processing_rc and not suppress_instructions:
|
||||
print "Enter macro using indented lines, end with empty line"
|
||||
self.log("Enter macro using indented lines, end with empty line")
|
||||
self.cur_macro_name = macro_name
|
||||
self.cur_macro_def = ""
|
||||
self.onecmd = self.hook_macro # override onecmd temporarily
|
||||
|
@ -345,11 +348,11 @@ class pronsole(cmd.Cmd):
|
|||
if macro_name in self.macros.keys():
|
||||
delattr(self.__class__, "do_"+macro_name)
|
||||
del self.macros[macro_name]
|
||||
print "Macro '"+macro_name+"' removed"
|
||||
self.log("Macro '"+macro_name+"' removed")
|
||||
if not self.processing_rc and not self.processing_args:
|
||||
self.save_in_rc("macro "+macro_name, "")
|
||||
else:
|
||||
print "Macro '"+macro_name+"' is not defined"
|
||||
self.log("Macro '"+macro_name+"' is not defined")
|
||||
def do_macro(self, args):
|
||||
if args.strip()=="":
|
||||
self.print_topics("User-defined macros", self.macros.keys(), 15, 80)
|
||||
|
@ -357,7 +360,7 @@ class pronsole(cmd.Cmd):
|
|||
arglist = args.split(None, 1)
|
||||
macro_name = arglist[0]
|
||||
if macro_name not in self.macros and hasattr(self.__class__, "do_"+macro_name):
|
||||
print "Name '"+macro_name+"' is being used by built-in command"
|
||||
self.log("Name '"+macro_name+"' is being used by built-in command")
|
||||
return
|
||||
if len(arglist) == 2:
|
||||
macro_def = arglist[1]
|
||||
|
@ -377,24 +380,24 @@ class pronsole(cmd.Cmd):
|
|||
self.start_macro(macro_name)
|
||||
|
||||
def help_macro(self):
|
||||
print "Define single-line macro: macro <name> <definition>"
|
||||
print "Define multi-line macro: macro <name>"
|
||||
print "Enter macro definition in indented lines. Use {0} .. {N} to substitute macro arguments"
|
||||
print "Enter python code, prefixed with ! Use arg[0] .. arg[N] to substitute macro arguments"
|
||||
print "Delete macro: macro <name> /d"
|
||||
print "Show macro definition: macro <name> /s"
|
||||
print "'macro' without arguments displays list of defined macros"
|
||||
self.log("Define single-line macro: macro <name> <definition>")
|
||||
self.log("Define multi-line macro: macro <name>")
|
||||
self.log("Enter macro definition in indented lines. Use {0} .. {N} to substitute macro arguments")
|
||||
self.log("Enter python code, prefixed with ! Use arg[0] .. arg[N] to substitute macro arguments")
|
||||
self.log("Delete macro: macro <name> /d")
|
||||
self.log("Show macro definition: macro <name> /s")
|
||||
self.log("'macro' without arguments displays list of defined macros")
|
||||
|
||||
def subhelp_macro(self, macro_name):
|
||||
if macro_name in self.macros.keys():
|
||||
macro_def = self.macros[macro_name]
|
||||
if "\n" in macro_def:
|
||||
print "Macro '"+macro_name+"' defined as:"
|
||||
print self.macros[macro_name]+"----------------"
|
||||
self.log("Macro '"+macro_name+"' defined as:")
|
||||
self.log(self.macros[macro_name]+"----------------")
|
||||
else:
|
||||
print "Macro '"+macro_name+"' defined as: '"+macro_def+"'"
|
||||
self.log("Macro '"+macro_name+"' defined as: '"+macro_def+"'")
|
||||
else:
|
||||
print "Macro '"+macro_name+"' is not defined"
|
||||
self.log("Macro '"+macro_name+"' is not defined")
|
||||
|
||||
def set(self, var, str):
|
||||
try:
|
||||
|
@ -403,29 +406,29 @@ class pronsole(cmd.Cmd):
|
|||
if not self.processing_rc and not self.processing_args:
|
||||
self.save_in_rc("set "+var, "set %s %s" % (var, value))
|
||||
except AttributeError:
|
||||
print "Unknown variable '%s'" % var
|
||||
self.log("Unknown variable '%s'" % var)
|
||||
except ValueError, ve:
|
||||
print "Bad value for variable '%s', expecting %s (%s)" % (var, repr(t)[1:-1], ve.args[0])
|
||||
self.log("Bad value for variable '%s', expecting %s (%s)" % (var, repr(t)[1:-1], ve.args[0]))
|
||||
|
||||
def do_set(self, argl):
|
||||
args = argl.split(None, 1)
|
||||
if len(args) < 1:
|
||||
for k in [kk for kk in dir(self.settings) if not kk.startswith("_")]:
|
||||
print "%s = %s" % (k, str(getattr(self.settings, k)))
|
||||
self.log("%s = %s" % (k, str(getattr(self.settings, k))))
|
||||
return
|
||||
value = getattr(self.settings, args[0])
|
||||
if len(args) < 2:
|
||||
try:
|
||||
print "%s = %s" % (args[0], getattr(self.settings, args[0]))
|
||||
self.log("%s = %s" % (args[0], getattr(self.settings, args[0])))
|
||||
except AttributeError:
|
||||
print "Unknown variable '%s'" % args[0]
|
||||
self.log("Unknown variable '%s'" % args[0])
|
||||
return
|
||||
self.set(args[0], args[1])
|
||||
|
||||
def help_set(self):
|
||||
print "Set variable: set <variable> <value>"
|
||||
print "Show variable: set <variable>"
|
||||
print "'set' without arguments displays all variables"
|
||||
self.log("Set variable: set <variable> <value>")
|
||||
self.log("Show variable: set <variable>")
|
||||
self.log("'set' without arguments displays all variables")
|
||||
|
||||
def complete_set(self, text, line, begidx, endidx):
|
||||
if (len(line.split()) == 2 and line[-1] != " ") or (len(line.split()) == 1 and line[-1]==" "):
|
||||
|
@ -507,16 +510,16 @@ class pronsole(cmd.Cmd):
|
|||
rci.close()
|
||||
rco.close()
|
||||
#if definition != "":
|
||||
# print "Saved '"+key+"' to '"+self.rc_filename+"'"
|
||||
# self.log("Saved '"+key+"' to '"+self.rc_filename+"'")
|
||||
#else:
|
||||
# print "Removed '"+key+"' from '"+self.rc_filename+"'"
|
||||
# self.log("Removed '"+key+"' from '"+self.rc_filename+"'")
|
||||
except Exception, e:
|
||||
print "Saving failed for", key+":", str(e)
|
||||
self.log("Saving failed for", key+":", str(e))
|
||||
finally:
|
||||
del rci, rco
|
||||
|
||||
def preloop(self):
|
||||
print "Welcome to the printer console! Type \"help\" for a list of available commands."
|
||||
self.log("Welcome to the printer console! Type \"help\" for a list of available commands.")
|
||||
cmd.Cmd.preloop(self)
|
||||
|
||||
def do_connect(self, l):
|
||||
|
@ -532,12 +535,12 @@ class pronsole(cmd.Cmd):
|
|||
try:
|
||||
baud = int(a[1])
|
||||
except:
|
||||
print "Bad baud value '"+a[1]+"' ignored"
|
||||
self.log("Bad baud value '"+a[1]+"' ignored")
|
||||
if len(p) == 0 and not port:
|
||||
print "No serial ports detected - please specify a port"
|
||||
self.log("No serial ports detected - please specify a port")
|
||||
return
|
||||
if len(a) == 0:
|
||||
print "No port specified - connecting to %s at %dbps" % (port, baud)
|
||||
self.log("No port specified - connecting to %s at %dbps" % (port, baud))
|
||||
if port != self.settings.port:
|
||||
self.settings.port = port
|
||||
self.save_in_rc("set port", "set port %s" % port)
|
||||
|
@ -547,14 +550,14 @@ class pronsole(cmd.Cmd):
|
|||
self.p.connect(port, baud)
|
||||
|
||||
def help_connect(self):
|
||||
print "Connect to printer"
|
||||
print "connect <port> <baudrate>"
|
||||
print "If port and baudrate are not specified, connects to first detected port at 115200bps"
|
||||
self.log("Connect to printer")
|
||||
self.log("connect <port> <baudrate>")
|
||||
self.log("If port and baudrate are not specified, connects to first detected port at 115200bps")
|
||||
ports = self.scanserial()
|
||||
if(len(ports)):
|
||||
print "Available ports: ", " ".join(ports)
|
||||
self.log("Available ports: ", " ".join(ports))
|
||||
else:
|
||||
print "No serial ports were automatically found."
|
||||
self.log("No serial ports were automatically found.")
|
||||
|
||||
def complete_connect(self, text, line, begidx, endidx):
|
||||
if (len(line.split()) == 2 and line[-1] != " ") or (len(line.split()) == 1 and line[-1]==" "):
|
||||
|
@ -568,22 +571,22 @@ class pronsole(cmd.Cmd):
|
|||
self.p.disconnect()
|
||||
|
||||
def help_disconnect(self):
|
||||
print "Disconnects from the printer"
|
||||
self.log("Disconnects from the printer")
|
||||
|
||||
def do_load(self,l):
|
||||
self._do_load(l)
|
||||
|
||||
def _do_load(self,l):
|
||||
if len(l)==0:
|
||||
print "No file name given."
|
||||
self.log("No file name given.")
|
||||
return
|
||||
print "Loading file:"+l
|
||||
self.log("Loading file:"+l)
|
||||
if not(os.path.exists(l)):
|
||||
print "File not found!"
|
||||
self.log("File not found!")
|
||||
return
|
||||
self.f = [i.replace("\n", "").replace("\r", "") for i in open(l)]
|
||||
self.filename = l
|
||||
print "Loaded ", l, ", ", len(self.f)," lines."
|
||||
self.log("Loaded ", l, ", ", len(self.f)," lines.")
|
||||
|
||||
def complete_load(self, text, line, begidx, endidx):
|
||||
s = line.split()
|
||||
|
@ -596,32 +599,32 @@ class pronsole(cmd.Cmd):
|
|||
return glob.glob("*/")+glob.glob("*.g*")
|
||||
|
||||
def help_load(self):
|
||||
print "Loads a gcode file (with tab-completion)"
|
||||
self.log("Loads a gcode file (with tab-completion)")
|
||||
|
||||
def do_upload(self, l):
|
||||
if len(l) == 0:
|
||||
print "No file name given."
|
||||
self.log("No file name given.")
|
||||
return
|
||||
print "Loading file:"+l.split()[0]
|
||||
self.log("Loading file:"+l.split()[0])
|
||||
if not(os.path.exists(l.split()[0])):
|
||||
print "File not found!"
|
||||
self.log("File not found!")
|
||||
return
|
||||
if not self.p.online:
|
||||
print "Not connected to printer."
|
||||
self.log("Not connected to printer.")
|
||||
return
|
||||
self.f = [i.replace("\n", "") for i in open(l.split()[0])]
|
||||
self.filename = l.split()[0]
|
||||
print "Loaded ", l, ", ", len(self.f)," lines."
|
||||
self.log("Loaded ", l, ", ", len(self.f)," lines.")
|
||||
tname = ""
|
||||
if len(l.split())>1:
|
||||
tname = l.split()[1]
|
||||
else:
|
||||
print "please enter target name in 8.3 format."
|
||||
self.log("please enter target name in 8.3 format.")
|
||||
return
|
||||
print "Uploading as ", tname
|
||||
print("Uploading "+self.filename)
|
||||
self.log("Uploading as ", tname)
|
||||
self.log(("Uploading "+self.filename))
|
||||
self.p.send_now("M28 "+tname)
|
||||
print("Press Ctrl-C to interrupt upload.")
|
||||
self.log(("Press Ctrl-C to interrupt upload."))
|
||||
self.p.startprint(self.f)
|
||||
try:
|
||||
sys.stdout.write("Progress: 00.0%")
|
||||
|
@ -639,16 +642,16 @@ class pronsole(cmd.Cmd):
|
|||
self.recvlisteners+=[self.listfiles]
|
||||
self.p.send_now("M20")
|
||||
time.sleep(0.5)
|
||||
print "\b\b\b\b\b100%. Upload completed. ", tname, " should now be on the card."
|
||||
self.log("\b\b\b\b\b100%. Upload completed. ", tname, " should now be on the card.")
|
||||
return
|
||||
except:
|
||||
print "...interrupted!"
|
||||
self.log("...interrupted!")
|
||||
self.p.pause()
|
||||
self.p.send_now("M29 "+tname)
|
||||
time.sleep(0.2)
|
||||
self.p.clear = 1
|
||||
self.p.startprint([])
|
||||
print "A partial file named ", tname, " may have been written to the sd card."
|
||||
self.log("A partial file named ", tname, " may have been written to the sd card.")
|
||||
|
||||
|
||||
def complete_upload(self, text, line, begidx, endidx):
|
||||
|
@ -662,23 +665,23 @@ class pronsole(cmd.Cmd):
|
|||
return glob.glob("*/")+glob.glob("*.g*")
|
||||
|
||||
def help_upload(self):
|
||||
print "Uploads a gcode file to the sd card"
|
||||
self.log("Uploads a gcode file to the sd card")
|
||||
|
||||
def help_print(self):
|
||||
if self.f is None:
|
||||
print "Send a loaded gcode file to the printer. Load a file with the load command first."
|
||||
self.log("Send a loaded gcode file to the printer. Load a file with the load command first.")
|
||||
else:
|
||||
print "Send a loaded gcode file to the printer. You have "+self.filename+" loaded right now."
|
||||
self.log("Send a loaded gcode file to the printer. You have "+self.filename+" loaded right now.")
|
||||
|
||||
def do_print(self, l):
|
||||
if self.f is None:
|
||||
print "No file loaded. Please use load first."
|
||||
self.log("No file loaded. Please use load first.")
|
||||
return
|
||||
if not self.p.online:
|
||||
print "Not connected to printer."
|
||||
self.log("Not connected to printer.")
|
||||
return
|
||||
print("Printing "+self.filename)
|
||||
print("You can monitor the print with the monitor command.")
|
||||
self.log(("printing "+self.filename))
|
||||
self.log(("You can monitor the print with the monitor command."))
|
||||
self.p.startprint(self.f)
|
||||
#self.p.pause()
|
||||
#self.paused = True
|
||||
|
@ -689,7 +692,7 @@ class pronsole(cmd.Cmd):
|
|||
self.p.send_now("M25")
|
||||
else:
|
||||
if(not self.p.printing):
|
||||
print "Not printing, cannot pause."
|
||||
self.log("Not self.log(ing, cannot pause.")
|
||||
return
|
||||
self.p.pause()
|
||||
#self.p.connect()# This seems to work, but is not a good solution.
|
||||
|
@ -698,11 +701,11 @@ class pronsole(cmd.Cmd):
|
|||
#self.do_resume(None)
|
||||
|
||||
def help_pause(self):
|
||||
print "Pauses a running print"
|
||||
self.log("Pauses a running print")
|
||||
|
||||
def do_resume(self, l):
|
||||
if not self.paused:
|
||||
print "Not paused, unable to resume. Start a print first."
|
||||
self.log("Not paused, unable to resume. Start a print first.")
|
||||
return
|
||||
self.paused = False
|
||||
if self.sdprinting:
|
||||
|
@ -712,7 +715,7 @@ class pronsole(cmd.Cmd):
|
|||
self.p.resume()
|
||||
|
||||
def help_resume(self):
|
||||
print "Resumes a paused print."
|
||||
self.log("Resumes a paused print.")
|
||||
|
||||
def emptyline(self):
|
||||
pass
|
||||
|
@ -731,33 +734,33 @@ class pronsole(cmd.Cmd):
|
|||
|
||||
def do_ls(self, l):
|
||||
if not self.p.online:
|
||||
print "Printer is not online. Try connect to it first."
|
||||
self.log("printer is not online. Try connect to it first.")
|
||||
return
|
||||
self.listing = 2
|
||||
self.sdfiles = []
|
||||
self.recvlisteners+=[self.listfiles]
|
||||
self.p.send_now("M20")
|
||||
time.sleep(0.5)
|
||||
print " ".join(self.sdfiles)
|
||||
self.log(" ".join(self.sdfiles))
|
||||
|
||||
def help_ls(self):
|
||||
print "lists files on the SD card"
|
||||
self.log("lists files on the SD card")
|
||||
|
||||
def waitforsdresponse(self, l):
|
||||
if "file.open failed" in l:
|
||||
print "Opening file failed."
|
||||
self.log("Opening file failed.")
|
||||
self.recvlisteners.remove(self.waitforsdresponse)
|
||||
return
|
||||
if "File opened" in l:
|
||||
print l
|
||||
self.log(l)
|
||||
if "File selected" in l:
|
||||
print "Starting print"
|
||||
self.log("Starting print")
|
||||
self.p.send_now("M24")
|
||||
self.sdprinting = 1
|
||||
#self.recvlisteners.remove(self.waitforsdresponse)
|
||||
return
|
||||
if "Done printing file" in l:
|
||||
print l
|
||||
self.log(l)
|
||||
self.sdprinting = 0
|
||||
self.recvlisteners.remove(self.waitforsdresponse)
|
||||
return
|
||||
|
@ -774,11 +777,11 @@ class pronsole(cmd.Cmd):
|
|||
self.p.reset()
|
||||
|
||||
def help_reset(self):
|
||||
print "Resets the printer."
|
||||
self.log("Resets the printer.")
|
||||
|
||||
def do_sdprint(self, l):
|
||||
if not self.p.online:
|
||||
print "Printer is not online. Try connect to it first."
|
||||
self.log("printer is not online. Try connect to it first.")
|
||||
return
|
||||
self.listing = 2
|
||||
self.sdfiles = []
|
||||
|
@ -786,17 +789,17 @@ class pronsole(cmd.Cmd):
|
|||
self.p.send_now("M20")
|
||||
time.sleep(0.5)
|
||||
if not (l.lower() in self.sdfiles):
|
||||
print "File is not present on card. Upload it first"
|
||||
self.log("File is not present on card. Upload it first")
|
||||
return
|
||||
self.recvlisteners+=[self.waitforsdresponse]
|
||||
self.p.send_now("M23 "+l.lower())
|
||||
print "Printing file: "+l.lower()+" from SD card."
|
||||
print "Requesting SD print..."
|
||||
self.log("printing file: "+l.lower()+" from SD card.")
|
||||
self.log("Requesting SD print...")
|
||||
time.sleep(1)
|
||||
|
||||
def help_sdprint(self):
|
||||
print "Print a file from the SD card. Tabcompletes with available file names."
|
||||
print "sdprint filename.g"
|
||||
self.log("print a file from the SD card. Tabcompletes with available file names.")
|
||||
self.log("sdprint filename.g")
|
||||
|
||||
def complete_sdprint(self, text, line, begidx, endidx):
|
||||
if self.sdfiles==[] and self.p.online:
|
||||
|
@ -810,34 +813,35 @@ class pronsole(cmd.Cmd):
|
|||
def recvcb(self, l):
|
||||
if "T:" in l:
|
||||
self.tempreadings = l
|
||||
|
||||
tstring = l.rstrip()
|
||||
if(tstring!="ok" and not tstring.startswith("ok T") and not tstring.startswith("T:") and not self.listing and not self.monitoring):
|
||||
print tstring
|
||||
self.log(tstring)
|
||||
sys.stdout.write(self.prompt)
|
||||
sys.stdout.flush()
|
||||
for i in self.recvlisteners:
|
||||
i(l)
|
||||
|
||||
def help_shell(self):
|
||||
print "Executes a python command. Example:"
|
||||
print "! os.listdir('.')"
|
||||
self.log("Executes a python command. Example:")
|
||||
self.log("! os.listdir('.')")
|
||||
|
||||
def default(self, l):
|
||||
if(l[0] in self.commandprefixes.upper()):
|
||||
if(self.p and self.p.online):
|
||||
if(not self.p.loud):
|
||||
print "SENDING:"+l
|
||||
self.log("SENDING:"+l)
|
||||
self.p.send_now(l)
|
||||
else:
|
||||
print "Printer is not online."
|
||||
self.log("printer is not online.")
|
||||
return
|
||||
elif(l[0] in self.commandprefixes.lower()):
|
||||
if(self.p and self.p.online):
|
||||
if(not self.p.loud):
|
||||
print "SENDING:"+l.upper()
|
||||
self.log("SENDING:"+l.upper())
|
||||
self.p.send_now(l.upper())
|
||||
else:
|
||||
print "Printer is not online."
|
||||
self.log("printer is not online.")
|
||||
return
|
||||
else:
|
||||
cmd.Cmd.default(self, l)
|
||||
|
@ -847,7 +851,7 @@ class pronsole(cmd.Cmd):
|
|||
|
||||
def tempcb(self, l):
|
||||
if "T:" in l:
|
||||
print l.replace("\r", "").replace("T", "Hotend").replace("B", "Bed").replace("\n", "").replace("ok ", "")
|
||||
self.log(l.replace("\r", "").replace("T", "Hotend").replace("B", "Bed").replace("\n", "").replace("ok ", ""))
|
||||
|
||||
def do_gettemp(self, l):
|
||||
if self.p.online:
|
||||
|
@ -857,7 +861,7 @@ class pronsole(cmd.Cmd):
|
|||
self.recvlisteners.remove(self.tempcb)
|
||||
|
||||
def help_gettemp(self):
|
||||
print "Read the extruder and bed temperature."
|
||||
self.log("Read the extruder and bed temperature.")
|
||||
|
||||
def do_settemp(self, l):
|
||||
try:
|
||||
|
@ -868,18 +872,18 @@ class pronsole(cmd.Cmd):
|
|||
if f>=0:
|
||||
if self.p.online:
|
||||
self.p.send_now("M104 S"+l)
|
||||
print "Setting hotend temperature to ", f, " degrees Celsius."
|
||||
self.log("Setting hotend temperature to ", f, " degrees Celsius.")
|
||||
else:
|
||||
print "Printer is not online."
|
||||
self.log("printer is not online.")
|
||||
else:
|
||||
print "You cannot set negative temperatures. To turn the hotend off entirely, set its temperature to 0."
|
||||
self.log("You cannot set negative temperatures. To turn the hotend off entirely, set its temperature to 0.")
|
||||
except:
|
||||
print "You must enter a temperature."
|
||||
self.log("You must enter a temperature.")
|
||||
|
||||
def help_settemp(self):
|
||||
print "Sets the hotend temperature to the value entered."
|
||||
print "Enter either a temperature in celsius or one of the following keywords"
|
||||
print ", ".join([i+"("+self.temps[i]+")" for i in self.temps.keys()])
|
||||
self.log("Sets the hotend temperature to the value entered.")
|
||||
self.log("Enter either a temperature in celsius or one of the following keywords")
|
||||
self.log(", ".join([i+"("+self.temps[i]+")" for i in self.temps.keys()]))
|
||||
|
||||
def complete_settemp(self, text, line, begidx, endidx):
|
||||
if (len(line.split()) == 2 and line[-1] != " ") or (len(line.split()) == 1 and line[-1]==" "):
|
||||
|
@ -894,18 +898,18 @@ class pronsole(cmd.Cmd):
|
|||
if f>=0:
|
||||
if self.p.online:
|
||||
self.p.send_now("M140 S"+l)
|
||||
print "Setting bed temperature to ", f, " degrees Celsius."
|
||||
self.log("Setting bed temperature to ", f, " degrees Celsius.")
|
||||
else:
|
||||
print "Printer is not online."
|
||||
self.log("printer is not online.")
|
||||
else:
|
||||
print "You cannot set negative temperatures. To turn the bed off entirely, set its temperature to 0."
|
||||
self.log("You cannot set negative temperatures. To turn the bed off entirely, set its temperature to 0.")
|
||||
except:
|
||||
print "You must enter a temperature."
|
||||
self.log("You must enter a temperature.")
|
||||
|
||||
def help_bedtemp(self):
|
||||
print "Sets the bed temperature to the value entered."
|
||||
print "Enter either a temperature in celsius or one of the following keywords"
|
||||
print ", ".join([i+"("+self.bedtemps[i]+")" for i in self.bedtemps.keys()])
|
||||
self.log("Sets the bed temperature to the value entered.")
|
||||
self.log("Enter either a temperature in celsius or one of the following keywords")
|
||||
self.log(", ".join([i+"("+self.bedtemps[i]+")" for i in self.bedtemps.keys()]))
|
||||
|
||||
def complete_bedtemp(self, text, line, begidx, endidx):
|
||||
if (len(line.split()) == 2 and line[-1] != " ") or (len(line.split()) == 1 and line[-1]==" "):
|
||||
|
@ -913,13 +917,13 @@ class pronsole(cmd.Cmd):
|
|||
|
||||
def do_move(self, l):
|
||||
if(len(l.split())<2):
|
||||
print "No move specified."
|
||||
self.log("No move specified.")
|
||||
return
|
||||
if self.p.printing:
|
||||
print "Printer is currently printing. Please pause the print before you issue manual commands."
|
||||
self.log("printer is currently printing. Please pause the print before you issue manual commands.")
|
||||
return
|
||||
if not self.p.online:
|
||||
print "Printer is not online. Unable to move."
|
||||
self.log("printer is not online. Unable to move.")
|
||||
return
|
||||
l = l.split()
|
||||
if(l[0].lower()=="x"):
|
||||
|
@ -935,13 +939,13 @@ class pronsole(cmd.Cmd):
|
|||
feed = self.settings.e_feedrate
|
||||
axis = "E"
|
||||
else:
|
||||
print "Unknown axis."
|
||||
self.log("Unknown axis.")
|
||||
return
|
||||
dist = 0
|
||||
try:
|
||||
dist = float(l[1])
|
||||
except:
|
||||
print "Invalid distance"
|
||||
self.log("Invalid distance")
|
||||
return
|
||||
try:
|
||||
feed = int(l[2])
|
||||
|
@ -952,11 +956,11 @@ class pronsole(cmd.Cmd):
|
|||
self.p.send_now("G90")
|
||||
|
||||
def help_move(self):
|
||||
print "Move an axis. Specify the name of the axis and the amount. "
|
||||
print "move X 10 will move the X axis forward by 10mm at ", self.settings.xy_feedrate, "mm/min (default XY speed)"
|
||||
print "move Y 10 5000 will move the Y axis forward by 10mm at 5000mm/min"
|
||||
print "move Z -1 will move the Z axis down by 1mm at ", self.settings.z_feedrate, "mm/min (default Z speed)"
|
||||
print "Common amounts are in the tabcomplete list."
|
||||
self.log("Move an axis. Specify the name of the axis and the amount. ")
|
||||
self.log("move X 10 will move the X axis forward by 10mm at ", self.settings.xy_feedrate, "mm/min (default XY speed)")
|
||||
self.log("move Y 10 5000 will move the Y axis forward by 10mm at 5000mm/min")
|
||||
self.log("move Z -1 will move the Z axis down by 1mm at ", self.settings.z_feedrate, "mm/min (default Z speed)")
|
||||
self.log("Common amounts are in the tabcomplete list.")
|
||||
|
||||
def complete_move(self, text, line, begidx, endidx):
|
||||
if (len(line.split()) == 2 and line[-1] != " ") or (len(line.split()) == 1 and line[-1]==" "):
|
||||
|
@ -976,29 +980,29 @@ class pronsole(cmd.Cmd):
|
|||
length = 5#default extrusion length
|
||||
feed = self.settings.e_feedrate#default speed
|
||||
if not self.p.online:
|
||||
print "Printer is not online. Unable to move."
|
||||
self.log("printer is not online. Unable to move.")
|
||||
return
|
||||
if self.p.printing:
|
||||
print "Printer is currently printing. Please pause the print before you issue manual commands."
|
||||
self.log("printer is currently printing. Please pause the print before you issue manual commands.")
|
||||
return
|
||||
ls = l.split()
|
||||
if len(ls):
|
||||
try:
|
||||
length = float(ls[0])
|
||||
except:
|
||||
print "Invalid length given."
|
||||
self.log("Invalid length given.")
|
||||
if len(ls)>1:
|
||||
try:
|
||||
feed = int(ls[1])
|
||||
except:
|
||||
print "Invalid speed given."
|
||||
self.log("Invalid speed given.")
|
||||
if override is not None:
|
||||
length = override
|
||||
feed = overridefeed
|
||||
if length > 0:
|
||||
print "Extruding %fmm of filament."%(length,)
|
||||
self.log("Extruding %fmm of filament."%(length,))
|
||||
elif length <0:
|
||||
print "Reversing %fmm of filament."%(-1*length,)
|
||||
self.log("Reversing %fmm of filament."%(-1*length,))
|
||||
else:
|
||||
"Length is 0, not doing anything."
|
||||
self.p.send_now("G91")
|
||||
|
@ -1006,62 +1010,62 @@ class pronsole(cmd.Cmd):
|
|||
self.p.send_now("G90")
|
||||
|
||||
def help_extrude(self):
|
||||
print "Extrudes a length of filament, 5mm by default, or the number of mm given as a parameter"
|
||||
print "extrude - extrudes 5mm of filament at 300mm/min (5mm/s)"
|
||||
print "extrude 20 - extrudes 20mm of filament at 300mm/min (5mm/s)"
|
||||
print "extrude -5 - REVERSES 5mm of filament at 300mm/min (5mm/s)"
|
||||
print "extrude 10 210 - extrudes 10mm of filament at 210mm/min (3.5mm/s)"
|
||||
self.log("Extrudes a length of filament, 5mm by default, or the number of mm given as a parameter")
|
||||
self.log("extrude - extrudes 5mm of filament at 300mm/min (5mm/s)")
|
||||
self.log("extrude 20 - extrudes 20mm of filament at 300mm/min (5mm/s)")
|
||||
self.log("extrude -5 - REVERSES 5mm of filament at 300mm/min (5mm/s)")
|
||||
self.log("extrude 10 210 - extrudes 10mm of filament at 210mm/min (3.5mm/s)")
|
||||
|
||||
def do_reverse(self, l):
|
||||
length = 5#default extrusion length
|
||||
feed = self.settings.e_feedrate#default speed
|
||||
if not self.p.online:
|
||||
print "Printer is not online. Unable to move."
|
||||
self.log("printer is not online. Unable to move.")
|
||||
return
|
||||
if self.p.printing:
|
||||
print "Printer is currently printing. Please pause the print before you issue manual commands."
|
||||
self.log("printer is currently printing. Please pause the print before you issue manual commands.")
|
||||
return
|
||||
ls = l.split()
|
||||
if len(ls):
|
||||
try:
|
||||
length = float(ls[0])
|
||||
except:
|
||||
print "Invalid length given."
|
||||
self.log("Invalid length given.")
|
||||
if len(ls)>1:
|
||||
try:
|
||||
feed = int(ls[1])
|
||||
except:
|
||||
print "Invalid speed given."
|
||||
self.log("Invalid speed given.")
|
||||
self.do_extrude("", length*-1.0, feed)
|
||||
|
||||
def help_reverse(self):
|
||||
print "Reverses the extruder, 5mm by default, or the number of mm given as a parameter"
|
||||
print "reverse - reverses 5mm of filament at 300mm/min (5mm/s)"
|
||||
print "reverse 20 - reverses 20mm of filament at 300mm/min (5mm/s)"
|
||||
print "reverse 10 210 - extrudes 10mm of filament at 210mm/min (3.5mm/s)"
|
||||
print "reverse -5 - EXTRUDES 5mm of filament at 300mm/min (5mm/s)"
|
||||
self.log("Reverses the extruder, 5mm by default, or the number of mm given as a parameter")
|
||||
self.log("reverse - reverses 5mm of filament at 300mm/min (5mm/s)")
|
||||
self.log("reverse 20 - reverses 20mm of filament at 300mm/min (5mm/s)")
|
||||
self.log("reverse 10 210 - extrudes 10mm of filament at 210mm/min (3.5mm/s)")
|
||||
self.log("reverse -5 - EXTRUDES 5mm of filament at 300mm/min (5mm/s)")
|
||||
|
||||
def do_exit(self, l):
|
||||
print "Disconnecting from printer..."
|
||||
self.log("Disconnecting from printer...")
|
||||
self.p.disconnect()
|
||||
print "Exiting program. Goodbye!"
|
||||
self.log("Exiting program. Goodbye!")
|
||||
return True
|
||||
|
||||
def help_exit(self):
|
||||
print "Disconnects from the printer and exits the program."
|
||||
self.log("Disconnects from the printer and exits the program.")
|
||||
|
||||
def do_monitor(self, l):
|
||||
interval = 5
|
||||
if not self.p.online:
|
||||
print "Printer is not online. Please connect first."
|
||||
self.log("printer is not online. Please connect first.")
|
||||
return
|
||||
print "Monitoring printer, use ^C to interrupt."
|
||||
self.log("Monitoring printer, use ^C to interrupt.")
|
||||
if len(l):
|
||||
try:
|
||||
interval = float(l)
|
||||
except:
|
||||
print "Invalid period given."
|
||||
print "Updating values every %f seconds."%(interval,)
|
||||
self.log("Invalid period given.")
|
||||
self.log("Updating values every %f seconds."%(interval,))
|
||||
self.monitoring = 1
|
||||
try:
|
||||
while(1):
|
||||
|
@ -1069,22 +1073,22 @@ class pronsole(cmd.Cmd):
|
|||
if(self.sdprinting):
|
||||
self.p.send_now("M27")
|
||||
time.sleep(interval)
|
||||
#print (self.tempreadings.replace("\r", "").replace("T", "Hotend").replace("B", "Bed").replace("\n", "").replace("ok ", ""))
|
||||
#self.log((self.tempreadings.replace("\r", "").replace("T", "Hotend").replace("B", "Bed").replace("\n", "").replace("ok ", "")))
|
||||
if(self.p.printing):
|
||||
print "Print progress: ", 100*float(self.p.queueindex)/len(self.p.mainqueue), "%"
|
||||
self.log("print progress: ", 100*float(self.p.queueindex)/len(self.p.mainqueue), "%")
|
||||
|
||||
if(self.sdprinting):
|
||||
print "SD print progress: ", self.percentdone, "%"
|
||||
self.log("SD print progress: ", self.percentdone, "%")
|
||||
|
||||
except:
|
||||
print "Done monitoring."
|
||||
self.log("Done monitoring.")
|
||||
pass
|
||||
self.monitoring = 0
|
||||
|
||||
def help_monitor(self):
|
||||
print "Monitor a machine's temperatures and an SD print's status."
|
||||
print "monitor - Reports temperature and SD print status (if SD printing) every 5 seconds"
|
||||
print "monitor 2 - Reports temperature and SD print status (if SD printing) every 2 seconds"
|
||||
self.log("Monitor a machine's temperatures and an SD print's status.")
|
||||
self.log("monitor - Reports temperature and SD print status (if SD printing) every 5 seconds")
|
||||
self.log("monitor 2 - Reports temperature and SD print status (if SD printing) every 2 seconds")
|
||||
|
||||
def expandcommand(self, c):
|
||||
return c.replace("$python", sys.executable)
|
||||
|
@ -1092,31 +1096,31 @@ class pronsole(cmd.Cmd):
|
|||
def do_skein(self, l):
|
||||
l = l.split()
|
||||
if len(l) == 0:
|
||||
print "No file name given."
|
||||
self.log("No file name given.")
|
||||
return
|
||||
settings = 0
|
||||
if(l[0]=="set"):
|
||||
settings = 1
|
||||
else:
|
||||
print "Skeining file:"+l[0]
|
||||
self.log("Skeining file:"+l[0])
|
||||
if not(os.path.exists(l[0])):
|
||||
print "File not found!"
|
||||
self.log("File not found!")
|
||||
return
|
||||
try:
|
||||
import shlex
|
||||
if(settings):
|
||||
param = self.expandcommand(self.settings.sliceoptscommand).replace("\\", "\\\\").encode()
|
||||
print "Entering slicer settings: ", param
|
||||
self.log("Entering slicer settings: ", param)
|
||||
subprocess.call(shlex.split(param))
|
||||
else:
|
||||
param = self.expandcommand(self.settings.slicecommand).encode()
|
||||
print "Slicing: ", param
|
||||
self.log("Slicing: ", param)
|
||||
params = [i.replace("$s", l[0]).replace("$o", l[0].replace(".stl", "_export.gcode").replace(".STL", "_export.gcode")).encode() for i in shlex.split(param.replace("\\", "\\\\").encode())]
|
||||
subprocess.call(params)
|
||||
print "Loading sliced file."
|
||||
self.log("Loading sliced file.")
|
||||
self.do_load(l[0].replace(".stl", "_export.gcode"))
|
||||
except Exception, e:
|
||||
print "Skeinforge execution failed: ", e
|
||||
self.log("Skeinforge execution failed: ", e)
|
||||
|
||||
def complete_skein(self, text, line, begidx, endidx):
|
||||
s = line.split()
|
||||
|
@ -1129,18 +1133,18 @@ class pronsole(cmd.Cmd):
|
|||
return glob.glob("*/")+glob.glob("*.stl")
|
||||
|
||||
def help_skein(self):
|
||||
print "Creates a gcode file from an stl model using the slicer (with tab-completion)"
|
||||
print "skein filename.stl - create gcode file"
|
||||
print "skein filename.stl view - create gcode file and view using skeiniso"
|
||||
print "skein set - adjust slicer settings"
|
||||
self.log("Creates a gcode file from an stl model using the slicer (with tab-completion)")
|
||||
self.log("skein filename.stl - create gcode file")
|
||||
self.log("skein filename.stl view - create gcode file and view using skeiniso")
|
||||
self.log("skein set - adjust slicer settings")
|
||||
|
||||
|
||||
def do_home(self, l):
|
||||
if not self.p.online:
|
||||
print "Printer is not online. Unable to move."
|
||||
self.log("printer is not online. Unable to move.")
|
||||
return
|
||||
if self.p.printing:
|
||||
print "Printer is currently printing. Please pause the print before you issue manual commands."
|
||||
self.log("printer is currently printing. Please pause the print before you issue manual commands.")
|
||||
return
|
||||
if "x" in l.lower():
|
||||
self.p.send_now("G28 X0")
|
||||
|
@ -1155,26 +1159,26 @@ class pronsole(cmd.Cmd):
|
|||
self.p.send_now("G92 E0")
|
||||
|
||||
def help_home(self):
|
||||
print "Homes the printer"
|
||||
print "home - homes all axes and zeroes the extruder(Using G28 and G92)"
|
||||
print "home xy - homes x and y axes (Using G28)"
|
||||
print "home z - homes z axis only (Using G28)"
|
||||
print "home e - set extruder position to zero (Using G92)"
|
||||
print "home xyze - homes all axes and zeroes the extruder (Using G28 and G92)"
|
||||
self.log("Homes the printer")
|
||||
self.log("home - homes all axes and zeroes the extruder(Using G28 and G92)")
|
||||
self.log("home xy - homes x and y axes (Using G28)")
|
||||
self.log("home z - homes z axis only (Using G28)")
|
||||
self.log("home e - set extruder position to zero (Using G92)")
|
||||
self.log("home xyze - homes all axes and zeroes the extruder (Using G28 and G92)")
|
||||
|
||||
def parse_cmdline(self, args):
|
||||
import getopt
|
||||
opts, args = getopt.getopt(args, "c:e:hw", ["conf = ", "config = ", "help"])
|
||||
for o, a in opts:
|
||||
#print repr((o, a))
|
||||
#self.log(repr((o, a)))
|
||||
if o in ("-c", "--conf", "--config"):
|
||||
self.load_rc(a)
|
||||
elif o in ("-h", "--help"):
|
||||
print "Usage: "+sys.argv[0]+' [-c filename [-c filename2 ... ] ] [-e "command" ...]'
|
||||
print " -c | --conf | --config - override startup .pronsolerc file"
|
||||
print " may chain config files, settings auto-save will go into last file in the chain"
|
||||
print ' -e <command> - executes command after configuration/.pronsolerc is loaded'
|
||||
print " macros/settings from these commands are not autosaved"
|
||||
self.log("Usage: "+sys.argv[0]+' [-c filename [-c filename2 ... ] ] [-e "command" ...]')
|
||||
self.log(" -c | --conf | --config - override startup .pronsolerc file")
|
||||
self.log(" may chain config files, settings auto-save will go into last file in the chain")
|
||||
self.log(' -e <command> - executes command after configuration/.pronsolerc is loaded')
|
||||
self.log(" macros/settings from these commands are not autosaved")
|
||||
sys.exit()
|
||||
if not self.rc_loaded:
|
||||
self.load_default_rc()
|
||||
|
|
Loading…
Reference in New Issue