BerichtLink#
Invoering#
MessageLink maakt communicatie mogelijk tussen twee EXP Brains door middel van korte berichten met optionele kleine gegevens. 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 EXP Brain, en de wachtrij wordt gelezen volgens het first-in, first-out (FIFO) principe. Als er meerdere berichten worden verzonden voordat de andere EXP 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 de gekoppelde hersenen.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 EXP 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 EXP Brains op een MessageLink aan elkaar gekoppeld zijn.
True– De twee EXP Brains zijn gekoppeld en communiceren via deze link.False– De twee EXP Brains zijn niet gekoppeld aan deze link.
Let op: Het is goede gewoonte om altijd te controleren of de EXP Brains aan het begin van een project zijn gekoppeld voordat je 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 decimaal getal naar de andere gekoppelde EXP Brain.
Usage:
send(string, integer, float)
Parameters |
Beschrijving |
|---|---|
|
De tekenreeks die naar de andere gekoppelde EXP Brain moet worden verzonden. |
|
Optioneel. Een geheel getal om naar de andere gekoppelde EXP Brain te sturen. |
|
Optioneel. Een zwevendekommagetal dat naar de andere gekoppelde EXP Brain wordt verzonden. Zwevendekommagetallen 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 EXP 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 en retourneert het volgende bericht uit de wachtrij van de andere gekoppelde EXP 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 Noneen blijft elk bericht dat daarna wordt verzonden in de wachtrij staan om te worden gelezen wanneer receive de volgende keer wordt gebruikt.
Als de andere gekoppelde EXP Brain alleen een string, receive precies die string.
Als de andere gekoppelde EXP Brain een geheel getal en/of een zwevendekommagetal heeft verzonden, ontvangt receive een enkele gecodeerde tekenreeks die alle velden in deze volgorde combineert: .string_integer_float
Als de andere gekoppelde EXP 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 EXP 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 EXP 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)