Exemple #1
0
 def on_server_start_btn_pressed(self):
     if not self.auto_status:
         #pass controller object as tcp server receives commands to execute functions that will interact with
         #the robot that are defined in the controller
         self.ServerThread = TcpServer(self.c)
         #connect signal (emit in this workthread) and slot (function add)
         self.connect(self.ServerThread,
                      QtCore.SIGNAL("update_led_label(QString, QString)"),
                      self.update_led_indicator)
         self.connect(
             self.ServerThread,
             QtCore.SIGNAL("update_ultrasonic_orientation_lcd(QString)"),
             self.update_ultrasonic_orientation_lcd)
         self.connect(
             self.ServerThread,
             QtCore.SIGNAL("update_wheel_orientation_lcd(QString)"),
             self.update_wheel_orientation_lcd)
         self.connect(self.ServerThread, QtCore.SIGNAL("started()"),
                      self.server_started)
         self.connect(self.ServerThread, QtCore.SIGNAL("finished()"),
                      self.server_finished)
         #start thread
         self.ServerThread.start()
     else:
         QtGui.QMessageBox.information(
             self, "Unauthorized!",
             "Please terminate autonomous thread before turning on controller mode"
         )
Exemple #2
0
 def __init__(self, storage, referential, marshaller, port):
     TcpServer.__init__(self, port)
     self.logger = logging.getLogger(__name__)
     self.storage = storage
     self.marshaller = marshaller
     self.referential = referential
     self.order_books = {}
     self.initialize_order_books()
     self.handle_callbacks = {
         MessageTypes.Logon.value: self.handle_logon,
         MessageTypes.CreateOrder.value: self.handle_create_order
     }
 def __init__(self, storage: AbstractStorage, client_authentication: bool,
              marshaller: Serialization, port: int):
     TcpServer.__init__(self, port)
     self.storage = storage
     self.client_authentication = client_authentication
     self.marshaller = marshaller
     self.order_books = {}
     self.handle_callbacks = {
         MessageTypes.Logon.value: self.handle_logon,
         MessageTypes.CreateOrder.value: self.handle_create_order
     }
     logger.info(
         f"Client authentication has been [{'enabled' if self.client_authentication else 'disabled'}]"
     )
Exemple #4
0
    def test_srv(self, my_socket):
        my_socket = my_socket.return_value
        socket = mock.Mock()
        host = '127.0.0.1'
        srv = TcpServer(host=host, port=4444)

        my_socket.accept.return_value = (socket, host)
        socket.recv.return_value = "ABC123"

        assert srv._running == False

        srv.run()

        socket.send.assert_called_once_with("ABC123")
        socket.close.assert_called_once_with()
        my_socket.close.assert_called_once_with()
        assert srv._running == False
Exemple #5
0
def main():
    config = create_config()
    config_ready.send(sender=config)

    # start tcp server
    try:
        tcp_server = TcpServer(config.get('network', 'listen_host'),
                               config.getint('network', 'listen_port'))
    except IOError as e:
        logger.error("Could not start TCP server: \"{0}\"".format(str(e)))
        sys.exit(1)

    peer_manager.local_address = (tcp_server.ip, tcp_server.port)
    tcp_server.start()
    peer_manager.start()
    chain_manager.start()

    # handle termination signals
    def signal_handler(signum=None, frame=None):
        logger.info('Signal handler called with signal {0}'.format(signum))
        peer_manager.stop()
        chain_manager.stop()
        tcp_server.stop()

    for sig in [signal.SIGTERM, signal.SIGHUP, signal.SIGQUIT, signal.SIGINT]:
        signal.signal(sig, signal_handler)

    # connect peer
    if config.get('network', 'remote_host'):
        peer_manager.connect_peer(
            config.get('network', 'remote_host'),
            config.getint('network', 'remote_port'))

    # loop
    while not peer_manager.stopped():
        time.sleep(0.1)
        if len(peer_manager.get_connected_peer_addresses()) > 2:
            chain_manager.bootstrap_blockchain()

    logger.info('exiting')

    peer_manager.join()

    logger.debug('main thread finished')
