Χειριστήρια Tango

Χειριστήρια Tango

Τι είναι TANGO?

Είναι ένα σύστημα διαχείρισης διαφόρων υλισμικού και λογισμικού.
Το 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:

Χειριστήρια Tango

Όπως βλέπετε στην εικόνα, συνδέουμε την πλακέτα με τον υπολογιστή μέσω UART CP2102. Όταν συνδέεται σε υπολογιστή, εμφανίζεται η συσκευή /dev/ttyUSB[0-N], συνήθως /dev/ttyUSB0.

ΠΟΓΟ

Τώρα ας ξεκινήσουμε pogoκαι δημιουργήστε σκελετό κώδικα για να εργαστείτε με την πλακέτα μας.

pogo

Χειριστήρια Tango

Έχω ήδη δημιουργήσει τον κώδικα, ας τον δημιουργήσουμε ξανά Αρχείο->Νέο.

Χειριστήρια Tango

Παίρνουμε τα εξής:

Χειριστήρια Tango

Η συσκευή μας (στο μέλλον, με τον όρο συσκευή θα εννοούμε το τμήμα λογισμικού) είναι άδεια και έχει δύο εντολές ελέγχου: Κατάσταση & Κατάσταση.

Πρέπει να είναι γεμάτο με τα απαραίτητα χαρακτηριστικά:

Ιδιότητα συσκευής — προεπιλεγμένες τιμές που μεταφέρουμε στη συσκευή για να την αρχικοποιήσουμε· για την πλακέτα GPS, πρέπει να μεταφέρετε το όνομα της πλακέτας στο σύστημα com="/dev/ttyUSB0" και ταχύτητα θύρας baudrade=9600

Εντολές — εντολές για τον έλεγχο της συσκευής μας· μπορούν να δοθούν ορίσματα και μια τιμή επιστροφής.

  • ΚΑΤΑΣΤΑΣΗ - επιστρέφει την τρέχουσα κατάσταση, από Μελών
  • ΚΑΤΑΣΤΑΣΗ - επιστρέφει την τρέχουσα κατάσταση, αυτό είναι το συμπλήρωμα της συμβολοσειράς ΚΑΤΑΣΤΑΣΗ
  • GPSArray - επιστρέφει gps χορδή στη μορφή DevVarCharArray

Στη συνέχεια, ορίστε τα χαρακτηριστικά της συσκευής που μπορούν να διαβαστούν/εγγραφούν σε/από αυτήν.
Scalar Attributes — απλά χαρακτηριστικά (char, string, long, κ.λπ.)
Ιδιότητες φάσματος - μονοδιάστατοι πίνακες
Χαρακτηριστικά εικόνας - δισδιάστατοι πίνακες

Μελών — την κατάσταση στην οποία βρίσκεται η συσκευή μας.

  • OPEN — η συσκευή είναι ανοιχτή.
  • ΚΛΕΙΣΙΜΟ — η συσκευή είναι κλειστή.
  • ΑΠΟΤΥΧΙΑ - λάθος.
  • ON — λήψη δεδομένων από τη συσκευή.
  • ΕΚΤΌΣ — δεν υπάρχουν δεδομένα από τη συσκευή.

Παράδειγμα προσθήκης χαρακτηριστικού gps_string:

Χειριστήρια Tango

Εκλογική περίοδος χρόνο σε ms, πόσο συχνά θα ενημερώνεται η τιμή gps_string. Εάν δεν έχει καθοριστεί ο χρόνος ενημέρωσης, το χαρακτηριστικό θα ενημερωθεί μόνο κατόπιν αιτήματος.

Συνέβη:

Χειριστήρια Tango

Τώρα πρέπει να δημιουργήσετε τον κώδικα Αρχείο->Δημιουργία

Χειριστήρια Tango

Από προεπιλογή, το Makefile δεν δημιουργείται· την πρώτη φορά που πρέπει να επιλέξετε το πλαίσιο για να το δημιουργήσετε. Αυτό γίνεται έτσι ώστε οι αλλαγές που έγιναν σε αυτό να μην διαγραφούν κατά τη διάρκεια μιας νέας γενιάς. Έχοντας το δημιουργήσει μία φορά και το ρυθμίσετε για το έργο σας (καταχώριση κλειδιών μεταγλώττισης, πρόσθετα αρχεία), μπορείτε να το ξεχάσετε.

Τώρα ας περάσουμε στον προγραμματισμό. pogo με δημιούργησε τα ακόλουθα για εμάς:

Χειριστήρια Tango

Θα μας ενδιαφέρουν τα 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Μ:

void always_executed_hook();
void read_attr_hardware(vector<long> &attr_list);
void read_gps_string(Tango::Attribute &attr);
void read_gps_array(Tango::Attribute &attr);

Όταν θέλουμε να διαβάσουμε την τιμή του χαρακτηριστικού 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

Χειριστήρια Tango

Υπάρχουν ήδη κάποιες συσκευές στη βάση δεδομένων, ας δημιουργήσουμε τώρα τη δική μας Επεξεργασία->Δημιουργία διακομιστή

Χειριστήρια Tango

Τώρα ας προσπαθήσουμε να συνδεθούμε σε αυτό:

Χειριστήρια Tango

Τίποτα δεν θα λειτουργήσει, πρώτα πρέπει να εκτελέσουμε το πρόγραμμά μας:

sudo ./NEO6M neo6m -v2

Μπορώ να συνδεθώ στη θύρα com μόνο με δικαιώματα ρίζα-και. v — επίπεδο καταγραφής.

Τώρα μπορούμε να συνδεθούμε:

Χειριστήρια Tango

Πελάτης

Στα γραφικά, η προβολή εικόνων είναι σίγουρα καλή, αλλά χρειάζεστε κάτι πιο χρήσιμο. Ας γράψουμε έναν πελάτη που θα συνδέεται με τη συσκευή μας και θα παίρνει μετρήσεις από αυτήν.

#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);
    }
}

Τρόπος μεταγλώττισης:

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++

Το αποτέλεσμα:

tango-cs@tangobox:~/workspace/c$ ./a.out 
$GPRMC,,V,,,,,,,,,,N*53

$GPRMC,,V,,,,,,,,,,N*53

$GPRMC,,V,,,,,,,,,,N*53

Λάβαμε το αποτέλεσμα ως επιστροφή εντολής, λαμβάνοντας τα χαρακτηριστικά μιας συμβολοσειράς και μιας σειράς χαρακτήρων.

παραπομπές

Έγραψα το άρθρο για τον εαυτό μου, γιατί μετά από λίγο αρχίζω να ξεχνάω πώς και τι να κάνω.

Σας ευχαριστώ για την προσοχή σας.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο