MessageLink#
Wstęp#
MessageLink umożliwia komunikację dwóch robotów V5 Brain poprzez wysyłanie krótkich wiadomości z opcjonalnymi małymi danymi. Został zaprojektowany do koordynacji między robotami — na przykład uruchamiania procedur, udostępniania wyników czujników lub wyzwalania zachowań u innego robota.
Każde użycie send dodaje wiadomość do kolejki połączonego mózgu V5, a kolejka jest odczytywana metodą FIFO (pierwszy wszedł, pierwszy wyszedł). Jeśli wiele wiadomości zostanie wysłanych przed użyciem przez drugi mózg V5 polecenia receive, zostaną one zapisane i zwrócone pojedynczo w kolejności wysłania. Ponieważ wiadomości mogą być kolejkowane, wielokrotne wysyłanie tego samego statusu w każdej pętli może powodować zaległości. W przypadku logiki krytycznej czasowo wysyłaj tylko wtedy, gdy wartości się zmienią.
Ważne: Oba roboty muszą jednocześnie obsługiwać projekty wykorzystujące MessageLink , w przeciwnym razie żadne wiadomości nie zostaną wysłane ani odebrane.
Ta strona używa przykładowej nazwy łącza link , łącza MessageLink W razie potrzeby zastąp ją własną, skonfigurowaną nazwą.
Poniżej znajduje się lista dostępnych metod:
is_linked– Zwraca informację, czy ten Mózg jest aktywnie połączony ze sparowanym Mózgiem.send– Wysyła wiadomość do sparowanego Mózgu.receive– czeka na następną przychodzącą wiadomość i ją zwraca.otrzymano
received– Rejestruje funkcję, która ma zostać wywołana po otrzymaniu nowej wiadomości.
Utwórz link#
Utwórz MessageLink na obu mózgach V5, aby ustanowić między nimi kanał komunikacyjny — bezprzewodowo za pomocą radioodbiorników V5 Robot Radios lub za pomocą przewodowego inteligentnego kabla — dzięki czemu roboty będą mogły przesyłać sobie nawzajem wiadomości.
MessageLink(smartport, name, linktype, wired)
Parametr |
Opis |
|---|---|
|
Port Smart używany do tego połączenia – port, do którego podłączone jest radio robota V5 (bezprzewodowo) lub kabel Smart Cable (przewodowo). Zapisujemy to jako |
|
Unikalna nazwa, jaką należy podać temu linkowi w postaci ciągu znaków. |
|
Rola, jaką ten Mózg będzie pełnił dla tej pary łączy. Każda para musi zawierać jednego Menedżera i jednego Pracownika:
|
|
Opcjonalnie. Czy to połączenie jest przewodowe, czy bezprzewodowe:
|
Kod dla Robota 1
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Manager """ link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER)Kod dla Robota 2
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Worker """ link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER)
Dostępne metody#
Po skonfigurowaniu MessageLink i połączeniu Brains możesz używać poniższych metod do wysyłania, odbierania i odpowiadania na wiadomości.
is_linked#
Metoda is_linked zwraca informację, czy mózgi V5 w MessageLink są ze sobą sparowane.
True– Dwa mózgi V5 są sparowane i komunikują się za pomocą tego łącza.False– Dwa mózgi V5 nie są sparowane w tym łączu.
Uwaga: Dobrą praktyką jest zawsze sprawdzenie, czy moduły V5 Brains są połączone na początku projektu, zanim uruchomisz dalszy kod.
Usage:
link.is_linked()
Parametry |
Opis |
|---|---|
Ta metoda nie ma żadnych parametrów. |
Kod dla Robota 1
# Tell the other robot when the screen is being pressed # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") # Continuously send if the screen is being pressed while True: if brain.screen.pressing(): link.send("pressed") else: link.send("released") wait(50, MSEC)Kod dla Robota 2
# Display if the other robot's screen is being pressed # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) # Continuously check if Robot 1 has sent "pressed" while True: brain.screen.clear_screen() brain.screen.set_cursor(1, 1) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() if link.receive() == "pressed": brain.screen.new_line() brain.screen.print("Manager is being pressed!") wait(50, MSEC)
send#
send wysyła ciąg znaków i/lub liczbę całkowitą i/lub zmiennoprzecinkową do drugiego połączonego mózgu V5.
Usage:
send(string, integer, float)
Parametry |
Opis |
|---|---|
|
Ciąg znaków do wysłania do drugiego połączonego mózgu V5. |
|
Opcjonalnie. Liczba całkowita do wysłania do drugiego połączonego mózgu V5. |
|
Opcjonalnie. Liczba zmiennoprzecinkowa do wysłania do drugiego połączonego mózgu V5. Liczby zmiennoprzecinkowe są formatowane do 4 miejsc po przecinku; jeśli podano mniej miejsc po przecinku, dodawane są zera końcowe, aż do wyświetlenia 4. |
Jeżeli wysłany zostanie tylko ciąg string , drugi połączony mózg V5 odbierze dokładnie ten ciąg.
Jeżeli uwzględniono integer i/lub float , odbierający mózg otrzymuje pojedynczy zakodowany ciąg, który łączy wszystkie pola w następującej kolejności: .string_integer_float
Przykład: Używając link.send(“string”, 1, 2.55) jest odbierane jako .string_1_2.5500.
Kod dla Robota 1
# Tell the other robot when the screen is being pressed # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") # Continuously send if the screen is being pressed while True: if brain.screen.pressing(): link.send("pressed") else: link.send("released") wait(50, MSEC)Kod dla Robota 2
# Display if the other robot's screen is being pressed # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) # Continuously check if Robot 1 has sent "pressed" while True: brain.screen.clear_screen() brain.screen.set_cursor(1, 1) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() if link.receive() == "pressed": brain.screen.new_line() brain.screen.print("Manager is being pressed!") wait(50, MSEC)
Kod dla Robota 1
# Tell the other robot where the screen was pressed # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") brain.screen.next_row() brain.screen.print("Tap to send circles") # Send the coordinates whenever the screen is pressed while True: if brain.screen.pressing(): x = brain.screen.x_position() y = brain.screen.y_position() link.send("touch", x, y) wait(10, MSEC)Kod dla Robota 2
# Draw a circle where Robot 1's screen was pressed # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 2 - Worker") while True: # Get the full encoded string circle_coordinates = link.receive(200) if circle_coordinates: # Split the encoded string by _ parts = circle_coordinates.split("_") if len(parts) == 3: # Convert the coordinates back into numbers x = float(parts[1]) y = float(parts[2]) brain.screen.set_fill_color(Color.WHITE) brain.screen.draw_circle(x, y, 20) wait(10, MSEC)
receive#
receive zwraca kolejną wiadomość w kolejce z drugiego połączonego modułu V5 Brain. Wiadomości są odczytywane w kolejności FIFO (najstarsze nieprzeczytane jako pierwsze). Jeśli kolejka jest pusta w momencie wywołania receive , oczekuje ona na nową wiadomość do określonego limitu czasu timeout Jeśli w tym przedziale czasowym nie pojawi się żadna wiadomość, receive zwraca None, a każda wiadomość wysłana później pozostaje w kolejce do odczytania przy następnym użyciu receive.
Jeśli drugi połączony mózg V5 wysłał tylko ciąg string, receive zwraca dokładnie ten ciąg.
Jeżeli drugi połączony mózg V5 wysłał liczbę całkowitą i/lub zmiennoprzecinkową, receive i zwraca pojedynczy zakodowany ciąg, który łączy wszystkie pola w następującej kolejności: .string_integer_float
Na przykład, jeśli drugi połączony moduł V5 Brain używa link.send(“string”, 1, 2.55), to użycie link.receive() zwraca zakodowany ciąg znaków, taki jak .string_1_2.5500. Możesz podzielić ten zakodowany ciąg znaków (zobacz poniższe przykłady), aby wyodrębnić nazwę wiadomości, wartości całkowite i zmiennoprzecinkowe.
Jeśli wolisz uniknąć ręcznego dzielenia/analizowania, użyj received w celu zarejestrowania obsługi dla określonej nazwy wiadomości; obsługa odbiera wysłane wartości jako argumenty.
Usage:
receive(timeout)
Parametry |
Opis |
|---|---|
|
Optional. How long in milliseconds |
Kod dla Robota 1
# Tell the other robot when the screen is being pressed # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") # Continuously send if the screen is being pressed while True: if brain.screen.pressing(): link.send("pressed") else: link.send("released") wait(50, MSEC)Kod dla Robota 2
# Display if the other robot's screen is being pressed # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) # Continuously check if Robot 1 has sent "pressed" while True: brain.screen.clear_screen() brain.screen.set_cursor(1, 1) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() if link.receive() == "pressed": brain.screen.new_line() brain.screen.print("Manager is being pressed!") wait(50, MSEC)
Kod dla Robota 1
# Send a math problem for the other Brain to solve # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") """ Change whether to "add" or "subtract", then what numbers to use in the operation. """ link.send("add", 7, 2.5)Kod dla Robota 2
# Solve the math problem that the other Brain sends # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() math_problem = link.receive() if math_problem: # Split the encoded string by _ parts = math_problem.split("_") if len(parts) == 3: # Remove the . from the beginning of the string operator = "".join([c for c in parts[0] if c.isalpha()]) # Separate out the numbers for the operation a = int(parts[1]) b = float(parts[2]) # Use what operator was sent if operator == "add": result = a + b elif operator == "subtract": result = a - b # If neither add or subtract is sent, do nothing else: pass brain.screen.print("Result = ", result)
received#
received rejestruje funkcję, która ma zostać wywołana za każdym razem, gdy V5 Brain otrzyma wysłaną wiadomość.
Usage:
link.received(message, arg)
Parametry |
Opis |
|---|---|
|
Nazwa wiadomości (ciąg znaków) do dopasowania. Gdy nazwa odebranej wiadomości pasuje do tej wartości, wywoływana jest funkcja zwrotna |
|
Wcześniej zdefiniowana funkcja, która jest uruchamiana, gdy mózg V5 otrzymuje wiadomość pasującą |
Otrzymano received są wywoływane z czterema argumentami:
Sygnatura wywołania zwrotnego:
callback(message, linkname, index, value)
Argument |
Opis |
|---|---|
|
Nazwa otrzymanej wiadomości (na przykład |
|
Nazwa łącza, z którego otrzymano wiadomość. |
|
Wartość całkowita wysyłana w wiadomości (jeśli podano). |
|
Wartość zmiennoprzecinkowa wysyłana w wiadomości (jeśli została podana). |
Kod dla Robota 1
# Send a math problem for the other Brain to solve # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") """ Change whether to "add" or "subtract", then what numbers to use in the operation. """ link.send("add", 7, 2.5)Kod dla Robota 2
# Solve the math problem that the other Brain sends # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() # add if "add" is received def add_cmd(message, linkname, a, b): result = a + b brain.screen.print("Result = ", result) # subtract if ""subtract" is received def subtract_cmd(message, linkname, a, b): result = a - b brain.screen.print("Result = ", result) # Create event handlers for "add" and "subtract" link.received("add", add_cmd) link.received("subtract", subtract_cmd)