Meddelandelänk#
Introduktion#
MessageLink låter två V5-hjärnor kommunicera genom att skicka korta strängmeddelanden med valfri liten data. Den är utformad för samordning mellan robotar – som att starta rutiner, dela sensorresultat eller utlösa beteenden på en annan robot.
Varje gång man använder send läggs ett meddelande till i den länkade V5 Brains kö, och kön läses först in, först ut (FIFO). Om flera meddelanden skickas innan den andra V5 Brain använder receive, kommer de att lagras och returneras ett i taget i den ordning de skickades. Eftersom meddelanden kan köa kan det skapa en eftersläpning om man upprepar sändningar av samma status i varje loop; för tidskritisk logik, skicka endast när värdena ändras.
Viktigt: Båda robotarna måste köra projekt som använder MessageLink samtidigt, annars kommer inga meddelanden att skickas/tas emot.
Den här sidan använder link som exempelnamn MessageLink Ersätt det med ditt eget konfigurerade namn efter behov.
Nedan följer en lista över tillgängliga metoder:
Skapa en länk#
Skapa en MessageLink på båda V5-hjärnorna för att upprätta en kommunikationskanal mellan dem – antingen trådlöst med V5-robotradior eller via en trådbunden Smart Cable – så att robotarna kan skicka meddelanden till varandra.
MessageLink(smartport, name, linktype, wired)
Parameter |
Beskrivning |
|---|---|
|
Smart Port som används för denna länk – porten som V5 Robot Radio är ansluten till (trådlös) eller Smart Cable är inkopplad i (kabelansluten). Skrivs som |
|
Det unika namnet som ska anges som en sträng för denna länk. |
|
Den roll som denna hjärna kommer att använda för detta länkpar. Varje par måste innehålla en chef och en arbetare:
|
|
Valfritt. Om denna länk är trådbunden eller trådlös:
|
Kod för robot 1
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Manager """ link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER)Kod för robot 2
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Worker """ link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER)
Tillgängliga metoder#
När din MessageLink är konfigurerad och hjärnorna är länkade kan du använda metoderna nedan för att skicka, ta emot och svara på meddelanden.
is_linked#
is_linked -metoden returnerar om V5-hjärnorna på en MessageLink är parade med varandra.
True– De två V5-hjärnorna är parade ihop och kommunicerar på den här länken.False– De två V5-hjärnorna är inte parade ihop på den här länken.
Obs! Det är god praxis att alltid kontrollera att V5-hjärnorna är länkade i början av ett projekt innan ytterligare kod körs.
Usage:
link.is_linked()
Parametrar |
Beskrivning |
|---|---|
Den här metoden har inga parametrar. |
Kod för robot 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 för robot 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 skickar en sträng och/eller ett heltal och/eller flyttal till den andra länkade V5-hjärnan.
Usage:
send(string, integer, float)
Parametrar |
Beskrivning |
|---|---|
|
Strängen som ska skickas till den andra länkade V5-hjärnan. |
|
Valfritt. Ett heltal att skicka till den andra länkade V5-hjärnan. |
|
Valfritt. Ett flyttal att skicka till den andra länkade V5 Brain. Flyttalen formateras till 4 decimaler; om färre decimaler anges läggs efterföljande nollor till tills 4 visas. |
Om endast string skickas, tar den andra länkade V5-hjärnan emot exakt den strängen.
Om integer och/eller float inkluderas, får den mottagande hjärnan en enda kodad sträng som kombinerar alla fält i denna ordning: .string_integer_float
Exempel: Med link.send(“string”, 1, 2.55) emot som .string_1_2.5500.
Kod för robot 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 för robot 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 för robot 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 för robot 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 returnerar nästa meddelande i kö från den andra länkade V5-hjärnan. Meddelanden läses i FIFO-ordning (äldsta olästa först). Om kön är tom när receive anropas, väntar den upp till den angivna timeout på ett nytt meddelande. Om inget meddelande anländer i det fönstret, returnerar receive None, och alla meddelanden som skickas efteråt finns kvar i kön för att läsas nästa gång receive används.
Om den andra länkade V5-hjärnan bara skickade en string, receive exakt den strängen.
Om den andra länkade V5-hjärnan skickade ett heltal och/eller flyttal, returnerar receive en enda kodad sträng som kombinerar alla fält i denna ordning: .string_integer_float
Om till exempel den andra länkade V5-hjärnan använder link.send(“string”, 1, 2.55), returnerar link.receive() en kodad sträng som .string_1_2.5500. Du kan dela denna kodade sträng (se exemplen nedan) för att extrahera meddelandenamnet, heltal och flyttal.
Om du hellre vill undvika manuell delning/parsning, använd received för att registrera en hanterare för ett specifikt meddelandenamn; hanteraren tar emot de skickade värdena som argument.
Usage:
receive(timeout)
Parametrar |
Beskrivning |
|---|---|
|
Valfritt. Hur länge i millisekunder |
Kod för robot 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 för robot 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 för robot 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 för robot 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 registrerar en funktion som ska anropas när V5-hjärnan tar emot ett skickat meddelande.
Usage:
link.received(message, arg)
Parametrar |
Beskrivning |
|---|---|
|
The message name (string) to match. When a received message’s name matches this value, the |
|
En tidigare definierad funktion som körs när V5-hjärnan tar emot ett meddelande som matchar |
received återanrop anropas med fyra argument:
Återuppringningssignatur:
callback(message, linkname, index, value)
Argument |
Beskrivning |
|---|---|
|
Meddelandenamnet som mottogs (till exempel |
|
Länknamnet som meddelandet mottogs från. |
|
Heltalsvärdet som skickas med meddelandet (om det anges). |
|
Flyttalsvärdet som skickas med meddelandet (om det anges). |
Kod för robot 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 för robot 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)