
Što je ?
To je sustav za upravljanje raznim uređajima i softverom.
TANGO trenutno podržava 4 platforme: Linux, Windows NT, Solaris i HP-UX.
Ovdje će biti opisano kako raditi s Linuxom (Ubuntu 18.04)
Zašto je potrebno?
Olakšava rad s raznim uređajima i softverom.
- Nije potrebno razmišljati o tome kako pohraniti podatke u bazi podataka, to je već učinjeno za vas.
- Samo je potrebno opisati mehanizam ispitivanja senzora.
- Svodi sav vaš kod na jedan standard.
Gdje pronaći?
Nisam je mogao pokrenuti iz izvora, za rad sam koristio gotovu sliku TangoBox 9.3.
U uputstvu je opisano kako instalirati iz paketa.
Od čega se sastoji?
- JIVE — služi za pregled i uređivanje baze podataka TANGO.
- POGO — generator koda za TANGO uređaje.
- Astor — softverski upravitelj za sustav TANGO.
Interesirat će nas samo prva dva komponente.
Podržani programski jezici
- C
- C++
- Java
- JavaScript
- Python
- Matlab
- LabVIEW
Radio sam s njom na pythonu i c++. Ovdje će se kao primjer koristiti c++.
Sada ćemo preći na opis kako povezati uređaj s TANGO i kako s njim raditi. Kao primjer uzet ćemo ploču GPS neo-6m-0-001:

Kao što se vidi na slici, ploču povezujemo s računalom putem UART CP2102. Pri povezivanju s računalom pojavljuje se uređaj /dev/ttyUSB[0-N], obično /dev/ttyUSB0.
POGO
Sada pokrenimo pogo, i generiramo kostur koda za rad s našom pločom.
pogo
Već sam imao kreiran kod, stvorit ćemo ga iznova. Datoteka->Nova.

Dobivamo sljedeće:

Naš uređaj (pod uređajem će se ubuduće smatrati softverski dio) je prazan i ima dvije naredbe za upravljanje: Stanje & Status.
Moraju se popuniti potrebnim atributima:
Atribut uređaja — zadane vrijednosti koje šaljemo uređaju za njegovu inicijalizaciju, za GPS ploču treba proslijediti naziv ploče u sustavu com="/dev/ttyUSB0" i brzinu com porta baudrate=9600
Naredbe — naredbe za upravljanje našim uređajem, mogu se dodati argumenti i vraćene vrijednosti.
- STANJE — vraća trenutno stanje, iz Stanja
- STATUS — vraća trenutni status, ovo je niz koji se dodaje STANJE
- GPSArray — vraća gps niz u obliku DevVarCharArray
Nakon toga definiraju se atributi uređaja koje je moguće čitati/pisati u/iz njega.
Skalarni atributi — jednostavni atributi (char, string, long itd.)
Spektralni atributi — jednodimenzionalne nizove
Svojstva slike — dvodimenzionalne nizove
Stanja — stanja u kojem se naš uređaj nalazi.
- OTVORENO — uređaj je otvoren.
- ZATVORENO — uređaj je zatvoren.
- FAILT — greška.
- ON — primamo podatke s uređaja.
- OFF — nema podataka s uređaja.
Primjer dodavanja atributa gps_string:

Period ispitivanja vrijeme u ms, koliko često će se ažurirati vrijednost gps_string. Ako se vrijeme ažuriranja ne postavi, atribut će se ažurirati samo na zahtjev.
Ispalo je:

Sada je potrebno generirati kod File->Generate

Zadano, Makefile se ne generira, prilikom prvog puta potrebno je staviti kvačicu da bi ga stvorili. Ovo je učinjeno kako bi unosi u njemu ostali netaknuti prilikom nove generacije. Kada ga jednom stvorite i prilagodite svom projektu (napisati kompajlerske ključeve, dodatne datoteke) možete zaboraviti na njega.
Sada prelazimo na samo programiranje. pogo nam je generirao sljedeće:

Zanimat će nas NEO6M.cpp & NEO6M.h. Razmotrit ćemo za primjer konstruktor klase:
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
}Što ovdje ima i što je ovdje važno? U funkciji init_device() odvija se alokacija memorije za naše atribute: gps_string & gps_array, ali to nije bitno. Najvažnije ovdje, su komentari:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1Sve što se nalazi unutar ovog komentarskog bloka prilikom sljedećih regeneracija koda u pogo neće biti izbrisano!. Sve što nije u blokovima hoće! To su mjesta gdje možemo programirati i unositi svoje izmjene.
Sada, koje glavne funkcije sadrži klasa 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);Kada želimo pročitati vrijednost atributa gps_string, bit će pozvane funkcije u sljedećem redoslijedu: always_executed_hook, read_attr_hardware i read_gps_string. U read_gps_string će se popuniti gps_string vrijednošću.
void NEO6M::read_gps_string(Tango::Attribute &attr)
{
DEBUG_STREAM << "NEO6M::read_gps_string(Tango::Attribute &attr) ulazi... " <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
}Komplikacija
Ulazimo u mapu s izvorima i:
makeProgram će se kompajlirati u mapu ~/DeviceServers.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6MJIVE
jive
U Bazi podataka već postoje neki uređaji, sada ćemo stvoriti naš Edit->Create Server

Sada ćemo pokušati spojiti s njom:

Ništa neće uspjeti, prvo moramo pokrenuti naš program:
sudo ./NEO6M neo6m -v2Možemo se povezati s com portom samo s pravima root-a. v — razina logiranja.
Sada se možemo povezati:

Klijent
Gledati slike u grafu je naravno dobro, ali treba nam nešto korisnije. Napisat ćemo klijenta koji će se povezivati s našim uređajem i uzimati njegove podatke.
#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 kompilirati:
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*53Dobiveni rezultat u obliku povratne komande, uzimanje atributa niza i niza znakova.
Linkovi
Članak sam pisao za sebe, jer nakon nekog vremena počinjem zaboravljati kako i što raditi.
Hvala na pažnji.
Izvor: habr.com
