
Kaj je to ?
To je sistem za upravljanje raznovrstno opremo in programsko opremo.
TANGO trenutno podpira 4 platforme: Linux, Windows NT, Solaris in HP-UX.
Tu bo opisana uporaba z Linuxom (Ubuntu 18.04)
Za kaj je to potrebno?
Poenostavi delo z raznovrstno opremo in programsko opremo.
- Nimate vam treba skrbeti, kako shraniti podatke v BDB, to je že urejeno namesto vas.
- Samo opisati je treba mehanizem za anketiranje senzorjev.
- Zveže vašo kodo v en sam standard.
Kje dobiti?
Iz izvorne kode je nisem mogel zagnati, za delo sem uporabil pripravljen imidž TangoBox 9.3.
V navodilih je opisano, kako namestiti iz paketov.
Iz česa je sestavljena?
- JIVE — služi za ogled in urejanje baze podatkov TANGO.
- POGO — generator kode za naprave TANGO.
- Astor — programski upravljalnik za sistem TANGO.
Zanimala nas bosta le prva dva komponenta.
Podprti programski jeziki
- C
- C++
- Java
- JavaScript
- Python
- Matlab
- LabVIEW
Delal sem z njim v Pythonu in C++. V tem primeru se bo uporabljal C++.
Zdaj bomo prešli na opis, kako povezati napravo s TANGO in kako z njo delati. Kot primer bomo vzeli ploščo GPS neo-6m-0-001:

Kot je razvidno na sliki, povezujemo ploščo s PC-jem preko UART CP2102. Ko priključimo na PC, se prikaže naprava /dev/ttyUSB[0-N], običajno /dev/ttyUSB0.
POGO
Zdaj zaženimo pogo, in generiramo okostje kode za delovanje z našo ploščo.
pogo
Že imam ustvarjeno kodo, ponovno jo bomo ustvarili File->New.

Pridobimo naslednje:

Naša naprava (pod napravo se bo kasneje mislilo programski del) je prazna in ima dve ukazi za upravljanje: State & Status.
Potrebno jo je napolniti z ustreznimi atributi:
Device Property — privzete vrednosti, ki jih predamo napravi za njeno inicializacijo, za GPS ploščo je potrebno predati ime plošče v sistemu com="/dev/ttyUSB0" in hitrost COM vrat baudrate=9600
Commands — ukazi za upravljanje z našo napravo, jim lahko določimo argumente in vrnjene vrednosti.
- STATE — vrne trenutni status, iz States
- STATUS — vrne trenutni status, to je niz dodatek k STATE
- GPSArray — vrne gps niz v obliki DevVarCharArray
Nato so določeni atributi naprave, ki jih je mogoče brati/pisati vanjo.
Scalar Attributes — preprosti atributi (char, string, long itd.)
Spectrum Attributes — enodimenzionalne tabele
Image Attributes — dvodimenzionalne tabele
States — stanje, v katerem se nahaja naša naprava.
- OPEN — naprava je odprta.
- ZAPRI — naprava je zaprta.
- FAILT — napaka.
- VKLJUČENO — prejemamo podatke z naprave.
- IZKLOP — ni podatkov z naprave.
Primer dodajanja atributa gps_string:

Obdobje iskanja čas v ms, kako pogosto se bo vrednost gps_string posodobila. Če časa osvežitve ne določite, se bo atribut osvežil samo na zahtevo.
Uspešno:

Zdaj je potrebno generirati kodo File->Generate

Privzeto Makefile ni generiran, prvič morate označiti potrditveno polje, da ga ustvarite. To je storjeno, da se spremembe, ki jih vnesete, ne izbrišejo ob novi generaciji. Ko ga enkrat ustvarite in nastavite za svoj projekt (vpisati kompilacijske ključne besede, dodatne datoteke), lahko na to pozabite.
Sedaj preidemo neposredno k programiranju. pogo nam je ustvaril naslednje:

Zanimali nas bodo NEO6M.cpp & NEO6M.h. Oglejmo si na primeru konstruktor razreda:
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
}Kaj je tukaj in kaj je najpomembnejše? V funkciji init_device() se dodeli pomnilnik za naše atribute: gps_string & gps_array, kar pa ni pomembno. Najbolj pomembno tukaj, so komentarji:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1Vse, kar se nahaja znotraj tega bloka komentarjev, ne bo izbrisano pri naslednjih regeneracijah kode v pogo!Vse, kar je v ne-blokih, bo! To so mesta, kjer lahko programiramo in dodamo svoje popravke.
Sedaj katere glavne funkcije vsebuje razred NEO6M:
void always_executed_hook();
void read_attr_hardware(vector &attr_list);
void read_gps_string(Tango::Attribute &attr);
void read_gps_array(Tango::Attribute &attr);Ko bomo želeli prebrati vrednost atributa gps_string, se bodo funkcije klicale v naslednjem vrstnem redu: always_executed_hook, read_attr_hardware in read_gps_string. V read_gps_string se bo gps_string napolnil z vrednostjo.
void NEO6M::read_gps_string(Tango::Attribute &attr)
{
DEBUG_STREAM << "NEO6M::read_gps_string(Tango::Attribute &attr) enter... " <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
}Kompilacija
Pojdite v mapo z izvorno kodo in:
makeProgram se bo prevedel v mapo ~/DeviceServers.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6MJIVE
jive
V BDP so že nekateri naprav, zdaj ustvarimo našo Edit->Create Server

Zdaj poskusimo povezati z njim:

Nič ne bo delovalo, najprej moramo zagnati naš program:
sudo ./NEO6M neo6m -v2Povezati se na com port mogu samo s pravima root-a. v — razina logiranja.
Sada se možemo spojiti:

Korisnik
Gledati slike na grafikonu je naravno dobro, ali trebamo nešto korisnije. Napisat ćemo klijenta koji će se povezati na uređaj i preuzeti očitanja s njega.
#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);
}
}Kako compilirati:
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++Rezultat:
tango-cs@tangobox:~/workspace/c$ ./a.out
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53Dobijeni rezultat kao povratak naredbe, očitavanje atributa niza i niza znakova.
Povezave
Članak sam napisao za sebe, jer nakon nekog vremena počinjem zaboravljati kako i što raditi.
Hvala na pažnji.
Izvor: habr.com
