
Mis see on ?
See on süsteem erinevate riistvara ja tarkvara haldamiseks.
TANGO toetab hetkel 4 platvormi: Linux, Windows NT, Solaris ja HP-UX.
Siin kirjeldatakse töö tegemist Linuxiga (Ubuntu 18.04)
Milleks seda on vaja?
Lihtsustab töötamist erineva riistvara ja tarkvaraga.
- Te ei pea muretsema andmete hoidmise üle andmebaasis, see on juba teie eest tehtud.
- Tuleb lihtsalt kirjeldada andurite küsitluse mehhanismi.
- Komponeerib kogu teie koodi üheks standardiks.
Kust seda saada?
Allikatest ei saanud seda käivitada, tööks kasutasin valmis pilti TangoBox 9.3.
Juhendis on kirjeldatud, kuidas installida pakettide kaudu.
Millest see koosneb?
- JIVE — kasutatakse TANGO andmebaasi vaatamiseks ja redigeerimiseks.
- POGO — TANGO seadme serverite koodi generaator.
- Astor — programmesüsteemi TANGO haldur.
Meid huvitavad ainult esimesed kaks komponenti.
Toetatud programmeerimiskeeled
- C
- C++
- Java
- JavaScript
- Python
- Matlab
- LabVIEW
Olen töötanud selle kallal pythonis & c++. Siin kasutatakse näitena c++.
Nüüd räägime, kuidas seadet TANGO-sse ühendada ja kuidas sellega töötada. Näiteks võtame arvesse plaadi GPS neo-6m-0-001:

Nagu pildilt näha, ühendame plaadi arvutiga läbi UART CP2102. Arvutiga ühendamisel ilmub seade /dev/ttyUSB[0-N], tavaliselt /dev/ttyUSB0.
POGO
Nüüd käivitage pogo, ja genereerime skelett-koodi meie plaadiga töötamiseks.
pogo
Mul oli juba kood loodud, loome selle uuesti File->New.

Saame järgneva:

Meie seade (edaspidi mõistame seadme all tarkvaralist osa) on tühi ja sellel on kaks juhtimiskäsku: State & Olek.
See tuleb täita vajalike atribuutidega:
Device Property — väärtused, mida edastame seadmele selle initsialiseerimiseks, GPS-plaadi puhul tuleb edastada plaadi nimi süsteemis com="/dev/ttyUSB0" ja COM-porti kiirus baudrate=9600
Commands — käskude haldamine meie seadme üle, neile saab määrata argumente ja tagastatava väärtuse.
- STATE — tagastab praeguse oleku, States
- OLEK — tagastab praeguse staatuse, see on stringiline täiendav info STATE
- GPSArray — tagastab gps stringina DevVarCharArray
Seejärel määratakse seadme atribuudid, mida saab lugeda/kirjutada sisse/välja.
Scalar Attributes — lihtsad atribuudid (char, string, long jne)
Spectrum atribuudid — ühemõõtmelised massiivid
Pildi atribuudid — kahemõõtmelised massiivid
States — olek, milles meie seade asub.
- AVADA — seade on avatud.
- SUFRE — seade on suletud.
- VIGA — viga.
- KAS — saame seadme andmeid.
- EI — seadme andmeid ei ole.
Atribuudi lisamise näide gps_string:

Polling period aeg ms, kui tihti värskendatakse gps_string väärtust. Kui värskendamise aega ei määrata, siis atribuut värskendatakse ainult päringu korral.
Saime:

Nüüd peame genereerima koodi Fail->Genereeri

Vaikimisi Makefile'i ei genereerita, esmakordsel kasutamisel tuleb märkida, et selle loomine on vajalik. See on tehtud selleks, et sinna tehtud muudatusi ei kustutataks uue genereerimise käigus. Kui olete selle kord juba loonud ja oma projekti jaoks seadistanud (kompilaatori võtmed, lisafailid), võite sellest unustada.
Nüüd liigume otseselt programmeerimise juurde. Pogo genereeris meile järgmist:

Meid huvitavad NEO6M.cpp & NEO6M.h. Võtame näiteks klassi konstruktori:
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
}Mida siin on ja mis on oluline? Funktsioonis init_device() toimub mälu eraldamine meie atribuutide jaoks: gps_string & gps_array, aga see ei ole oluline. Siin on kõige olulisem, see on kommentaarid:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1Kõik, mis asub selle kommentaaribloki sees, ei eemaldata järgmiste koodigeneratsioonide käigus pogo-s ole!... Kõik, mis pole plokkides, jääb! Need on kohad, kus saame programmeerida ja teha oma muutusi.
Nüüd, millised peamised funktsioonid sisaldab klass 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);Kui me soovime lugeda atribuudi väärtust gps_string, kutsutakse funktsioonid järgmises järjekorras: always_executed_hook, read_attr_hardware ja read_gps_string. Funktsioonis read_gps_string täidetakse gps_string väärtusega.
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 -----*/
// Seadista atribuudiväärtus
*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
}Kompileerimine
Siseneme kausta, kus on lähtekoodid ja:
makeProgramm kompileeritakse kausta ~/DeviceServers.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6MJIVE
jive
Andmebaasis on juba mõned seadmed, loome nüüd oma Muuda->Loo server

Nüüd proovime sellele ühenduda:

Ei õnnestu, esmalt peame käivitama meie programmi:
sudo ./NEO6M neo6m -v2COM-porti ühendamine on võimalik ainult õigustega root-a. v — logimise tase.
Nüüd saame ühenduda:

Klient
Graafikul piltide vaatamine on hea, kuid vajame midagi kasulikumat. Kirjutame kliendi, mis ühendub meie seadmega ja võtab sealt näidud.
#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);
}
}Kuidas kompileerida:
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++Tulemus:
tango-cs@tangobox:~/workspace/c$ ./a.out
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53Saime tulemuse käsu tagastusena, atribuutide stringi ja massiivide võtmisena.
Lingid
Kirjutasin artikli endale, kuna mõne aja pärast hakkan unustama, kuidas ja mida teha.
Aitäh tähelepanu eest.
Allikas: habr.com
