
Kas ir ?
TÄ ir dažÄdas aparatÅ«ras un programmatÅ«ras pÄrvaldÄ«bas sistÄma.
TANGO ŠæŠ¾Š“Š“ŠµŃŠ¶ŠøŠ²Š°ŠµŃ 4 плаŃŃŠ¾ŃŠ¼Ń Š½Š° Š“Š°Š½Š½ŃŠ¹ моменŃ: Linux, Windows NT, Solaris Šø HP-UX.
ŠŠ“еŃŃ Š±ŃŠ“ŠµŃ Š¾ŠæŠøŃŠ°Š½Š° ŃŠ°Š±Š¾Ńа Ń Linux(Ubuntu 18.04)
Kam tas paredzÄts?
VienkÄrÅ”o darbu ar dažÄdÄm iekÄrtÄm un programmatÅ«ru.
- Jums nav jÄdomÄ, kÄ uzglabÄt datus datu bÄzÄ, tas jau ir izdarÄ«ts jÅ«su vietÄ.
- Ir tikai jÄapraksta aptaujas sensoru mehÄnisms.
- Samazina visu jūsu kodu līdz vienam standartam.
Kur to iegūt?
Es nevarÄju to palaist no pirmkoda; lai strÄdÄtu, es izmantoju gatavu TangoBox 9.3 attÄlu.
InstrukcijÄs ir aprakstÄ«ts, kÄ instalÄt no pakotnÄm.
No kÄ tas sastÄv?
- DŽĪVS ā izmanto, lai skatÄ«tu un rediÄ£Ätu TANGO datubÄzi.
- POGO ā kodu Ä£enerators TANGO ierÄ«Äu serveriem.
- Astor ā programmas TANGO sistÄmas vadÄ«tÄjs.
MÅ«s interesÄs tikai pirmie divi komponenti.
AtbalstÄ«tÄs programmÄÅ”anas valodas
- C
- C + +
- Java
- JavaScript
- Pitons
- Matlab
- LabVIEW
Es strÄdÄju ar to python un c++. Å eit kÄ piemÄrs tiks izmantots C++.
Tagad pÄriesim pie apraksta, kÄ savienot ierÄ«ci ar TANGO un kÄ ar to strÄdÄt. Maksa tiks Åemta par piemÄru GPS neo-6m-0-001:

KÄ redzat attÄlÄ, mÄs savienojam plati ar datoru, izmantojot UART CP2102. Kad ierÄ«ce ir pievienota datoram, tiek parÄdÄ«ta ierÄ«ce /dev/ttyUSB[0-N], parasti /dev/ttyUSB0.
POGO
Tagad sÄksim pogo, un Ä£enerÄt skeleta kodu darbam ar mÅ«su dÄli.
pogo
Es jau izveidoju kodu, izveidosim to vÄlreiz Fails-> Jauns.

MÄs iegÅ«stam sekojoÅ”o:

MÅ«su ierÄ«ce (turpmÄk ar ierÄ«ci mÄs domÄsim programmatÅ«ras daļu) ir tukÅ”a, un tai ir divas vadÄ«bas komandas: Valsts & Status.
Tam jÄbÅ«t aizpildÄ«tam ar nepiecieÅ”amajiem atribÅ«tiem:
IerÄ«ces Ä«paÅ”ums ā noklusÄjuma vÄrtÄ«bas, kuras mÄs pÄrsÅ«tÄm uz ierÄ«ci, lai to inicializÄtu; GPS platei ir jÄpÄrsÅ«ta plates nosaukums sistÄmÄ com="/dev/ttyUSB0" un komunikÄciju porta Ätrumu baudrade=9600
komandas ā komandas, lai kontrolÄtu mÅ«su ierÄ«ci; tÄm var tikt doti argumenti un atgrieÅ”anas vÄrtÄ«ba.
- VALSTS - atgriež paÅ”reizÄjo stÄvokli, no Valstis
- STATUS - atgriež paÅ”reizÄjo statusu, tas ir virknes papildinÄjums VALSTS
- GPSArray - atgriežas GPS virkne formÄ DevVarCharArray
PÄc tam iestatiet ierÄ«ces atribÅ«tus, kurus var nolasÄ«t/rakstÄ«t uz/no tÄs.
SkalÄrie atribÅ«ti ā vienkÄrÅ”i atribÅ«ti (char, string, long uc)
Spektra atribūti - viendimensijas masīvi
AttÄla atribÅ«ti - divdimensiju masÄ«vi
Valstis ā stÄvoklis, kurÄ atrodas mÅ«su ierÄ«ce.
- OPEN ā ierÄ«ce ir atvÄrta.
- AIZVÄRT - ierÄ«ce ir aizvÄrta.
- KĻŪDA - kļūda.
- ON ā saÅemt datus no ierÄ«ces.
- OFF ā nav datu no ierÄ«ces.
AtribÅ«ta pievienoÅ”anas piemÄrs gps_string:

