
ĂfarĂ« Ă«shtĂ« ?
Kjo është një sistem për menaxhimin e pajisjeve dhe softuerëve të ndryshëm.
TANGO mbështet 4 platforma për momentin: Linux, Windows NT, Solaris dhe HP-UX.
Këtu do të përshkruhet funksionimi me Linux (Ubuntu 18.04)
Për çfarë nevojitet?
E thjeshtëson punën me pajisje dhe softuerë të ndryshëm.
- Nuk keni nevojë të mendoni se si të ruani të dhënat në DB, kjo është bërë për ju.
- Duhet vetëm të përshkruani mekanizmin e pyetjes së sensorëve.
- E redukton të gjithë kodin tuaj në një standard të vetëm.
Ku të merrni?
Nuk arrita ta nis nga burimet, përdorova imazhin e gatshëm TangoBox 9.3.
Udhëzimi përshkruan se si të instaloni nga paketat.
Nga çfarë përbëhet?
- JIVE â shĂ«rben pĂ«r tĂ« parĂ« dhe redaktuar bazĂ«n e tĂ« dhĂ«nave TANGO.
- POGO â gjenerator kodi pĂ«r serverĂ«t e pajisjeve TANGO.
- Astor â menaxhuesi i softuerit pĂ«r sistemin TANGO.
Ne do të interesohemi vetëm për dy komponentët e parë.
Gjuhët e programimit të mbështetura
- C
- C++
- Java
- JavaScript
- Python
- Matlab
- LabVIEW
Kam punuar me të në python & c++. Këtu si një shembull do të përdoret c++.
Tani do të kalojmë në përshkrimin se si të lidheni me pajisjen TANGO dhe si të punoni me të. Si shembull do të marrë një pllakë GPS neo-6m-0-001:

Siç duket në foto, pllakën e lidhim me PC përmes UART CP2102. Kur lidhet me PC, shfaqet pajisja /dev/ttyUSB[0-N], zakonisht /dev/ttyUSB0.
POGO
Tani do të fillojmë pogo, dhe do të gjenerojmë kodin skelet për të punuar me pllakat tonë.
pogo
Unë tashmë kam krijuar kodin, le ta krijojmë përsëri File->New.

Marrim këtë:

Pajisja jonë (për pajisjen më vonë do të kuptohet pjesa software) është e zbrazët dhe ka dy komanda kontrolli: State & Statusi.
Duhet ta mbushim atë me atributet e nevojshme:
Device Property â vlerat standarde qĂ« i dĂ«rgojmĂ« pajisjes pĂ«r inicializim, pĂ«r pllakat GPS duhet tĂ« dĂ«rgojmĂ« emrin e pllakat nĂ« sistem com="/dev/ttyUSB0" dhe shpejtĂ«sinĂ« e portit com baudrate=9600
Commands â komandat e kontrollit pĂ«r pajisjen tonĂ«, atyre mund t'u caktojmĂ« argumente dhe vlera tĂ« kthyera.
- STATE â kthen gjendjen aktuale, nga States
- STATUS â kthen statusin aktual, ky Ă«shtĂ« njĂ« shtesĂ« string pĂ«r STATE
- GPSArray â kthen gps njĂ« string nĂ« formatin DevVarCharArray
Më tej caktosen atributet e pajisjes që mund të lexohen/shkruhen në/nga të.
Scalar Attributes â atribute tĂ« thjeshta (char, string, long etj.)
Atributet Spectrum â array tĂ« njĂ«dimensionale
Atributet e Imazhit â array tĂ« dydimensionale
States â gjendjet nĂ« tĂ« cilat ndodhet pajisja jonĂ«.
- HAPUR â pajisja Ă«shtĂ« e hapur.
- Mbyll â pajisja Ă«shtĂ« e mbyllur.
- DĂSHTIM â gabim.
- ON â po marrim tĂ« dhĂ«na nga pajisja.
- OFF â nuk ka tĂ« dhĂ«na nga pajisja.
Shembuj i shtimit të atributit gps_string:

Periudha e anketimit kohë në ms, sa shpesh do të përditësohet vlera gps_string. Nëse koha e përditësimit nuk caktohet, atëherë atributi do të përditësohet vetëm me kërkesë.
Arritëm:

Tani duhet të gjenerojmë kodin File->Generate

Me default, Makefile nuk gjenerohet, herën e parë duhet të vendosni shenjën që ta krijoni. Kjo është bërë që ndryshimet e bëra në të mos fshihen gjatë gjenerimeve të reja. Duke e krijuar atë njëherë dhe duke e konfiguroni për projektin tuaj (shkruani çelësat e kompilimit, skedarët shtesë) mund ta nisni pa u shqetësuar më për të.
Tani kalojmë drejtpërdrejt në programim. pogo na ka gjeneruar këtë:

Na interesojnë NEO6M.cpp & NEO6M.h. Le ta shqyrtojmë për shembull konstruktorin e klasës:
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
}ĂfarĂ« ka kĂ«tu dhe cila Ă«shtĂ« rĂ«ndĂ«sishmja? NĂ« funksionin init_device() ndodh alokimi i memories pĂ«r atributet tona: gps_string & gps_array, por kjo nuk ka rĂ«ndĂ«si. RĂ«ndĂ«sishmja kĂ«tu, janĂ« komentet:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1Gjithçka që gjendet brenda këtij bloku komenti gjatë gjenerimeve të mëvonshme të kodit në pogo nuk do të fshihet!. Gjithçka që është në blloqe do! Këto janë ato vende ku mund të programojmë dhe të bëjmë ndryshimet tona.
Tani, cilat funksione kryesore përmban klasi 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);Kur ne të duam të lexojmë vlerën e atributit gps_string, do të thirren funksionet në këtë rend: always_executed_hook, read_attr_hardware dhe read_gps_string. Në read_gps_string do të plotësohet gps_string me vlerën.
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
}Kompilimi
Hyrë në dosjen me burimet dhe:
makeProgrami do të kompilohet në dosjen ~/DeviceServers.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6MJIVE
jive
Në DB tashmë ka disa pajisje, tani do të krijojmë tonën Edit->Krijo Server

Tani do të përpiqemi të lidhemi me të:

Nuk do të funksionojë, së pari duhet të nisni programin tonë:
sudo ./NEO6M neo6m -v2TĂ« lidhem me portin com mundem vetĂ«m me tĂ« drejtat root-a. v â niveli i ndihmĂ«s.
Tani mundemi të lidhemi:

Klienti
Në grafik është e mirë të shohim pamjet, por duhet diçka më të dobishme. Do të shkruajmë një klient që do të lidhet me pajisjen tonë dhe do të marrë të dhënat.
#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);
}
}Si të kompilohet:
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++Rezultati:
tango-cs@tangobox:~/workspace/c$ ./a.out
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53Mori rezultat si kthim të komandës, marrja e atributeve të vargut dhe masës së karaktereve.
Linke
Artikulli është shkruar për vete, sepse pas një kohe filloj të harroj si dhe çfarë duhet bërë.
Faleminderit për vëmendjen.
Burimi: habr.com
