Σύνδεσμος μηνύματος#
Εισαγωγή#
Η κλάση message_link επιτρέπει σε δύο εγκεφάλους EXP να επικοινωνούν στέλνοντας σύντομα μηνύματα συμβολοσειράς με προαιρετικά μικρά δεδομένα. Έχει σχεδιαστεί για συντονισμό ρομπότ με ρομπότ — όπως η έναρξη ρουτινών, η κοινοποίηση αποτελεσμάτων αισθητήρων ή η ενεργοποίηση συμπεριφορών σε ένα άλλο ρομπότ.
Κάθε χρήση του send προσθέτει ένα μήνυμα στην ουρά του συνδεδεμένου EXP Brain και η ουρά διαβάζεται first-in, first-out (FIFO). Εάν αποσταλούν πολλά μηνύματα πριν ο άλλος EXP 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 επιστρέφει εάν οι εγκέφαλοι EXP σε ένα MessageLink είναι ζευγαρωμένοι μεταξύ τους.
bool isLinked();
Αυτή η συνάρτηση δεν έχει παραμέτρους.
Return ValuesΑυτή η συνάρτηση επιστρέφει μια λογική τιμή.
true– Οι δύο εγκέφαλοι EXP είναι ζευγαρωμένοι και επικοινωνούν σε αυτόν τον σύνδεσμο.false– Οι δύο εγκέφαλοι EXP δεν είναι ζευγαρωμένοι σε αυτόν τον σύνδεσμο.
Είναι καλή πρακτική να ελέγχετε πάντα για να βεβαιωθείτε ότι οι εγκέφαλοι EXP είναι συνδεδεμένοι στην αρχή ενός έργου πριν από την εκτέλεση οποιουδήποτε περαιτέρω κώδικα.
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 );
Παράμετρος |
Τύπος |
Περιγραφή |
|---|---|---|
|
|
Το μήνυμα που θα σταλεί στον άλλο συνδεδεμένο εγκέφαλο EXP. |
|
|
Ένας ακέραιος αριθμός για αποστολή στον άλλο συνδεδεμένο εγκέφαλο EXP. |
|
|
Ένα διπλό για αποστολή στον άλλο συνδεδεμένο εγκέφαλο EXP. Τα διπλάσια μορφοποιούνται σε 4 δεκαδικά ψηφία. Εάν παρέχονται λιγότερα δεκαδικά ψηφία, προστίθενται μηδενικά στο τέλος μέχρι να εμφανιστούν 4. |
Αυτή η συνάρτηση δεν επιστρέφει καμία τιμή.
NotesΕάν σταλεί μόνο message , ο άλλος συνδεδεμένος εγκέφαλος EXP λαμβάνει ακριβώς αυτό το μήνυμα.
Εάν συμπεριληφθούν οι τιμές 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 EXP 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.Εάν ο άλλος συνδεδεμένος εγκέφαλος EXP έστειλε μόνο μια συμβολοσειρά
string,receiveεπιστρέφει αυτήν ακριβώς τη συμβολοσειρά.Εάν το άλλο συνδεδεμένο EXP Brain έστειλε έναν ακέραιο ή/και έναν αριθμό float, η συνάρτηση
receiveεπιστρέφει μια ενιαία κωδικοποιημένη συμβολοσειρά που συνδυάζει όλα τα πεδία με αυτήν τη σειρά:.string_integer_floatΓια παράδειγμα, εάν το άλλο συνδεδεμένο EXP 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#
Καταγράφει μια συνάρτηση που θα καλείται κάθε φορά που ο εγκέφαλος EXP λαμβάνει ένα απεσταλμένο μήνυμα.
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
// 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(); // Create the link message_link link(PORT1, "LeftRightLink", 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"); 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); } }