Ovládání tanga

Ovládání tanga

Co je TANGO?

Jedná se o systém pro správu různého hardwaru a softwaru.
TANGO aktuálně podporuje 4 platformy: Linux, Windows NT, Solaris a HP-UX.
Zde popíšeme práci s Linuxem (Ubuntu 18.04)

Nebo co ne?

Zjednodušuje práci s různými zařízeními a softwarem.

  • Nemusíte přemýšlet o tom, jak data do databáze uložit, je to již hotové za vás.
  • Je pouze nutné popsat mechanismus pro polling senzory.
  • Redukuje veškerý váš kód na jeden standard.

Kde se dostat?

Nemohl jsem to spustit ze zdrojového kódu, k práci jsem použil hotový obrázek TangoBoxu 9.3.
Pokyny popisují, jak nainstalovat z balíčků.

Z čeho se skládá?

  • JIVE — slouží k prohlížení a editaci databáze TANGO.
  • POGO — generátor kódu pro servery zařízení TANGO.
  • Astor — programový manažer pro systém TANGO.

Nás budou zajímat pouze první dvě složky.

Podporované programovací jazyky

  • C
  • C + +
  • Jáva
  • JavaScript
  • PYTHON
  • Matlab
  • LabVIEW

Pracoval jsem s tím v pythonu a c++. Zde bude jako příklad použit C++.

Nyní přejdeme k popisu, jak zařízení připojit k TANGO a jak s ním pracovat. Poplatek bude brán jako příklad GPS neo-6m-0-001:

Ovládání tanga

Jak vidíte na obrázku, desku připojujeme k PC přes UART CP2102. Po připojení k počítači se zobrazí zařízení /dev/ttyUSB[0-N], obvykle /dev/ttyUSB0.

POGO

Nyní spustíme Pogoa vygenerujte kód kostry pro práci s naší deskou.

pogo

Ovládání tanga

Kód jsem již vytvořil, pojďme ho vytvořit znovu Soubor->Nový.

Ovládání tanga

Získáme následující:

Ovládání tanga

Naše zařízení (v budoucnu budeme zařízením rozumět softwarovou část) je prázdné a má dva ovládací příkazy: Stát & Status.

Musí být vyplněno potřebnými atributy:

Vlastnost zařízení — výchozí hodnoty, které přeneseme do zařízení za účelem jeho inicializace; pro desku GPS je třeba přenést název desky v systému com="/dev/ttyUSB0" a rychlost com portu baudrade=9600

Příkazy — příkazy pro ovládání našeho zařízení; lze jim zadat argumenty a návratovou hodnotu.

  • STÁT - vrátí aktuální stav, od States
  • POSTAVENÍ - vrátí aktuální stav, toto je doplněk řetězce STÁT
  • GPSArray - vrací gps řetězec ve formuláři DevVarCharArray

Dále nastavte atributy zařízení, které lze číst/zapisovat do/z něj.
Skalární atributy — jednoduché atributy (char, string, long atd.)
Atributy spektra - jednorozměrná pole
Atributy obrázku - dvourozměrná pole

States — stav, ve kterém se naše zařízení nachází.

  • OTEVŘENO — zařízení je otevřené.
  • ZAVŘÍT - zařízení je zavřené.
  • SELHAT - chyba.
  • ON — přijímat data ze zařízení.
  • OFF — žádná data ze zařízení.

Příklad přidání atributu gps_string:

Ovládání tanga

Období hlasování čas v ms, jak často bude hodnota gps_string aktualizována. Pokud není čas aktualizace zadán, bude atribut aktualizován pouze na vyžádání.

Ukázalo se:

Ovládání tanga

Nyní musíte vygenerovat kód Soubor->Generovat

Ovládání tanga

Ve výchozím nastavení se Makefile negeneruje; poprvé je potřeba zaškrtnout políčko, aby se vytvořil. To se provádí tak, aby se v něm provedené změny při nové generaci nesmazaly. Jakmile jej jednou vytvoříte a nakonfigurujete pro svůj projekt (zaregistrujte kompilační klíče, další soubory), můžete na to zapomenout.

Nyní přejděme k programování. pogo with nám vygeneroval následující:

Ovládání tanga

Nás budou zajímat NEO6M.cpp & NEO6M.h. Vezměme si příklad konstruktoru třídy:

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
}

Co tam je a co je zde důležité? Funkce init_device() alokuje paměť pro naše atributy: gps_string & gps_array, ale to není důležité. Tady je to nejdůležitější, toto jsou komentáře:

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

Vše, co je uvnitř tohoto bloku komentářů, nebude zahrnuto do pogo během následujících regenerací kódu Uhni!. Vše, co není v blocích, bude! To jsou místa, kde můžeme programovat a provádět vlastní úpravy.

Jaké jsou tedy hlavní funkce, které třída obsahuje? 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);

Když chceme číst hodnotu atributu gps_string, funkce budou volány v následujícím pořadí: always_executed_hook, read_attr_hardware и read_gps_string. Read_gps_string vyplní gps_string hodnotou.

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
}

Kompilace

Přejděte do zdrojové složky a:

make

Program bude zkompilován do složky ~/DeviceServers.

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

JIVE

jive

Ovládání tanga

V databázi již jsou nějaká zařízení, pojďme nyní vytvořit naše Upravit->Vytvořit server

Ovládání tanga

Nyní se k němu zkusíme připojit:

Ovládání tanga

Nic nebude fungovat, nejprve musíme spustit náš program:

sudo ./NEO6M neo6m -v2

Ke com portu se mohu připojit pouze s právy kořen-a v — úroveň protokolování.

Nyní se můžeme připojit:

Ovládání tanga

Zákazník

V grafice je prohlížení obrázků jistě dobré, ale potřebujete něco užitečnějšího. Pojďme napsat klienta, který se připojí k našemu zařízení a bude z něj odečítat hodnoty.

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

Jak sestavit:

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

Výsledek:

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

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

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

Výsledek jsme dostali jako návrat příkazu, přičemž jsme převzali atributy řetězce a pole znaků.

reference

Článek jsem napsal pro sebe, protože po chvíli začínám zapomínat, jak a co mám dělat.

Děkuji vám za pozornost.

Zdroj: www.habr.com

Přidat komentář