Il s'agit d'un système de gestion de divers matériels et logiciels.
TANGO prend actuellement en charge 4 plates-formes : Linux, Windows NT, Solaris et HP-UX.
Ici, nous décrirons le travail avec Linux (Ubuntu 18.04)
Pour quelle raison?
Simplifie le travail avec divers équipements et logiciels.
Vous n'avez pas besoin de réfléchir à 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.
Je n'ai pas pu le lancer à partir du code source ; j'ai utilisé une image toute faite de TangoBox 9.3 pour travailler.
Les instructions décrivent comment installer à partir de packages.
En quoi cela consiste?
JIVE — utilisé pour visualiser et éditer la base de données TANGO.
POGO — générateur de code pour les serveurs d'appareils TANGO.
Astor — responsable de programme pour le système TANGO.
Nous nous intéresserons uniquement aux deux premières composantes.
Langages de programmation pris en charge
C
C + +
Java
JavaScript
Python
Matlab
LabVIEW
J'ai travaillé avec en python et c++. Ici, le C++ sera utilisé comme exemple.
Passons maintenant à une description de la façon de connecter l'appareil à TANGO et de comment l'utiliser. Les frais seront pris à titre d'exemple GPS néo-6m-0-001:
Comme vous pouvez le voir sur l'image, nous connectons la carte au PC via UART CP2102. Lorsqu'il est connecté à un PC, l'appareil apparaît /dev/ttyUSB[0-N], généralement /dev/ttyUSB0.
POGO
Maintenant courons pogo, et générez un code squelette pour travailler avec notre tableau.
pogo
J'ai déjà créé le code, créons-le à nouveau Fichier->Nouveau.
Nous obtenons ce qui suit :
Notre appareil (à l'avenir, par appareil nous désignerons la partie logicielle) est vide et dispose de deux commandes de contrôle : Région & Statut.
Il doit être rempli des attributs nécessaires :
Propriété de l'appareil — valeurs par défaut que nous transférons à l'appareil pour l'initialiser ; pour la carte GPS, vous devez transférer le nom de la carte dans le système com="/dev/ttyUSB0" et la vitesse du port COM baudrade=9600
Commandes — des commandes pour contrôler notre appareil ; elles peuvent recevoir des arguments et une valeur de retour.
ETAT - renvoie l'état actuel, de États
STATUT - renvoie l'état actuel, c'est le complément de la chaîne à ETAT
Tableau GPS - Retour gps chaîne sous la forme DevVarCharArray
Ensuite, définissez les attributs du périphérique qui peuvent être lus/écrits vers/depuis celui-ci. Attributs scalaires — attributs simples (char, string, long, etc.) Attributs du spectre - tableaux unidimensionnels Attributs d'image - tableaux bidimensionnels
États — l'état dans lequel se trouve notre appareil.
OUVERT — l'appareil est ouvert.
CLOSE - l'appareil est fermé.
ÉCHEC - erreur.
ON — recevoir des données de l'appareil.
de remise — aucune donnée de l'appareil.
Exemple d'ajout d'un attribut chaîne_gps:
Période de scrutin temps en ms, à quelle fréquence la valeur gps_string sera mise à jour. Si l'heure de mise à jour n'est pas spécifiée, l'attribut sera mis à jour uniquement sur demande.
Il s'est avéré:
Maintenant vous devez générer le code Fichier->Générer
Par défaut, le Makefile n'est pas généré ; la première fois il faut cocher la case pour le créer. Ceci est fait pour que les modifications qui y sont apportées ne soient pas supprimées lors d'une nouvelle génération. Après l'avoir créé une fois et configuré pour votre projet (enregistrement des clés de compilation, fichiers supplémentaires), vous pouvez l'oublier.
Passons maintenant à la programmation. pogo a généré ce qui suit pour nous :
Nous serons intéressés par NEO6M.cpp & NEO6M.h. Prenons un exemple de constructeur de classe :
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
}
Qu'y a-t-il et qu'est-ce qui est important ici ? La fonction init_device() alloue de la mémoire pour nos attributs : chaîne_gps & tableau_gps, mais ce n'est pas important. La chose la plus importante ici, voici les commentaires :
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1
Tout ce qui se trouve à l'intérieur de ce bloc de commentaires ne sera pas inclus dans pogo lors des régénérations de code ultérieures éloignez-vous !. Tout ce qui n'est pas en blocs le sera ! Ce sont les endroits où nous pouvons programmer et effectuer nos propres modifications.
Maintenant, quelles sont les principales fonctions contenues dans la classe ? NÉO6M:
Quand nous voulons lire la valeur de l'attribut chaîne_gps, les fonctions seront appelées dans l'ordre suivant : toujours_exécuté_hook, read_attr_hardware и read_gps_string. Read_gps_string remplira gps_string avec la valeur.
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
}
Compilation
Allez dans le dossier source et :
make
Le programme sera compilé dans le dossier ~/DeviceServers.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6M
JIVE
jive
Il y a déjà quelques appareils dans la base de données, créons maintenant le nôtre Edition->Créer un serveur
Essayons maintenant de nous y connecter :
Rien ne fonctionnera, nous devons d'abord exécuter notre programme :
sudo ./NEO6M neo6m -v2
Je ne peux me connecter qu'au port COM avec des droits racine-a v — niveau de journalisation.
Nous pouvons maintenant connecter :
Client
En graphisme, regarder des images est certes une bonne chose, mais il faut quelque chose de plus utile. Écrivons un client qui se connectera à notre appareil et en tirera des lectures.
#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);
}
}