Se on järjestelmä erilaisten laitteistojen ja ohjelmistojen hallintaan.
TANGO tukee tällä hetkellä neljää alustaa: Linux, Windows NT, Solaris ja HP-UX.
Tässä kuvataan työskentely Linuxin kanssa (Ubuntu 18.04)
Mitä varten se on?
Helpottaa työskentelyä erilaisten laitteiden ja ohjelmistojen kanssa.
Sinun ei tarvitse miettiä tietojen tallentamista tietokantaan, se on jo tehty puolestasi.
On vain tarpeen kuvata kyselytunnistimien mekanismi.
En pystynyt käynnistämään sitä lähdekoodista; käytin TangoBox 9.3:n valmiita kuvia toimimaan.
Ohjeissa kerrotaan, kuinka paketeista asennetaan.
Mistä se koostuu?
Jive — käytetään TANGO-tietokannan katseluun ja muokkaamiseen.
POGO — koodigeneraattori TANGO-laitepalvelimille.
astor — TANGO-järjestelmän ohjelmapäällikkö.
Olemme kiinnostuneita vain kahdesta ensimmäisestä komponentista.
Tuetut ohjelmointikielet
C
C + +
Jaava
JavaScript
Python
matlab
LabVIEW
Työskentelin sen kanssa pythonilla ja c++:lla. Tässä käytetään C++:aa esimerkkinä.
Siirrytään nyt kuvaukseen siitä, kuinka laite liitetään TANGO:hon ja miten sitä käytetään. Maksu otetaan esimerkkinä GPS neo-6m-0-001:
Kuten kuvasta näkyy, liitämme kortin PC:hen UART CP2102:n kautta. Kun laite on liitetty tietokoneeseen, näyttöön tulee laite /dev/ttyUSB[0-N], yleensä /dev/ttyUSB0.
POGO
Nyt käynnistetään Pogo, ja luoda runkokoodin laudallamme työskentelemistä varten.
pogo
Olen jo luonut koodin, luodaan se uudelleen Tiedosto-> Uusi.
Saamme seuraavat:
Laitteemme (tulevaisuudessa laitteella tarkoitamme ohjelmisto-osaa) on tyhjä ja siinä on kaksi ohjauskomentoa: Osavaltio & Tila.
Se on täytettävä tarvittavilla määritteillä:
Laitteen ominaisuus - oletusarvot, jotka siirrämme laitteeseen alustaaksesi sen; GPS-kortille sinun on siirrettävä kortin nimi järjestelmässä com="/dev/ttyUSB0" ja tietoliikenneportin nopeus baudrade=9600
komennot — komennot, joilla ohjataan laitettamme; niille voidaan antaa argumentteja ja palautusarvo.
OSAVALTIO - palauttaa nykyisen tilan, alkaen Valtiot
STATUS - palauttaa nykyisen tilan, tämä on merkkijonon täydennys OSAVALTIO
GPSArray - palautuu GPS merkkijono muodossa DevVarCharArray
Aseta seuraavaksi laitteen attribuutit, jotka voidaan lukea/kirjoittaa siihen/sitä. Skalaariattribuutit - yksinkertaiset attribuutit (merkki, merkkijono, pitkä jne.) Spektrin attribuutit - yksiulotteiset taulukot Kuvan attribuutit - kaksiulotteiset taulukot
Valtiot — tila, jossa laitteemme sijaitsee.
OPEN — laite on auki.
SULJE - laite on kiinni.
Epäonnistunut -virhe.
ON — vastaanottaa tietoja laitteesta.
POIS — ei tietoja laitteesta.
Esimerkki attribuutin lisäämisestä gps_string:
Äänestysaika aika ms, kuinka usein gps_string-arvo päivitetään. Jos päivitysaikaa ei ole määritetty, attribuutti päivitetään vain pyynnöstä.
Kävi ilmi:
Nyt sinun on luotava koodi Tiedosto-> Luo
Oletusarvoisesti Makefileä ei luoda; ensimmäistä kertaa sinun on valittava valintaruutu luodaksesi sen. Tämä tehdään niin, että siihen tehdyt muutokset eivät poistu uuden sukupolven aikana. Kun olet luonut sen kerran ja määrittänyt sen projektillesi (rekisteröi käännösavaimet, lisätiedostot), voit unohtaa sen.
Siirrytään nyt ohjelmointiin. pogo with loi meille seuraavan:
Olemme kiinnostuneita NEO6M.cpp & NEO6M.h:sta. Otetaan esimerkki luokan rakentajasta:
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
}
Mitä siellä on ja mikä on tärkeää? Init_device()-funktio varaa muistia määritteillemme: gps_string & gps_array, mutta se ei ole tärkeää. Tärkeintä tässä, nämä ovat kommentit:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1
Kaikkea, mikä on tämän kommenttilohkon sisällä, ei sisällytetä pogoon myöhempien koodin uudelleenmuotoilujen aikana muuttaa pois!. Kaikki, mikä ei ole lohkoissa, tulee olemaan! Nämä ovat paikkoja, joissa voimme ohjelmoida ja tehdä omia muokkauksiamme.
Kun haluamme lukea attribuutin arvon gps_string, funktioita kutsutaan seuraavassa järjestyksessä: aina_suoritettu_koukku, read_attr_hardware и read_gps_string. Read_gps_string täyttää gps_string arvolla.
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
}
Kokoelma
Siirry lähdekansioon ja:
make
Ohjelma käännetään ~/DeviceServers-kansioon.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6M
Jive
jive
Tietokannassa on jo joitain laitteita, luodaan nyt omamme Muokkaa-> Luo palvelin
Yritetään nyt muodostaa yhteys siihen:
Mikään ei toimi, ensin meidän on suoritettava ohjelmamme:
sudo ./NEO6M neo6m -v2
Voin muodostaa yhteyden com-porttiin vain oikeuksilla juuris. v - kirjaustaso.
Nyt voimme yhdistää:
asiakas
Grafiikassa kuvien katsominen on varmasti hyvä asia, mutta tarvitset jotain hyödyllisempää. Kirjoitetaan asiakas, joka muodostaa yhteyden laitteeseen ja ottaa siitä lukemat.
#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);
}
}