Hainbat hardware eta software kudeatzeko sistema bat da.
Gaur egun TANGOk 4 plataforma onartzen ditu: Linux, Windows NT, Solaris eta HP-UX.
Hemen Linux-ekin lan egitea deskribatuko dugu (Ubuntu 18.04)
Zertarako da?
Hainbat ekipamendu eta softwarerekin lana errazten du.
Ez duzu datu-basean datuak nola gorde pentsatu behar, dagoeneko eginda dago.
Inkesta-sentsoreen mekanismoa deskribatzea baino ez da beharrezkoa.
Ezin izan nuen iturburu-kodetik abiatu; TangoBox 9.3-ren prest egindako irudi bat erabili nuen lan egiteko.
Argibideek paketeetatik nola instalatu deskribatzen dute.
Zertan datza?
jive β TANGO datu-basea ikusteko eta editatzeko erabiltzen da.
Lehenengo bi osagaiak bakarrik interesatuko zaizkigu.
Onartutako programazio-lengoaiak
C
C ++
Java
Ikusteko Javascript-a
Python
matlab
LabVIEW
Python eta c++-n lan egin nuen. Hemen C++ erabiliko da adibide gisa.
Orain pasa gaitezen gailua TANGOra nola konektatu eta harekin lan egin nola konektatu den azaltzen duen deskribapen batera. Kuota hartuko da adibide gisa GPS neo-6m-0-001:
Irudian ikus dezakezun bezala, plaka ordenagailura konektatzen dugu UART CP2102 bidez. PC batera konektatuta dagoenean, gailua agertzen da /dev/ttyUSB[0-N], normalean /dev/ttyUSB0.
POGO
Orain abiarazi dezagun pogo, eta sortu eskeleto-kodea gure taularekin lan egiteko.
pogo
Dagoeneko sortu dut kodea, sor dezagun berriro Fitxategia->Berria.
Honako hauek lortzen ditugu:
Gure gailua (etorkizunean, gailuaren arabera, softwarearen zatia esan nahi dugu) hutsik dago eta bi kontrol komando ditu: Estatuko & Status.
Beharrezko atributuekin bete behar da:
Gailuaren propietatea - hasieratzeko gailura transferitzen ditugun balio lehenetsiak; GPS plakarako, plakaren izena sisteman transferitu behar duzu com="/dev/ttyUSB0" eta com portuaren abiadura baudrade=9600
Komandoak β gure gailua kontrolatzeko komandoak; argumentuak eta itzulera balio bat eman diezaiekete.
ESTATU - uneko egoera itzultzen du, from States
STATUS - uneko egoera itzultzen du, hau da katearen osagarria ESTATU
Ondoren, ezarri gailuaren atributuak bertatik irakurri/idatzi daitezkeen. Atributu eskalarrak - Atributu sinpleak (char, string, long, etab.) Espektro-atributuak - Dimentsio bakarreko matrizeak Irudiaren Atributuak - bi dimentsioko arrayak
States β gure gailua zein egoeratan dagoen.
OPEN β Gailua irekita dago.
ITXI - gailua itxita dago.
HUTS - akatsa.
ON β jaso datuak gailutik.
OFF β gailuko daturik ez.
Atributu bat gehitzearen adibidea gps_katea:
Bozketa epea denbora ms-tan, gps_string balioa zenbat aldiz eguneratuko den. Eguneratze-ordua zehazten ez bada, atributua eskatuta soilik eguneratuko da.
Gertatua:
Orain kodea sortu behar duzu Fitxategia->Sortu
Lehenespenez, Makefile ez da sortzen; lehen aldiz, laukia markatu behar duzu sortzeko. Hau egiten da belaunaldi berri batean egindako aldaketak ezabatu ez daitezen. Behin sortu eta zure proiekturako konfiguratu ondoren (erregistratu konpilazio gakoak, fitxategi osagarriak), ahaztu egin dezakezu.
Orain programaziora pasa gaitezen. pogo-k honako hau sortu digu:
NEO6M.cpp eta NEO6M.h interesatuko zaizkigu. Har dezagun klase-eraikitzaile baten adibide bat:
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
}
Zer dago eta zer da garrantzitsua hemen? init_device() funtzioak memoria esleitzen du gure atributuetarako: gps_katea & gps_array, baina ez da garrantzitsua. Hemen garrantzitsuena, hauek dira iruzkinak:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1
Iruzkin bloke honen barruan dagoen guztia ez da pogoan sartuko ondorengo kode birsorkuntzan alde egin!. Blokeetan ez dagoen guztia izango da! Hauek dira gure edizioak programatu eta egin ditzakegun tokiak.
Orain zein dira klaseak dituen funtzio nagusiak? NEO6M:
Atributuaren balioa irakurri nahi dugunean gps_katea, funtzioak hurrenkera honetan deituko dira: beti_exekutatu_hook, read_attr_hardware ΠΈ irakurri_gps_katea. Read_gps_string balioarekin gps_string beteko du.
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
}
konpilazio
Joan iturriko karpetara eta:
make
Programa ~/DeviceServers karpetan konpilatuko da.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6M
jive
jive
Dagoeneko gailu batzuk daude datu-basean, sortu dezagun orain gurea Editatu->Sortu zerbitzaria
Orain saia gaitezen harekin konektatzen:
Ezer ez da funtzionatuko, lehenik gure programa exekutatu behar dugu:
sudo ./NEO6M neo6m -v2
Eskubideekin soilik konektatu naiteke com portura root-A. v β Erregistro maila.
Orain konektatu gaitezke:
bezero
Grafikoetan, argazkiei begiratzea ona da, zalantzarik gabe, baina zerbait erabilgarriagoa behar duzu. Idatzi dezagun gure gailura konektatuko den bezero bat eta har dezagun irakurketak.
#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);
}
}