BalsoÅ”anas periods laiks ms, cik bieži gps_string vÄrtÄ«ba tiks atjauninÄta. Ja atjauninÄÅ”anas laiks nav norÄdÄ«ts, atribÅ«ts tiks atjauninÄts tikai pÄc pieprasÄ«juma.
Notika:

Tagad jums ir jÄÄ£enerÄ kods Fails-> Ä¢enerÄt

PÄc noklusÄjuma Makefile netiek Ä£enerÄts; pirmo reizi ir jÄatzÄ«mÄ izvÄles rÅ«tiÅa, lai to izveidotu. Tas tiek darÄ«ts, lai tajÄ veiktÄs izmaiÅas netiktu dzÄstas jaunas paaudzes laikÄ. Vienreiz izveidojot to un konfigurÄjot savam projektam (reÄ£istrÄjiet kompilÄcijas atslÄgas, papildu failus), varat par to aizmirst.
Tagad pÄriesim pie programmÄÅ”anas. pogo with mums Ä£enerÄja Å”Ädu informÄciju:

MÅ«s interesÄs NEO6M.cpp un NEO6M.h. Å emsim klases konstruktora piemÄru:
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
}Kas tur ir un kas Å”eit ir svarÄ«gs? Funkcija init_device() pieŔķir atmiÅu mÅ«su atribÅ«tiem: gps_string & gps_masÄ«vs, bet tas nav svarÄ«gi. VissvarÄ«gÄkais Å”eit, Å”ie ir komentÄri:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1Viss, kas atrodas Å”ajÄ komentÄru blokÄ, turpmÄkÄs koda atjaunoÅ”anas laikÄ netiks iekļauts pogo virzies prom!. Viss, kas nav blokos, bÅ«s! Å Ä«s ir vietas, kur mÄs varam programmÄt un veikt savus labojumus.
KÄdas ir galvenÄs klases funkcijas? 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);Kad mÄs vÄlamies nolasÄ«t atribÅ«ta vÄrtÄ«bu gps_string, funkcijas tiks izsauktas Å”ÄdÄ secÄ«bÄ: vienmÄr_izpildÄ«ts_ÄÄ·is, read_attr_hardware Šø lasÄ«t_gps_string. Read_gps_string aizpildÄ«s gps_string ar vÄrtÄ«bu.
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 -----*/
// Set the attribute value
*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
}KompilÄcija
Dodieties uz avota mapi un:
makeProgramma tiks apkopota mapÄ ~/DeviceServers.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6MDŽĪVS
jive
Dažas ierÄ«ces jau ir datu bÄzÄ, tagad izveidosim mÅ«su RediÄ£Ät->Izveidot serveri

Tagad mÄÄ£inÄsim izveidot savienojumu ar to:

Nekas nedarbosies, vispirms mums jÄpalaiž mÅ«su programma:
sudo ./NEO6M neo6m -v2PieslÄgties com portam varu tikai ar tiesÄ«bÄm sakne-A. v ā mežizstrÄdes lÄ«menis.
Tagad mÄs varam izveidot savienojumu:

Klients
GrafikÄ attÄlu skatīŔanÄs noteikti ir laba, bet jums ir nepiecieÅ”ams kaut kas noderÄ«gÄks. UzrakstÄ«sim klientu, kas izveidos savienojumu ar mÅ«su ierÄ«ci un Åems no tÄs rÄdÄ«jumus.
#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);
}
}KÄ sastÄdÄ«t:
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++RezultÄts:
tango-cs@tangobox:~/workspace/c$ ./a.out
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53MÄs saÅÄmÄm rezultÄtu kÄ komandas atgrieÅ”anos, Åemot vÄrÄ virknes un rakstzÄ«mju masÄ«va atribÅ«tus.
atsauces
Rakstu rakstÄ«ju sev, jo pÄc kÄda laika sÄku aizmirst, kÄ un ko darÄ«t.
Paldies par uzmanību.
Avots: www.habr.com
