
Čo je to ?
Je to systém na správu rôzneho hardvéru a softvéru.
TANGO aktuálne podporuje 4 platformy: Linux, Windows NT, Solaris a HP-UX.
Tu bude popísaná práca s Linuxom (Ubuntu 18.04)
Na čo je potrebný?
Uľahčuje prácu s rôznym hardvérom a softvérom.
- Nemusíte sa zaoberať tým, ako uchovávať dáta v DB, to už za vás bolo urobené.
- Treba len opísať mechanizmus dotazovania senzorov.
- Zjednocuje celý váš kód do jedného štandardu.
Kde získať?
Z pôvodných súborov som to nedokázal spustiť, pre prácu som použil hotový obraz TangoBox 9.3.
V návode je popísané, ako nainštalovať z balíkov.
Z čoho sa skladá?
- JIVE — slúži na prezeranie a editovanie databázy TANGO.
- POGO — generátor kódu pre zariadenia TANGO.
- Astor — softvérový manažér pre systém TANGO.
Zaujímať nás budú iba prvé dva komponenty.
Podporované programovacie jazyky
- C
- C++
- Java
- JavaScript
- Python
- Matlab
- LabVIEW
Pracoval som s ním na python & c++. Tu v príklade sa bude používať c++.
Teraz prejdeme k popisu, ako pripojiť zariadenie k TANGO a ako s ním pracovať. Ako príklad vezmeme dosku GPS neo-6m-0-001:

Ako je vidieť na obrázku, dosku pripájame k PC cez UART CP2102. Po pripojení k PC sa objaví zariadenie /dev/ttyUSB[0-N], zvyčajne /dev/ttyUSB0.
POGO
Teraz spustíme pogo, a vygenerujeme kostru kódu pre našu dosku.
pogo
Už som mal vytvorený kód, vytvoríme ho nanovo File->New.

Získavame nasledovné:

Naše zariadenie (pod zariadením sa neskôr myslí softvérová časť) je prázdne a má dve ovládacie príkazy: State & Stav.
Je potrebné ho vyplniť potrebnými atribútmi:
Device Property — hodnoty predvolené, ktoré posielame do zariadenia na jeho inicializáciu, pre dosku GPS je potrebné poslať názov dosky v systéme com="/dev/ttyUSB0" a rýchlosť com portu baudrade=9600
Commands — príkazy na ovládanie nášho zariadenia, ktorým môžeme zadávať argumenty a návratovú hodnotu.
- STATE — vracia aktuálny stav, z States
- STATUS — vracia aktuálny status, je to reťazec doplnenia k STATE
- GPSArray — vracia gps reťazec vo forme DevVarCharArray
Ďalej sa zadávajú atribúty zariadenia, ktoré je možné čítať/písať do/z neho.
Scalar Attributes — základné atribúty (char, string, long a pod.)
Spectrum Attributes — jednorozmerné polia
Image Attributes — dvojrozmerné polia
States — stavy, v ktorých sa naše zariadenie nachádza.
- OPEN — zariadenie je otvorené.
- CLOSE — zariadenie je zatvorené.
- FAILT — chyba.
- ÁNO — prijímame údaje z urządzenia.
- VYPNUTÉ — nie sú údaje z urządzenia.
Príklad pridania atribútu gps_string:

Obdobie dotazovania čas v ms, ako často sa bude aktualizovať hodnota gps_string. Ak nie je zadaný čas aktualizácie, attribút sa aktualizuje len na požiadanie.
Podarilo sa:

Teraz potrebujeme vygenerovať kód Súbor->Generovať

Podľa predpokladu sa Makefile nevytvára, po prvýkrát je potrebné zaškrtnúť políčko, aby sa vytvoril. Urobilo sa to preto, aby sa zmeny, ktoré do neho zasahujete, neodstránili pri novej generácii. Akonáhle ho vytvoríte raz a nastavíte ho pre svoj projekt (zaznačenie kompilátorských kľúčov, dodatkových súborov), môžete na neho zabudnúť.
Teraz prejdeme priamo k programovaniu. pogo nám vygeneroval nasledovné:

