Σύνδεσμος Μηνύματος#
Εισαγωγή#
Το MessageLink επιτρέπει σε δύο εγκεφάλους V5 να επικοινωνούν στέλνοντας σύντομα μηνύματα συμβολοσειράς με προαιρετικά μικρά δεδομένα. Έχει σχεδιαστεί για συντονισμό μεταξύ ρομπότ — όπως η έναρξη ρουτινών, η κοινοποίηση αποτελεσμάτων αισθητήρων ή η ενεργοποίηση συμπεριφορών σε ένα άλλο ρομπότ.
Κάθε χρήση του send προσθέτει ένα μήνυμα στην ουρά του συνδεδεμένου V5 Brain και η ουρά διαβάζεται με τη μέθοδο FIFO (first-in, first-out). Εάν αποσταλούν πολλά μηνύματα πριν το άλλο V5 Brain χρησιμοποιήσει το receive, αυτά θα αποθηκευτούν και θα επιστραφούν ένα κάθε φορά με τη σειρά που στάλθηκαν. Επειδή τα μηνύματα μπορούν να περιέλθουν σε ουρά, η επαναλαμβανόμενη αποστολή της ίδιας κατάστασης σε κάθε βρόχο μπορεί να δημιουργήσει συσσώρευση εκκρεμοτήτων. Για λογική που είναι κρίσιμη για τον χρόνο, στείλτε μόνο όταν αλλάζουν οι τιμές.
Σημαντικό: Και τα δύο ρομπότ πρέπει να εκτελούν έργα που χρησιμοποιούν MessageLink ταυτόχρονα, διαφορετικά δεν θα αποστέλλονται/λαμβάνονται μηνύματα.
Αυτή η σελίδα χρησιμοποιεί το link ως παράδειγμα ονόματος MessageLink Αντικαταστήστε το με το δικό σας διαμορφωμένο όνομα, όπως απαιτείται.
Παρακάτω είναι μια λίστα με τις διαθέσιμες μεθόδους:
is_linked– Επιστρέφει εάν αυτός ο Εγκέφαλος είναι ενεργά συνδεδεμένος με τον συζευγμένο Εγκέφαλό του.send– Στέλνει ένα μήνυμα στον ζευγαρωμένο εγκέφαλο.receive– Περιμένει και επιστρέφει το επόμενο εισερχόμενο μήνυμα.received– Καταχωρεί μια συνάρτηση που θα καλείται κάθε φορά που λαμβάνεται ένα νέο μήνυμα.
Δημιουργία συνδέσμου#
Δημιουργήστε ένα MessageLink και στους δύο εγκεφάλους V5 για να δημιουργήσετε ένα κανάλι επικοινωνίας μεταξύ τους —είτε ασύρματα με τα V5 Robot Radios είτε μέσω ενός ενσύρματου έξυπνου καλωδίου— ώστε τα ρομπότ να μπορούν να στέλνουν μηνύματα μεταξύ τους.
MessageLink(smartport, name, linktype, wired)
Παράμετρος |
Περιγραφή |
|---|---|
|
Η Έξυπνη Θύρα που χρησιμοποιείται για αυτήν τη σύνδεση—η θύρα στην οποία είναι συνδεδεμένο το Ρομποτικό Ραδιόφωνο V5 (ασύρματα) ή στην οποία είναι συνδεδεμένο το Έξυπνο Καλώδιο (ενσύρματα). Γράφεται ως |
|
Το μοναδικό όνομα που θα δοθεί σε αυτόν τον σύνδεσμο ως συμβολοσειρά. |
|
Ο ρόλος που θα χρησιμοποιήσει αυτός ο εγκέφαλος για αυτό το ζεύγος συνδέσμων. Κάθε ζεύγος πρέπει να περιλαμβάνει έναν Διευθυντή και έναν Εργαζόμενο:
|
|
Προαιρετικό. Είτε αυτή η σύνδεση είναι ενσύρματη είτε ασύρματη:
|
Κωδικός για το Ρομπότ 1
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Manager """ link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER)Κωδικός για το Ρομπότ 2
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Worker """ link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER)
Διαθέσιμες μέθοδοι#
Μόλις ρυθμιστεί το MessageLink και συνδεθούν οι Brains, μπορείτε να χρησιμοποιήσετε τις παρακάτω μεθόδους για να στέλνετε, να λαμβάνετε και να απαντάτε σε μηνύματα.
is_linked#
Η μέθοδος is_linked επιστρέφει εάν οι εγκέφαλοι V5 σε ένα MessageLink είναι ζευγαρωμένοι μεταξύ τους.
True– Οι δύο εγκέφαλοι V5 είναι ζευγαρωμένοι και επικοινωνούν σε αυτόν τον σύνδεσμο.False– Οι δύο εγκέφαλοι V5 δεν είναι ζευγαρωμένοι σε αυτόν τον σύνδεσμο.
Σημείωση: Είναι καλή πρακτική να ελέγχετε πάντα για να βεβαιωθείτε ότι οι εγκέφαλοι V5 είναι συνδεδεμένοι στην αρχή ενός έργου πριν από την εκτέλεση οποιουδήποτε περαιτέρω κώδικα.
Usage:
link.is_linked()
Παράμετροι |
Περιγραφή |
|---|---|
Αυτή η μέθοδος δεν έχει παραμέτρους. |
Κωδικός για το Ρομπότ 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)Κωδικός για το Ρομπότ 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 στέλνει μια συμβολοσειρά ή/και έναν ακέραιο ή/και έναν αριθμό float στον άλλο συνδεδεμένο εγκέφαλο V5.
Usage:
send(string, integer, float)
Παράμετροι |
Περιγραφή |
|---|---|
|
Η συμβολοσειρά που θα σταλεί στον άλλο συνδεδεμένο εγκέφαλο V5. |
|
Προαιρετικό. Ένας ακέραιος αριθμός για αποστολή στον άλλο συνδεδεμένο εγκέφαλο V5. |
|
Προαιρετικό. Ένας αριθμός κινητής υποδιαστολής για αποστολή στον άλλο συνδεδεμένο εγκέφαλο V5. Οι αριθμοί κινητής υποδιαστολής μορφοποιούνται σε 4 δεκαδικά ψηφία. Εάν παρέχονται λιγότερα δεκαδικά ψηφία, προστίθενται μηδενικά στο τέλος μέχρι να εμφανιστούν 4. |
Εάν αποσταλεί μόνο η συμβολοσειρά string , ο άλλος συνδεδεμένος εγκέφαλος V5 λαμβάνει αυτήν ακριβώς τη συμβολοσειρά.
Εάν συμπεριληφθούν οι αριθμοί integer και/ή float , ο εγκέφαλος λήψης λαμβάνει μια ενιαία κωδικοποιημένη συμβολοσειρά που συνδυάζει όλα τα πεδία με την εξής σειρά: .string_integer_float
Παράδειγμα: Χρησιμοποιώντας link.send(“string”, 1, 2.55) λαμβάνεται ως .string_1_2.5500.
Κωδικός για το Ρομπότ 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)Κωδικός για το Ρομπότ 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)
Κωδικός για το Ρομπότ 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)Κωδικός για το Ρομπότ 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 returns the next queued message from the other linked V5 Brain. Messages are read in FIFO order (oldest unread first). If the queue is empty when receive is called, it waits up to the specified timeout for a new message. If no message arrives in that window, receive returns None, and any message sent afterward remains in the queue to be read the next time receive is used.
Εάν ο άλλος συνδεδεμένος εγκέφαλος V5 έστειλε μόνο μια συμβολοσειρά string, receive , επιστρέφει αυτήν ακριβώς τη συμβολοσειρά.
Εάν ο άλλος συνδεδεμένος V5 Brain έστειλε έναν ακέραιο ή/και έναν αριθμό float, η συνάρτηση receive επιστρέφει μια ενιαία κωδικοποιημένη συμβολοσειρά που συνδυάζει όλα τα πεδία με την εξής σειρά: .string_integer_float
Για παράδειγμα, εάν ο άλλος συνδεδεμένος V5 Brain χρησιμοποιεί link.send(“string”, 1, 2.55), τότε χρησιμοποιώντας link.receive() επιστρέφει μια κωδικοποιημένη συμβολοσειρά όπως .string_1_2.5500. Μπορείτε να διαχωρίσετε αυτήν την κωδικοποιημένη συμβολοσειρά (δείτε τα παρακάτω παραδείγματα) για να εξαγάγετε τις τιμές ονόματος μηνύματος, ακεραίου και κινητής υποδιαστολής.
Αν προτιμάτε να αποφύγετε τον χειροκίνητο διαχωρισμό/ανάλυση, χρησιμοποιήστε την εντολή received για να καταχωρήσετε έναν χειριστή για ένα συγκεκριμένο όνομα μηνύματος. Ο χειριστής λαμβάνει τις τιμές που αποστέλλονται ως ορίσματα.
Usage:
receive(timeout)
Παράμετροι |
Περιγραφή |
|---|---|
|
Προαιρετικό. Πόσο χρόνο σε χιλιοστά του δευτερολέπτου θα λάβει το |
Κωδικός για το Ρομπότ 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)Κωδικός για το Ρομπότ 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)
Κωδικός για το Ρομπότ 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)Κωδικός για το Ρομπότ 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 καταχωρεί μια συνάρτηση που θα καλείται κάθε φορά που ο εγκέφαλος V5 λαμβάνει ένα απεσταλμένο μήνυμα.
Usage:
link.received(message, arg)
Παράμετροι |
Περιγραφή |
|---|---|
|
Το όνομα του μηνύματος (συμβολοσειρά) που θα ταιριάζει. Όταν το όνομα ενός ληφθέντος μηνύματος ταιριάζει με αυτήν την τιμή, καλείται η συνάρτηση |
|
Μια προηγουμένως ορισμένη συνάρτηση που εκτελείται όταν ο εγκέφαλος V5 λαμβάνει ένα μήνυμα που ταιριάζει με |
Οι επανακλήσεις received καλούνται με τέσσερα ορίσματα:
Υπογραφή Επανάκλησης:
callback(message, linkname, index, value)
Επιχείρημα |
Περιγραφή |
|---|---|
|
Το όνομα του μηνύματος που ελήφθη (για παράδειγμα, |
|
Το όνομα του συνδέσμου από τον οποίο ελήφθη το μήνυμα. |
|
Η ακέραια τιμή που αποστέλλεται με το μήνυμα (εάν παρέχεται). |
|
Η τιμή float που αποστέλλεται με το μήνυμα (εάν παρέχεται). |
Κωδικός για το Ρομπότ 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)Κωδικός για το Ρομπότ 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)