Σύνδεσμος μηνύματος#
Εισαγωγή#
Η κλάση 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— Επιστρέφει εάν αυτός ο Εγκέφαλος είναι ενεργά συνδεδεμένος με τον συζευγμένο Εγκέφαλό του.αποστολή— Στέλνει ένα μήνυμα στον ζευγαρωμένο εγκέφαλο.λήψη— Περιμένει και επιστρέφει το επόμενο εισερχόμενο μήνυμα.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Αυτή η συνάρτηση επιστρέφει μια λογική τιμή.
σωστό– Οι δύο εγκέφαλοι EXP είναι ζευγαρωμένοι και επικοινωνούν σε αυτόν τον σύνδεσμο.λάθος– Οι δύο εγκέφαλοι 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 — Στέλνει μια συμβολοσειρά μηνύματος με
διπλό.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Εάν σταλεί μόνο μήνυμα , ο άλλος συνδεδεμένος εγκέφαλος EXP λαμβάνει ακριβώς αυτό το μήνυμα.
Εάν συμπεριληφθούν οι τιμές (και με δείκτη εάν παρέχονται), ο εγκέφαλος λήψης λαμβάνει ένα μόνο κωδικοποιημένο μήνυμα που συνδυάζει όλα τα πεδία με την εξής σειρά: .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 που λαμβάνονται.
Notesσυνάρτηση
receiveεπιστρέφει το επόμενο μήνυμα στην ουρά από τον άλλο συνδεδεμένο εγκέφαλο EXP. Τα μηνύματα διαβάζονται με σειρά FIFO (πρώτα τα παλαιότερα μη αναγνωσμένα). Εάν η ουρά είναι κενή όταν καλείται η συνάρτησηreceive, περιμένει μέχρι το καθορισμένο χρονικό όριογια ένα νέο μήνυμα. Εάν δεν φτάσει κανένα μήνυμα σε αυτό το παράθυρο, η συνάρτησηreceiveεπιστρέφει0και οποιοδήποτε μήνυμα αποστέλλεται στη συνέχεια παραμένει στην ουρά για να διαβαστεί την επόμενη φορά που θα χρησιμοποιηθεί η συνάρτησηreceive.Εάν ο άλλος συνδεδεμένος εγκέφαλος EXP έστειλε μόνο μια συμβολοσειρά
,,receiveεπιστρέφει αυτήν ακριβώς τη συμβολοσειρά.Εάν το άλλο συνδεδεμένο EXP Brain έστειλε έναν ακέραιο ή/και έναν αριθμό float, η συνάρτηση
receiveεπιστρέφει μια ενιαία κωδικοποιημένη συμβολοσειρά που συνδυάζει όλα τα πεδία με αυτήν τη σειρά:.string_integer_floatΓια παράδειγμα, εάν το άλλο συνδεδεμένο EXP Brain χρησιμοποιεί
link.send(“string”, 1, 2.55), τότε χρησιμοποιώνταςlink.receive()επιστρέφει μια κωδικοποιημένη συμβολοσειρά όπως.string_1_2.5500. Μπορείτε να διαχωρίσετε αυτήν την κωδικοποιημένη συμβολοσειρά (δείτε τα παρακάτω παραδείγματα) για να εξαγάγετε τις τιμές ονόματος μηνύματος, ακεραίου και κινητής υποδιαστολής.Αν προτιμάτε να αποφύγετε τον χειροκίνητο διαχωρισμό/ανάλυση, χρησιμοποιήστε την εντολή
receivedγια να καταχωρήσετε έναν χειριστή για ένα συγκεκριμένο όνομα μηνύματος. Ο χειριστής λαμβάνει τις τιμές που αποστέλλονται ως ορίσματα.
Examples
Χρησιμοποιώντας το 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 Functions
1 Καταγράφει μια επανάκληση για όλα τα ληφθέντα μηνύματα (μήνυμα + τιμή).
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)
);
Parameters
Παράμετρος
Τύπος
Περιγραφή
message
const char *
Το όνομα του μηνύματος που θα ανακτηθεί. Εάν παραλειφθεί, η επανάκληση εκτελείται για όλα τα ληφθέντα μηνύματα.
callback
Δείκτης συνάρτησης
Μια συνάρτηση που εκτελείται όταν λαμβάνεται ένα μήνυμα.
Return Values
Αυτή η συνάρτηση δεν επιστρέφει καμία τιμή.
Callback Signature
1 Λαμβάνει το όνομα του αποστολέα, το όνομα του μηνύματος και την τιμή.
void callback(const char *, const char *, double)
2 Λαμβάνει το όνομα του αποστολέα, το όνομα του μηνύματος, τον δείκτη και την τιμή.
void callback(const char *, const char *, int32_t, double)
Τύπος
Περιγραφή
1st const char *
Το όνομα του συνδέσμου του αποστολέα.
2nd const char *
Το όνομα του μηνύματος που ελήφθη.
int32_t
Το ευρετήριο που σχετίζεται με το μήνυμα.
double
Η τιμή που σχετίζεται με το μήνυμα.
Examples
Κωδικός για το Ρομπότ 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);
}
}