Exemple #6
0
 def _createServices(self, eventloop):
     """Hardcoding a list of services - later we might add auto-detection of services present"""
     Airconditioner(self, self.config, eventloop)
     AutoShade(self, self.config, eventloop)
     AutoLight(self, self.config, eventloop)
     HiFi(self, self.config, eventloop)
     IrTrans(self, self.config, eventloop)
     Kodi(self, self.config, eventloop)
     Paradox(self, self.config, eventloop)
     Projector(self, self.config, eventloop)
     Scene(self, self.config, eventloop)
     Schedule(self, self.config, eventloop)
     SleepSense(self, self.config, eventloop)
     SunRiseSet(self, self.config, eventloop)
     ZWaveMios(self, self.config, eventloop)
     # let's make this last:
     TcpServer(self, self.config, eventloop)
Exemple #7
0
 def __init__(self, marshaller, port):
     TcpServer.__init__(self, port)
     self.marshaller = marshaller
     self.referential = None
     self.initialize_referential()
Exemple #8
0
 def initMainWindow(self):
     # create Device Data Widget
     self.devDataWidget = None
     self.devGraphicWidget = None
     self.devProgramWidget = None
     self.contentWidgetList = []
     # real time object
     self.rtc = QTimer()
     self.rtc.timeout.connect(self.onRtcTimeout)
     self.onRtcTimeout()
     self.rtc.start(1000)
     self.versionLabel.setText(self.getVersion())
     self.modalTextLabel.setText("单控模式")
     # create mysql database
     self.dataBase = DataBase()
     self.dataBase.getAllDevices(DevAttr.monitorSubDevDict,
                                 DevAttr.devAttrList)
     self.dataBase.databaseState.connect(self.onDatabaseState)
     self.dataBaseThread = QThread()
     self.dataBase.moveToThread(self.dataBaseThread)
     self.getMonitorDevice.connect(self.dataBase.onCreateDevicesInfo)
     self.savingParaSetting.connect(self.dataBase.onSavingParaSetting)
     self.dataBaseThread.start()
     # frame
     self.contentFrameLayout = QHBoxLayout()
     self.contentFrame.setLayout(self.contentFrameLayout)
     # self.contentFrameLayout.setContentsMargins(0,0,0,0)
     # graphic view
     self.devGraphicWidget = DeviceGraphicWidget(
         self.getAllDevice())  # new widget
     self.devGraphicWidget.sendDataToTcp.connect(self.sendDataToTcp)
     self.contentFrameLayout.addWidget(self.devGraphicWidget)
     self.contentWidgetList.append(self.devGraphicWidget)
     # program running..
     self.devProgramWidget = DevProgramWidget()
     self.contentFrameLayout.addWidget(self.devProgramWidget)
     self.contentWidgetList.append(self.devProgramWidget)
     self.devProgramWidget.sendDataToTcp.connect(self.sendDataToTcp)
     self.devProgramWidget.analogCtrl.connect(self.analogCtrl)
     self.showAllDeviceInWidget()
     # create tcp server, main function...
     self.tcpServer = TcpServer()
     self.tcpServerThread = QThread()
     self.tcpServer.moveToThread(self.tcpServerThread)
     self.tcpServer.getAllSubDev.connect(self.onTcpServerGetAllSubDev)
     self.tcpServer.updateDeviceState.connect(
         self.devGraphicWidget.onUpdateDeviceState)
     self.tcpServer.updateParaSetting.connect(self.onTcpServerUpdateSetting)
     self.tcpServer.operationalCtrl.connect(self.onTcpServerOperationalCtrl)
     self.tcpServer.devConnectingInfo.connect(
         self.onTcpServerGetDevConnectingInfo)
     self.tcpServer.speedSet.connect(self.onTcpServerSpeedSet)
     self.sendDataToTcp.connect(self.tcpServer.onDataToSend)
     self.tcpServerThread.start()
     # plc Socket
     self.plcSocket = PlcSocket()
     self.plcSocketThread = QThread()
     self.plcSocket.moveToThread(self.plcSocketThread)
     self.plcSocketManagement.connect(self.plcSocket.onTcpSocketManagement)
     self.plcSocketThread.started.connect(self.plcSocket.initTcpSocket)
     self.plcSocketThread.start()
     # analog detection
     self.analogDetection = AnalogDetection()
     self.analogDetectionThread = QThread()
     self.analogDetection.moveToThread(self.analogDetectionThread)
     self.analogDetectionThread.started.connect(self.analogDetection.init)
     self.analogCtrl.connect(self.analogDetection.onAnalogCtrl)
     self.analogDetection.GPIOState.connect(self.onPhysicalGPIOState)
     if not Config.Debug:
         self.analogDetection.ControlModeSwitch.connect(
             self.onControlModeSwitch)
     self.analogDetectionThread.start()
     # push button signal and slots
     self.dataShowingPushButton.clicked.connect(
         self.onDataShowingPushButtonClicked)
     self.graphicShowingPushButton.clicked.connect(
         self.onGraphicShowingPushButtonClicked)
     self.autoRunningPushButton.clicked.connect(self.changeToProgramMode)
     self.organizedPlayPushButton.clicked.connect(
         self.onOrganizedPlayPushButtonClicked)
     self.systemManagementPushButton.clicked.connect(
         self.onSystemManagementPushButtonClicked)
     self.netFramePushButton.clicked.connect(
         self.onNetFramePushButtonClicked)
