
Co to je ?
Je to systém pro řízení různých zařízení a softwaru.
TANGO v současnosti podporuje 4 platformy: Linux, Windows NT, Solaris a HP-UX.
Zde bude popsána práce s Linuxem (Ubuntu 18.04)
K čemu to je?
Usnadňuje práci s různým zařízením a softwarem.
- Nemusíte přemýšlet o tom, jak uchovávat data v DB, to už je uděláno za vás.
- Je třeba pouze popsat mechanismus dotazování senzorů.
- Sjednocuje váš kód do jednoho standardu.
Kde to získat?
Z předpřipravených zdrojů jsem ho nedokázal spustit, pro práci jsem použil hotový obraz TangoBox 9.3.
V příručce je popsáno, jak instalovat z balíčků.
Z čeho se skládá?
- JIVE — slouží k prohlížení a úpravy databáze TANGO.
- POGO — generátor kódu pro zařízení TANGO.
- Astor — programový manažer pro systém TANGO.
Budeme se zajímat pouze o první dva komponenty.
Podporované programovací jazyky
- C
- C++
- Javy
- JavaScript
- CouchDB
- Matlab
- LabVIEW
Pracoval jsem s ním na pythonu a c++. Zde bude jako příklad použit c++.
Nyní přejdeme k popisu, jak připojit zařízení k TANGO a jak s ním pracovat. Jako příklad bude použita deska GPS neo-6m-0-001:

Jak je vidět na obrázku, desku připojujeme k PC přes UART CP2102. Při připojení k PC se objeví zařízení /dev/ttyUSB[0-N], obvykle /dev/ttyUSB0.
POGO
Nyní spustíme pogo, a vygenerujeme kostru kódu pro práci s naši deskou.
pogo
Měl jsem již vytvořený kód, vytvoříme ho znovu Soubor->Nový.

Dostaneme následující:

Naše zařízení (pod zařízením se dále rozumí softwarová část) je prázdné a má dvě ovládací příkazy: Stav && Status.
Je třeba jej vyplnit potřebnými atributy:
Vlastnost zařízení — výchozí hodnoty, které předáváme zařízení pro jeho inicializaci, pro desku GPS je třeba předat název desky v systému com="/dev/ttyUSB0" a rychlost com portu baudrade=9600
Příkazy — příkazy pro ovládání našeho zařízení, lze jim zadat argumenty a návratovou hodnotu.
- STAV — vrací aktuální stav, z Stavy
- STATUS — vrací aktuální status, to je řetězec přídavek k STAV
- GPSArray — vrací gps řetězec ve formě DevVarCharArray
Dále se zadávají atributy zařízení, které lze číst/pisovat do/z něj.
Skalární atributy — jednoduché atributy (char, string, long atd.)
Spektrum atributy — jednorozměrné pole
Obrázková atributy — dvourozměrné pole
Stavy — stav, ve kterém se nachází naše zařízení.
- OTEVŘENO — zařízení je otevřeno.
- ZAVŘENO — zařízení je uzavřeno.
- CHYBA — chyba.
- NA — přijímáme data ze zařízení.
- VYPNUTO — nejsou žádná data ze zařízení.
Příklad přidání atributu gps_string:

Perioda dotazování čas v ms, jak často se bude hodnota gps_string aktualizovat. Pokud se nezadá aktualizační doba, atribut se bude aktualizovat pouze na požadavek.
Podařilo se:

Nyní je potřeba vygenerovat kód Soubor->Generovat

Ve výchozím nastavení se Makefile nevytváří, poprvé je potřeba zaškrtnout, aby se vytvořil. To je provedeno, aby se provedené úpravy v něm neztratily při novém generování. Jakmile ho vytvoříte jednou a nastavíte podle svého projektu (zapsat kompilátorové klíče, další soubory), můžete na něj zapomenout.
Nyní se dostáváme přímo k programování. pogo nám vygeneroval následující:

Zajímat nás budou NEO6M.cpp & NEO6M.h. Podívejme se na příklad konstruktoru třídy:
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
}Co zde je a co je zde důležité? V funkci init_device() dochází k alokaci paměti pro naše atributy: gps_string && gps_array, ale to není důležité. Nejdůležitější je zde, to jsou komentáře:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1Vše, co se nachází uvnitř tohoto komentářového bloku, nebude při dalších regeneracích kódu v pogo odstraněno!. Vše, co je mimo bloky, bude! To jsou místa, kde můžeme programovat a provádět své změny.
Nyní, jaké hlavní funkce obsahuje třída 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);Když budeme chtít přečíst hodnotu atributu gps_string, budou zavolány funkce v následujícím pořadí: always_executed_hook, read_attr_hardware a read_gps_string. V read_gps_string dojde k naplnění gps_string hodnotou.
void NEO6M::read_gps_string(Tango::Attribute &attr)
{
DEBUG_STREAM << "NEO6M::read_gps_string(Tango::Attribute &attr) entering... " <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
}Kompilace
Vstupujeme do složky se zdrojovými kódy a:
makeProgram se zkompiluje do složky ~/DeviceServers.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6MJIVE
jive
V DB už jsou nějaká zařízení, nyní vytvoříme naše Úpravy->Vytvořit server

Nyní se pokusíme připojit k němu:

Nic nevydrží, nejprve musíme spustit naši aplikaci:
sudo ./NEO6M neo6m -v2K portu com se mohu připojit pouze s právy root-a. v — úroveň protokolování.
Teď se můžeme připojit:

Zákazník
Dívat se na obrázky na grafu je sice pěkné, ale potřebujeme něco užitečnějšího. Napíšeme klienta, který se připojí k našemu zařízení a získá z něj data.
#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);
}
}Jak kompilovat:
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++Result:
tango-cs@tangobox:~/workspace/c$ ./a.out
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53Obdrželi jsme výsledek jako návratový kód příkazu a získání atributů řetězce a pole znaků.
Odkazy
Článek jsem psal pro sebe, protože po nějaké době začínám zapomínat, jak a co dělat.
Děkuji za pozornost.
Zdroj: habr.com
