Ziņojuma saite#
Ievads#
Klase message_link ļauj divām V5 smadzenēm sazināties, nosūtot īsas virknes ziņojumus ar nelieliem papildu datiem. Tā ir paredzēta robotu savstarpējai koordinācijai — piemēram, rutīnu palaišanai, sensoru rezultātu koplietošanai vai uzvedības aktivizēšanai citā robotā.
Katru reizi, kad tiek izmantota send, saistītās V5 smadzeņu rindai tiek pievienots ziņojums, un rinda tiek lasīta pēc principa “pirmais iekšā, pirmais ārā” (FIFO). Ja pirms otras V5 smadzeņu sistēmas tiek izmantota receive, tiek nosūtīti vairāki ziņojumi, tie tiks saglabāti un atgriezti pa vienam tādā secībā, kādā tie tika nosūtīti. Tā kā ziņojumi var tikt ievietoti rindā, atkārtota viena un tā paša statusa nosūtīšana katrā ciklā var radīt uzkrāšanos; laika ziņā kritiskas loģikas gadījumā sūtiet tikai tad, kad mainās vērtības.
Svarīgi: Abiem robotiem vienlaikus jādarbojas projektos, kas izmanto message_link , pretējā gadījumā ziņojumi netiks nosūtīti/saņemti.
Klases konstruktori#
message_link(
int32_t index,
const char *name,
linkType type,
bool isWired = false );
Klases iznīcinātājs#
Iznīcina objektu message_link un atbrīvo saistītos resursus.
virtual ~message_link();
Parametri#
Parametrs |
Tips |
Apraksts |
|---|---|---|
|
|
Viedports, kuram ir pievienots V5 radio vai viedkabelis, tiek rakstīts kā |
|
|
Ziņojuma saites nosaukums. |
|
|
Saites veids —
|
|
|
Vai message_link objekts ir savienots ar vadu savienojumu.
|
Piemērs#
1. robota kods
// Create a wireless link in Port 1 message_link link = message_link( PORT1, // index "VEXRoboticsLink123456789", // name linkType::manager, // type true); // isWiredRobots 2 kods
// Create a wireless link in Port 1 message_link link = message_link( PORT1, // index "VEXRoboticsLink123456789", // name linkType::worker, // type true); // isWired
Dalībnieku funkcijas#
Klase message_link ietver šādas dalībfunkcijas:
isLinked— Atgriež, vai šīs smadzenes ir aktīvi savienotas ar pārī savienotajām smadzenēm.send— Nosūta ziņojumu pārī savienotajām smadzenēm.receive— Gaida un atgriež nākamo ienākošo ziņojumu.received— Reģistrē funkciju, kas tiks izsaukta ikreiz, kad tiek saņemts jauns ziņojums.
Pirms jebkuru message_link dalībfunkciju izsaukšanas ir jāizveido message_link instance, kā parādīts zemāk:
1. robota kods
// Create a wireless link in Port 1 message_link link = message_link( PORT1, // index "VEXRoboticsLink123456789", // name linkType::manager, // type true); // isWiredRobots 2 kods
// Create a wireless link in Port 1 message_link link = message_link( PORT1, // index "VEXRoboticsLink123456789", // name linkType::worker, // type true); // isWired
isLinked#
isLinked metode atgriež, vai V5 smadzenes MessageLink saitē ir savienotas pārī viena ar otru.
bool isLinked();
Šai funkcijai nav parametru.
Return ValuesŠī funkcija atgriež Būla vērtību.
true– Abas V5 smadzenes ir savienotas pārī un sazinās, izmantojot šo saiti.false– Abas V5 smadzenes šajā saitē nav savienotas pārī.
Pirms jebkāda turpmāka koda palaišanas projekta sākumā vienmēr ir ieteicams pārbaudīt, vai V5 smadzenes ir saistītas.
Examples1. robota kods
// 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); }Robots 2 kods
// 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#
Nosūta ziņojumu, izmantojot saites savienojumu.
Available FunctionsParameters1 — Nosūta ziņojuma virkni.
int32_t send( const char *message );2 — Nosūta ziņojuma virkni ar vērtību
double.int32_t send( const char *message, double value );3 — Nosūta ziņojuma virkni ar
int32_tundouble.int32_t send( const char *message, int32_t index, double value );
Parametrs |
Tips |
Apraksts |
|---|---|---|
|
|
Ziņojums, kas jānosūta otrai saistītajai V5 smadzenei. |
|
|
Vesels skaitlis, kas jānosūta uz otru saistīto V5 smadzeņu sistēmu. |
|
|
Dubultskaitlis, kas jānosūta uz otru saistīto V5 Brain. Dubultskaitļi tiek formatēti ar 4 zīmēm aiz komata; ja norādīts mazāk zīmju aiz komata, tiek pievienotas nulles, līdz tiek parādīti 4. |
Šī funkcija neatgriež nekādas vērtības.
NotesJa tiek nosūtīts tikai message , otra saistītā V5 smadzenes saņem tieši šo ziņojumu.
Ja ir iekļauta value (un index ja tāds ir), saņēmēja smadzenes saņem vienu kodētu ziņojumu, kas apvieno visus laukus šādā secībā: .message_index_value
Izmantojot link.send(“string”, 1, 2.55) tiek saņemts kā .string_1_2.5500.
1. robota kods
// 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); }Robots 2 kods
// 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#
Saņem ziņojumu no saites savienojuma.
Available Functionsint32_t receive(
char *buffer,
int32_t length,
int32_t timeoutMs = 500 );
Parametrs |
Tips |
Apraksts |
|---|---|---|
|
|
Buferis saņemtā ziņojuma glabāšanai. |
|
|
Bufera garums. |
|
|
Cik ilgi milisekundēs |
Šī funkcija atgriež saņemto baitu skaitu.
Notesreceiveatgriež nākamo rindā esošo ziņojumu no otras saistītās V5 Brain. Ziņojumi tiek lasīti FIFO secībā (vispirms vecākie nelasītie). Ja rinda ir tukša, kad tiek izsauktareceive, tā gaida jaunu ziņojumu līdz norādītajamtimeoutJa šajā logā netiek saņemts neviens ziņojums,receiveatgriež0, un visi pēc tam nosūtītie ziņojumi paliek rindā, lai tos nolasītu nākamajā reizē, kad tiks izmantotareceive.Ja otra saistītā V5 Brain nosūtīja tikai
string,receiveatgriež precīzu virkni.Ja otra saistītā V5 Brain nosūtīja veselu skaitli un/vai peldošo skaitli,
receiveatgriež vienu kodētu virkni, kas apvieno visus laukus šādā secībā:.string_integer_floatPiemēram, ja otra saistītā V5 Brain izmanto
link.send(“string”, 1, 2.55), tad, izmantojotlink.receive()tiek atgriezta kodēta virkne, piemēram,.string_1_2.5500Šo kodēto virkni var sadalīt (skatiet tālāk sniegtos piemērus), lai iegūtu ziņojuma nosaukumu, veselu skaitli un peldošās vērtības.Ja vēlaties izvairīties no manuālas sadalīšanas/parsēšanas, izmantojiet
received, lai reģistrētu apstrādātāju konkrētam ziņojuma nosaukumam; apstrādātājs saņem nosūtītās vērtības kā argumentus.
Izmantojot link.send(“string”, 1, 2.55) tiek saņemts kā .string_1_2.5500.
1. robota kods
// 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); }Robots 2 kods
// 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#
Reģistrē funkciju, kas tiks izsaukta ikreiz, kad V5 Brain saņem nosūtītu ziņojumu.
Available FunctionsParameters1 Reģistrē atzvanu visiem saņemtajiem ziņojumiem (ziņojums + vērtība).
void received( void (* callback)(const char *, const char *, double) );2 Reģistrē atzvanu visiem saņemtajiem ziņojumiem (ziņojums + indekss + vērtība).
void received( void (* callback)(const char *, const char *, int32_t, double) );3 Reģistrē atzvanīšanas pieprasījumu konkrētam ziņojumam (ziņojums + vērtība).
void received( const char *message, void (* callback)(const char *, const char *, double) );4 Reģistrē atzvanīšanas pieprasījumu konkrētam ziņojumam (ziņojums + indekss + vērtība).
void received( const char *message, void (* callback)(const char *, const char *, int32_t, double) );
Parametrs |
Tips |
Apraksts |
|---|---|---|
|
|
Ziņojuma nosaukums, kas jāklausa. Ja netiek norādīts, atzvans tiek veikts visiem saņemtajiem ziņojumiem. |
|
|
Funkcija, kas tiek izpildīta, kad tiek saņemts ziņojums. |
Šī funkcija neatgriež nekādas vērtības.
Callback Signature1 Saņem sūtītāja vārdu, ziņojuma nosaukumu un vērtību.
void callback(const char *, const char *, double)2 Saņem sūtītāja vārdu, ziņojuma nosaukumu, indeksu un vērtību.
void callback(const char *, const char *, int32_t, double)
Tips |
Apraksts |
|---|---|
1st |
Sūtītāja saites nosaukums. |
2nd |
Saņemtā ziņojuma nosaukums. |
|
Ar ziņojumu saistītais indekss. |
|
Ar ziņojumu saistītā vērtība. |
1. robota kods
// 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); } }Robots 2 kods
// 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); } }