Exemple #9
0
class MainWindow(QFrame, ui_mainwindow.Ui_Form):
    plcSocketManagement = pyqtSignal(int)
    getMonitorDevice = pyqtSignal(str, list)
    getPlaysInfo = pyqtSignal()
    sendDataToTcp = pyqtSignal(str, int,
                               list)  # name, id, messageTypeId, action, data
    savingParaSetting = pyqtSignal(str, int, int, int)
    analogCtrl = pyqtSignal(int, int)

    # ControlModeSwitch = pyqtSignal(int)
    # PhysicalGPIOState = pyqtSignal(int, int)
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.initMainWindow()

    def initMainWindow(self):
        # create Device Data Widget
        self.devDataWidget = None
        self.devGraphicWidget = None
        self.devProgramWidget = None
        self.contentWidgetList = []
        # real time object
        self.rtc = QTimer()
        self.rtc.timeout.connect(self.onRtcTimeout)
        self.onRtcTimeout()
        self.rtc.start(1000)
        self.versionLabel.setText(self.getVersion())
        self.modalTextLabel.setText("单控模式")
        # create mysql database
        self.dataBase = DataBase()
        self.dataBase.getAllDevices(DevAttr.monitorSubDevDict,
                                    DevAttr.devAttrList)
        self.dataBase.databaseState.connect(self.onDatabaseState)
        self.dataBaseThread = QThread()
        self.dataBase.moveToThread(self.dataBaseThread)
        self.getMonitorDevice.connect(self.dataBase.onCreateDevicesInfo)
        self.savingParaSetting.connect(self.dataBase.onSavingParaSetting)
        self.dataBaseThread.start()
        # frame
        self.contentFrameLayout = QHBoxLayout()
        self.contentFrame.setLayout(self.contentFrameLayout)
        # self.contentFrameLayout.setContentsMargins(0,0,0,0)
        # graphic view
        self.devGraphicWidget = DeviceGraphicWidget(
            self.getAllDevice())  # new widget
        self.devGraphicWidget.sendDataToTcp.connect(self.sendDataToTcp)
        self.contentFrameLayout.addWidget(self.devGraphicWidget)
        self.contentWidgetList.append(self.devGraphicWidget)
        # program running..
        self.devProgramWidget = DevProgramWidget()
        self.contentFrameLayout.addWidget(self.devProgramWidget)
        self.contentWidgetList.append(self.devProgramWidget)
        self.devProgramWidget.sendDataToTcp.connect(self.sendDataToTcp)
        self.devProgramWidget.analogCtrl.connect(self.analogCtrl)
        self.showAllDeviceInWidget()
        # create tcp server, main function...
        self.tcpServer = TcpServer()
        self.tcpServerThread = QThread()
        self.tcpServer.moveToThread(self.tcpServerThread)
        self.tcpServer.getAllSubDev.connect(self.onTcpServerGetAllSubDev)
        self.tcpServer.updateDeviceState.connect(
            self.devGraphicWidget.onUpdateDeviceState)
        self.tcpServer.updateParaSetting.connect(self.onTcpServerUpdateSetting)
        self.tcpServer.operationalCtrl.connect(self.onTcpServerOperationalCtrl)
        self.tcpServer.devConnectingInfo.connect(
            self.onTcpServerGetDevConnectingInfo)
        self.tcpServer.speedSet.connect(self.onTcpServerSpeedSet)
        self.sendDataToTcp.connect(self.tcpServer.onDataToSend)
        self.tcpServerThread.start()
        # plc Socket
        self.plcSocket = PlcSocket()
        self.plcSocketThread = QThread()
        self.plcSocket.moveToThread(self.plcSocketThread)
        self.plcSocketManagement.connect(self.plcSocket.onTcpSocketManagement)
        self.plcSocketThread.started.connect(self.plcSocket.initTcpSocket)
        self.plcSocketThread.start()
        # analog detection
        self.analogDetection = AnalogDetection()
        self.analogDetectionThread = QThread()
        self.analogDetection.moveToThread(self.analogDetectionThread)
        self.analogDetectionThread.started.connect(self.analogDetection.init)
        self.analogCtrl.connect(self.analogDetection.onAnalogCtrl)
        self.analogDetection.GPIOState.connect(self.onPhysicalGPIOState)
        if not Config.Debug:
            self.analogDetection.ControlModeSwitch.connect(
                self.onControlModeSwitch)
        self.analogDetectionThread.start()
        # push button signal and slots
        self.dataShowingPushButton.clicked.connect(
            self.onDataShowingPushButtonClicked)
        self.graphicShowingPushButton.clicked.connect(
            self.onGraphicShowingPushButtonClicked)
        self.autoRunningPushButton.clicked.connect(self.changeToProgramMode)
        self.organizedPlayPushButton.clicked.connect(
            self.onOrganizedPlayPushButtonClicked)
        self.systemManagementPushButton.clicked.connect(
            self.onSystemManagementPushButtonClicked)
        self.netFramePushButton.clicked.connect(
            self.onNetFramePushButtonClicked)

    def onRtcTimeout(self):
        self.timeLabel.setText(
            QDateTime.currentDateTime().toString("yyyy/MM/dd dddd hh:mm:ss"))

    @pyqtSlot(str, list)
    def onTcpServerGetAllSubDev(self, monitorName, subDev):
        if DevAttr.monitorSubDevDict.get(monitorName) == subDev:
            print("Got same monitor device!", monitorName)
            return
        if DevAttr.monitorSubDevDict.get(monitorName) is None:
            DevAttr.monitorSubDevDict.setdefault(monitorName, subDev)
        else:
            DevAttr.monitorSubDevDict[monitorName] = subDev
        self.getMonitorDevice.emit(monitorName, subDev)
        print("some thing changed...", subDev)
        DevAttr.devAttrList = self.createDevInfoDict()  # 需要等待数据库创建完成以后再生成此变量
        self.showAllDeviceInWidget()

    def getAllDevice(self):
        allDevice = []
        for key in DevAttr.monitorSubDevDict.keys():
            for dev in DevAttr.monitorSubDevDict[key]:
                allDevice.append(dev[1])
        return allDevice

    def createDevInfoDict(self):
        devInfo = []
        for key in DevAttr.monitorSubDevDict.keys():
            for dev in DevAttr.monitorSubDevDict[key]:
                devInfo.append(DevAttr(dev[0], dev[1]))
        return devInfo

    def showAllDeviceInWidget(self):
        if self.devDataWidget is not None:
            self.contentWidgetList.remove(self.devDataWidget)
            self.contentFrameLayout.removeWidget(self.devDataWidget)
            self.devDataWidget.deleteLater()
        self.devDataWidget = DevDataWidget(DevAttr.devAttrList)  # new widget
        self.devDataWidget.sendDataToTcp.connect(self.sendDataToTcp)
        self.contentFrameLayout.addWidget(self.devDataWidget)
        self.contentWidgetList.append(self.devDataWidget)
        self.showWidgetInContentWidget(widget=self.devDataWidget)

    def onDataShowingPushButtonClicked(self):
        DevAttr.OperationMode = DevAttr.SingleModeD
        if self.devDataWidget is not None:
            self.showWidgetInContentWidget(widget=self.devDataWidget)
            self.modalTextLabel.setText("单控模式")

    def onGraphicShowingPushButtonClicked(self):
        DevAttr.OperationMode = DevAttr.SingleModeG
        self.showWidgetInContentWidget(widget=self.devGraphicWidget)
        self.modalTextLabel.setText("单控模式")

    def changeToProgramMode(self):
        if Config.Debug:
            DevAttr.OperationMode = DevAttr.ProgramMode
            self.showWidgetInContentWidget(widget=self.devProgramWidget)
            self.modalTextLabel.setText("程控模式")

    @pyqtSlot(int)
    def onControlModeSwitch(self, mode):
        if mode == AnalogDetection.GPIO_PROGRAM:
            self.dataShowingPushButton.setEnabled(False)
            self.graphicShowingPushButton.setEnabled(False)
            DevAttr.OperationMode = DevAttr.ProgramMode
            self.showWidgetInContentWidget(widget=self.devProgramWidget)
            self.modalTextLabel.setText("程控模式")
        elif mode == AnalogDetection.GPIO_SINGLE:
            self.dataShowingPushButton.setEnabled(True)
            self.graphicShowingPushButton.setEnabled(True)
            self.onDataShowingPushButtonClicked()
            self.modalTextLabel.setText("单控模式")
        else:
            self.modalTextLabel.setText("维保模式")

    def onOrganizedPlayPushButtonClicked(self):
        try:
            organizedPlay = OrganizedPlay()
            organizedPlay.playsActive.connect(
                self.devProgramWidget.onAutoRunning)
            print("organizedPlay exit code:", organizedPlay.exec_())
        except Exception as e:
            print("create organized play error", str(e))

    def showWidgetInContentWidget(self, index=0, widget=None):
        for w in self.contentWidgetList:
            w.hide()
        if widget is None:
            if len(self.contentWidgetList) != 0:
                self.contentWidgetList[0].show()
        else:
            widget.show()

    def onDatabaseState(self, s):
        if s:
            self.databaseLabel.setText("数据库忙")
        else:
            self.databaseLabel.setText("数据库闲")

    def onSystemManagementPushButtonClicked(self):
        login = AccountLogin()
        if login.exec_():
            try:
                sysManagement = SystemManagement()
                sysManagement.somthingChanged.connect(
                    self.onSysManagementSomthingChanged)
                sysManagement.exec_()
            except Exception as e:
                print(str(e))

    def onNetFramePushButtonClicked(self):
        try:
            deviceNetGraphic = DeviceNetGraphic(self.getAllDevice())
            for dev in self.getAllDevice():
                deviceNetGraphic.stateChanged(dev, False, True)
            deviceNetGraphic.showFullScreen()
            deviceNetGraphic.exec_()
        except Exception as e:
            print(str(e))

    @pyqtSlot(str, str)
    def onSysManagementSomthingChanged(self, name, value):
        self.plcSocketManagement.emit(1)

    @pyqtSlot(int, dict)
    def onTcpServerUpdateSetting(self, sec, setting):
        try:
            id = setting["DevId"]
            targetPos = setting["targetPos"]
            UpLimited = setting["UpLimited"]
            DownLimited = setting["DownLimited"]
            for dev in DevAttr.devAttrList:
                if dev.devId == id:
                    dev.targetPos = targetPos
                    dev.upLimitedPos = UpLimited
                    dev.downLimitedPos = DownLimited
                    if dev.targetPos > 100:
                        dev.setStateWord(DevAttr.SW_LowerLimit)
                    else:
                        dev.clearStateWord(DevAttr.SW_LowerLimit)
                    dev.valueChanged.emit(dev.devId, dev.devName)
                    self.savingParaSetting.emit(dev.devName, targetPos,
                                                UpLimited, DownLimited)
        except Exception as e:
            print("On Tcp Server update Setting", str(e))

    @pyqtSlot(int, dict)
    def onTcpServerOperationalCtrl(self, sec, content):
        DevAttr.singleCtrlOperation[sec] = content["State"]

    @pyqtSlot(int, dict)
    def onTcpServerSpeedSet(self, sec, content):
        DevAttr.singleCtrlSpeed[sec] = content["Value"]

    def getVersion(self):
        return "Version {}.{}.{}".format(sys.version_info[0],
                                         sys.version_info[1],
                                         sys.version_info[2])

    @pyqtSlot(dict)
    def onTcpServerGetDevConnectingInfo(self, info):
        devIsConnecting = False
        if isinstance(info, dict):
            for name, id in info.items():
                if name is not None:
                    devIsConnecting = True
                    break
        if devIsConnecting:
            self.internetLabel.setText(self.tr("设备已连接"))
        else:
            self.internetLabel.setText(self.tr("无设备连接"))

    def closeEvent(self, *args, **kwargs):
        login = AccountLogin()
        if login.exec_():
            args[0].accept()
        else:
            args[0].ignore()

    def onPhysicalGPIOState(self, gpio, state):
        if state == AnalogDetection.KEY_DOWN:
            focusWidget = QApplication.focusWidget()
            if focusWidget is None: return
            if gpio == AnalogDetection.GPIO_TURN_NEXT:
                tabKey = QKeyEvent(QEvent.KeyPress, Qt.Key_Right,
                                   Qt.NoModifier, "right")
                QApplication.sendEvent(focusWidget, tabKey)
            elif gpio == AnalogDetection.GPIO_TURN_PREV:
                tabKey = QKeyEvent(QEvent.KeyPress, Qt.Key_Left, Qt.NoModifier,
                                   "left")
                QApplication.sendEvent(focusWidget, tabKey)
            elif gpio == AnalogDetection.GPIO_RUN:
                tabKey = QKeyEvent(QEvent.KeyPress, Qt.Key_F5, Qt.NoModifier,
                                   "f5")
                QApplication.sendEvent(focusWidget, tabKey)
            elif gpio == AnalogDetection.GPIO_STOP:
                tabKey = QKeyEvent(QEvent.KeyPress, Qt.Key_F6, Qt.NoModifier,
                                   "f6")
                QApplication.sendEvent(focusWidget, tabKey)
