Tautan Pesan#
Perkenalan#
Kelas message_link memungkinkan dua V5 Brain berkomunikasi dengan mengirimkan pesan string pendek dengan data kecil opsional. Kelas ini dirancang untuk koordinasi antar robot — seperti memulai rutinitas, berbagi hasil sensor, atau memicu perilaku pada robot lain.
Setiap penggunaan send menambahkan pesan ke antrian V5 Brain yang terhubung, dan antrian dibaca masuk pertama keluar pertama (FIFO). Jika beberapa pesan dikirim sebelum V5 Brain lainnya menggunakan receive, pesan-pesan tersebut akan disimpan dan dikembalikan satu per satu sesuai urutan pengirimannya. Karena pesan dapat mengantri, mengirim status yang sama berulang kali setiap putaran dapat menyebabkan penumpukan; untuk logika yang sensitif terhadap waktu, kirim hanya ketika nilai berubah.
Penting: Kedua robot harus menjalankan proyek yang menggunakan message_link secara bersamaan, jika tidak, tidak ada pesan yang akan dikirim/diterima.
Konstruktor Kelas#
message_link(
int32_t index,
const char *name,
linkType type,
bool isWired = false );
Destruktor Kelas#
Menghapus objek message_link dan melepaskan sumber daya terkait.
virtual ~message_link();
Parameter#
Parameter |
Jenis |
Keterangan |
|---|---|---|
|
|
Port Pintar yang terhubung dengan Radio V5, atau Kabel Pintar, ditulis sebagai |
|
|
Nama Tautan Pesan. |
|
|
Jenis tautan, yaitu
|
|
|
Apakah objek message_link terhubung melalui kabel.
|
Contoh#
Kode untuk Robot 1
// Create a wireless link in Port 1 message_link link = message_link( PORT1, // index "VEXRoboticsLink123456789", // name linkType::manager, // type true); // isWiredKode untuk Robot 2
// Create a wireless link in Port 1 message_link link = message_link( PORT1, // index "VEXRoboticsLink123456789", // name linkType::worker, // type true); // isWired
Fungsi Keanggotaan#
Kelas message_link mencakup fungsi anggota berikut:
isLinked— Mengembalikan apakah Otak ini terhubung secara aktif ke Otak pasangannya.send— Mengirim pesan ke Otak yang berpasangan.receive— Menunggu dan mengembalikan pesan masuk berikutnya.received— Mendaftarkan fungsi yang akan dipanggil setiap kali pesan baru diterima.
Sebelum memanggil fungsi anggota message_link apa pun, sebuah instance message_link harus dibuat, seperti yang ditunjukkan di bawah ini:
Kode untuk Robot 1
// Create a wireless link in Port 1 message_link link = message_link( PORT1, // index "VEXRoboticsLink123456789", // name linkType::manager, // type true); // isWiredKode untuk Robot 2
// Create a wireless link in Port 1 message_link link = message_link( PORT1, // index "VEXRoboticsLink123456789", // name linkType::worker, // type true); // isWired
isLinked#
Metode isLinked mengembalikan nilai boolean yang menunjukkan apakah V5 Brains pada MessageLink sudah berpasangan satu sama lain.
bool isLinked();
Fungsi ini tidak memiliki parameter apa pun.
Return ValuesFungsi ini mengembalikan nilai boolean.
true– Kedua Otak V5 dipasangkan dan berkomunikasi melalui tautan ini.false– Kedua V5 Brain tidak terhubung pada tautan ini.
Sebaiknya selalu periksa untuk memastikan V5 Brains sudah terhubung di awal proyek sebelum menjalankan kode lebih lanjut.
ExamplesKode untuk Robot 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); }Kode untuk Robot 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#
Mengirim pesan melalui koneksi tautan.
Available FunctionsParameters1 — Mengirimkan rangkaian pesan.
int32_t send( const char *message );2 — Mengirimkan string pesan dengan
double.int32_t send( const char *message, double value );3 — Mengirimkan string pesan dengan
int32_tdandouble.int32_t send( const char *message, int32_t index, double value );
Parameter |
Jenis |
Keterangan |
|---|---|---|
|
|
Pesan yang akan dikirim ke V5 Brain lain yang terhubung. |
|
|
Bilangan bulat untuk dikirim ke V5 Brain lain yang terhubung. |
|
|
Nilai double untuk dikirim ke V5 Brain lain yang terhubung. Nilai double diformat hingga 4 angka desimal; jika angka desimal yang diberikan kurang dari itu, angka nol di belakang koma akan ditambahkan hingga 4 angka desimal ditampilkan. |
Fungsi ini tidak mengembalikan nilai apa pun.
NotesJika hanya message yang dikirim, V5 Brain lain yang terhubung akan menerima pesan yang persis sama.
Jika nilai value (dan indeks index jika disediakan) disertakan, Otak penerima akan mendapatkan satu pesan terenkripsi yang menggabungkan semua bidang dalam urutan ini: .message_index_value
Dengan menggunakan link.send(“string”, 1, 2.55) diterima sebagai .string_1_2.5500.
Kode untuk Robot 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); }Kode untuk Robot 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#
Menerima pesan dari koneksi tautan.
Available Functionsint32_t receive(
char *buffer,
int32_t length,
int32_t timeoutMs = 500 );
Parameter |
Jenis |
Keterangan |
|---|---|---|
|
|
Buffer untuk menyimpan pesan yang diterima. |
|
|
Panjang buffer. |
|
|
Berapa lama dalam milidetik |
Fungsi ini mengembalikan jumlah byte yang diterima.
Notesreceivemengembalikan pesan antrean berikutnya dari V5 Brain lain yang terhubung. Pesan dibaca dalam urutan FIFO (pesan terlama yang belum dibaca terlebih dahulu). Jika antrean kosong saatreceivedipanggil, ia menunggu hingga batas waktutimeoutuntuk pesan baru. Jika tidak ada pesan yang tiba dalam jangka waktu tersebut,receivemengembalikan0, dan pesan apa pun yang dikirim setelahnya tetap berada dalam antrean untuk dibaca saatreceivedigunakan berikutnya.Jika V5 Brain yang terhubung lainnya hanya mengirimkan string
string,receivedan mengembalikan string yang persis sama.Jika V5 Brain lain yang terhubung mengirimkan bilangan bulat dan/atau bilangan pecahan,
receivemengembalikan satu string terenkripsi yang menggabungkan semua bidang dalam urutan ini:.string_integer_floatMisalnya, jika V5 Brain yang terhubung lainnya menggunakan
link.send(“string”, 1, 2.55), maka menggunakanlink.receive()akan mengembalikan string yang dikodekan seperti.string_1_2.5500. Anda dapat memisahkan string yang dikodekan ini (lihat contoh di bawah) untuk mengekstrak nama pesan, nilai integer, dan float.Jika Anda lebih suka menghindari pemisahan/penguraian manual, gunakan
receiveduntuk mendaftarkan handler untuk nama pesan tertentu; handler menerima nilai yang dikirim sebagai argumen.
Dengan menggunakan link.send(“string”, 1, 2.55) diterima sebagai .string_1_2.5500.
Kode untuk Robot 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); }Kode untuk Robot 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#
Mendaftarkan fungsi yang akan dipanggil setiap kali V5 Brain menerima pesan yang dikirim.
Available FunctionsParameters1 Mendaftarkan fungsi callback untuk semua pesan yang diterima (pesan + nilai).
void received( void (* callback)(const char *, const char *, double) );2 Mendaftarkan fungsi callback untuk semua pesan yang diterima (pesan + indeks + nilai).
void received( void (* callback)(const char *, const char *, int32_t, double) );3 Mendaftarkan fungsi callback untuk pesan tertentu (pesan + nilai).
void received( const char *message, void (* callback)(const char *, const char *, double) );4 Mendaftarkan fungsi callback untuk pesan tertentu (pesan + indeks + nilai).
void received( const char *message, void (* callback)(const char *, const char *, int32_t, double) );
Parameter |
Jenis |
Keterangan |
|---|---|---|
|
|
Nama pesan yang akan dipantau. Jika diabaikan, fungsi callback akan dijalankan untuk semua pesan yang diterima. |
|
|
Sebuah fungsi yang dijalankan ketika sebuah pesan diterima. |
Fungsi ini tidak mengembalikan nilai apa pun.
Callback Signature1 Menerima nama pengirim, nama pesan, dan nilai.
void callback(const char *, const char *, double)2 Menerima nama pengirim, nama pesan, indeks, dan nilai.
void callback(const char *, const char *, int32_t, double)
Jenis |
Keterangan |
|---|---|
1st |
Nama tautan pengirim. |
2nd |
Nama pesan yang diterima. |
|
Indeks yang terkait dengan pesan tersebut. |
|
Nilai yang terkait dengan pesan tersebut. |
Kode untuk Robot 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); } }Kode untuk Robot 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); } }