Είναι ένα σύστημα διαχείρισης διαφόρων υλισμικού και λογισμικού.
Το TANGO υποστηρίζει αυτήν τη στιγμή 4 πλατφόρμες: Linux, Windows NT, Solaris και HP-UX.
Εδώ θα περιγράψουμε την εργασία με Linux (Ubuntu 18.04)
Σε τι χρησιμεύει;
Απλοποιεί την εργασία με διάφορους εξοπλισμούς και λογισμικό.
Δεν χρειάζεται να σκεφτείτε πώς να αποθηκεύσετε δεδομένα στη βάση δεδομένων, έχει ήδη γίνει για εσάς.
Είναι απαραίτητο μόνο να περιγραφεί ο μηχανισμός για τους αισθητήρες δημοσκόπησης.
Δεν μπορούσα να το εκκινήσω από τον πηγαίο κώδικα· χρησιμοποίησα μια έτοιμη εικόνα του TangoBox 9.3 για να δουλέψω.
Οι οδηγίες περιγράφουν τον τρόπο εγκατάστασης από πακέτα.
Από τι αποτελείται;
jive — χρησιμοποιείται για την προβολή και την επεξεργασία της βάσης δεδομένων TANGO.
ΠΟΓΟ — γεννήτρια κώδικα για διακομιστές συσκευών TANGO.
Astor — διαχειριστής προγράμματος για το σύστημα TANGO.
Θα μας ενδιαφέρουν μόνο τα δύο πρώτα στοιχεία.
Υποστηριζόμενες γλώσσες προγραμματισμού
C
C + +
Java
το JavaScript
Python
matlab
LabVIEW
Δούλεψα με αυτό σε python & c++. Εδώ η C++ θα χρησιμοποιηθεί ως παράδειγμα.
Τώρα ας προχωρήσουμε σε μια περιγραφή του τρόπου σύνδεσης της συσκευής στο TANGO και του τρόπου εργασίας με αυτό. Το τέλος θα ληφθεί ως παράδειγμα GPS neo-6m-0-001:
Όπως βλέπετε στην εικόνα, συνδέουμε την πλακέτα με τον υπολογιστή μέσω UART CP2102. Όταν συνδέεται σε υπολογιστή, εμφανίζεται η συσκευή /dev/ttyUSB[0-N], συνήθως /dev/ttyUSB0.
ΠΟΓΟ
Τώρα ας ξεκινήσουμε pogoκαι δημιουργήστε σκελετό κώδικα για να εργαστείτε με την πλακέτα μας.
pogo
Έχω ήδη δημιουργήσει τον κώδικα, ας τον δημιουργήσουμε ξανά Αρχείο->Νέο.
Παίρνουμε τα εξής:
Η συσκευή μας (στο μέλλον, με τον όρο συσκευή θα εννοούμε το τμήμα λογισμικού) είναι άδεια και έχει δύο εντολές ελέγχου: Κατάσταση & Κατάσταση.
Πρέπει να είναι γεμάτο με τα απαραίτητα χαρακτηριστικά:
Ιδιότητα συσκευής — προεπιλεγμένες τιμές που μεταφέρουμε στη συσκευή για να την αρχικοποιήσουμε· για την πλακέτα GPS, πρέπει να μεταφέρετε το όνομα της πλακέτας στο σύστημα com="/dev/ttyUSB0" και ταχύτητα θύρας baudrade=9600
Εντολές — εντολές για τον έλεγχο της συσκευής μας· μπορούν να δοθούν ορίσματα και μια τιμή επιστροφής.
ΚΑΤΑΣΤΑΣΗ - επιστρέφει την τρέχουσα κατάσταση, από Μελών
ΚΑΤΑΣΤΑΣΗ - επιστρέφει την τρέχουσα κατάσταση, αυτό είναι το συμπλήρωμα της συμβολοσειράς ΚΑΤΑΣΤΑΣΗ
GPSArray - επιστρέφει gps χορδή στη μορφή DevVarCharArray
Στη συνέχεια, ορίστε τα χαρακτηριστικά της συσκευής που μπορούν να διαβαστούν/εγγραφούν σε/από αυτήν. Scalar Attributes — απλά χαρακτηριστικά (char, string, long, κ.λπ.) Ιδιότητες φάσματος - μονοδιάστατοι πίνακες Χαρακτηριστικά εικόνας - δισδιάστατοι πίνακες
Μελών — την κατάσταση στην οποία βρίσκεται η συσκευή μας.
OPEN — η συσκευή είναι ανοιχτή.
ΚΛΕΙΣΙΜΟ — η συσκευή είναι κλειστή.
ΑΠΟΤΥΧΙΑ - λάθος.
ON — λήψη δεδομένων από τη συσκευή.
ΕΚΤΌΣ — δεν υπάρχουν δεδομένα από τη συσκευή.
Παράδειγμα προσθήκης χαρακτηριστικού gps_string:
Εκλογική περίοδος χρόνο σε ms, πόσο συχνά θα ενημερώνεται η τιμή gps_string. Εάν δεν έχει καθοριστεί ο χρόνος ενημέρωσης, το χαρακτηριστικό θα ενημερωθεί μόνο κατόπιν αιτήματος.
Συνέβη:
Τώρα πρέπει να δημιουργήσετε τον κώδικα Αρχείο->Δημιουργία
Από προεπιλογή, το Makefile δεν δημιουργείται· την πρώτη φορά που πρέπει να επιλέξετε το πλαίσιο για να το δημιουργήσετε. Αυτό γίνεται έτσι ώστε οι αλλαγές που έγιναν σε αυτό να μην διαγραφούν κατά τη διάρκεια μιας νέας γενιάς. Έχοντας το δημιουργήσει μία φορά και το ρυθμίσετε για το έργο σας (καταχώριση κλειδιών μεταγλώττισης, πρόσθετα αρχεία), μπορείτε να το ξεχάσετε.
Τώρα ας περάσουμε στον προγραμματισμό. pogo με δημιούργησε τα ακόλουθα για εμάς:
Θα μας ενδιαφέρουν τα NEO6M.cpp & NEO6M.h. Ας πάρουμε ένα παράδειγμα ενός κατασκευαστή κλάσης:
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
}
Τι υπάρχει και τι είναι σημαντικό εδώ; Η συνάρτηση init_device() εκχωρεί μνήμη για τα χαρακτηριστικά μας: gps_string & gps_array, αλλά δεν είναι σημαντικό. Το πιο σημαντικό εδώ, αυτά είναι τα σχόλια:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1
Όλα όσα βρίσκονται μέσα σε αυτό το μπλοκ σχολίων δεν θα συμπεριληφθούν στο pogo κατά τη διάρκεια των επόμενων αναδημιουργιών κώδικα Κάνε στην άκρη!. Ό,τι δεν είναι σε μπλοκ θα είναι! Αυτά είναι τα μέρη όπου μπορούμε να προγραμματίσουμε και να κάνουμε τις δικές μας επεξεργασίες.
Τώρα ποιες είναι οι κύριες συναρτήσεις που περιέχει η τάξη; ΝΕΟ6Μ:
Όταν θέλουμε να διαβάσουμε την τιμή του χαρακτηριστικού gps_string, οι συναρτήσεις θα κληθούν με την ακόλουθη σειρά: πάντα_εκτελείται_άγκιστρο, read_attr_hardware и read_gps_string. Το Read_gps_string θα γεμίσει το gps_string με την τιμή.
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
}
Σύνταξη
Μεταβείτε στον φάκελο προέλευσης και:
make
Το πρόγραμμα θα μεταγλωττιστεί στο φάκελο ~/DeviceServers.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6M
jive
jive
Υπάρχουν ήδη κάποιες συσκευές στη βάση δεδομένων, ας δημιουργήσουμε τώρα τη δική μας Επεξεργασία->Δημιουργία διακομιστή
Τώρα ας προσπαθήσουμε να συνδεθούμε σε αυτό:
Τίποτα δεν θα λειτουργήσει, πρώτα πρέπει να εκτελέσουμε το πρόγραμμά μας:
sudo ./NEO6M neo6m -v2
Μπορώ να συνδεθώ στη θύρα com μόνο με δικαιώματα ρίζα-και. v — επίπεδο καταγραφής.
Τώρα μπορούμε να συνδεθούμε:
Πελάτης
Στα γραφικά, η προβολή εικόνων είναι σίγουρα καλή, αλλά χρειάζεστε κάτι πιο χρήσιμο. Ας γράψουμε έναν πελάτη που θα συνδέεται με τη συσκευή μας και θα παίρνει μετρήσεις από αυτήν.
#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);
}
}