Çeşitli donanım ve yazılımların yönetilmesine yönelik bir sistemdir.
TANGO şu anda 4 platformu desteklemektedir: Linux, Windows NT, Solaris ve HP-UX.
Burada Linux ile çalışmayı anlatacağız (Ubuntu 18.04)
Nasılsın?
Çeşitli ekipman ve yazılımlarla çalışmayı kolaylaştırır.
Verileri veritabanında nasıl saklayacağınızı düşünmenize gerek yok, bu zaten sizin için yapıldı.
Kaynak kodundan başlatamadım; çalışmak için TangoBox 9.3'ün hazır bir görüntüsünü kullandım.
Talimatlarda paketlerden nasıl kurulum yapılacağı açıklanmaktadır.
Ne içeriyor?
JİV — TANGO veritabanını görüntülemek ve düzenlemek için kullanılır.
POGO — TANGO cihaz sunucuları için kod oluşturucu.
Astor — TANGO sistemi için program yöneticisi.
Sadece ilk iki bileşenle ilgileneceğiz.
Desteklenen programlama dilleri
C
C + +
Java
JavaScript
Python
Matlab
LabVIEW
Bununla python ve c++ ile çalıştım. Burada örnek olarak C++ kullanılacaktır.
Şimdi cihazı TANGO'ya nasıl bağlayacağınızı ve onunla nasıl çalışacağınızı açıklamaya geçelim. Ücret örnek olarak alınacak GPS neo-6m-0-001:
Resimde gördüğünüz gibi kartı UART CP2102 üzerinden PC'ye bağlıyoruz. Bir PC'ye bağlandığında cihaz görünür /dev/ttyUSB[0-N], genellikle /dev/ttyUSB0.
POGO
Şimdi başlayalım pogove panomuzla çalışmak için iskelet kodu oluşturun.
pogo
Kodu zaten oluşturdum, tekrar oluşturalım Dosya->Yeni.
Aşağıdakileri alıyoruz:
Cihazımız (ileride cihaz derken yazılım kısmını kastedeceğiz) boş ve iki kontrol komutu var: Eyalet & Durum.
Gerekli niteliklerle doldurulmalıdır:
Cihaz Özelliği — cihazı başlatmak için cihaza aktardığımız varsayılan değerler; GPS kartı için sistemdeki kartın adını aktarmanız gerekir com = "/dev/ttyUSB0" ve com bağlantı noktası hızı baudrade=9600
Komutları — cihazımızı kontrol etmek için komutlar; bunlara argümanlar ve bir dönüş değeri verilebilir.
BELİRTMEK, BİLDİRMEK - mevcut durumu döndürür Devletler
DURUMU - mevcut durumu döndürür; bu, dizenin tamamlayıcısıdır BELİRTMEK, BİLDİRMEK
GPS Dizisi - İadeler gps formdaki dize DevVarCharArray
Daha sonra, okunabilecek/yazılabilecek cihaz özelliklerini ayarlayın. Skaler Nitelikler — basit nitelikler (karakter, dize, uzun vb.) Spektrum Nitelikleri - tek boyutlu diziler Görüntü Özellikleri - iki boyutlu diziler
Devletler — cihazımızın bulunduğu eyalet.
AÇIK — cihaz açık.
KAPAT - cihaz kapalı.
BAŞARISIZ - hata.
ON — cihazdan veri alın.
KAPALI — cihazdan veri yok.
Özellik ekleme örneği gps_string:
Oylama dönemi ms cinsinden süre, gps_string değerinin ne sıklıkta güncelleneceği. Güncelleme zamanı belirtilmezse özellik yalnızca istek üzerine güncellenecektir.
Çıktı:
Şimdi kodu oluşturmanız gerekiyor Dosya->Oluştur
Varsayılan olarak Makefile oluşturulmaz; ilk kez oluşturmak için kutuyu işaretlemeniz gerekir. Bu, üzerinde yapılan değişikliklerin yeni nesilde silinmemesi için yapılır. Bunu bir kez oluşturduktan ve projeniz için yapılandırdıktan sonra (derleme anahtarlarını, ek dosyaları kaydedin), bunu unutabilirsiniz.
Şimdi programlamaya geçelim. pogo ile bizim için aşağıdakileri oluşturdu:
NEO6M.cpp ve NEO6M.h ile ilgileneceğiz. Bir sınıf yapıcısının örneğini ele alalım:
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
}
Burada ne var ve önemli olan ne? init_device() işlevi niteliklerimiz için bellek ayırır: gps_string & gps_dizisiama önemli değil. Burada en önemli şey, bunlar yorumlar:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1
Bu yorum bloğunun içindeki her şey sonraki kod yeniden oluşturma işlemleri sırasında pogo'ya dahil edilmeyecektir. uzaklaş!. Bloklarda olmayan her şey olacak! Bunlar programlayabileceğimiz ve kendi düzenlemelerimizi yapabileceğimiz yerlerdir.
Şimdi sınıfın içerdiği ana işlevler nelerdir? NEO6M:
Özellik değerini okumak istediğimizde gps_string, işlevler aşağıdaki sırayla çağrılacaktır: her zaman_executed_hook, read_attr_hardware и read_gps_string. Read_gps_string, gps_string'i değerle dolduracaktır.
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
}
Derleme
Kaynak klasöre gidin ve:
make
Program ~/DeviceServers klasörüne derlenecektir.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6M
JİV
jive
Veritabanında zaten bazı cihazlar var, şimdi kendimizinkini oluşturalım Düzenle->Sunucu Oluştur
Şimdi ona bağlanmayı deneyelim:
Hiçbir şey işe yaramayacak, önce programımızı çalıştırmamız gerekiyor:
sudo ./NEO6M neo6m -v2
Com bağlantı noktasına yalnızca haklarla bağlanabiliyorum köks. v — kayıt düzeyi.
Artık bağlanabiliriz:
Müşteri
Grafiklerde resimlere bakmak kesinlikle iyidir, ancak daha kullanışlı bir şeye ihtiyacınız var. Cihazımıza bağlanıp ondan okumalar alacak bir client yazalım.
#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);
}
}