Zaujímajú nás NEO6M.cpp & NEO6M.h. Pozrime sa na príklad konštruktora triedy:
NEO6M::NEO6M(Tango::DeviceClass *cl, string &s)
: TANGO_BASE_CLASS(cl, s.c_str())
{
/*----- CHRÁNENÁ REGIÓN ID(NEO6M::constructor_1) POVOLENÁ ZAČIATOK -----*/
init_device();
/*----- CHRÁNENÁ REGIÓN KONIEC -----*/ // NEO6M::constructor_1
}Čo tu je a čo je tu dôležité? Vo funkcii init_device() dochádza k alokácii pamäte pre naše atribúty: gps_string & gps_array, ale to nie je dôležité. Najdôležitejšie je tu, to sú komentáre:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1Všetko, čo sa nachádza v tomto bloku komentárov, sa pri následných re-ženériách kódu v pogo neodstráni! Za to všetko, čo nie je v blokoch, sa odstráni! To sú miesta, kde môžeme programovať a robiť svoje úpravy.Teraz, aké hlavné funkcie obsahuje trieda
NEO6M void always_executed_hook(); void read_attr_hardware(vector<long> &attr_list); void read_gps_string(Tango::Attribute &attr); void read_gps_array(Tango::Attribute &attr);:
Keď sa pokúsime prečítať hodnotu atribútu, budú sa volať funkcie v nasledujúcom poradí: gps_stringalways_executed_hook read_attr_hardware, read_gps_string a . V read_gps_string sa naplní gps_string hodnotou.void NEO6M::read_gps_string(Tango::Attribute &attr) { DEBUG_STREAM << "NEO6M::read_gps_string(Tango::Attribute &attr) vstup... " << endl; /*----- CHRÁNENÁ REGIÓN ID(NEO6M::read_gps_string) POVOLENÁ ZAČIATOK -----*/ // Nastaviť hodnotu atribútu*this->attr_gps_string_read = Tango::string_dup(this->gps.c_str());attr.set_value(attr_gps_string_read);/*----- CHRÁNENÁ REGIÓN KONIEC -----*/ // NEO6M::read_gps_string }
Vstupujeme do priečinka so zdrojovými kódmi a:Kompilácia
Program sa skompiluje do priečinka ~\/DeviceServers.
maketango-cs@tangobox:~\/DeviceServers$ ls NEO6M
jiveJIVE
V DB už existujú nejaké zariadenia, teraz si vytvoríme naše
Upraviť->Vytvoriť Server Teraz sa pokúsime pripojiť k nemu:

Nič z toho nebude fungovať, najprv musíte spustiť náš program:

sudo .\/NEO6M neo6m -v2
Pripojiť sa k com portu môžem len s právami-a. root-á. v — úroveň logovania.
Teraz sa môžeme pripojiť:

Klienta
Vo grafike je pekné pozerať sa na obrázky, ale potrebujeme niečo užitočnejšie. Napíšeme klienta, ktorý sa pripojí k nášmu zariadeniu a zozbiera z neho údaje.
#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);
}
}Ako kompilovať:
g++ gps.cpp -I/usr/local/include/tango -I/usr/local/include -I/usr/local/include -std=c++0x -Dlinux -L/usr/local/lib -ltango -lomniDynamic4 -lCOS4 -lomniORB4 -lomnithread -llog4tango -lzmq -ldl -lpthread -lstdc++Výsledok:
tango-cs@tangobox:~/workspace/c$ ./a.out
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53Dostali sme výsledok vo forme návratovej hodnoty príkazu, vyzdvihnutia atribútov reťazca a poľa znakov.
Odkazy
Článok som písal pre seba, pretože po čase začínam zabúdať, ako a čo robiť.
Ďakujem za pozornosť.
Zdroj: habr.com
