Üzenetlink#
Bevezetés#
A MessageLink lehetővé teszi két EXP Brain közötti kommunikációt rövid, opcionálisan kis adatmennyiségekkel ellátott üzenetek küldésével. A rendszer robotok közötti koordinációra készült – például rutinok indítására, érzékelőeredmények megosztására vagy viselkedések kiváltására egy másik roboton.
A send minden egyes használata egy üzenetet ad a csatolt EXP Brain sorához, és a sor FIFO (first-in, first-out) elv alapján kerül olvasásra. Ha több üzenet is elküldésre kerül, mielőtt a másik EXP Brain a receive metódust használja, akkor azok egyenként, a küldés sorrendjében kerülnek tárolásra és visszaküldésre. Mivel az üzenetek sorba állíthatók, ugyanazon állapot ismételt elküldése minden ciklusban várakozást okozhat; időkritikus logika esetén csak akkor küldjön üzenetet, ha az értékek megváltoznak.
Fontos: Mindkét robotnak egyszerre kell olyan projekteket futtatnia, amelyek MessageLink használnak, különben nem lesznek üzenetek küldve/fogadva.
Ez az oldal link nevet használja példaként MessageLink névként. Szükség szerint cserélje le a saját konfigurált névre.
Az alábbiakban felsoroljuk az elérhető módszereket:
Link létrehozása#
Hozz létre egy MessageLinket mindkét EXP Brain-en, hogy kommunikációs csatornát hozz létre közöttük – akár vezeték nélkül V5 Robot Radios-szal, akár vezetékes Smart Cable-en keresztül –, így a robotok üzeneteket küldhetnek egymásnak.
MessageLink(smartport, name, linktype, wired)
Paraméter |
Leírás |
|---|---|
|
Az ehhez a kapcsolathoz használt Smart Port – az a port, amelyhez a V5 Robot Radio csatlakozik (vezeték nélküli), vagy amelyhez a Smart Cable csatlakozik (vezetékes). |
|
A link egyedi neve karakterláncként. |
|
Az Agy szerepe, amelyet ez a kapcsolatpárhoz fog használni. Minden párnak tartalmaznia kell egy Menedzsert és egy Munkást:
|
|
Opcionális. Vezetékes vagy vezeték nélküli kapcsolatról van szó:
|
1. robot kódja
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Manager """ link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER)Robot 2 kódja
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Worker """ link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER)
Elérhető módszerek#
Miután a MessageLink be van állítva és az Agyak össze vannak kapcsolva, az alábbi módszerekkel küldhetsz, fogadhatsz és válaszolhatsz üzenetekre.
is_linked#
is_linked A metódus visszaadja, hogy a MessageLink EXP Brainjei párosítva vannak-e egymással.
True– A két EXP agy párosítva van és ezen a kapcsolaton keresztül kommunikál.False– A két EXP Brain nincs párosítva ezen a linken.
Megjegyzés: Jó gyakorlat, ha a projekt elején mindig ellenőrizzük, hogy az EXP Brain-ek össze vannak-e kapcsolva, mielőtt bármilyen további kódot futtatnánk.
Usage:
link.is_linked()
Paraméterek |
Leírás |
|---|---|
Ennek a metódusnak nincsenek paraméterei. |
1. robot kódja
# 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)Robot 2 kódja
# 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 egy karakterláncot és/vagy egy egész számot és/vagy lebegőpontos számot küld a másik összekapcsolt EXP Brainnek.
Usage:
send(string, integer, float)
Paraméterek |
Leírás |
|---|---|
|
A másik összekapcsolt EXP Brainnek küldendő karakterlánc. |
|
Opcionális. Egy egész szám, amelyet el kell küldeni a másik összekapcsolt EXP Brainnek. |
|
Opcionális. Egy lebegőpontos szám, amelyet a másik összekapcsolt EXP Brain-nek kell elküldeni. A lebegőpontos számok 4 tizedesjegyre vannak formázva; ha kevesebb tizedesjegyet adunk meg, akkor a záró nullák addig kerülnek hozzáadásra, amíg 4 nem jelenik meg. |
Ha csak string kerül elküldésre, akkor a másik összekapcsolt EXP Brain pontosan ezt a karakterláncot kapja meg.
Ha integer és/vagy float szerepel, a fogadó Brain egyetlen kódolt karakterláncot kap, amely az összes mezőt ebben a sorrendben kombinálja: .string_integer_float
Példa: A link.send(“string”, 1, 2.55) értéke .string_1_2.5500 lesz.
1. robot kódja
# 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)Robot 2 kódja
# 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)
1. robot kódja
# 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)Robot 2 kódja
# 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 parancs visszaadja a következő sorban álló üzenetet a másik összekapcsolt EXP Brain-ből. Az üzenetek FIFO sorrendben kerülnek olvasásra (a legrégebbi olvasatlan először). Ha a várólista üres receive hívásakor, akkor a megadott timeout vár új üzenetre. Ha ebben az ablakban nem érkezik üzenet, receive parancs Noneértéket adja vissza, és minden ezután küldött üzenet a sorban marad, hogy receive parancs következő használatakor beolvassák.
Ha a másik összekapcsolt EXP Brain csak egy string, receive pontosan ezt a karakterláncot adja vissza.
Ha a másik összekapcsolt EXP Brain egész és/vagy lebegőpontos számot küldött, receive egyetlen kódolt karakterláncot ad vissza, amely az összes mezőt ebben a sorrendben kombinálja: .string_integer_float
Például, ha a másik összekapcsolt EXP Brain a link.send(“string”, 1, 2.55)függvényt használja, akkor link.receive() használata egy kódolt karakterláncot ad vissza, például .string_1_2.5500Ezt a kódolt karakterláncot feloszthatja (lásd az alábbi példákat), hogy kinyerje az üzenet nevét, egész számát és lebegőpontos értékeit.
Ha inkább elkerülnéd a manuális felosztást/elemzést, használd a received függvényt egy adott üzenetnévhez tartozó kezelő regisztrálásához; a kezelő argumentumként fogadja az elküldött értékeket.
Usage:
receive(timeout)
Paraméterek |
Leírás |
|---|---|
|
Opcionális. Mennyi ideig vár |
1. robot kódja
# 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)Robot 2 kódja
# 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)
1. robot kódja
# 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)Robot 2 kódja
# 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 regisztrál egy függvényt, amely minden alkalommal meghívódik, amikor az EXP Brain elküldött üzenetet kap.
Usage:
link.received(message, arg)
Paraméterek |
Leírás |
|---|---|
|
Az egyeztetendő üzenet neve (karakterlánc). Amikor egy fogadott üzenet neve megegyezik ezzel az értékkel, a |
|
Egy korábban definiált függvény, amely akkor fut le, amikor az EXP Brain kap egy |
received visszahívásokat négy argumentummal hívjuk meg:
Visszahívási aláírás:
callback(message, linkname, index, value)
Érv |
Leírás |
|---|---|
|
A fogadott üzenet neve (például |
|
A hivatkozás neve, amelyről az üzenet érkezett. |
|
Az üzenettel együtt küldött egész szám (ha meg van adva). |
|
Az üzenettel együtt küldött lebegőpontos érték (ha meg van adva). |
1. robot kódja
# 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)Robot 2 kódja
# 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)