Tango juhtnupud

Tango juhtnupud

Mis on TANGO?

See on süsteem erineva riist- ja tarkvara haldamiseks.
TANGO toetab praegu 4 platvormi: Linux, Windows NT, Solaris ja HP-UX.
Siin kirjeldame tööd Linuxiga (Ubuntu 18.04)

Mida on vaja?

Lihtsustab tööd erinevate seadmete ja tarkvaraga.

  • Te ei pea mõtlema, kuidas andmeid andmebaasi salvestada, see on teie eest juba tehtud.
  • On vaja ainult kirjeldada küsitlusandurite mehhanismi.
  • Vähendab kogu teie koodi ühele standardile.

Kust seda saada?

Ma ei saanud seda lähtekoodist käivitada; kasutasin töötamiseks TangoBox 9.3 valmiskujutist.
Juhendis kirjeldatakse, kuidas pakettidest installida.

Millest see koosneb?

  • JIVE — kasutatakse TANGO andmebaasi vaatamiseks ja redigeerimiseks.
  • POGO — koodigeneraator TANGO seadmeserverite jaoks.
  • Astor — süsteemi TANGO programmijuht.

Meid huvitavad ainult kaks esimest komponenti.

Toetatud programmeerimiskeeled

  • C
  • C + +
  • Java
  • JavaScript
  • Python
  • matlab
  • LabVIEW

Töötasin sellega pythonis ja c++-s. Siin kasutatakse näitena C++.

Liigume nüüd edasi seadme TANGO-ga ühendamise ja sellega töötamise kirjelduse juurde. Tasu võetakse eeskujuks GPS neo-6m-0-001:

Tango juhtnupud

Nagu pildil näha, ühendame plaadi arvutiga UART CP2102 kaudu. Kui seade on arvutiga ühendatud, kuvatakse seade /dev/ttyUSB[0-N], tavaliselt /dev/ttyUSB0.

POGO

Nüüd käivitame pogoja looge meie tahvliga töötamiseks skeletikood.

pogo

Tango juhtnupud

Olen koodi juba loonud, loome uuesti Fail-> Uus.

Tango juhtnupud

Saame järgmise:

Tango juhtnupud

Meie seade (edaspidi mõtleme seadme all tarkvaraosa) on tühi ja sellel on kaks juhtkäsku: riik & olek.

See peab olema täidetud vajalike atribuutidega:

Seadme atribuut — vaikeväärtused, mille me selle lähtestamiseks seadmesse üle kanname; GPS-plaadi jaoks peate süsteemis üle kandma plaadi nime com="/dev/ttyUSB0" ja side kiirus baudrade = 9600

Käsud — käsud meie seadme juhtimiseks; neile saab anda argumendid ja tagastatava väärtuse.

  • RIIK - tagastab praeguse oleku, alates Ühendriigid
  • STATUS - tagastab praeguse oleku, see on stringi täiendus RIIK
  • GPSArray - naaseb GPS string vormis DevVarCharArray

Järgmisena määrake seadme atribuudid, mida saab sellest lugeda/kirjutada.
Skalaarsed atribuudid — lihtsad atribuudid (char, string, long jne)
Spektri atribuudid - ühemõõtmelised massiivid
Pildi atribuudid - kahemõõtmelised massiivid

Ühendriigid — olek, milles meie seade asub.

  • AVATUD — seade on avatud.
  • CLOSE — seade on suletud.
  • EBAÕNNESTUS - viga.
  • ON — seadmest andmete vastuvõtmine.
  • OFF — seadmest pole andmeid.

Näide atribuudi lisamisest gps_string:

Tango juhtnupud

Valimisperiood aeg ms, kui sageli väärtust gps_string värskendatakse. Kui värskendamise aega pole määratud, värskendatakse atribuuti ainult nõudmisel.

Juhtus:

Tango juhtnupud

Nüüd peate koodi genereerima Fail-> Genereeri

Tango juhtnupud

Vaikimisi Makefile'i ei genereerita; esimest korda peate selle loomiseks märkima. Seda tehakse selleks, et selles tehtud muudatusi uue põlvkonna ajal ei kustutataks. Olles selle ühe korra loonud ja oma projekti jaoks konfigureerinud (registreerige kompileerimisvõtmed, lisafailid), võite selle unustada.

Liigume nüüd programmeerimise juurde. pogo with genereeris meie jaoks järgmise:

Tango juhtnupud

Oleme huvitatud NEO6M.cpp ja NEO6M.h. Võtame näite klassikonstruktorist:

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
}

Mis seal on ja mis on siin oluline? Funktsioon init_device() eraldab meie atribuutidele mälu: gps_string & gps_massiiv, kuid see pole oluline. Siin on kõige tähtsam, need on kommentaarid:

/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
    .......
/*----- PROTECTED REGION END -----*/    //  NEO6M::constructor_1

Kõike, mis on selles kommentaariplokis, ei kaasata järgnevate koodide regenereerimise käigus pogosse ära kolima!. Kõik, mis pole plokkides, saab olema! Need on kohad, kus saame programmeerida ja ise toimetada.

Millised on peamised funktsioonid, mida klass sisaldab? NEO6M:

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

Kui tahame lugeda atribuudi väärtust gps_string, kutsutakse funktsioone järgmises järjekorras: alati_teostatud_konks, read_attr_hardware и loe_gps_string. Read_gps_string täidab väärtusega 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
}

Koostamine

Minge lähtekausta ja:

make

Programm kompileeritakse kausta ~/DeviceServers.

tango-cs@tangobox:~/DeviceServers$ ls
NEO6M

JIVE

jive

Tango juhtnupud

Andmebaasis on juba mõned seadmed, loome nüüd oma Redigeerimine->Loo server

Tango juhtnupud

Proovime nüüd sellega ühenduse luua:

Tango juhtnupud

Miski ei tööta, kõigepealt peame käivitama oma programmi:

sudo ./NEO6M neo6m -v2

Saan ühenduse luua ainult õigustega juur-A. v — metsaraie tase.

Nüüd saame ühendada:

Tango juhtnupud

Klient

Graafikas on piltide vaatamine kindlasti hea, kuid vaja on midagi kasulikumat. Kirjutame kliendi, mis loob ühenduse meie seadmega ja võtab sellelt näidud.

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

Kuidas koostada:

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

Tulemus:

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

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

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

Saime tulemuse käsutagastusena, võttes stringi ja märkide massiivi atribuudid.

Viited

Kirjutasin artikli enda jaoks, sest mõne aja pärast hakkan unustama, kuidas ja mida teha.

Tänan teid tähelepanu eest.

Allikas: www.habr.com

Lisa kommentaar