Esempio n. 1
0
class RPIInit(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

        self.SerialConnection = SerialConnection()
        self.WifiConnection = WifiConnection()
        self.BluetoothConnection = Bluetooth_Connection()

        self.WifiConnection.connect()
        self.wifiIsConnected = True
        self.BluetoothConnection.setupConnection()
        self.bluetoothIsConnected = True
        self.SerialConnection.connect()
        self.serialIsConnected = True

    def readFromWifiConnection(self):
        while True:
            try:
                msg = self.WifiConnection.read()
                if msg == '':
                    print('Wifi Connection is Lost')
                    self.wifiIsConnected = False
                    break

                command = msg[0:1]
                print(command)
                print('From PC: ' + str(msg))
                if command == 'A':
                    self.SerialConnection.write(str(msg[1:]))
                elif command == 'T':
                    self.BluetoothConnection.clientWrite(str(msg[1:]))
                elif command == ';':
                    self.WifiConnection.write('RPi3: connection closed')
                    self.wifiIsConnected = False
                    break
                else:
                    self.WifiConnection.write('Rpi3: Message received')
            except Exception as e:
                print('readFromWifiConnection Error' + str(e))

    def readFromBluetoothConnection(self):
        while True:
            try:
                msg = self.BluetoothConnection.clientRead()
                if msg == '':
                    print('bluetooth connection lost')
                    self.bluetoothIsConnected = False
                    break

                command = msg[0:1]
                print(command)
                print('From Bluetooth:' + str(msg))
                if command == 'P':
                    self.WifiConnection.write(str(msg[1:]))
                elif command == 'A':
                    self.SerialConnection.write(str(msg[1:]))
                elif msg == ';':
                    self.BluetoothConnection.clientWrite(
                        'RPi3: Connection closed')
                    self.bluetoothIsConnected = False
                    break
                else:
                    self.BluetoothConnection.clientWrite('RPi3: Msg received')
            except Exception as e:
                print('readFromBluetoothConnection Error' + str(e))

    def readFromSerialConnection(self):
        while True:
            try:
                msg = self.SerialConnection.read()
                if msg == '':
                    print('serial conncetion is lost')
                    self.serialIsConnected = False
                    break
                command = msg[0:1]
                print(command)
                print('From Arduino:' + str(msg))
                if command == 'P':
                    self.WifiConnection.write(str(msg[1:]))
                elif command == 'T':
                    self.BluetoothConnection.write('RPi3: Instruction ' +
                                                   str(msg[1:]) +
                                                   ' Sent to Tablet')
                elif msg == ';':
                    self.SerialConnection.Write('RPi3: Connection Closed')
                    self.serialIsConnected = False
                    break
                else:
                    print('works')
            except Exception as e:
                print('readFromSerialConnection Error' + str(e))

    def startThreads(self):
        bluetoothThread = threading.Thread(
            target=self.readFromBluetoothConnection, name='Bluetooth Thread')
        wifiThread = threading.Thread(target=self.readFromBluetoothConnection,
                                      name="Bluetooth Thread")
        serialThread = threading.Thread(target=self.readFromSerialConnection,
                                        name="Serial Thread")

        bluetoothThread.daemon = True
        wifiThread.daemon = True
        serialThread.daemon = True
        print('Susccessfully initialized threads')

        bluetoothThread.start()
        wifiThread.start()
        serialThread.start()
        print("Worker Threads started")

    def cleanup(self):
        try:
            self.WifiConnection.close()
            self.BluetoothConnection.close()
            self.SerialConnection.close()
        except Exception as e:
            print("Cleanup Error:" + str(e))
class FaceDection(QMainWindow):
    def __init__(self, parent=None):
        super(FaceDection, self).__init__(parent)

        # gui connections
        self.ui = Ui_FaceDetection()
        self.ui.setupUi(self)
        self.ui.speed_dial.sliderMoved.connect(self.set_fan_speed)
        self.ui.horizontal_speed.sliderReleased.connect(self.horizontal_stop)
        self.ui.vertical_speed.sliderReleased.connect(self.vertical_stop)
        self.ui.horizontal_speed.valueChanged.connect(self.set_hor_speed)
        self.ui.vertical_speed.valueChanged.connect(self.set_ver_speed)
        self.ui.serial_select.currentIndexChanged.connect(self.port_select)
        self.ui.command_edit.returnPressed.connect(self.command_send)

        # video and face recognition
        self.faces = []
        self.ui.video.face_callback = self.video_face_callback
        self.ui.video.image_callback = self.video_image_callback

        # serial connection
        self.serial = SerialConnection()
        for port in self.serial.list_ports():
            self.ui.serial_select.addItem(port)
        self.listener_timer = QTimer(self)
        self.listener_timer.timeout.connect(self.serial_read)
        self.listener_timer.start(50)

    def set_fan_speed(self, speed, update_dial=False):
        self.ui.speed_label.setText("%d %%" % speed)
        self.serial.send("VENT " + str(speed))
        if update_dial:
            self.ui.speed_dial.setValue(speed)

    def horizontal_stop(self):
        self.serial.send("STOP")
        self.ui.horizontal_speed.setValue(0)  # snap back

    def vertical_stop(self):
        self.serial.send("STOP")
        self.ui.vertical_speed.setValue(0)  # snap back

    def set_hor_speed(self, value):
        if not value == 0:
            self.serial.send("IBASE " + str(value))

    def set_ver_speed(self, value):
        if not value == 0:
            self.serial.send("IELBOW " + str(value))

    def serial_read(self):
        message_queue = self.serial.queue
        while not message_queue.empty():
            message = message_queue.get_nowait()
            if message[0] == "#":
                self.ui.log.append("<b>" + message + "</b>")
            elif message[0] == "!":
                self.ui.log.append("<font color=red>" + message + "</font>")
            message_queue.task_done()

    def command_send(self):
        command = self.ui.command_edit.text()
        self.serial.send(command)
        self.ui.command_edit.clear()

    def port_select(self, index):
        # disconnect
        if index == 0:
            self.serial.stop()
            self.ui.log.clear()
            self.ui.command_edit.clear()
            self.ui.command_edit.setEnabled(False)
            self.ui.fanbox.setEnabled(False)
            self.ui.movementbox.setEnabled(False)
        # connect
        else:
            try:
                port = self.ui.serial_select.currentText()
                self.serial.connect(port=port, baud=19200)
                self.ui.command_edit.setEnabled(True)
                self.ui.fanbox.setEnabled(True)
                self.ui.movementbox.setEnabled(True)
            except Exception, e:
                QMessageBox.warning(self, "Error", e.message)
class FaceDection(QMainWindow):
    def __init__(self, parent=None):
        super(FaceDection, self).__init__(parent)

        # gui connections
        self.ui = Ui_FaceDetection()
        self.ui.setupUi(self)
        self.ui.speed_dial.sliderMoved.connect(self.set_fan_speed)
        self.ui.horizontal_speed.sliderReleased.connect(self.horizontal_stop)
        self.ui.vertical_speed.sliderReleased.connect(self.vertical_stop)
        self.ui.horizontal_speed.valueChanged.connect(self.set_hor_speed)
        self.ui.vertical_speed.valueChanged.connect(self.set_ver_speed)
        self.ui.serial_select.currentIndexChanged.connect(self.port_select)
        self.ui.command_edit.returnPressed.connect(self.command_send)

        # video and face recognition
        self.faces = []
        self.ui.video.face_callback = self.video_face_callback
        self.ui.video.image_callback = self.video_image_callback

        # serial connection
        self.serial = SerialConnection()
        for port in self.serial.list_ports():
            self.ui.serial_select.addItem(port)
        self.listener_timer = QTimer(self)
        self.listener_timer.timeout.connect(self.serial_read)
        self.listener_timer.start(50)

    def set_fan_speed(self, speed, update_dial=False):
        self.ui.speed_label.setText("%d %%" % speed)
        self.serial.send("VENT " + str(speed))
        if update_dial:
            self.ui.speed_dial.setValue(speed)

    def horizontal_stop(self):
        self.serial.send("STOP")
        self.ui.horizontal_speed.setValue(0)  # snap back

    def vertical_stop(self):
        self.serial.send("STOP")
        self.ui.vertical_speed.setValue(0)  # snap back

    def set_hor_speed(self, value):
        if not value == 0:
            self.serial.send("IBASE "+str(value))

    def set_ver_speed(self, value):
        if not value == 0:
            self.serial.send("IELBOW "+str(value))

    def serial_read(self):
        message_queue = self.serial.queue
        while not message_queue.empty():
            message = message_queue.get_nowait()
            if message[0] == "#":
                self.ui.log.append("<b>"+message+"</b>")
            elif message[0] == "!":
                self.ui.log.append("<font color=red>"+message+"</font>")
            message_queue.task_done()

    def command_send(self):
        command = self.ui.command_edit.text()
        self.serial.send(command)
        self.ui.command_edit.clear()

    def port_select(self, index):
        # disconnect
        if index == 0:
            self.serial.stop()
            self.ui.log.clear()
            self.ui.command_edit.clear()
            self.ui.command_edit.setEnabled(False)
            self.ui.fanbox.setEnabled(False)
            self.ui.movementbox.setEnabled(False)
        # connect
        else:
            try:
                port = self.ui.serial_select.currentText()
                self.serial.connect(port=port, baud=19200)
                self.ui.command_edit.setEnabled(True)
                self.ui.fanbox.setEnabled(True)
                self.ui.movementbox.setEnabled(True)
            except Exception, e:
                QMessageBox.warning(self, "Error", e.message)