Модуль Arduino BLE с python и GUI (2 основных цикла событий)

#python #user-interface #arduino #pyqt #bluetooth-lowenergy

#python #пользовательский интерфейс #arduino #pyqt #bluetooth -низкое энергопотребление

Вопрос:

Я пытаюсь создать графический интерфейс на Python, который позволит мне отправлять сообщение на модуль Bluetooth Arduino (nrf8001), когда я нажимаю кнопку внутри графического интерфейса. В настоящее время я написал скрипт для графического интерфейса пользователя и скрипт для подключения к модулю Bluetooth.

Проблема: всякий раз, когда я подключаюсь к модулю Bluetooth, нажимая кнопку GUI, которую я сделал, графический интерфейс, похоже, зависает / зависает, пока продолжается сценарий для подключения Bluetooth. Я читал, что это может быть связано с запуском двух основных циклов событий.

Я действительно новичок в python, и мне было интересно, есть ли хорошее решение для этого.

Файл Bluetooth

 import Adafruit_BluefruitLE
from Adafruit_BluefruitLE.services import UART



""" Get the BLE provider for the current platform. DO NOT REMOVE."""
ble = Adafruit_BluefruitLE.get_provider()
message = "empty"


def change_message(msg_string):
    global message
    message = msg_string

def run_Time(uart):
    global message
    connection_status = True
    uart.write("Ready")

    while (connection_status == True):
        if message != "empty":
            if (message == "exit"):
                connection_status= False
            else:
                uart.write(message)
                message = "empty"

def main():
    # Clear any cached data
    ble.clear_cached_data()

    # Get the first available BLE network adapter and make sure it's powered on.
    adapter = ble.get_default_adapter()
    adapter.power_on()
    print('Using adapter: {0}'.format(adapter.name))

    # Disconnect any currently connected UART devices.
    print('Disconnecting any connected UART devices...')
    UART.disconnect_devices()

    # Scan for UART devices.
    print('Searching for UART device...')
    try:
        adapter.start_scan()
        # Search for the first UART device found (timeout_sec to change parameter)
        device = UART.find_device()
        if device is None:
            raise RuntimeError('Failed to find UART device!')
    finally:
        # Make sure scanning is stopped before exiting.
        adapter.stop_scan()

    print('Connecting to device...')
    device.connect()

    try:

        print('Discovering services...')
        UART.discover(device)

        # create an instance of the service
        uart = UART(device)
        run_Time(uart)

    finally:
        device.disconnect()


# Initialize the BLE system.  MUST be called before other BLE calls!
def start_ble_connection():
    ble.initialize()
    ble.run_mainloop_with(main)
  

Графический интерфейс

 import sys
from PyQt4.QtCore import pyqtSlot
from PyQt4.QtGui import *
import terminal_input

# ----- GENERAL VARIABLES -------
# Windows Size
w_xSize = 200
w_ySize = 300

# Create a generic btn size
x_size = 130
y_size = 32

# Create generic x,y, variables to append to btn locations
# such  that you can shift the entire btn locations as a whole
x_frame1 = (w_xSize-x_size)/2 #center
y_frame1 = 10

# ------ DEFINING WINDOW PROPERTIES -------
# create our window
app = QApplication(sys.argv)

# Base class  to all our widget is QWidget
w = QWidget()

# Set window title
w.setWindowTitle('Primitive GUI')

# Set window size.
w.resize(w_xSize,w_ySize )

# ------ DEFINING BUTTON PROPERTIES -------
# Button 1
btn = QPushButton("Channel 0", w)
btn.move(0 x_frame1, 0 y_frame1)
btn.resize(x_size,y_size) #(x,y)

# Button 2
btn2 = QPushButton("Channel 1", w)
btn2.move(0 x_frame1, 30 y_frame1)
btn2.resize(x_size,y_size)


# ------ DEFINING TEXTBOX PROPERTIES -------
textbox = QLineEdit(w)
textbox.move(x_frame1, w_ySize-50)
textbox.resize(x_size,y_size)


# ------ CREATE SLOTS FOR BUTTONS ------
@pyqtSlot()
def on_click():
    print("btn1 was clicked")
    terminal_input.start_ble_connection()


@pyqtSlot()
def on_click_btn2():
    textbox.setText("Button 2")
    terminal_input.change_message("button 2")

# ------ CONNECT SIGNALS TO THE SLOTS ------
# Each button can have its own function that it calls

# Button 1
btn.clicked.connect(on_click)

#btn.pressed.connect(on_press)
#btn.released.connect(on_release)

# Button 2
btn2.clicked.connect(on_click_btn2)

# ------ SHOW THE WINDOW ------
# Show the window and run the app
w.show()
app.exec_()