Σύνδεσμος μηνύματος#
Εισαγωγή#
Η κλάση message_link επιτρέπει σε δύο εγκεφάλους V5 να επικοινωνούν στέλνοντας σύντομα μηνύματα συμβολοσειράς με προαιρετικά μικρά δεδομένα. Έχει σχεδιαστεί για συντονισμό ρομπότ με ρομπότ — όπως εκκίνηση ρουτινών, κοινή χρήση αποτελεσμάτων αισθητήρων ή ενεργοποίηση συμπεριφορών σε άλλο ρομπότ.
Κάθε χρήση του send προσθέτει ένα μήνυμα στην ουρά του συνδεδεμένου V5 Brain και η ουρά διαβάζεται με τη μέθοδο FIFO (first-in, first-out). Εάν αποσταλούν πολλά μηνύματα πριν το άλλο V5 Brain χρησιμοποιήσει το receive, αυτά θα αποθηκευτούν και θα επιστραφούν ένα κάθε φορά με τη σειρά που στάλθηκαν. Επειδή τα μηνύματα μπορούν να περιέλθουν σε ουρά, η επαναλαμβανόμενη αποστολή της ίδιας κατάστασης σε κάθε βρόχο μπορεί να δημιουργήσει συσσώρευση εκκρεμοτήτων. Για λογική που είναι κρίσιμη για τον χρόνο, στείλτε μόνο όταν αλλάζουν οι τιμές.
Σημαντικό: Και τα δύο ρομπότ πρέπει να εκτελούν έργα που χρησιμοποιούν message_link ταυτόχρονα, διαφορετικά δεν θα αποστέλλονται/λαμβάνονται μηνύματα.
Κατασκευαστές κλάσεων#
message_link(
int32_t index,
const char *name,
linkType type,
bool isWired = false );
Καταστροφέας κλάσης#
Καταστρέφει το αντικείμενο message_link και απελευθερώνει τους σχετικούς πόρους.
virtual ~message_link();
Παράμετροι#
Παράμετρος |
Τύπος |
Περιγραφή |
|---|---|---|
|
|
Η Έξυπνη Θύρα στην οποία είναι συνδεδεμένο το V5 Radio ή το Έξυπνο Καλώδιο, γράφεται ως |
|
|
Το όνομα του συνδέσμου μηνύματος. |
|
|
Ο τύπος σύνδεσης, είτε
|
|
|
Εάν το αντικείμενο message_link είναι ενσύρματο.
|
Παράδειγμα#
Κωδικός για το Ρομπότ 1
// Create a wireless link in Port 1 message_link link = message_link( PORT1, // index "VEXRoboticsLink123456789", // name linkType::manager, // type true); // isWiredΚωδικός για το Ρομπότ 2
// Create a wireless link in Port 1 message_link link = message_link( PORT1, // index "VEXRoboticsLink123456789", // name linkType::worker, // type true); // isWired
Συναρτήσεις Μελών#
Η κλάση message_link περιλαμβάνει τις ακόλουθες συναρτήσεις-μέλη:
isLinked— Επιστρέφει εάν αυτός ο Εγκέφαλος είναι ενεργά συνδεδεμένος με τον συζευγμένο Εγκέφαλό του.send— Στέλνει ένα μήνυμα στον ζευγαρωμένο εγκέφαλο.receive— Περιμένει και επιστρέφει το επόμενο εισερχόμενο μήνυμα.received— Καταχωρεί μια συνάρτηση που θα καλείται κάθε φορά που λαμβάνεται ένα νέο μήνυμα.
Πριν από την κλήση οποιασδήποτε συνάρτησης μέλους message_link , πρέπει να δημιουργηθεί μια παρουσία message_link , όπως φαίνεται παρακάτω:
Κωδικός για το Ρομπότ 1
// Create a wireless link in Port 1 message_link link = message_link( PORT1, // index "VEXRoboticsLink123456789", // name linkType::manager, // type true); // isWiredΚωδικός για το Ρομπότ 2
// Create a wireless link in Port 1 message_link link = message_link( PORT1, // index "VEXRoboticsLink123456789", // name linkType::worker, // type true); // isWired
isLinked#
Η μέθοδος isLinked επιστρέφει εάν οι εγκέφαλοι V5 σε ένα MessageLink είναι ζευγαρωμένοι μεταξύ τους.
bool isLinked();
Αυτή η συνάρτηση δεν έχει παραμέτρους.
Return ValuesΑυτή η συνάρτηση επιστρέφει μια λογική τιμή.
true– Οι δύο εγκέφαλοι V5 είναι ζευγαρωμένοι και επικοινωνούν σε αυτόν τον σύνδεσμο.false– Οι δύο εγκέφαλοι V5 δεν είναι ζευγαρωμένοι σε αυτόν τον σύνδεσμο.
Είναι καλή πρακτική να ελέγχετε πάντα για να βεβαιωθείτε ότι οι εγκέφαλοι V5 είναι συνδεδεμένοι στην αρχή ενός έργου πριν από την εκτέλεση οποιουδήποτε περαιτέρω κώδικα.
ExamplesΚωδικός για το Ρομπότ 1
// Tell the other robot when the screen is being pressed // Create the link message_link link = message_link(PORT1, "VEXRoboticsLink123456789", linkType::manager, true); // Do not run code UNTIL the Brains are linked while (!link.isLinked()){ 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(0.05, seconds); }Κωδικός για το Ρομπότ 2
// Display if the other robot's screen is being pressed // Create the link message_link link = message_link(PORT1, "VEXRoboticsLink123456789", linkType::worker, true); // Do not run code UNTIL the Brains are linked while (!link.isLinked()){ wait(0.1, seconds); } // Continuously check if Robot 1 has sent "pressed" while (true){ Brain.Screen.clearScreen(); Brain.Screen.setCursor(1, 1); Brain.Screen.print("Robot 2 - Worker"); Brain.Screen.newLine(); char msg[32] = {0}; // buffer for incoming message int32_t n = link.receive(msg, sizeof(msg), 100); // wait up to 100ms if (n > 0 && strcmp(msg, "pressed") == 0) { Brain.Screen.newLine(); Brain.Screen.print("Manager is being pressed!"); } wait(0.05, seconds); }
send#
Στέλνει ένα μήνυμα μέσω της σύνδεσης σύνδεσης.
Available FunctionsParameters1 — Στέλνει μια συμβολοσειρά μηνύματος.
int32_t send( const char *message );2 — Στέλνει μια συμβολοσειρά μηνύματος με
double.int32_t send( const char *message, double value );3 — Στέλνει μια συμβολοσειρά μηνύματος με τιμή
int32_tκαι τιμήdouble.int32_t send( const char *message, int32_t index, double value );
Παράμετρος |
Τύπος |
Περιγραφή |
|---|---|---|
|
|
Το μήνυμα που θα σταλεί στον άλλο συνδεδεμένο εγκέφαλο V5. |
|
|
Ένας ακέραιος αριθμός για αποστολή στον άλλο συνδεδεμένο εγκέφαλο V5. |
|
|
Ένα διπλό για αποστολή στον άλλο συνδεδεμένο εγκέφαλο V5. Τα διπλάσια μορφοποιούνται σε 4 δεκαδικά ψηφία. Εάν παρέχονται λιγότερα δεκαδικά ψηφία, προστίθενται μηδενικά στο τέλος μέχρι να εμφανιστούν 4. |
Αυτή η συνάρτηση δεν επιστρέφει καμία τιμή.
NotesΕάν σταλεί μόνο το μήνυμα message είναι το άλλο συνδεδεμένο V5 Brain.
Εάν συμπεριληφθούν οι τιμές value (και index εάν παρέχονται), ο εγκέφαλος λήψης λαμβάνει ένα μόνο κωδικοποιημένο μήνυμα που συνδυάζει όλα τα πεδία με την εξής σειρά: .message_index_value
Χρησιμοποιώντας το link.send(“string”, 1, 2.55) λαμβάνεται ως .string_1_2.5500.
Κωδικός για το Ρομπότ 1
// Tell the other robot when the screen is being pressed // Create the link message_link link = message_link(PORT1, "VEXRoboticsLink123456789", linkType::manager, true); // Do not run code UNTIL the Brains are linked while (!link.isLinked()){ 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(0.05, seconds); }Κωδικός για το Ρομπότ 2
// Display if the other robot's screen is being pressed // Create the link message_link link = message_link(PORT1, "VEXRoboticsLink123456789", linkType::worker, true); // Do not run code UNTIL the Brains are linked while (!link.isLinked()){ wait(0.1, seconds); } // Continuously check if Robot 1 has sent "pressed" while (true){ Brain.Screen.clearScreen(); Brain.Screen.setCursor(1, 1); Brain.Screen.print("Robot 2 - Worker"); Brain.Screen.newLine(); char msg[32] = {0}; // buffer for incoming message int32_t n = link.receive(msg, sizeof(msg), 100); // wait up to 100ms if (n > 0 && strcmp(msg, "pressed") == 0) { Brain.Screen.newLine(); Brain.Screen.print("Manager is being pressed!"); } wait(0.05, seconds); }
receive#
Λαμβάνει ένα μήνυμα από τη σύνδεση σύνδεσης.
Available Functionsint32_t receive(
char *buffer,
int32_t length,
int32_t timeoutMs = 500 );
Παράμετρος |
Τύπος |
Περιγραφή |
|---|---|---|
|
|
Η προσωρινή μνήμη για την αποθήκευση του ληφθέντος μηνύματος. |
|
|
Το μήκος του buffer. |
|
|
Πόσο χρόνο σε χιλιοστά του δευτερολέπτου θα λάβει το |
Αυτή η συνάρτηση επιστρέφει τον αριθμό των byte που λαμβάνονται.
Notesreceivereturns the next queued message from the other linked V5 Brain. Messages are read in FIFO order (oldest unread first). If the queue is empty whenreceiveis called, it waits up to the specifiedtimeoutfor a new message. If no message arrives in that window,receivereturns0, and any message sent afterward remains in the queue to be read the next timereceiveis 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για να καταχωρήσετε έναν χειριστή για ένα συγκεκριμένο όνομα μηνύματος. Ο χειριστής λαμβάνει τις τιμές που αποστέλλονται ως ορίσματα.
Χρησιμοποιώντας το link.send(“string”, 1, 2.55) λαμβάνεται ως .string_1_2.5500.
Κωδικός για το Ρομπότ 1
// Tell the other robot when the screen is being pressed // Create the link message_link link = message_link(PORT1, "VEXRoboticsLink123456789", linkType::manager, true); // Do not run code UNTIL the Brains are linked while (!link.isLinked()){ 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(0.05, seconds); }Κωδικός για το Ρομπότ 2
// Display if the other robot's screen is being pressed // Create the link message_link link = message_link(PORT1, "VEXRoboticsLink123456789", linkType::worker, true); // Do not run code UNTIL the Brains are linked while (!link.isLinked()){ wait(0.1, seconds); } // Continuously check if Robot 1 has sent "pressed" while (true){ Brain.Screen.clearScreen(); Brain.Screen.setCursor(1, 1); Brain.Screen.print("Robot 2 - Worker"); Brain.Screen.newLine(); char msg[32] = {0}; // buffer for incoming message int32_t n = link.receive(msg, sizeof(msg), 100); // wait up to 100ms if (n > 0 && strcmp(msg, "pressed") == 0) { Brain.Screen.newLine(); Brain.Screen.print("Manager is being pressed!"); } wait(0.05, seconds); }
received#
Καταγράφει μια συνάρτηση που θα καλείται κάθε φορά που ο εγκέφαλος V5 λαμβάνει ένα απεσταλμένο μήνυμα.
Available FunctionsParameters1 Καταγράφει μια επανάκληση για όλα τα ληφθέντα μηνύματα (μήνυμα + τιμή).
void received( void (* callback)(const char *, const char *, double) );2 Καταγράφει μια επανάκληση για όλα τα ληφθέντα μηνύματα (μήνυμα + δείκτης + τιμή).
void received( void (* callback)(const char *, const char *, int32_t, double) );3 Καταγράφει μια επανάκληση για ένα συγκεκριμένο μήνυμα (μήνυμα + τιμή).
void received( const char *message, void (* callback)(const char *, const char *, double) );4 Καταγράφει μια επανάκληση για ένα συγκεκριμένο μήνυμα (μήνυμα + δείκτης + τιμή).
void received( const char *message, void (* callback)(const char *, const char *, int32_t, double) );
Παράμετρος |
Τύπος |
Περιγραφή |
|---|---|---|
|
|
Το όνομα του μηνύματος που θα ανακτηθεί. Εάν παραλειφθεί, η επανάκληση εκτελείται για όλα τα ληφθέντα μηνύματα. |
|
|
Μια συνάρτηση που εκτελείται όταν λαμβάνεται ένα μήνυμα. |
Αυτή η συνάρτηση δεν επιστρέφει καμία τιμή.
Callback Signature1 Λαμβάνει το όνομα του αποστολέα, το όνομα του μηνύματος και την τιμή.
void callback(const char *, const char *, double)2 Λαμβάνει το όνομα του αποστολέα, το όνομα του μηνύματος, τον δείκτη και την τιμή.
void callback(const char *, const char *, int32_t, double)
Τύπος |
Περιγραφή |
|---|---|
1st |
Το όνομα του συνδέσμου του αποστολέα. |
2nd |
Το όνομα του μηνύματος που ελήφθη. |
|
Το ευρετήριο που σχετίζεται με το μήνυμα. |
|
Η τιμή που σχετίζεται με το μήνυμα. |
Κωδικός για το Ρομπότ 1
// Create the link. message_link link(PORT1, "LeftRightLink", linkType::manager, true); // Send whether screen is pressed on left or right. void screen_pressed() { if (Brain.Screen.xPosition() < 240) { link.send("left"); } else { link.send("right"); } } int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); // Do not run code UNTIL the Brains are linked. while (!link.isLinked()) { wait(0.1, seconds); } Brain.Screen.print("Robot 1 - Manager"); Brain.Screen.pressed(screen_pressed); while (true) { wait(10, msec); } }Κωδικός για το Ρομπότ 2
// Create variable to track where screen is pressed. int lastPress = 0; // Update the variable whenever a new message is received. void message_received(const char* message, const char* linkname, double timestamp) { if (strcmp(message, "left") == 0) lastPress = 1; if (strcmp(message, "right") == 0) lastPress = 2; } int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); // Create the link. message_link link(PORT1, "VEXRoboticsLink123456789", linkType::worker, true); // Do not run code UNTIL the Brains are linked. while (!link.isLinked()) { wait(0.1, seconds); } link.received(message_received); // Display if Robot 1's screen was pressed on the left or right while (true) { Brain.Screen.clearScreen(); Brain.Screen.setCursor(1, 1); Brain.Screen.print("Robot 2 - Worker"); Brain.Screen.newLine(); if (lastPress == 1) { Brain.Screen.print("Manager pressed LEFT"); } else if (lastPress == 2) { Brain.Screen.print("Manager pressed RIGHT"); } else { Brain.Screen.print("Waiting..."); } wait(0.1, seconds); } }