# import os # os.system('ifconfig eth0 192.168.101.253') # print('IP changed to 192.168.101.253') import sys from socket import * import time import atexit #import serial import binascii #import threading from PyQt4 import QtGui, QtCore from PyQt4.QtCore import Qt #import struct #from binascii import hexlify #from binascii import unhexlify sock = socket(AF_UNIX, SOCK_STREAM) BUFFER_SIZE = 256 packet_size = 30 #serPort = serial.Serial( # port='/dev/ttyUSB0', # baudrate=9600, # parity=serial.PARITY_ODD, # stopbits=serial.STOPBITS_ONE, # bytesize=serial.SEVENBITS #) class Container(QtGui.QX11EmbedContainer): def __init__(self): QtGui.QX11EmbedContainer.__init__(self) def sizeHint(self): size = QtCore.QSize(400, 500) return size.expandedTo(QtGui.QApplication.globalStrut()) class ExeMeasureThread(QtCore.QThread): signalCom = QtCore.pyqtSignal(object) def __init__(self, filename): QtCore.QThread.__init__(self) self.filename = filename def run(self): num_lines = sum(1 for line in open(self.filename)) fin_lines = 0.0 with open(self.filename) as coordinates: for line in coordinates: self.move_to(line) self.wait_for_completion() value = self.read_gaussmeter() fin_lines += 1 self.signalCom.emit(((fin_lines/num_lines)*100, value)) def wait_for_completion(self): sock.send("check_status" + ("\0" * (packet_size-len("check_status")))) msg = sock.recv(50) #print msg while msg == "busy": sock.send("check_status" + ("\0" * (packet_size-len("check_status")))) msg = sock.recv(50) #print msg time.sleep(0.1) def move_to(self, coordinates): G_CMD = "G0" + coordinates + "\n" sock.send(G_CMD + ("\0" * (packet_size-len(G_CMD)))) def read_gaussmeter(self): #serPort.write("ALLF?") value = '' time.sleep(0.2) #while serPort.inWaiting() > 0: #value += serPort.read(1) #if value != '': # print ">>" + value return value #class ExeMeasureThreadRemote(QtCore.QThread): Implement this if you have GUI-Remote connection problems class Main(QtGui.QMainWindow): def __init__(self): super(Main, self).__init__() self.initUI() def initUI(self): self.frameSysIni = QtGui.QFrame() self.frameSysIni.setFrameShape(QtGui.QFrame.StyledPanel) self.frameHoming = QtGui.QFrame() self.frameHoming.setFrameShape(QtGui.QFrame.StyledPanel) self.frameMoving = QtGui.QFrame() self.frameMoving.setFrameShape(QtGui.QFrame.StyledPanel) self.frameMeasure = QtGui.QFrame() self.frameMeasure.setFrameShape(QtGui.QFrame.StyledPanel) self.frameConsole = QtGui.QFrame() self.frameConsole.setFrameShape(QtGui.QFrame.StyledPanel) self.outputText = QtGui.QTextEdit() #self.frameOutput = QtGui.QFrame() #self.frameOutput.setFrameShape(QtGui.QFrame.StyledPanel) ##############Berk##################### #self.bleAdapterConnect = QtGui.QFrame() #self.bleAdapterConnect.setFrameShape(QtGui.QFrame.StyledPanel) ##############Berk##################### self.splitterVLeft = QtGui.QSplitter(Qt.Vertical) self.splitterVLeft.addWidget(self.frameSysIni) self.splitterVLeft.addWidget(self.frameHoming) self.splitterVLeft.addWidget(self.frameMoving) self.splitterVLeft.addWidget(self.frameMeasure) self.splitterVLeft.setSizes([200,150,150,300]) self.splitterVRight = QtGui.QSplitter(Qt.Vertical) self.splitterVRight.addWidget(self.frameConsole) #self.splitterVRight.addWidget(self.frameOutput) self.splitterVRight.addWidget(self.outputText) self.splitterVRight.setSizes([400,400]) self.splitterH = QtGui.QSplitter(Qt.Horizontal) self.splitterH.addWidget(self.splitterVLeft) self.splitterH.addWidget(self.splitterVRight) self.splitterH.setSizes([500,500]) self.setCentralWidget(self.splitterH) QtGui.QApplication.setStyle(QtGui.QStyleFactory.create('Cleanlooks')) font11 = QtGui.QFont() font11.setPointSize(11) font11.setBold(True) font11.setUnderline(True) font11.setWeight(75) font10 = QtGui.QFont() font10.setPointSize(10) self.bleAdapterConnect = QtGui.QPushButton('Enable Connect') self.bleAdapterConnect.setGeometry(QtCore.QRect(30, 80, 70, 30)) self.bleAdapterDConnect = QtGui.QPushButton('Connect external PC') self.bleAdapterDConnect.setGeometry(QtCore.QRect(30, 80, 70, 30)) self.bleIniButton = QtGui.QPushButton('Init BLE Functions') self.bleIniButton.setGeometry(QtCore.QRect(30, 80, 70, 30)) self.lableIni = QtGui.QLabel('System Initialization') self.lableIni.setGeometry(QtCore.QRect(10, 10, 150, 20)) self.lableIni.setFont(font11) self.lableStatusController = QtGui.QLabel('Movement controller') self.lableStatusController.setGeometry(QtCore.QRect(310, 50, 20, 20)) self.lableStatusController.setFont(font10) self.lableStatusSerial = QtGui.QLabel('BLE') self.lableStatusSerial.setGeometry(QtCore.QRect(30, 80, 100, 30)) self.lableStatusSerial.setFont(font10) self.pushButtonIni = QtGui.QPushButton('Initialize') self.pushButtonIni.setGeometry(QtCore.QRect(30, 80, 100, 30)) self.frameStatusController = QtGui.QFrame() self.frameStatusController.setFrameShape(QtGui.QFrame.StyledPanel) self.frameStatusController.setFrameShadow(QtGui.QFrame.Raised) self.frameStatusSerial = QtGui.QFrame() self.frameStatusSerial.setFrameShape(QtGui.QFrame.StyledPanel) self.frameStatusSerial.setFrameShadow(QtGui.QFrame.Raised) self.gridLayoutSysIni = QtGui.QGridLayout() self.gridLayoutSysIni.addWidget(self.lableIni, 0, 0, 1, 3) self.gridLayoutSysIni.addWidget(self.lableStatusController, 1, 2, 1, 1) self.gridLayoutSysIni.addWidget(self.lableStatusSerial, 2, 2, 1, 1) self.gridLayoutSysIni.addWidget(self.frameStatusSerial, 2, 4, 1, 1) self.gridLayoutSysIni.addWidget(self.frameStatusController, 1, 4, 1, 1) self.gridLayoutSysIni.addWidget(self.pushButtonIni, 2, 0, 1, 1) self.gridLayoutSysIni.addWidget(self.bleAdapterConnect, 3, 0, 1, 1) self.gridLayoutSysIni.addWidget(self.bleAdapterDConnect, 3, 1, 1, 1) self.gridLayoutSysIni.addWidget(self.bleIniButton, 3, 2, 1, 1) self.frameSysIni.setLayout(self.gridLayoutSysIni) self.pushButtonIni.clicked.connect(self.sys_ini) self.bleAdapterConnect.clicked.connect(self.connectDongle) self.bleAdapterDConnect.clicked.connect(self.dConnectDongle) self.bleIniButton.clicked.connect(self.initBLEfuctions) self.homigXminButton = QtGui.QPushButton('Home X-') self.homigYminButton = QtGui.QPushButton('Home Y-') self.homigZminButton = QtGui.QPushButton('Home Z-') self.homigXplsButton = QtGui.QPushButton('Home X+') self.homigYplsButton = QtGui.QPushButton('Home Y+') self.homigZplsButton = QtGui.QPushButton('Home Z+') self.lableHoming = QtGui.QLabel('Homing') self.lableHoming.setFont(font11) self.lableHomingStatus = QtGui.QLabel('Homing status') self.lableHomingStatus.setFont(font10) self.pushButtonHoming = QtGui.QPushButton('Home') self.frameStatusHoming = QtGui.QFrame() self.frameStatusHoming.resize(20,20) self.frameStatusHoming.setFrameShape(QtGui.QFrame.StyledPanel) self.frameStatusHoming.setFrameShadow(QtGui.QFrame.Raised) self.spacerItem1 = QtGui.QSpacerItem(379, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.spacerItem2 = QtGui.QSpacerItem(20, 48, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.gridLayoutHoming = QtGui.QGridLayout() self.gridLayoutHoming.addWidget(self.lableHoming, 0, 0, 1, 1) self.gridLayoutHoming.addWidget(self.lableHomingStatus, 3, 2, 1, 1) self.gridLayoutHoming.addWidget(self.pushButtonHoming, 3, 0, 1, 1) self.gridLayoutHoming.addWidget(self.frameStatusHoming, 3, 3, 1, 1) self.gridLayoutHoming.addWidget(self.pushButtonHoming, 3, 0, 1, 1) self.gridLayoutHoming.addWidget(self.homigXminButton, 2, 0, 1, 1) self.gridLayoutHoming.addWidget(self.homigYminButton, 2, 1, 1, 1) self.gridLayoutHoming.addWidget(self.homigZminButton, 2, 2, 1, 1) self.gridLayoutHoming.addWidget(self.homigXplsButton, 1, 0, 1, 1) self.gridLayoutHoming.addWidget(self.homigYplsButton, 1, 1, 1, 1) self.gridLayoutHoming.addWidget(self.homigZplsButton, 1, 2, 1, 1) self.gridLayoutHoming.addItem(self.spacerItem1, 1, 0, 2, 4) self.gridLayoutHoming.addItem(self.spacerItem2, 2, 1, 2, 1) self.frameHoming.setLayout(self.gridLayoutHoming) self.pushButtonHoming.clicked.connect(self.homing) self.homigXminButton.clicked.connect(self.homingXminus) self.homigYminButton.clicked.connect(self.homingYminus) self.homigZminButton.clicked.connect(self.homingZminus) self.homigXplsButton.clicked.connect(self.homingXplus) self.homigYplsButton.clicked.connect(self.homingYplus) self.homigZplsButton.clicked.connect(self.homingZplus) self.lableMove = QtGui.QLabel('Move to a point and measure') self.lableMove.setFont(font11) self.lableMoveTo = QtGui.QLabel('Move to:') self.lableMoveTo.setFont(font10) self.lineEditCoordinates = QtGui.QLineEdit() self.pushButtonExeMove = QtGui.QPushButton('Execute') self.spacerItem3 = QtGui.QSpacerItem(20, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.spacerItem4 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.gridLayoutMove = QtGui.QGridLayout() self.gridLayoutMove.addWidget(self.lableMove, 0, 0, 1, 2) self.gridLayoutMove.addWidget(self.lableMoveTo, 2, 0, 1, 1) self.gridLayoutMove.addWidget(self.lineEditCoordinates, 2, 1, 1, 1) self.gridLayoutMove.addWidget(self.pushButtonExeMove, 2, 3, 1, 1) self.gridLayoutMove.addItem(self.spacerItem3, 2, 2, 1, 1) self.gridLayoutMove.addItem(self.spacerItem4, 1, 0, 1, 1) self.frameMoving.setLayout(self.gridLayoutMove) self.pushButtonExeMove.clicked.connect(self.ExeMove) self.lableMeasure = QtGui.QLabel('Move along a path and measure') self.lableMeasure.setFont(font11) self.lableLoadFile = QtGui.QLabel('Load path file:') self.lableLoadFile.setFont(font10) self.lableSaveFile = QtGui.QLabel('Save data as:') self.lableSaveFile.setFont(font10) self.lableFileName1 = QtGui.QLabel('') self.lableFileName1.setFont(font10) self.lableFileName2 = QtGui.QLabel('') self.lableFileName2.setFont(font10) iconOpenFile = QtGui.QIcon() iconOpenFile.addPixmap(QtGui.QPixmap('open.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.pushButtonOpenFile = QtGui.QPushButton('') self.pushButtonOpenFile.setIcon(iconOpenFile) self.pushButtonSaveFile = QtGui.QPushButton('') self.pushButtonSaveFile.setIcon(iconOpenFile) self.pushButtonExeMeasure = QtGui.QPushButton('Execute') self.pushButtonStopMeasure = QtGui.QPushButton('Stop') self.progressBar = QtGui.QProgressBar() self.progressBar.setProperty("value", 0) self.spacerItem5 = QtGui.QSpacerItem(127, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.spacerItem6 = QtGui.QSpacerItem(81, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.spacerItem7 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Maximum) self.spacerItem8 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Preferred) self.spacerItem9 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) self.spacerItem10 = QtGui.QSpacerItem(20, 20, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) #spacerItem11 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.gridLayoutMeasure = QtGui.QGridLayout() self.gridLayoutMeasure.addWidget(self.lableMeasure, 0, 0, 1, 2) self.gridLayoutMeasure.addItem(self.spacerItem8, 1, 0, 1, 1) self.gridLayoutMeasure.addWidget(self.lableLoadFile, 2, 0, 1, 1) self.gridLayoutMeasure.addWidget(self.pushButtonOpenFile, 2, 1, 1, 1) self.gridLayoutMeasure.addWidget(self.lableFileName1, 2, 2, 1, 1) self.gridLayoutMeasure.addWidget(self.lableSaveFile, 3, 0, 1, 1) self.gridLayoutMeasure.addWidget(self.pushButtonSaveFile, 3, 1, 1, 1) self.gridLayoutMeasure.addWidget(self.lableFileName2, 3, 2, 1, 1) self.gridLayoutMeasure.addWidget(self.pushButtonExeMeasure, 4, 0, 1, 1) self.gridLayoutMeasure.addWidget(self.pushButtonStopMeasure, 4, 1, 1, 1) self.gridLayoutMeasure.addItem(self.spacerItem6, 4, 2, 1, 1) self.gridLayoutMeasure.addItem(self.spacerItem5, 4, 3, 1, 1) self.gridLayoutMeasure.addItem(self.spacerItem7, 5, 0, 1, 1) self.gridLayoutMeasure.addWidget(self.progressBar, 6, 0, 1, 4) self.gridLayoutMeasure.addItem(self.spacerItem9, 7, 0, 1, 1) #self.gridLayoutMeasure.addItem(self.spacerItem10, 3, 0, 1, 1) #gridLayoutMeasure.addItem(spacerItem11, 2, 3, 1, 2) self.frameMeasure.setLayout(self.gridLayoutMeasure) self.pushButtonOpenFile.clicked.connect(self.getOpenFileName) self.pushButtonSaveFile.clicked.connect(self.getSaveFileName) self.pushButtonExeMeasure.clicked.connect(self.ExeMeasure) self.pushButtonExeMeasure.clicked.connect(self.StopMeasure) self.console = Container() self.hbox = QtGui.QHBoxLayout() self.hbox.addWidget(self.console) self.vbox = QtGui.QVBoxLayout() self.vbox.addStretch(1) self.vbox.addLayout(self.hbox) self.frameConsole.setLayout(self.vbox) self.setGeometry(100,100,1000,800) self.setWindowTitle("COSI-Measure") self.show() #Individual homing for indivudial axis. #This is useful in case some probe or holder is hard to remove. #For example: x0y0z0 is just above the frame. Single button homing will break if something is attached. #You can manually home x and y first. Then, complete z homing at x,y max position (other corner)(Check height with probe or attachment ofc.) def homingXplus(self): sock.send("G162X\n" + ("\0" * (packet_size-len("G162X\n")))) sock.send("G162X\n" + ("\0" * (packet_size-len("G162X\n")))) self.wait_for_completion() def homingYplus(self): sock.send("G162Y\n" + ("\0" * (packet_size-len("G161Y\n")))) sock.send("G162Y\n" + ("\0" * (packet_size-len("G161Y\n")))) self.wait_for_completion() def homingZplus(self): sock.send("G162Z\n" + ("\0" * (packet_size-len("G161Z\n")))) sock.send("G162Z\n" + ("\0" * (packet_size-len("G161Z\n")))) self.wait_for_completion() def homingXminus(self): sock.send("G161X\n" + ("\0" * (packet_size-len("G162X\n")))) sock.send("G161X\n" + ("\0" * (packet_size-len("G162X\n")))) self.wait_for_completion() def homingYminus(self): sock.send("G161Y\n" + ("\0" * (packet_size-len("G162Y\n")))) sock.send("G161Y\n" + ("\0" * (packet_size-len("G162Y\n")))) self.wait_for_completion() def homingZminus(self): sock.send("G161Z\n" + ("\0" * (packet_size-len("G162Z\n")))) sock.send("G161Z\n" + ("\0" * (packet_size-len("G162Z\n")))) self.wait_for_completion() #This enables a local connection from an external device using a TCP_IP protocol. #The handshake is manual, I fixed some keywords please feel free to implement yours. #The main drawback: there is no access to the GUI anymore. #The remote part should send a disconnect message ("CLOSECONN") to break the loop. #If pipe is broken due to some kind of error, the TCP connection should manually closed from another terminal. (Not to close whole GUI which resets the homing settings) #This part should definetely be improved and can be customized for different applications. #Manual termination of TCP Example: #Find the offending process: netstat -np #Find the socket file descriptor: lsof -np $PID #Debug the process: gdb -p $PID #Close the socket: call close($FD) #Close the debugger: quit Source: https://www.scm.keele.ac.uk/staff/stan/2016/05/16/closing-sockets-without-killing-processes/ #Unfortunately the debian is limited. Some functions may not be found but the idea should be implementable. def dConnectDongle(self): self.remoteSocket = socket(AF_INET, SOCK_STREAM) self.remoteSocket.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) self.TCP_IP = "192.168.101.253" self.TCP_PORT = 7001 self.remoteSocket.bind((self.TCP_IP,self.TCP_PORT)) self.remoteSocket.listen(1) self.conn, self.addr = self.remoteSocket.accept() self.connectDongle() print("Connection address: ",self.addr) #self.adapter.stop() def connectDongle(self): print("Full software control is on the Remote Machine. Click close from the otherside to make gui effective again.") while True: self.remoteData = self.conn.recv(BUFFER_SIZE) #receive the data if(str(self.remoteData) == "CLOSECONN"): # Close connection keyword self.conn.send("Closing Connection") # Acknowledge command. time.sleep(2) self.conn.close() self.remoteSocket.close() break #Activate the GUI again elif(str(self.remoteData[0:3]) == "MOV"): #I always send starting with a MOV command to make it consistent. if len(self.remoteData) == 18: #For submillimeter resolution. #Remote data structure is (MOVXXXxxYYYyyZZZzz). #The submillimeter precision is 2, first 3 digits are the coordinates in mm for xyz. #E.g.: command example MOV #Please pad with zeros. i.e. 58.23 is 05823 print('recv data is:', self.remoteData, 'length:', len(self.remoteData)) self.xRem = (str(self.remoteData[3:8])) self.yRem = (str(self.remoteData[8:13])) self.zRem = (str(self.remoteData[13:18])) print('x: ',self.xRem) print('y: ',self.yRem) print('z: ',self.zRem) X = str("x")+str(self.xRem[:3])+'.'+str(self.xRem[3:5]) Y = str("y")+str(self.yRem[:3])+'.'+str(self.yRem[3:5]) Z = str("z")+str(self.zRem[:3])+'.'+str(self.zRem[3:5]) coordinates = X + Y + Z print(coordinates) elif len(self.remoteData) == 12: # For milimeter resolution #Remote data structure is (MOVXXXYYYZZZ) xxxs print('recv data is:', self.remoteData, 'length:', len(self.remoteData)) self.xRem = (str(self.remoteData[3:6])) self.yRem = (str(self.remoteData[6:9])) self.zRem = (str(self.remoteData[9:12])) print('x: ',self.xRem) print('y: ',self.yRem) print('z: ',self.zRem) coordinates = str("x")+str(self.xRem)+str("y")+str(self.yRem)+str("z")+str(self.zRem) else: print('Unknown format') self.conn.close() self.remoteSocket.close() break self.move_to(coordinates) self.wait_for_completion() self.conn.send("MOVOK") elif(str(self.remoteData) == "OK"): print("movok: ") self.conn.send("MOVOK") def initBLEfuctions(self): print("N/A") def sys_ini(self): def coordinatesCB(handle,value): print(value) self.ReceivedIntArray = struct.unpack('<BBBBBBBBBBBBBBBBBBBB', value) print(self.ReceivedIntArray) self.xBLE = (self.ReceivedIntArray[0]-48)*100 + (self.ReceivedIntArray[1]-48)*10 + (self.ReceivedIntArray[2]-48) self.yBLE = (self.ReceivedIntArray[3]-48)*100 + (self.ReceivedIntArray[4]-48)*10 + (self.ReceivedIntArray[5]-48) self.zBLE = (self.ReceivedIntArray[6]-48)*100 + (self.ReceivedIntArray[7]-48)*10 + (self.ReceivedIntArray[8]-48) print('x: ',self.xBLE) print('y: ',self.yBLE) print('z: ',self.zBLE) coordinates = str("x")+str(self.xBLE)+str("y")+str(self.yBLE)+str("z")+str(self.zBLE) self.move_to(coordinates) self.wait_for_completion() #time.sleep(0.2) self.thr.start() #valueX = self.read_gaussmeter() #valueX = 'a' #cursor = self.outputText.textCursor() #cursor.insertText(valueX) def ServerOkService (handle, value): self.ReceivedIntArray = struct.unpack('<BB', value) print(self.ReceivedIntArray) if(self.ReceivedIntArray[0]==107): coordinates = str("x450y450z450") self.move_to(coordinates) self.wait_for_completion() #valueX = self.read_gaussmeter() #valueX = 'a' #cursor = self.outputText.textCursor() #cursor.insertText(valueX) wid=QtCore.QString.number(self.console.winId()) self.process = QtCore.QProcess(self) args = [ "-into", wid, "-bc", "-e", "\"./mendel.elf\"", ] self.process.start("xterm", args) time.sleep(7) socketStatus = sock.connect_ex("/tmp/socket") if socketStatus == 0: self.frameStatusController.setStyleSheet("QWidget { background-color: %s }" % QtGui.QColor(0, 255, 0).name()) else: self.frameStatusController.setStyleSheet("QWidget { background-color: %s }" % QtGui.QColor(255, 0, 0).name()) #if(serPort.isOpen() == False): #self.frameStatusSerial.setStyleSheet("QWidget { background-color: %s }" % QtGui.QColor(255, 0, 0).name()) #else: self.frameStatusSerial.setStyleSheet("QWidget { background-color: %s }" % QtGui.QColor(0, 255, 0).name()) def homing(self): sock.send("G161XYZ\n" + ("\0" * (packet_size-len("G161XYZ\n")))) sock.send("G161XYZ\n" + ("\0" * (packet_size-len("G161XYZ\n")))) sock.send("G162XYZ\n" + ("\0" * (packet_size-len("G162XYZ\n")))) sock.send("G162XYZ\n" + ("\0" * (packet_size-len("G162XYZ\n")))) self.wait_for_completion() self.frameStatusHoming.setStyleSheet("QWidget { background-color: %s }" % QtGui.QColor(0, 255, 0).name()) def wait_for_completion(self): sock.send("check_status" + ("\0" * (packet_size-len("check_status")))) msg = sock.recv(50) #print msg while msg == "busy": sock.send("check_status" + ("\0" * (packet_size-len("check_status")))) msg = sock.recv(50) #print msg time.sleep(1) def ExeMove(self): coordinates = str(self.lineEditCoordinates.text()) self.move_to(coordinates) self.wait_for_completion() #value = self.read_gaussmeter() value = "a" cursor = self.outputText.textCursor() cursor.insertText(value) def move_to(self, coordinates): G_CMD = "G0" + coordinates + "\n" sock.send(G_CMD + ("\0" * (packet_size-len(G_CMD)))) def read_gaussmeter(self): #serPort.write("ALLF?") value = '' #time.sleep(1) self.device.char_write(myids.COSI_READY_CHAR ,bytearray([1, 0]), wait_for_response=False) #,0) self.thr = threading.Thread(name='a test thread',target=self.read_gaussmeter) #while serPort.inWaiting() > 0: #value += serPort.read(1) if value != '': print ">>" + value return value def getOpenFileName(self): self.filenameOpen = QtGui.QFileDialog.getOpenFileName(self, 'Open File',".","(*.path)") self.lableFileName1.setText(self.filenameOpen) def getSaveFileName(self): self.filenameSave = QtGui.QFileDialog.getSaveFileName(self, 'Save File') self.lableFileName2.setText(self.filenameSave) def ExeMeasure(self): worker = ExeMeasureThread(self.filenameOpen) worker.signalCom.connect(self.onDataReady) self.threads = [] self.threads.append(worker) worker.start() def onDataReady(self, value): cursor = self.outputText.textCursor() cursor.insertText(value[1]) with open(self.filenameSave,"a") as dataFile: dataFile.write(value[1]) self.progressBar.setValue(value[0]) def StopMeasure(self): pass def finish(self): sock.send("quit"+ ("\0" * (packet_size-len("quit")))) sock.close() print 'finished\n' def main(): app = QtGui.QApplication(sys.argv) main = Main() sys.exit(app.exec_()) if __name__ == "__main__": main()