Exemple #10
0
import re
from tcpserver import TcpServer
from boebot import BoeBot
import time, os

boebot = BoeBot()
tcp = TcpServer()
while True:
    try:
        command = tcp.command()
        if len(command) > 0:
            print('command', command)
            # ------- to be designed by students ---------
            if command == 'l':
                boebot.rotateLeft()
            elif command == 'r':
                boebot.rotateRight()
            elif command == 'f':
                boebot.goForward()
            elif command == 'b':
                boebot.goBackward()
            elif command == 's':
                boebot.stop()
# --------------------------------------------
        time.sleep(0.1)
    except Exception as e:
        print('main', e)
        os._exit(1)
Exemple #11
0
#线程函数
def keyBordInput(server):
    while True:
        msg = input('send to ' + str(server.remoteAdr) + ':')
        if msg == 'quit' or server._closed:
            break
        try:
            print("send...")
            server.send(msg)
        except RuntimeError as error:
            print(error.with_traceback())
            print("socket connection broken")
            break
    server.client.close()
    return


'''
    普通的服务器端程序
'''
if __name__ == "__main__":
    server = TcpServer(6002)
    server.bind()
    server.listening()
    #以函数的形式启动线程
    ct = threading.Thread(target=keyBordInput, args=[server])
    ct.start()
    server.receive()
    ct.join
    server.close()
    print('server is closed!')
        try:
            print("send...")
            server.crytoSend(msg)
        except RuntimeError as error:
            print(error.with_traceback())
            print("socket connection broken")
            break
    server.client.close()
    return


