Ia adalah sistem untuk menguruskan pelbagai perkakasan dan perisian.
TANGO kini menyokong 4 platform: Linux, Windows NT, Solaris dan HP-UX.
Di sini kami akan menerangkan bekerja dengan Linux (Ubuntu 18.04)
Untuk apa itu?
Memudahkan kerja dengan pelbagai peralatan dan perisian.
Anda tidak perlu memikirkan cara untuk menyimpan data dalam pangkalan data, ia sudah dilakukan untuk anda.
Ia hanya perlu untuk menerangkan mekanisme untuk penderia undian.
Saya tidak dapat melancarkannya daripada kod sumber; Saya menggunakan imej siap sedia TangoBox 9.3 untuk berfungsi.
Arahan menerangkan cara memasang daripada pakej.
Apakah kandungannya?
jive β digunakan untuk melihat dan mengedit pangkalan data TANGO.
POGO β penjana kod untuk pelayan peranti TANGO.
Astor β pengurus program untuk sistem TANGO.
Kami hanya akan berminat dalam dua komponen pertama.
Bahasa pengaturcaraan yang disokong
C
C + +
Java
JavaScript
Python
Matlab
Tinjauan Makmal
Saya bekerja dengannya dalam python & c++. Di sini C++ akan digunakan sebagai contoh.
Sekarang mari kita beralih kepada penerangan tentang cara menyambungkan peranti ke TANGO dan cara bekerja dengannya. Bayaran akan diambil sebagai contoh GPS neo-6m-0-001:
Seperti yang anda lihat dalam gambar, kami menyambungkan papan ke PC melalui UART CP2102. Apabila disambungkan ke PC, peranti muncul /dev/ttyUSB[0-N], biasanya /dev/ttyUSB0.
POGO
Sekarang mari kita lancarkan pogo, dan menjana kod rangka untuk bekerja dengan papan kami.
pogo
Saya sudah mencipta kod itu, mari buat semula Fail->Baharu.
Kami mendapat perkara berikut:
Peranti kami (pada masa hadapan, mengikut peranti yang kami maksudkan bahagian perisian) kosong dan mempunyai dua arahan kawalan: Negeri & status.
Ia mesti diisi dengan sifat-sifat yang diperlukan:
Harta Peranti β nilai lalai yang kami pindahkan ke peranti untuk memulakannya; untuk papan GPS, anda perlu memindahkan nama papan dalam sistem com="/dev/ttyUSB0" dan kelajuan port com baudrade=9600
arahan β perintah untuk mengawal peranti kami; ia boleh diberikan hujah dan nilai pulangan.
NEGERI - mengembalikan keadaan semasa, daripada Syarikat
STATUS - mengembalikan status semasa, ini adalah pelengkap rentetan NEGERI
GPSArray - pulangan gps rentetan dalam bentuk DevVarCharArray
Seterusnya, tetapkan atribut peranti yang boleh dibaca/ditulis ke/daripadanya. Atribut Skalar - atribut mudah (char, rentetan, panjang, dll.) Atribut Spektrum - tatasusunan satu dimensi Atribut Imej - tatasusunan dua dimensi
Syarikat β keadaan di mana peranti kami berada.
BUKA β peranti terbuka.
TUTUP - peranti ditutup.
GAGAL - kesilapan.
ON β terima data daripada peranti.
OFF β tiada data daripada peranti.
Contoh menambah atribut gps_string:
tempoh pengundian masa dalam ms, kekerapan nilai gps_string akan dikemas kini. Jika masa kemas kini tidak ditentukan, atribut akan dikemas kini hanya atas permintaan.
Berlaku:
Sekarang anda perlu menjana kod Fail->Jana
Secara lalai, Makefile tidak dijana; kali pertama anda perlu menandakan kotak untuk menciptanya. Ini dilakukan supaya perubahan yang dibuat padanya tidak dipadamkan semasa generasi baharu. Setelah menciptanya sekali dan mengkonfigurasinya untuk projek anda (daftar kunci kompilasi, fail tambahan), anda boleh melupakannya.
Sekarang mari kita beralih kepada pengaturcaraan. pogo dengan menghasilkan yang berikut untuk kami:
Kami akan berminat dengan NEO6M.cpp & NEO6M.h. Mari kita ambil contoh pembina kelas:
NEO6M::NEO6M(Tango::DeviceClass *cl, string &s)
: TANGO_BASE_CLASS(cl, s.c_str())
{
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
init_device();
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1
}
Apa yang ada dan apa yang penting di sini? Fungsi init_device() memperuntukkan memori untuk atribut kami: gps_string & gps_array, tetapi ia tidak penting. Perkara yang paling penting di sini, ini adalah ulasan:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1
Semua yang ada di dalam blok ulasan ini tidak akan disertakan dalam pogo semasa penjanaan semula kod berikutnya berpindah!. Semua yang tidak ada dalam blok akan menjadi! Ini adalah tempat di mana kita boleh memprogram dan membuat suntingan kita sendiri.
Sekarang apakah fungsi utama yang terkandung dalam kelas? NEO6M:
Apabila kita ingin membaca nilai atribut gps_string, fungsi akan dipanggil dalam susunan berikut: always_executed_hook, read_attr_hardware ΠΈ read_gps_string. Read_gps_string akan mengisi gps_string dengan nilai.
void NEO6M::read_gps_string(Tango::Attribute &attr)
{
DEBUG_STREAM << "NEO6M::read_gps_string(Tango::Attribute &attr) entering... " << endl;
/*----- PROTECTED REGION ID(NEO6M::read_gps_string) ENABLED START -----*/
// Set the attribute value
*this->attr_gps_string_read = Tango::string_dup(this->gps.c_str());
attr.set_value(attr_gps_string_read);
/*----- PROTECTED REGION END -----*/ // NEO6M::read_gps_string
}
Penyusunan
Pergi ke folder sumber dan:
make
Program ini akan disusun ke dalam folder ~/DeviceServers.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6M
jive
jive
Sudah terdapat beberapa peranti dalam pangkalan data, mari kita cipta peranti kita sekarang Edit->Buat Pelayan
Sekarang mari kita cuba menyambung kepadanya:
Tiada apa-apa yang akan berfungsi, pertama kita perlu menjalankan program kami:
sudo ./NEO6M neo6m -v2
Saya hanya boleh menyambung ke port com dengan hak akar-a. v - tahap pembalakan.
Sekarang kita boleh menyambung:
Pelanggan
Dalam grafik, melihat gambar sudah tentu bagus, tetapi anda memerlukan sesuatu yang lebih berguna. Mari tulis pelanggan yang akan menyambung ke peranti kami dan mengambil bacaan daripadanya.
#include <tango.h>
using namespace Tango;
int main(int argc, char **argv) {
try {
//
// create a connection to a TANGO device
//
DeviceProxy *device = new DeviceProxy("NEO6M/neo6m/1");
//
// Ping the device
//
device->ping();
//
// Execute a command on the device and extract the reply as a string
//
vector<Tango::DevUChar> gps_array;
DeviceData cmd_reply;
cmd_reply = device->command_inout("GPSArray");
cmd_reply >> gps_array;
for (int i = 0; i < gps_array.size(); i++) {
printf("%c", gps_array[i]);
}
puts("");
//
// Read a device attribute (string data type)
//
string spr;
DeviceAttribute att_reply;
att_reply = device->read_attribute("gps_string");
att_reply >> spr;
cout << spr << endl;
vector<Tango::DevUChar> spr2;
DeviceAttribute att_reply2;
att_reply2 = device->read_attribute("gps_array");
att_reply2.extract_read(spr2);
for (int i = 0; i < spr2.size(); i++) {
printf("%c", spr2[i]);
}
puts("");
} catch (DevFailed &e) {
Except::print_exception(e);
exit(-1);
}
}