# 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()