'''
    加密的服务器端程序
'''
if __name__ == "__main__":
    server = TcpServer(6001)
    server.bind()
    server.listening()
    #产生加密模块
    cryto = CryptoModule()
    publicKey = cryto.exportPublicKey()
    server.client.send(publicKey[0:])  #发送公钥
    receive = server.client.recv(2048)
    aseKey = cryto.RsaDecryptCipher.decrypt(receive)  #解密ASE私钥
    #    print('-------------AseKey------------')
    #    print(len(aseKey))
    #    print(aseKey.decode())
    cryto.importAseKey(aseKey)
    server.setCryto(cryto)
    #以函数的形式启动线程
    ct = threading.Thread(target=keyBordInput, args=[server])
Exemple #13
0
class Main(QWidget, Ui_Form):
    """---------------CLASS CONSTRUCTOR---------------------"""
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        #method to setup the UI, defined in server_ui.py
        self.setupUi(self)
        #controller is instantiated here so it can be accessible
        #for arduino thread, controler thread
        #and tcpServer thread
        self.c = Controller()
        #start arduino thread
        self.start_arduino_thread()
        #auto thread status
        self.auto_status = False
        #server thread status
        self.server_status = False

    """---------------INSTANCE METHODS---------------------"""
    """SLOT FUNCTIONS"""

    #UPDATE UI LED INDICATOR
    def update_led_indicator(self, led, text):
        if led == "red":
            self.red_label.setStyleSheet(text)
            self.green_label.setStyleSheet("background-color: white")
            self.blue_label.setStyleSheet("background-color: white")
        elif led == "green":
            self.red_label.setStyleSheet("background-color: white")
            self.green_label.setStyleSheet(text)
            self.blue_label.setStyleSheet("background-color: white")
        elif led == "blue":
            self.red_label.setStyleSheet("background-color: white")
            self.green_label.setStyleSheet("background-color: white")
            self.blue_label.setStyleSheet(text)
        elif led == "off":
            self.red_label.setStyleSheet(text)
            self.green_label.setStyleSheet(text)
            self.blue_label.setStyleSheet(text)

    #UPDATE ULTRASONIC SENSOR LCD SCREEN
    def update_ultrasonic_distance_lcd(self, text):
        self.ultrasonic_distance_lcd.display(text)

    #UPDATE ULTRASONIC ORIENTATION LCD SCREEN
    def update_ultrasonic_orientation_lcd(self, text):
        self.ultrasonic_orientation_lcd.display(text)

    #UPDATE CAR ORIENTATION LCD SCREEN
    def update_wheel_orientation_lcd(self, text):
        self.wheel_orientation_lcd.display(text)

    #SERVER STARTED NOTIFICATION AND UI UPDATE
    def server_started(self):
        self.controller_label.setStyleSheet("background-color: green")
        QtGui.QMessageBox.information(self, "Started!",
                                      "Server thread started")
        self.server_status = True

    #SERVER FINISHED NOTIFICATINO AND UI UPDATE
    def server_finished(self):
        self.controller_label.setStyleSheet("background-color: white")
        QtGui.QMessageBox.information(self, "Finished!",
                                      "Server thread finished")
        self.server_status = False

    #AUTONOMOUS MODE STARTED NOTIFICATION AND UI UPDATE
    def auto_started(self):
        self.auto_label.setStyleSheet("background-color: green")
        QtGui.QMessageBox.information(self, "Started!",
                                      "Autonomous mode thread started")
        self.auto_status = True

    #AUTONOMOUS MODE FINISHED NOTIFICATINO AND UI UPDATE
    def auto_finished(self):
        self.auto_label.setStyleSheet("background-color: white")
        QtGui.QMessageBox.information(self, "Finished!",
                                      "Autonomous mode thread finished")
        self.auto_status = False

    """PyQt BUTTON LISTENERS MANAGING THREADS"""
    #START TCP SERVER THREAD
    @pyqtSignature("")
    def on_server_start_btn_pressed(self):
        if not self.auto_status:
            #pass controller object as tcp server receives commands to execute functions that will interact with
            #the robot that are defined in the controller
            self.ServerThread = TcpServer(self.c)
            #connect signal (emit in this workthread) and slot (function add)
            self.connect(self.ServerThread,
                         QtCore.SIGNAL("update_led_label(QString, QString)"),
                         self.update_led_indicator)
            self.connect(
                self.ServerThread,
                QtCore.SIGNAL("update_ultrasonic_orientation_lcd(QString)"),
                self.update_ultrasonic_orientation_lcd)
            self.connect(
                self.ServerThread,
                QtCore.SIGNAL("update_wheel_orientation_lcd(QString)"),
                self.update_wheel_orientation_lcd)
            self.connect(self.ServerThread, QtCore.SIGNAL("started()"),
                         self.server_started)
            self.connect(self.ServerThread, QtCore.SIGNAL("finished()"),
                         self.server_finished)
            #start thread
            self.ServerThread.start()
        else:
            QtGui.QMessageBox.information(
                self, "Unauthorized!",
                "Please terminate autonomous thread before turning on controller mode"
            )

    #START AUTONOMOUS MODE
    @pyqtSignature("")
    def on_auto_on_btn_pressed(self):
        if not self.server_status:
            self.AutoThread = Auto_Thread(self.c)
            self.connect(self.AutoThread, QtCore.SIGNAL("started()"),
                         self.auto_started)
            self.connect(self.AutoThread, QtCore.SIGNAL("finished()"),
                         self.auto_finished)
            #start thread
            self.AutoThread.start()
        else:
            QtGui.QMessageBox.information(
                self, "Unauthorized!",
                "Please disconnect client before turning on autonomous mode")

    #START AUTONOMOUS MODE
    @pyqtSignature("")
    def on_auto_off_btn_pressed(self):
        self.AutoThread.finish_thread()

    """THREAD FUNCTIONS AUTOMATICALLY TRIGGERED"""

    #START ARDUINO SENSING THREAD
    def start_arduino_thread(self):

        #pass the controllet object so it can upload the sensor data to the controller instance
        #pass the Main object, inheriting from Ui_Form, to be able to upload sensor values in PyQt
        #using a QThread that will be able to talk to this thread (main one)
        #through signals and slots
        self.ArduinoThread = Arduino_Thread(self.c)
        #connect signal (emit in this workthread) and slot (function add)
        self.connect(self.ArduinoThread,
                     QtCore.SIGNAL("update_led_label(QString, QString)"),
                     self.update_led_indicator)
        self.connect(self.ArduinoThread,
                     QtCore.SIGNAL("update_ultrasonic_distance_lcd(QString)"),
                     self.update_ultrasonic_distance_lcd)

        #start thread
        self.ArduinoThread.start()