Është një sistem për menaxhimin e pajisjeve dhe softuerëve të ndryshëm.
TANGO aktualisht mbështet 4 platforma: Linux, Windows NT, Solaris dhe HP-UX.
Këtu do të përshkruajmë punën me Linux (Ubuntu 18.04)
Për çfarë është?
Thjeshtëson punën me pajisje dhe softuer të ndryshëm.
Ju nuk keni nevojë të mendoni se si të ruani të dhënat në bazën e të dhënave, tashmë është bërë për ju.
Është e nevojshme vetëm të përshkruhet mekanizmi për sensorët e votimit.
Nuk mund ta nisja nga kodi burimor; përdora një imazh të gatshëm të TangoBox 9.3 për të punuar.
Udhëzimet përshkruajnë se si të instaloni nga paketat.
Nga çfarë përbëhet?
JIVE — përdoret për të parë dhe modifikuar bazën e të dhënave TANGO.
Pogo — gjenerues i kodit për serverët e pajisjes TANGO.
Astor — menaxher programi për sistemin TANGO.
Ne do të jemi të interesuar vetëm për dy komponentët e parë.
Gjuhët e programimit të mbështetura
C
C + +
Java
JavaScript
Piton
MATLAB
PAMJE Laboratori
Kam punuar me të në python & c++. Këtu C++ do të përdoret si shembull.
Tani le të kalojmë në një përshkrim se si ta lidhni pajisjen me TANGO dhe si të punoni me të. Tarifa do të merret si shembull GPS neo-6m-0-001:
Siç mund ta shihni në foto, ne e lidhim tabelën me PC-në përmes UART CP2102. Kur lidhet me një PC, pajisja shfaqet /dev/ttyUSB[0-N], zakonisht /dev/ttyUSB0.
Pogo
Tani le të nisim pogo, dhe gjeneroni kodin e skeletit për të punuar me bordin tonë.
pogo
Tashmë kam krijuar kodin, le ta krijojmë përsëri Skedar->E re.
Ne marrim sa vijon:
Pajisja jonë (në të ardhmen, me pajisje do të nënkuptojmë pjesën e softuerit) është bosh dhe ka dy komanda kontrolli: shtet & Statusi.
Duhet të plotësohet me atributet e nevojshme:
Vetia e pajisjes — vlerat e paracaktuara që transferojmë në pajisje për ta inicializuar; për tabelën GPS, duhet të transferoni emrin e tabelës në sistem com="/dev/ttyUSB0" dhe shpejtësia e portit kom baudrade=9600
Komandat — komandat për të kontrolluar pajisjen tonë; atyre mund t'u jepen argumente dhe një vlerë kthyese.
STATE - kthen gjendjen aktuale, nga Shtetet
STATUSI - kthen statusin aktual, ky është plotësimi i vargut STATE
GPSArray - kthehet GPS varg në formë DevVarCharArray
Më pas, vendosni atributet e pajisjes që mund të lexohen/shkruhen në/nga ajo. Atributet skalar - atribute të thjeshta (char, varg, i gjatë, etj.) Atributet e spektrit - vargje njëdimensionale Atributet e imazhit - vargje dydimensionale
Shtetet — gjendja në të cilën ndodhet pajisja jonë.
HAPUR - pajisja është e hapur.
CLOSE - pajisja është e mbyllur.
Dështoi - gabim.
ON — merrni të dhëna nga pajisja.
OFF — nuk ka të dhëna nga pajisja.
Shembull i shtimit të një atributi gps_string:
periudha e votimit koha në ms, sa shpesh do të përditësohet vlera gps_string. Nëse koha e përditësimit nuk është e specifikuar, atributi do të përditësohet vetëm sipas kërkesës.
Ndodhi:
Tani ju duhet të gjeneroni kodin Skedar-> Gjeneroni
Si parazgjedhje, Makefile nuk krijohet; hera e parë që duhet të kontrolloni kutinë për ta krijuar atë. Kjo bëhet në mënyrë që ndryshimet e bëra në të të mos fshihen gjatë një gjenerate të re. Pasi ta keni krijuar një herë dhe ta konfiguroni atë për projektin tuaj (regjistroni çelësat e përpilimit, skedarët shtesë), mund ta harroni atë.
Tani le të kalojmë te programimi. pogo me gjeneroi sa vijon për ne:
Ne do të jemi të interesuar për NEO6M.cpp & NEO6M.h. Le të marrim një shembull të një konstruktori të 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 dhe çfarë është e rëndësishme këtu? Funksioni init_device() shpërndan memorie për atributet tona: gps_string & gps_array, por nuk është e rëndësishme. Gjëja më e rëndësishme këtu, këto janë komentet:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1
Çdo gjë që është brenda këtij blloku komentesh nuk do të përfshihet në pogo gjatë rigjenerimeve të mëvonshme të kodit Largohu!. Gjithçka që nuk është në blloqe do të jetë! Këto janë vendet ku ne mund të programojmë dhe të bëjmë modifikimet tona.
Tani cilat janë funksionet kryesore që përmban klasa? NEO6M:
Kur duam të lexojmë vlerën e atributit gps_string, funksionet do të thirren në rendin e mëposhtëm: gjithmonë_e ekzekutuar_grep, read_attr_hardware и read_gps_string. Read_gps_string do të mbushë gps_string me vlerën.
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
}
Përpilimi
Shkoni te dosja burimore dhe:
make
Programi do të kompilohet në dosjen ~/DeviceServers.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6M
JIVE
jive
Tashmë ka disa pajisje në bazën e të dhënave, le të krijojmë tani tonën Edit-> Krijo server
Tani le të përpiqemi të lidhemi me të:
Asgjë nuk do të funksionojë, së pari duhet të ekzekutojmë programin tonë:
sudo ./NEO6M neo6m -v2
Unë mund të lidhem vetëm me portin com me të drejta rrënjë-a. v - niveli i prerjeve.
Tani mund të lidhemi:
klient
Në grafikë, shikimi i fotografive është sigurisht i mirë, por ju duhet diçka më e dobishme. Le të shkruajmë një klient që do të lidhet me pajisjen tonë dhe do të marrë lexime prej saj.
#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);
}
}