Žinutės nuoroda#
Įvadas#
message_link klasė leidžia dviem EXP smegenims bendrauti siunčiant trumpus tekstinius pranešimus su pasirinktinai mažais duomenimis. Ji skirta robotų tarpusavio koordinavimui – pvz., paleisti rutinas, dalytis jutiklių rezultatais arba suaktyvinti kito roboto elgesį.
Kiekvieną kartą panaudojus send, prie susieto EXP smegenų eilės pridedamas pranešimas, o eilė skaitoma FIFO principu. Jei prieš kitam EXP smegenų panaudojant receive, išsiunčiami keli pranešimai, jie bus saugomi ir grąžinami po vieną tokia tvarka, kokia buvo išsiųsti. Kadangi pranešimai gali būti eilėje, pakartotinis tos pačios būsenos siuntimas kiekviename cikle gali sukelti vėlavimą; laiko požiūriu kritinei logikai siųskite tik tada, kai pasikeičia reikšmės.
Svarbu: Abu robotai vienu metu turi vykdyti projektus, kurie naudoja message_link , kitaip pranešimai nebus siunčiami / gaunami.
Klasės konstruktoriai#
message_link(
int32_t index,
const char *name,
linkType type,
bool isWired = false );
Klasės destruktorius#
Sunaikina objektą message_link ir atlaisvina susijusius išteklius.
virtual ~message_link();
Parametrai#
Parametras |
Tipas |
Aprašymas |
|---|---|---|
|
|
Išmanusis prievadas, prie kurio prijungtas V5 radijas arba išmanusis kabelis, rašomas kaip |
|
|
Žinutės nuorodos pavadinimas. |
|
|
Ryšio tipas –
|
|
|
Ar „message_link“ objektas yra laidinis.
|
Pavyzdys#
1 roboto kodas
// Create a wireless link in Port 1 message_link link = message_link( PORT1, // index "VEXRoboticsLink123456789", // name linkType::manager, // type true); // isWiredRoboto 2 kodas
// Create a wireless link in Port 1 message_link link = message_link( PORT1, // index "VEXRoboticsLink123456789", // name linkType::worker, // type true); // isWired
Narių funkcijos#
message_link klasėje yra šios narių funkcijos:
isLinked— Grąžina, ar šios smegenys yra aktyviai prijungtos prie suporuotų smegenų.send— Siunčia žinutę suporuotoms smegenims.receive— Laukia ir grąžina kitą gaunamą pranešimą.received— Registruoja funkciją, kuri bus iškviečiama gavus naują pranešimą.
Prieš iškviečiant bet kokias message_link nario funkcijas, reikia sukurti message_link egzempliorių, kaip parodyta žemiau:
1 roboto kodas
// Create a wireless link in Port 1 message_link link = message_link( PORT1, // index "VEXRoboticsLink123456789", // name linkType::manager, // type true); // isWiredRoboto 2 kodas
// Create a wireless link in Port 1 message_link link = message_link( PORT1, // index "VEXRoboticsLink123456789", // name linkType::worker, // type true); // isWired
isLinked#
isLinked metodas grąžina, ar EXP smegenys „MessageLink“ tinkle yra suporuotos viena su kita.
bool isLinked();
Ši funkcija neturi jokių parametrų.
Return ValuesŠi funkcija grąžina loginę reikšmę.
true– Dvi EXP smegenys yra suporuotos ir bendrauja šiuo ryšiu.false– Šioje jungtyje nėra suporuotos dvi EXP smegenys.
Prieš paleidžiant bet kokį tolesnį kodą, gera praktika yra visada patikrinti, ar EXP smegenys yra susietos projekto pradžioje.
Examples1 roboto kodas
// 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); }Roboto 2 kodas
// 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#
Siunčia pranešimą per nuorodos ryšį.
Available FunctionsParameters1 — Siunčia pranešimo eilutę.
int32_t send( const char *message );2 — Siunčia pranešimų eilutę su
double.int32_t send( const char *message, double value );3 — Siunčia pranešimų eilutę su
int32_tirdouble.int32_t send( const char *message, int32_t index, double value );
Parametras |
Tipas |
Aprašymas |
|---|---|---|
|
|
Žinutė, kurią reikia siųsti į kitą susietą EXP smegenų bloką. |
|
|
Sveikasis skaičius, kurį reikia siųsti į kitą susietą EXP smegenų sritį. |
|
|
Dvigubas kodas, siunčiamas į kitą susietą EXP smegenų lauką. Dvigubi kodai suformatuojami iki 4 skaitmenų po kablelio; jei pateikiama mažiau skaitmenų po kablelio, pridedami nuliai, kol rodoma 4. |
Ši funkcija negrąžina jokių reikšmių.
NotesJei siunčiama tik message , kita susieta EXP smegenys gauna būtent tą žinutę.
Jei įtraukiama value (ir index jei nurodyta), priimančios smegenys gauna vieną užkoduotą pranešimą, kuriame visi laukai sujungiami tokia tvarka: .message_index_value
Naudojant link.send(“string”, 1, 2.55) gaunamas kaip .string_1_2.5500.
1 roboto kodas
// 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); }Roboto 2 kodas
// 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#
Gauna pranešimą iš nuorodos ryšio.
Available Functionsint32_t receive(
char *buffer,
int32_t length,
int32_t timeoutMs = 500 );
Parametras |
Tipas |
Aprašymas |
|---|---|---|
|
|
Buferis gautam pranešimui saugoti. |
|
|
Buferio ilgis. |
|
|
Kiek milisekundėmis |
Ši funkcija grąžina gautų baitų skaičių.
Notesreceivegrąžina kitą eilėje esantį pranešimą iš kitos susietos EXP smegenų grupės. Pranešimai skaitomi FIFO tvarka (pirmiausia seniausi neskaityti). Jei eilė tuščia, kai iškviečiamareceive, ji laukia naujo pranešimo iki nurodytoreceive. Jei per tą langą negaunama jokio pranešimo,receivegrąžinatimeout, o visi vėliau išsiųsti pranešimai lieka eilėje, kad būtų perskaityti kitą kartą naudojant0.Jei kitas susietas EXP Brain išsiuntė tik
string,receivegrąžina tikslią eilutę.Jei kitas susietas EXP Brain išsiuntė sveikąjį ir (arba) slankiojo skaičiaus reikšmę,
receivegrąžina vieną užkoduotą eilutę, kuri sujungia visus laukus tokia tvarka:.string_integer_floatPavyzdžiui, jei kitas susietas EXP Brain naudoja
link.send(“string”, 1, 2.55), tada naudojantlink.receive()grąžina užkoduotą eilutę, pvz..string_1_2.5500Šią užkoduotą eilutę galite padalinti (žr. pavyzdžius toliau), kad išgautumėte pranešimo pavadinimą, sveikąjį skaičių ir slankiojo skaičiaus reikšmes.Jei norite išvengti rankinio skaidymo / analizavimo, naudokite
received, kad užregistruotumėte konkretaus pranešimo pavadinimo tvarkyklę; tvarkyklė gauna išsiųstas reikšmes kaip argumentus.
Naudojant link.send(“string”, 1, 2.55) gaunamas kaip .string_1_2.5500.
1 roboto kodas
// 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); }Roboto 2 kodas
// 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#
Registruoja funkciją, kuri bus iškviečiama kaskart, kai EXP Brain gaus išsiųstą pranešimą.
Available FunctionsParameters1 Registruoja visų gautų pranešimų (pranešimas + reikšmė) grįžtamąjį ryšį.
void received( void (* callback)(const char *, const char *, double) );2 Registruoja visų gautų pranešimų atgalinį iškvietimą (pranešimas + indeksas + reikšmė).
void received( void (* callback)(const char *, const char *, int32_t, double) );3 Registruoja konkretaus pranešimo (pranešimas + reikšmė) grįžtamąjį ryšį.
void received( const char *message, void (* callback)(const char *, const char *, double) );4 Registruoja konkretaus pranešimo (pranešimas + indeksas + reikšmė) grįžtamąjį ryšį.
void received( const char *message, void (* callback)(const char *, const char *, int32_t, double) );
Parametras |
Tipas |
Aprašymas |
|---|---|---|
|
|
Klausomo pranešimo pavadinimas. Jei nenurodyta, grįžtamasis iškvietimas vykdomas visiems gautiems pranešimams. |
|
Funkcijos rodyklė |
Funkcija, kuri vykdoma gavus pranešimą. |
Ši funkcija negrąžina jokių reikšmių.
Callback Signature1 Gauna siuntėjo vardą, žinutės pavadinimą ir reikšmę.
void callback(const char *, const char *, double)2 Gauna siuntėjo vardą, pranešimo pavadinimą, indeksą ir reikšmę.
void callback(const char *, const char *, int32_t, double)
Tipas |
Aprašymas |
|---|---|
1st |
Siuntėjo nuorodos pavadinimas. |
2nd |
Gautos žinutės pavadinimas. |
|
Su pranešimu susietas indeksas. |
|
Su pranešimu susijusi reikšmė. |
1 roboto kodas
// 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); } }Roboto 2 kodas
// 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); } }