Dit is 'n stelsel vir die bestuur van verskeie hardeware en sagteware.
TANGO ondersteun tans 4 platforms: Linux, Windows NT, Solaris en HP-UX.
Hier sal ons werk met Linux beskryf (Ubuntu 18.04)
Waarvoor is dit?
Vereenvoudig werk met verskeie toerusting en sagteware.
Jy hoef nie te dink oor hoe om data in die databasis te stoor nie, dit is reeds vir jou gedoen.
Dit is slegs nodig om die meganisme vir stemsensors te beskryf.
Ek kon dit nie vanaf die bronkode begin nie, ek het 'n klaargemaakte beeld van TangoBox 9.3 gebruik om te werk.
Die instruksies beskryf hoe om vanaf pakkette te installeer.
Waaruit bestaan dit?
jive — gebruik om die TANGO-databasis te bekyk en te redigeer.
POGO - kodegenerator vir TANGO-toestelbedieners.
Astor — programbestuurder vir die TANGO-stelsel.
Ons sal slegs in die eerste twee komponente belangstel.
Ondersteunde programmeertale
C
C + +
Java
JavaScript
Python
Matlab
LabVIEW
Ek het daarmee gewerk in python & c++. Hier sal C++ as voorbeeld gebruik word.
Kom ons gaan nou oor na 'n beskrywing van hoe om die toestel aan TANGO te koppel en hoe om daarmee te werk. Die fooi sal as voorbeeld geneem word GPS neo-6m-0-001:
Soos u in die prentjie kan sien, koppel ons die bord aan die rekenaar via UART CP2102. Wanneer dit aan 'n rekenaar gekoppel is, verskyn die toestel /dev/ttyUSB[0-N], gewoonlik /dev/ttyUSB0.
POGO
Nou kom ons hardloop pogo, en genereer skeletkode om met ons bord te werk.
pogo
Ek het reeds die kode geskep, kom ons skep dit weer Lêer-> Nuut.
Ons kry die volgende:
Ons toestel (in die toekoms, met toestel bedoel ons die sagteware-deel) is leeg en het twee beheeropdragte: staat & Status.
Dit moet gevul word met die nodige eienskappe:
Toestel eiendom - verstekwaardes wat ons na die toestel oordra om dit vir die GPS-bord te inisialiseer, u moet die naam van die bord in die stelsel oordra com="/dev/ttyUSB0" en com-poortspoed baudrade=9600
Instruksies - opdragte om ons toestel te beheer, hulle kan argumente en 'n terugkeerwaarde gegee word.
STATE - gee die huidige toestand terug, vanaf State
STATUS - gee die huidige status terug, dit is die string se aanvulling tot STATE
GPSArray - opbrengste GPS string in die vorm DevVarCharArray
Stel dan die toestelkenmerke in wat daarheen gelees/geskryf kan word. Skalêre eienskappe - eenvoudige eienskappe (char, string, long, ens.) Spektrum eienskappe - eendimensionele skikkings Beeldeienskappe - tweedimensionele skikkings
State — die toestand waarin ons toestel geleë is.
OOP — die toestel is oop.
SLUIT - die toestel is gesluit.
FOUT - fout.
ON - ontvang data vanaf die toestel.
AF - geen data vanaf die toestel nie.
Voorbeeld van die byvoeging van 'n kenmerk gps_string:
Stemmingsperiode tyd in ms, hoe gereeld die gps_string-waarde opgedateer sal word. As die opdateringstyd nie gespesifiseer is nie, sal die kenmerk slegs op versoek opgedateer word.
Het gebeur:
Nou moet jy die kode genereer Lêer-> Genereer
By verstek word die Makefile nie gegenereer die eerste keer dat jy die blokkie moet merk om dit te skep nie. Dit word gedoen sodat die veranderinge wat daaraan gemaak word nie tydens 'n nuwe generasie uitgevee word nie. Nadat u dit een keer geskep het en dit vir u projek gekonfigureer het (registreer samestellingsleutels, bykomende lêers), kan u daarvan vergeet.
Kom ons gaan nou oor na programmering. pogo met het die volgende vir ons gegenereer:
Ons sal belangstel in NEO6M.cpp & NEO6M.h. Kom ons neem 'n voorbeeld van 'n klaskonstruktor:
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
}
Wat is daar en wat is hier belangrik? Die init_device() funksie ken geheue toe vir ons eienskappe: gps_string & gps_skikking, maar dit is nie belangrik nie. Die belangrikste ding hier, dit is die opmerkings:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1
Alles wat binne hierdie kommentaarblok is, sal nie ingesluit word in pogo tydens daaropvolgende kodeherwinnings nie beweeg weg!. Alles wat nie in blokke is nie, sal wees! Dit is die plekke waar ons kan programmeer en ons eie wysigings kan maak.
Nou wat is die hooffunksies wat die klas bevat? NEO6M:
Wanneer ons die eienskapwaarde wil lees gps_string, sal die funksies in die volgende volgorde genoem word: altyd_uitvoer_haak, read_attr_hardware и lees_gps_string. Read_gps_string sal gps_string met die waarde vul.
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
}
Samestelling
Gaan na die brongids en:
make
Die program sal saamgestel word in die ~/DeviceServers-lêergids.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6M
jive
jive
Daar is reeds 'n paar toestelle in die databasis, kom ons skep nou ons s'n Redigeer-> Skep bediener
Kom ons probeer nou om daaraan te koppel:
Niks sal werk nie, eers moet ons ons program laat loop:
sudo ./NEO6M neo6m -v2
Ek kan slegs met regte aan die com-poort koppel wortel-A. v - logvlak.
Nou kan ons verbind:
kliënt
In grafika is dit beslis goed om na prente te kyk, maar jy het iets nuttiger nodig. Kom ons skryf 'n kliënt wat aan ons toestel sal koppel en lesings daaruit sal neem.
#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);
}
}