
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
