def getNozzleTemperature(self): r""" getNozzleTemperature method reads current nozzle temperature returns: nozzle temperature """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None with self._commandLock: # get Temperature resp = self._beeCon.sendCmd("M105\n") try: splits = resp.split(" ") tPos = splits[0].find("T:") t = float(splits[0][tPos+2:]) return t except Exception as ex: logger.error("Error getting nozzle temperature: %s", str(ex)) return 0
def goToBootloader(self): r""" goToBootloader method Resets the printer to Bootloader """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None if self._beeCon.transfering: logger.info('File transfer in progress... Can not change to Bootloader\n') return None logger.info('Changing to Bootloader...\n') mode = self.getPrinterMode() if mode == 'Bootloader': logger.info('Printer Already in Bootloader\n') return False with self._commandLock: self._beeCon.sendCmd('M609\n') self._beeCon.reconnect() mode = self.getPrinterMode() return mode
def transferSDFile(self, fileName, sdFileName=None): r""" transferSDFile method Transfers GCode file to printer internal memory """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None if os.path.isfile(fileName) is False: logger.warning("Gcode Transfer: File does not exist") return logger.info("Transfer GCode File: %s" % fileName) try: with self._commandLock: self._beeCon.read() if sdFileName is not None: self._transfThread = transferThread.FileTransferThread(self._beeCon, fileName, 'gcode', sdFileName) else: self._transfThread = transferThread.FileTransferThread(self._beeCon, fileName, 'gcode') self._transfThread.start() except Exception as ex: logger.error("Error starting the print operation: %s", str(ex)) return False return
def initSD(self): r""" initSD method inits Sd card """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None with self._commandLock: # Init SD self._beeCon.write("M21\n") tries = 10 resp = "" while (tries > 0) and ("ok" not in resp.lower()): try: resp += self._beeCon.read() tries -= 1 except Exception as ex: logger.error("Error initializing SD Card: %s", str(ex)) return tries
def flashFirmware(self, fileName, firmwareString='20.0.0'): r""" flashFirmware method Flash new firmware """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None """ if ('linux' or 'darwin') in platform.system().lower(): fileName = fileName.translate(None,''.join("'")) elif ('win32' or 'cygwin') in platform.system().lower(): fileName = fileName.translate(None,''.join('"'))\ """ if os.path.isfile(fileName) is False: logger.warning("Flash firmware: File does not exist") return logger.info("Flashing new firmware File: %s", fileName) self.setFirmwareString('0.0.0') # Clear FW Version self._transfThread = transferThread.FileTransferThread(self._beeCon, fileName, 'Firmware', firmwareString) self._transfThread.start() return
def move(self, x=None, y=None, z=None, e=None, f=None, wait=None): r""" move method performs a relative move at a given feedrate current arguments: x - X axis displacement y - Y axis displacement z - Z axis displacement e - E extruder displacement f - feedrate """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None with self._commandLock: resp = self._beeCon.sendCmd("G91\n") newX = 0 newY = 0 newZ = 0 newE = 0 if x is not None: newX = newX + x if y is not None: newY = newY + y if z is not None: newZ = newZ + z if e is not None: newE = newE + e if f is not None: newF = float(f) commandStr = "G1 X" + str(newX) + " Y" + str(newY) \ + " Z" + str(newZ) + " E" + str(newE) + " F" + str(newF) + "\n" else: commandStr = "G1 X" + str(newX) + " Y" + str(newY) \ + " Z" + str(newZ) + " E" + str(newE) + "\n" if wait is not None: self._beeCon.sendCmd(commandStr) else: #self._beeCon.sendCmd(commandStr, "3") self._beeCon.sendCmd(cmd=commandStr, wait="3", timeout=100) self._beeCon.sendCmd("G90\n") return
def cancelCalibration(self): r""" cancelCalibration method Cancels the calibration procedure. """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None self.home() return
def load(self): r""" load method performs load filament operation """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None with self._commandLock: self._beeCon.sendCmd("M701\n", "3") return
def getStatus(self): r""" getStatus method returns the current status of the printer """ mode = self.getPrinterMode() if mode == 'Bootloader': logger.info('Printer in Bootloader mode') return 'Bootloader' if mode is None or (mode != 'Firmware' and mode != 'Bootloader'): logger.warning('GetStatus: can only get status in firmware') return None if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None resp = '' status = '' done = False with self._commandLock: while not done: while 's:' not in resp.lower(): resp += self._beeCon.sendCmd("M625\n") time.sleep(1) if 's:3' in resp.lower(): status = 'Ready' done = True elif 's:4' in resp.lower(): status = 'Moving' done = True elif 's:5' in resp.lower(): status = 'SD_Print' done = True elif 's:6' in resp.lower(): status = 'Transfer' done = True elif 's:7' in resp.lower() or 'pause' in resp.lower(): status = 'Pause' self._paused = True done = True elif 's:9' in resp.lower() or '_shutdown' in resp.lower(): status = 'Shutdown' self._shutdown = True done = True return status
def goToLoadUnloadPos(self): r""" goToLoadUnloadPos method moves the printer to the load/unload position """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None with self._commandLock: self._beeCon.waitForStatus('M703\n', '3') return
def beep(self): r""" beep method performs a beep with 2 seconds duration """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None with self._commandLock: self._beeCon.sendCmd("M300 P2000\n") return
def startHeating(self, temperature, extruder=0): r""" startHeating method Starts Heating procedure """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None with self._commandLock: self._setPointTemperature = temperature return self._beeCon.waitForStatus('M703 S%.2f\n' % temperature, '3')
def home(self): r""" home method homes all axis """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None with self._commandLock: self._beeCon.sendCmd(cmd="G28\n", wait="3", timeout=100) return
def sendCmd(self, cmd, wait=None, timeout=None): r""" sendCmd method Sends command to printer """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None with self._commandLock: if '\n' not in cmd: cmd += '\n' return self._beeCon.sendCmd(cmd, wait, timeout)
def clearShutdownFlag(self): r""" clearShutdownFlag method Clears shutdown Flag """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None with self._commandLock: self._beeCon.sendCmd('M505\n') return True
def setFirmwareString(self, fwStr): r""" setFirmwareString method Sets new bootloader firmware String """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None with self._commandLock: cmd = 'M114 A' + str(fwStr) + '\n' self._beeCon.sendCmd(cmd, 'ok') return
def setFilamentString(self, filStr): r""" setFilamentString method Sets filament string arguments: filStr - filament string """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None with self._commandLock: return self._beeCon.sendCmd('M1000 %s' % filStr)
def startSDPrint(self, sdFileName=''): r""" startSDPrint method starts printing selected file """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None with self._commandLock: self._beeCon.sendCmd('M33 %s' % sdFileName) return True
def cancelHeating(self): r""" cancelHeating method Cancels Heating """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None with self._commandLock: self._setPointTemperature = 0 return self._beeCon.sendCmd("M704\n", "3")
def goToNextCalibrationPoint(self): r""" goToNextCalibrationPoint method Moves to next calibration point. """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None with self._commandLock: self._beeCon.sendCmd('G132\n') return
def setBlowerSpeed(self, speed): r""" setBlowerSpeed method Sets Blower Speed """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None with self._commandLock: cmd = 'M106 S' + str(speed) + '\n' self._beeCon.sendCmd(cmd) return
def resumePrint(self): r""" resumePrint method Resume print from pause/_shutdown """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None with self._commandLock: self._beeCon.sendCmd('M643\n') self._pausing = False self._shutdown = False return
def getHeatingState(self): r""" getHeatingState method Returns the heating state """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None currentT = self.getNozzleTemperature() if self._setPointTemperature > 0: return 100 * currentT/self._setPointTemperature else: return 100
def homeXY(self): r""" homeXY method home axis X and Y """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None with self._commandLock: #self._beeCon.sendCmd("G28 X0 Y0\n", "3") self._beeCon.sendCmd(cmd="G28 X0 Y0\n", wait="3", timeout=100) return
def getFileList(self): r""" getFileList method Returns list with GCode files strored in the printers memory """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None fList = {'FileNames': [], 'FilePaths': []} self.initSD() with self._commandLock: resp = "" self._beeCon.write("M20\n") while "end file list" not in resp.lower(): resp += self._beeCon.read() lines = resp.split('\n') for l in lines: if "/" in l: if "firmware.bck" in l.lower(): pass elif "firmware.bin" in l.lower(): pass elif "config.txt" in l.lower(): pass elif "config.bck" in l.lower(): pass elif l == "": pass else: fName = l[1:len(l)] fList['FileNames'].append(fName) fList['FilePaths'].append('') elif "end file list" in l.lower(): return fList return fList
def pausePrint(self): r""" pausePrint method Initiates pause process """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None with self._commandLock: self._beeCon.sendCmd('M640\n') self._pausing = True self.stopStatusMonitor() return
def createFile(self, fileName): r""" createFile method Creates a file in the SD card root directory arguments: fileName - file name """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None # Init SD self.initSD() with self._commandLock: fn = fileName if len(fileName) > 8: fn = fileName[:8] cmdStr = "M30 " + fn + "\n" resp = self._beeCon.sendCmd(cmdStr) tries = 10 while tries > 0: if "file created" in resp.lower(): logger.info("SD file created") break elif "error" in resp.lower(): logger.error("Error creating file") return False else: resp = self._beeCon.sendCmd("\n") logger.debug("Create file in SD: " + resp) tries -= 1 if tries <= 0: return False return True
def getPrinterMode(self): r""" getPrinterMode method Returns a string with the current printer mode (Bootloader/Firmware). """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None with self._commandLock: resp = self._beeCon.sendCmd("M625\n") if 'Bad M-code 625' in resp: # printer in bootloader mode return "Bootloader" elif 'ok Q' in resp: return "Firmware" else: return None
def cancelPrint(self): r""" cancelPrint method cancels current print and home the printer axis """ logger.debug('Cancelling print...') self.stopStatusMonitor() if self.isTransferring() is True: self.cancelTransfer() time.sleep(2) # Waits for thread to stop transferring return True with self._commandLock: self._beeCon.sendCmd("M112\n", "3") return True
def setNozzleTemperature(self, t): r""" setNozzleTemperature method Sets nozzle target temperature Arguments: t - nozzle temperature """ if self.isTransferring(): logger.debug('File Transfer Thread active, please wait for transfer thread to end') return None with self._commandLock: commandStr = "M104 S" + str(t) + "\n" # set Temperature self._beeCon.sendCmd(commandStr) return