BerichtLink#
Invoering#
MessageLink maakt communicatie mogelijk tussen twee V5 Brains door korte berichten te versturen met optioneel kleine hoeveelheden data. Het is ontworpen voor robot-naar-robot-coördinatie, zoals het starten van routines, het delen van sensorresultaten of het activeren van gedragingen op een andere robot.
Elke keer dat send wordt gebruikt, wordt een bericht toegevoegd aan de wachtrij van de gekoppelde V5 Brain, en de wachtrij wordt gelezen volgens het first-in, first-out (FIFO) principe. Als er meerdere berichten worden verzonden voordat de andere V5 Brain receive gebruikt, worden ze één voor één opgeslagen en geretourneerd in de volgorde waarin ze zijn verzonden. Omdat berichten in de wachtrij kunnen staan, kan het herhaaldelijk verzenden van dezelfde status in elke lus een opstopping veroorzaken; voor tijdskritieke logica is het raadzaam alleen te verzenden wanneer waarden veranderen.
Belangrijk: Beide robots moeten tegelijkertijd projecten uitvoeren die gebruikmaken van MessageLink , anders worden er geen berichten verzonden/ontvangen.
Op deze pagina wordt link als voorbeeld gebruikt voor de naam MessageLink Vervang deze door uw eigen geconfigureerde naam indien nodig.
Hieronder vindt u een lijst met beschikbare methoden:
is_linked– Geeft aan of dit brein actief verbonden is met het bijbehorende brein.send– Verstuurt een bericht naar het gekoppelde brein.receive– Wacht op het volgende binnenkomende bericht en retourneert dit.received– Registreert een functie die wordt aangeroepen wanneer een nieuw bericht wordt ontvangen.
Een link maken#
Maak op beide V5 Brains een MessageLink aan om een communicatiekanaal tussen hen tot stand te brengen – draadloos met V5 Robot Radios of via een bekabelde Smart Cable – zodat de robots berichten naar elkaar kunnen sturen.
MessageLink(smartport, name, linktype, wired)
Parameter |
Beschrijving |
|---|---|
|
De Smart Port die voor deze verbinding wordt gebruikt: de poort waarop de V5 Robot Radio is aangesloten (draadloos) of waarop de Smart Cable is aangesloten (bedraad). Dit wordt weergegeven als |
|
De unieke naam die aan deze link moet worden gegeven, als tekenreeks. |
|
De rol die dit brein zal vervullen voor dit linkpaar. Elk paar moet één manager en één werker bevatten:
|
|
Optioneel. Of deze verbinding bedraad of draadloos is:
|
Code voor Robot 1
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Manager """ link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER)Code voor Robot 2
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Worker """ link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER)
Beschikbare methoden#
Zodra je MessageLink is ingesteld en de Brains zijn gekoppeld, kun je de onderstaande methoden gebruiken om berichten te verzenden, te ontvangen en te beantwoorden.
is_linked#
is_linked methode retourneert of de V5 Brains op een MessageLink aan elkaar gekoppeld zijn.
True– De twee V5-hersenen zijn gekoppeld en communiceren via deze verbinding.False– De twee V5-hersenen zijn niet gekoppeld op deze link.
Let op: Het is goede gewoonte om altijd te controleren of de V5 Brains aan het begin van een project zijn gekoppeld voordat u verdere code uitvoert.
Usage:
link.is_linked()
Parameters |
Beschrijving |
|---|---|
Deze methode heeft geen parameters. |
Code voor 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)Code voor 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 verzendt een tekenreeks en/of een geheel getal en/of een zweefgetal naar de andere gekoppelde V5 Brain.
Usage:
send(string, integer, float)
Parameters |
Beschrijving |
|---|---|
|
De tekenreeks die naar de andere gekoppelde V5 Brain moet worden verzonden. |
|
Optioneel. Een geheel getal dat naar de andere gekoppelde V5 Brain moet worden verzonden. |
|
Optioneel. Een float-waarde die naar de andere gekoppelde V5 Brain wordt verzonden. Float-waarden worden opgemaakt met 4 decimalen; als er minder decimalen worden opgegeven, worden er nullen achter de komma toegevoegd totdat er 4 worden weergegeven. |
Als er slechts string wordt verzonden, ontvangt de andere gekoppelde V5 Brain precies diezelfde string.
Als integer en/of float zijn opgenomen, krijgt de ontvangende Brain een enkele gecodeerde tekenreeks die alle velden in deze volgorde combineert: .string_integer_float
Voorbeeld: Bij gebruik van link.send(“string”, 1, 2.55) ontvangen als .string_1_2.5500.
Code voor 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)Code voor 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)
Code voor 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)Code voor 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 retourneert het volgende bericht uit de wachtrij van de andere gekoppelde V5 Brain. Berichten worden in FIFO-volgorde gelezen (oudste ongelezen eerst). Als de wachtrij leeg is wanneer receive wordt aangeroepen, wacht het tot de opgegeven timeout op een nieuw bericht. Als er binnen dat tijdsvenster geen bericht arriveert, retourneert receive receive, en blijft elk bericht dat daarna wordt verzonden in de wachtrij staan om te worden gelezen wanneer None de volgende keer wordt gebruikt.
Als de andere gekoppelde V5 Brain alleen een string, receive precies die string terug.
Als de andere gekoppelde V5 Brain een geheel getal en/of een drijvende-kommawaarde heeft verzonden, ontvangt receive een enkele gecodeerde tekenreeks die alle velden in deze volgorde combineert: .string_integer_float
Als de andere gekoppelde V5 Brain bijvoorbeeld link.send(“string”, 1, 2.55)gebruikt, dan retourneert link.receive() een gecodeerde tekenreeks zoals .string_1_2.5500Je kunt deze gecodeerde tekenreeks splitsen (zie de voorbeelden hieronder) om de berichtnaam, de gehele getallen en de drijvende-kommawaarden te extraheren.
Als je liever handmatig splitsen/parsen vermijdt, gebruik dan received om een handler te registreren voor een specifieke berichtnaam; de handler ontvangt de verzonden waarden als argumenten.
Usage:
receive(timeout)
Parameters |
Beschrijving |
|---|---|
|
Optioneel. Hoe lang in milliseconden |
Code voor 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)Code voor 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)
Code voor 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)Code voor 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 registreert een functie die moet worden aangeroepen wanneer de V5 Brain een verzonden bericht ontvangt.
Usage:
link.received(message, arg)
Parameters |
Beschrijving |
|---|---|
|
The message name (string) to match. When a received message’s name matches this value, the |
|
Een eerder gedefinieerde functie die wordt uitgevoerd wanneer de V5 Brain een bericht ontvangt dat overeenkomt met bericht |
Er zijn received argumenten:
Callback-handtekening:
callback(message, linkname, index, value)
Argument |
Beschrijving |
|---|---|
|
De naam van het ontvangen bericht (bijvoorbeeld |
|
De naam van de link waarvan het bericht afkomstig is. |
|
De integerwaarde die met het bericht is meegestuurd (indien opgegeven). |
|
De zwevendekommagetalwaarde die met het bericht is meegestuurd (indien aanwezig). |
Code voor 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)Code voor 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)