
Qu'est-ce que ?
C'est un système pour la gestion de divers équipements et logiciels.
TANGO prend actuellement en charge 4 plateformes : Linux, Windows NT, Solaris et HP-UX.
Ici, nous décrirons le fonctionnement avec Linux (Ubuntu 18.04)
À quoi ça sert ?
Cela facilite le travail avec divers équipements et logiciels.
- Vous n'avez pas besoin de vous soucier de la manière de stocker les données dans la base de données, c'est déjà fait pour vous.
- Il suffit de décrire le mécanisme d'interrogation des capteurs.
- Cela ramène tout votre code à une seule norme.
Où le trouver ?
Je n'ai pas pu le lancer depuis les sources, j'ai utilisé l'image TangoBox 9.3.
Le guide décrit comment l'installer à partir des paquets.
De quoi est-elle composée ?
- JIVE — sert à visualiser et à modifier la base de données TANGO.
- POGO — générateur de code pour les serveurs d'appareils TANGO.
- Astor — gestionnaire logiciel pour le système TANGO.
Nous ne nous intéresserons qu'aux deux premiers composants.
Langages de programmation pris en charge
- C
- C++
- Java
- JavaScript
- Python
- Matlab
- LabVIEW
J'ai travaillé avec elle en python & c++. Ici, nous utiliserons c++ comme exemple.
Passons maintenant à la description de la façon de connecter un appareil à TANGO et de comment y travailler. Comme exemple, nous prendrons la carte GPS neo-6m-0-001:

Comme on le voit sur l'image, la carte est connectée à l'ordinateur via UART CP2102. Lors de la connexion à l'ordinateur, un appareil apparaît /dev/ttyUSB[0-N], généralement /dev/ttyUSB0.
POGO
Maintenant, lançons pogo, et nous générons un squelette de code pour travailler avec notre carte.
pogo
J'avais déjà un code créé, recréons-le Fichier->Nouveau.

Nous obtenons ce qui suit :

Notre appareil (par appareil, nous entendrons plus tard la partie logicielle) est vide et possède deux commandes de contrôle : State & Statut.
Il doit être rempli avec les attributs nécessaires :
Propriété de l'appareil — valeurs par défaut que nous transmettons à l'appareil pour son initialisation, pour la carte GPS, nous devons transmettre le nom de la carte dans le système com="/dev/ttyUSB0" et la vitesse du port com baudrade=9600
Commandes — commandes de contrôle de notre appareil, qui peuvent avoir des arguments et une valeur de retour.
- ÉTAT — renvoie l'état actuel, de États
- STATUS — renvoie le statut actuel, c'est un complément de chaîne à ÉTAT
- GPSArray — renvoie gps une chaîne sous forme de DevVarCharArray
Ensuite, les attributs de l'appareil sont définis, qui peuvent être lus/écrits en/de celui-ci.
Attributs scalaires — attributs simples (char, string, long, etc.)
Attributs de spectre — tableaux unidimensionnels
Attributs d'image — tableaux bidimensionnels
États — états dans lesquels se trouve notre appareil.
- OUVERTE — appareil ouvert.
- FERMÉE — appareil fermé.
- ÉCHEC — erreur.
- ACTIVER — nous recevons des données de l'appareil.
- OFF — Pas de données de l'appareil.
Exemple d'ajout d'attribut gps_string:

Période d'interrogation temps en ms, à quelle fréquence la valeur de gps_string sera mise à jour. Si le temps de mise à jour n'est pas spécifié, l'attribut ne sera mis à jour que sur demande.
Obtenu :

Nous devons maintenant générer le code Fichier->Générer

Par défaut, le Makefile n'est pas généré, la première fois, vous devez cocher pour le créer. Cela a été fait pour que les modifications apportées ne soient pas supprimées lors d'une nouvelle génération. Une fois créé et configuré pour votre projet (en spécifiant les clés de compilation, les fichiers supplémentaires), vous pouvez l'oublier.
Passons maintenant à la programmation. pogo nous a généré ce qui suit :

Nous allons nous intéresser à NEO6M.cpp & NEO6M.h. Prenons comme exemple le constructeur de la classe :
NEO6M::NEO6M(Tango::DeviceClass *cl, string &s)
: TANGO_BASE_CLASS(cl, s.c_str())
{
----- REGION PROTEGEE ID(NEO6M::constructor_1) ENABLED DEBUT -----
init_device();
----- REGION PROTEGEE FIN -----
}Que contient ici et quel est l'essentiel ? Dans la fonction init_device(), la mémoire est allouée pour nos attributs : gps_string & gps_array, mais ce n'est pas important. Ce qui est le plus important ici, ce sont les commentaires :
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1Tout ce qui se trouve à l'intérieur de ce bloc de commentaires ne sera pas supprimé lors des futures régénérations de code dans pogo !Tout ce qui se trouve en dehors des blocs le sera ! Ce sont les endroits où nous pouvons programmer et apporter nos modifications.
Quelles sont les principales fonctions de la classe NEO6M:
void always_executed_hook();
void read_attr_hardware(vector &attr_list);
void read_gps_string(Tango::Attribute &attr);
void read_gps_array(Tango::Attribute &attr);Lorsque nous souhaitons lire la valeur d'un attribut, gps_string, les fonctions seront appelées dans l'ordre suivant : always_executed_hook, read_attr_hardware et read_gps_string. Dans read_gps_string, gps_string sera rempli avec la valeur.
void NEO6M::read_gps_string(Tango::Attribute &attr)
{
DEBUG_STREAM << "NEO6M::read_gps_string(Tango::Attribute &attr) entre... " <attr_gps_string_read = Tango::string_dup(this->gps.c_str());
attr.set_value(attr_gps_string_read);
----- REGION PROTEGEE FIN -----
}Compilation
Accédez au dossier avec les sources et :
makeLe programme sera compilé dans le dossier ~/DeviceServers.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6MJIVE
jive
Il y a déjà des dispositifs dans la BDD, créons maintenant le nôtre Éditer->Créer Serveur

Essayons maintenant de nous y connecter :

Cela ne fonctionnera pas, il faut d'abord démarrer notre programme :
sudo ./NEO6M neo6m -v2Je ne peux me connecter au port COM qu'avec des droits root-a. v — niveau de journalisation.
Nous pouvons maintenant nous connecter :

Client
Bien sûr, il est agréable de regarder les images dans le graphique, mais il nous faut quelque chose de plus utile. Écrivons un client qui se connectera à notre appareil et récupérera ses mesures.
#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);
}
}Comment compiler :
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++Résultat :
tango-cs@tangobox:~/workspace/c$ ./a.out
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53Nous avons obtenu le résultat sous forme de retour de commande, d'attributs de chaîne et de tableau de caractères.
Liens
J'ai écrit cet article pour moi-même, car après un certain temps, j'oublie comment faire quoi.
Merci pour votre attention.
Source : habr.com
