Odkaz na zprávu#
Zavedení#
MessageLink umožňuje dvěma robotům V5 Brains komunikaci odesíláním krátkých řetězcových zpráv s volitelnými malými daty. Je navržen pro koordinaci mezi roboty – například pro spouštění rutin, sdílení výsledků senzorů nebo spouštění chování u jiného robota.
Každé použití send přidá zprávu do fronty propojeného V5 Brainu a fronta se čte v systému FIFO (first in, first out). Pokud je odesláno více zpráv předtím, než druhý V5 Brain použije receive, budou uloženy a vráceny jedna po druhé v pořadí, v jakém byly odeslány. Protože se zprávy mohou řadit do fronty, opakované odesílání stejného stavu v každé smyčce může způsobit nahromadění zpráv; z časově kritické logiky odesílejte pouze při změně hodnot.
Důležité: Oba roboti musí současně spouštět projekty, které používají MessageLink , jinak nebudou odesílány/přijímány žádné zprávy.
Tato stránka používá jako příklad názvu MessageLink hodnotu link V případě potřeby jej nahraďte vlastním nakonfigurovaným názvem.
Níže je uveden seznam dostupných metod:
Vytvořit odkaz#
Vytvořte na obou robotech V5 Brains komunikační kanál MessageLink – buď bezdrátově s robotickými rádii V5, nebo pomocí kabelového chytrého kabelu – aby si roboti mohli navzájem posílat zprávy.
MessageLink(smartport, name, linktype, wired)
Parametr |
Popis |
|---|---|
|
Inteligentní port použitý pro toto propojení – port, ke kterému je připojeno robotické rádio V5 (bezdrátově) nebo je do něj zapojen inteligentní kabel (kabelově). Zapisuje se jako |
|
Jedinečný název, který se má tomuto odkazu zadat jako řetězec. |
|
Role, kterou tento mozek použije pro tento pár odkazů. Každý pár musí obsahovat jednoho manažera a jednoho pracovníka:
|
|
Volitelné. Zda je toto připojení kabelové nebo bezdrátové:
|
Kód pro robota 1
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Manager """ link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER)Kód pro Robota 2
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Worker """ link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER)
Dostupné metody#
Jakmile je váš MessageLink nastaven a Brains jsou propojeny, můžete k odesílání, přijímání a odpovídání na zprávy použít níže uvedené metody.
is_linked#
Metoda is_linked vrací, zda jsou mozky V5 na MessageLink vzájemně spárovány.
True– Dva mozky V5 jsou spárované a komunikují prostřednictvím tohoto spojení.False– Dva mozky V5 nejsou v tomto spojení spárovány.
Poznámka: Je dobrým zvykem vždy na začátku projektu zkontrolovat, zda jsou V5 Brains propojeny, než spustíte jakýkoli další kód.
Usage:
link.is_linked()
Parametry |
Popis |
|---|---|
Tato metoda nemá žádné parametry. |
Kód pro 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)Kód pro 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 odešle řetězec a/nebo celé číslo a/nebo číslo s plovoucí desetinnou čárkou do druhého propojeného V5 Brainu.
Usage:
send(string, integer, float)
Parametry |
Popis |
|---|---|
|
Řetězec, který se má odeslat do druhého propojeného mozku V5. |
|
Volitelné. Celé číslo, které se má odeslat do druhého propojeného mozku V5. |
|
Volitelné. Číslo s plovoucí desetinnou čárkou, které se odešle do druhého propojeného V5 Brainu. Čísla s plovoucí desetinnou čárkou jsou formátována na 4 desetinná místa; pokud je zadáno méně desetinných míst, přidávají se koncové nuly, dokud se nezobrazí 4. |
Pokud je odeslán pouze řetězec string Brain obdrží přesně tento řetězec.
Pokud je zahrnuto integer a/nebo float , přijímající Brain dostane jeden zakódovaný řetězec, který kombinuje všechna pole v tomto pořadí: .string_integer_float
Příklad: Použitím link.send(“string”, 1, 2.55) přijata jako .string_1_2.5500.
Kód pro 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)Kód pro 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)
Kód pro 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)Kód pro 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#
Funkce receive vrací další zprávu ve frontě z druhého propojeného V5 Brainu. Zprávy se čtou v pořadí FIFO (nejstarší nepřečtené jako první). Pokud je fronta při volání funkce receive prázdná, čeká na novou zprávu až do zadaného časového limitu timeout receive vrátí hodnotu Nonea všechny zprávy odeslané poté zůstanou ve frontě pro přečtení při příštím použití funkce receive.
Pokud druhý propojený V5 Brain odeslal pouze řetězec string, receive vrátí přesný řetězec.
Pokud druhý propojený V5 Brain odeslal celé číslo a/nebo číslo s plovoucí čárkou, receive vrátí jeden zakódovaný řetězec, který kombinuje všechna pole v tomto pořadí: .string_integer_float
Například pokud druhý propojený V5 Brain používá link.send(“string”, 1, 2.55), pak použití link.receive() vrátí zakódovaný řetězec, například .string_1_2.5500. Tento zakódovaný řetězec můžete rozdělit (viz níže uvedené příklady) a extrahovat tak název zprávy, celé číslo a hodnotu s desetinnou čárkou.
Pokud se raději vyhnete ručnímu dělení/parsování, použijte received k registraci obslužné rutiny pro konkrétní název zprávy; obslužná rutina přijímá odeslané hodnoty jako argumenty.
Usage:
receive(timeout)
Parametry |
Popis |
|---|---|
|
Volitelné. Jak dlouho v milisekundách |
Kód pro 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)Kód pro 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)
Kód pro 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)Kód pro 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 registruje funkci, která má být volána vždy, když V5 Brain přijme odeslanou zprávu.
Usage:
link.received(message, arg)
Parametry |
Popis |
|---|---|
|
The message name (string) to match. When a received message’s name matches this value, the |
|
Dříve definovaná function, která se spustí, když V5 Brain obdrží zprávu odpovídající |
received zpětných volání se čtyřmi argumenty:
Podpis zpětného volání:
callback(message, linkname, index, value)
Argument |
Popis |
|---|---|
|
Název přijaté zprávy (například |
|
Název odkazu, ze kterého byla zpráva přijata. |
|
Celočíselná hodnota odeslaná se zprávou (pokud je zadána). |
|
Hodnota s desetinnou čárkou odeslaná se zprávou (pokud je zadána). |
Kód pro 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)Kód pro 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)