Viestilinkki#
Johdanto#
MessageLinkin avulla kaksi V5 Brainia kommunikoi keskenään lähettämällä lyhyitä viestejä, jotka sisältävät valinnaisesti pieniä tietoja. Se on suunniteltu robottien väliseen koordinointiin – kuten rutiinien käynnistämiseen, anturitulosten jakamiseen tai toisen robotin toiminnan käynnistämiseen.
Jokainen send -funktion käyttökerta lisää viestin linkitetyn V5 Brainin jonoon, ja jono luetaan FIFO-periaatteella (first-in, first-out). Jos useita viestejä lähetetään ennen kuin toinen V5 Brain käyttää receive -funktiota, ne tallennetaan ja palautetaan yksi kerrallaan lähetysjärjestyksessä. Koska viestit voivat jonottaa, saman tilan toistuva lähettäminen jokaisessa silmukassa voi luoda ruuhkan; aikakriittisissä logiikoissa viesti lähetetään vain, kun arvot muuttuvat.
Tärkeää: Molempien robottien on oltava käynnissä projekteissa, jotka käyttävät MessageLink tä samanaikaisesti, muuten viestejä ei lähetetä/vastaanoteta.
Tällä sivulla käytetään esimerkkinimenä link MessageLink Korvaa se tarvittaessa omalla määritetyllä nimelläsi.
Alla on luettelo käytettävissä olevista menetelmistä:
Luo linkki#
Luo MessageLink molempiin V5 Brain -aivoihin muodostaaksesi niiden välille kommunikaatiokanavan – joko langattomasti V5-robottiradioiden avulla tai langallisen älykaapelin kautta – jotta robotit voivat lähettää viestejä toisilleen.
MessageLink(smartport, name, linktype, wired)
Parametri |
Kuvaus |
|---|---|
|
Tässä linkissä käytetty älyportti – portti, johon V5-robottiradio on kytketty (langaton) tai johon älykaapeli on kytketty (langallinen). Kirjoitetaan muodossa |
|
Linkin yksilöllinen nimi merkkijonona. |
|
Rooli, jota tämä aivo käyttää tälle linkkiparille. Jokaisen parin on sisällettävä yksi johtaja ja yksi työntekijä:
|
|
Valinnainen. Onko tämä yhteys langallinen vai langaton:
|
Robotin 1 koodi
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Manager """ link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER)Robotin 2 koodi
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Worker """ link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER)
Käytettävissä olevat menetelmät#
Kun MessageLink on määritetty ja aivot on linkitetty, voit käyttää alla olevia menetelmiä viestien lähettämiseen, vastaanottamiseen ja niihin vastaamiseen.
is_linked#
is_linked -metodi palauttaa, ovatko MessageLinkin V5-aivot paritettuja toisiinsa.
True– Kaksi V5-aivoa on yhdistetty ja kommunikoivat keskenään tämän linkin kautta.False– Kahta V5-aivoa ei ole yhdistetty tällä linkillä.
Huomautus: On hyvä käytäntö tarkistaa aina projektin alussa, että V5-aivot on linkitetty ennen minkään muun koodin suorittamista.
Usage:
link.is_linked()
Parametrit |
Kuvaus |
|---|---|
Tällä menetelmällä ei ole parametreja. |
Robotin 1 koodi
# 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)Robotin 2 koodi
# 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 lähettää merkkijonon ja/tai kokonaisluvun ja/tai liukulukun toiseen linkitettyyn V5 Brainiin.
Usage:
send(string, integer, float)
Parametrit |
Kuvaus |
|---|---|
|
Toiseen linkitettyyn V5 Brainiin lähetettävä merkkijono. |
|
Valinnainen. Kokonaisluku, joka lähetetään toiseen linkitettyyn V5 Brainiin. |
|
Valinnainen. Liukuluku lähetettäväksi toiseen linkitettyyn V5 Brainiin. Liukuluvut muotoillaan neljän desimaalin tarkkuudella; jos desimaaleja on vähemmän, niiden loppuun lisätään nollia, kunnes niitä on enää neljä. |
Jos lähetetään vain string , toinen linkitetty V5-aivo vastaanottaa tarkalleen kyseisen merkkijonon.
Jos mukaan lasketaan arvot integer ja/tai float , vastaanottava aivot saavat yhden koodatun merkkijonon, joka yhdistää kaikki kentät tässä järjestyksessä: .string_integer_float
Esimerkki: Käyttämällä link.send(“string”, 1, 2.55) vastaanotetaan muodossa .string_1_2.5500.
Robotin 1 koodi
# 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)Robotin 2 koodi
# 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)
Robotin 1 koodi
# 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)Robotin 2 koodi
# 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 palauttaa seuraavan jonossa olevan viestin toisesta linkitetystä V5 Brainista. Viestit luetaan FIFO-järjestyksessä (vanhin lukematon ensin). Jos jono on tyhjä, kun receive kutsutaan, se odottaa uutta viestiä määritettyyn timeout asti. Jos kyseiseen ikkunaan ei saavu viestiä, receive palauttaa arvon None, ja kaikki sen jälkeen lähetetyt viestit jäävät jonoon luettavaksi seuraavalla kerralla, kun receive käytetään.
Jos toinen linkitetty V5 Brain lähetti vain string, receive palauttaa tarkalleen kyseisen merkkijonon.
Jos toinen linkitetty V5 Brain lähetti kokonaisluvun ja/tai liukulukun, receive palauttaa yhden koodatun merkkijonon, joka yhdistää kaikki kentät tässä järjestyksessä: .string_integer_float
Jos esimerkiksi toinen linkitetty V5 Brain käyttää funktiota link.send(“string”, 1, 2.55), niin funktion link.receive() käyttö palauttaa koodatun merkkijonon, kuten .string_1_2.5500Voit jakaa tämän koodatun merkkijonon (katso esimerkit alla) purkaaksesi viestin nimen, kokonaisluvun ja liukulukujen arvot.
Jos haluat mieluummin välttää manuaalisen jakamisen/jäsentämisen, käytä received rekisteröidäksesi käsittelijän tietylle viestin nimelle; käsittelijä vastaanottaa lähetetyt arvot argumentteina.
Usage:
receive(timeout)
Parametrit |
Kuvaus |
|---|---|
|
Valinnainen. Kuinka kauan millisekunteina |
Robotin 1 koodi
# 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)Robotin 2 koodi
# 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)
Robotin 1 koodi
# 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)Robotin 2 koodi
# 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 rekisteröi funktion kutsuttavaksi aina, kun V5 Brain vastaanottaa lähetetyn viestin.
Usage:
link.received(message, arg)
Parametrit |
Kuvaus |
|---|---|
|
Vastaavan viestin nimi (merkkijono). Kun vastaanotetun viestin nimi vastaa tätä arvoa, kutsutaan |
|
Aiemmin määritelty function, joka suoritetaan, kun V5 Brain vastaanottaa viestin, joka vastaa |
received takaisinkutsufunktioita kutsutaan neljällä argumentilla:
Takaisinkutsun allekirjoitus:
callback(message, linkname, index, value)
Argumentti |
Kuvaus |
|---|---|
|
Vastaanotetun viestin nimi (esimerkiksi |
|
Linkin nimi, josta viesti vastaanotettiin. |
|
Viestin mukana lähetetty kokonaislukuarvo (jos annettu). |
|
Viestin mukana lähetetty liukuluku (jos annettu). |
Robotin 1 koodi
# 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)Robotin 2 koodi
# 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)