ื‘ืงืจื•ืช ื˜ื ื’ื•

ื‘ืงืจื•ืช ื˜ื ื’ื•

ืžื”ื• ื˜ื ื’ื•?

ื–ื•ื”ื™ ืžืขืจื›ืช ืœื ื™ื”ื•ืœ ื—ื•ืžืจื” ื•ืชื•ื›ื ื” ืฉื•ื ื™ื.
TANGO ืชื•ืžื›ืช ื›ื™ื•ื ื‘-4 ืคืœื˜ืคื•ืจืžื•ืช: Linux, Windows NT, Solaris ื•-HP-UX.
ื›ืืŸ ื ืชืืจ ืขื‘ื•ื“ื” ืขื ืœื™ื ื•ืงืก (ืื•ื‘ื•ื ื˜ื• 18.04)

ืœืฉื ืžื” ื–ื”?

ืžืคืฉื˜ ืขื‘ื•ื“ื” ืขื ืฆื™ื•ื“ ื•ืชื•ื›ื ื•ืช ืฉื•ื ื•ืช.

  • ืืชื” ืœื ืฆืจื™ืš ืœื—ืฉื•ื‘ ืื™ืš ืœืื—ืกืŸ ื ืชื•ื ื™ื ื‘ืžืกื“ ื”ื ืชื•ื ื™ื, ื–ื” ื›ื‘ืจ ื ืขืฉื” ื‘ืฉื‘ื™ืœืš.
  • ื™ืฉ ืฆื•ืจืš ืจืง ืœืชืืจ ืืช ื”ืžื ื’ื ื•ืŸ ืขื‘ื•ืจ ื—ื™ื™ืฉื ื™ ืกืงืจ.
  • ืžืฆืžืฆื ืืช ื›ืœ ื”ืงื•ื“ ืฉืœืš ืœืชืงืŸ ืื—ื“.

ื”ื™ื›ืŸ ื ื™ืชืŸ ืœื”ืฉื™ื’ ืื•ืชื•?

ืœื ื™ื›ื•ืœืชื™ ืœื”ืคืขื™ืœ ืื•ืชื• ืžืงื•ื“ ื”ืžืงื•ืจ; ื”ืฉืชืžืฉืชื™ ื‘ืชืžื•ื ื” ืžื•ื›ื ื” ืฉืœ TangoBox 9.3 ื›ื“ื™ ืœืขื‘ื•ื“.
ื”ื”ื•ืจืื•ืช ืžืชืืจื•ืช ื›ื™ืฆื“ ืœื”ืชืงื™ืŸ ืžื—ื‘ื™ืœื•ืช.

ืžืžื” ื–ื” ืžื•ืจื›ื‘?

  • ื’'ื™ื™ื‘ - ืžืฉืžืฉ ืœืฆืคื™ื™ื” ื•ืขืจื™ื›ื” ืฉืœ ืžืกื“ ื”ื ืชื•ื ื™ื ืฉืœ TANGO.
  • POGO - ืžื—ื•ืœืœ ืงื•ื“ ืขื‘ื•ืจ ืฉืจืชื™ ืžื›ืฉื™ืจื™ TANGO.
  • ืืกื˜ื•ืจ - ืžื ื”ืœ ืชื•ื›ื ื™ืช ืขื‘ื•ืจ ืžืขืจื›ืช TANGO.

ื ืชืขื ื™ื™ืŸ ืจืง ื‘ืฉื ื™ ื”ืžืจื›ื™ื‘ื™ื ื”ืจืืฉื•ื ื™ื.

ืฉืคื•ืช ืชื›ื ื•ืช ื ืชืžื›ื•ืช

  • C
  • C + +
  • Java
  • JavaScript
  • ืคื™ืชื•ืŸ
  • ืžื˜ืœื‘
  • LabVIEW

ืขื‘ื“ืชื™ ืขื ื–ื” ื‘-python & c++. ื›ืืŸ C++ ื™ืฉืžืฉ ื›ื“ื•ื’ืžื”.

ื›ืขืช ื ืขื‘ื•ืจ ืœืชื™ืื•ืจ ื›ื™ืฆื“ ืœื—ื‘ืจ ืืช ื”ืžื›ืฉื™ืจ ืœ-TANGO ื•ืื™ืš ืœืขื‘ื•ื“ ืื™ืชื•. ื”ืื’ืจื” ืชื™ืœืงื— ื›ื“ื•ื’ืžื” GPS neo-6m-0-001:

ื‘ืงืจื•ืช ื˜ื ื’ื•

ื›ืคื™ ืฉื ื™ืชืŸ ืœืจืื•ืช ื‘ืชืžื•ื ื”, ืื ื• ืžื—ื‘ืจื™ื ืืช ื”ืœื•ื— ืœืžื—ืฉื‘ ื‘ืืžืฆืขื•ืช UART CP2102. ื›ืืฉืจ ืžื—ื•ื‘ืจ ืœืžื—ืฉื‘, ื”ื”ืชืงืŸ ืžื•ืคื™ืข /dev/ttyUSB[0-N], ื‘ื“ืจืš ื›ืœืœ /dev/ttyUSB0.

POGO

ืขื›ืฉื™ื• ื‘ื•ืื• ื ืชื—ื™ืœ ืคื•ื’, ื•ืฆื•ืจ ืงื•ื“ ืฉืœื“ ืœืขื‘ื•ื“ื” ืขื ื”ืœื•ื— ืฉืœื ื•.

pogo

ื‘ืงืจื•ืช ื˜ื ื’ื•

ื›ื‘ืจ ื™ืฆืจืชื™ ืืช ื”ืงื•ื“, ื‘ื•ืื• ื ื™ืฆื•ืจ ืื•ืชื• ืฉื•ื‘ ืงื•ื‘ืฅ->ื—ื“ืฉ.

ื‘ืงืจื•ืช ื˜ื ื’ื•

ืื ื—ื ื• ืžืงื‘ืœื™ื ืืช ื”ื“ื‘ืจื™ื ื”ื‘ืื™ื:

ื‘ืงืจื•ืช ื˜ื ื’ื•

ื”ืžื›ืฉื™ืจ ืฉืœื ื• (ื‘ืขืชื™ื“, ื‘ืžื›ืฉื™ืจ ื ืชื›ื•ื•ืŸ ืœื—ืœืง ื”ืชื•ื›ื ื”) ืจื™ืง ื•ื™ืฉ ืœื• ืฉืชื™ ืคืงื•ื“ื•ืช ืฉืœื™ื˜ื”: ืžื“ื™ื ื” & ืžืฆื‘.

ื™ืฉ ืœืžืœื ืื•ืชื• ื‘ืชื›ื•ื ื•ืช ื”ื“ืจื•ืฉื•ืช:

ื ื›ืก ืžื›ืฉื™ืจ - ืขืจื›ื™ ื‘ืจื™ืจืช ืžื—ื“ืœ ืฉืื ื• ืžืขื‘ื™ืจื™ื ืœืžื›ืฉื™ืจ ื›ื“ื™ ืœืืชื—ืœ ืื•ืชื•; ืขื‘ื•ืจ ืœื•ื— ื”-GPS, ืขืœื™ืš ืœื”ืขื‘ื™ืจ ืืช ืฉื ื”ืœื•ื— ื‘ืžืขืจื›ืช com="/dev/ttyUSB0" ื•ืžื”ื™ืจื•ืช ื™ืฆื™ืืช COM baudrade=9600

ืคืงื•ื“ื•ืช - ืคืงื•ื“ื•ืช ืœืฉืœื™ื˜ื” ื‘ืžื›ืฉื™ืจ ืฉืœื ื•; ื ื™ืชืŸ ืœืชืช ืœื”ืŸ ืืจื’ื•ืžื ื˜ื™ื ื•ืขืจืš ื”ื—ื–ืจื”.

  • ืžื“ื™ื ื” - ืžื—ื–ื™ืจ ืืช ื”ืžืฆื‘ ื”ื ื•ื›ื—ื™, ืž ื”ื‘ืจื™ืช
  • ืกื˜ึธื˜ื•ึผืก - ืžื—ื–ื™ืจื” ืืช ื”ืกื˜ื˜ื•ืก ื”ื ื•ื›ื—ื™, ื–ื• ื”ื”ืฉืœืžื” ืฉืœ ื”ืžื—ืจื•ื–ืช ืžื“ื™ื ื”
  • GPSArray - ื”ื—ื–ืจื•ืช GPS ืžื—ืจื•ื–ืช ื‘ื˜ื•ืคืก DevVarCharArray

ืœืื—ืจ ืžื›ืŸ, ื”ื’ื“ืจ ืืช ืชื›ื•ื ื•ืช ื”ืžื›ืฉื™ืจ ืฉื ื™ืชืŸ ืœืงืจื•ื/ืœื›ืชื•ื‘ ืืœื™ื•/ืžืžื ื•.
ืชื›ื•ื ื•ืช ืกืงืœืจื™ื•ืช - ืชื›ื•ื ื•ืช ืคืฉื•ื˜ื•ืช (char, ืžื—ืจื•ื–ืช, ืืจื•ื›ื” ื•ื›ื•')
ืชื›ื•ื ื•ืช ืกืคืงื˜ืจื•ื - ืžืขืจื›ื™ื ื—ื“ ืžื™ืžื“ื™ื™ื
ืชื›ื•ื ื•ืช ืชืžื•ื ื” - ืžืขืจื›ื™ื ื“ื• ืžื™ืžื“ื™ื™ื

ื”ื‘ืจื™ืช - ื”ืžืฆื‘ ืฉื‘ื• ื ืžืฆื ื”ืžื›ืฉื™ืจ ืฉืœื ื•.

  • ืœึดืคึฐืชื•ึนื—ึท - ื”ืžื›ืฉื™ืจ ืคืชื•ื—.
  • ืœืกื’ื•ืจ - ื”ืžื›ืฉื™ืจ ืกื’ื•ืจ.
  • ื›ืฉืœ - ืฉื’ื™ืื”.
  • 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 ื‘ืžื”ืœืš ื—ื™ื“ื•ืฉื™ ื”ืงื•ื“ ื”ื‘ืื™ื ื–ื•ื–!. ื›ืœ ืžื” ืฉืœื ื ืžืฆื ื‘ื‘ืœื•ืงื™ื ื™ื”ื™ื”! ืืœื” ื”ืžืงื•ืžื•ืช ืฉื‘ื”ื ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœืชื›ื ืช ื•ืœื‘ืฆืข ืขืจื™ื›ื•ืช ืžืฉืœื ื•.

ืขื›ืฉื™ื• ืžื”ืŸ ื”ืคื•ื ืงืฆื™ื•ืช ื”ืขื™ืงืจื™ื•ืช ืฉื”ืžื—ืœืงื” ืžื›ื™ืœื”? 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);

ื›ืืฉืจ ืื ื• ืจื•ืฆื™ื ืœืงืจื•ื ืืช ืขืจืš ื”ืชื›ื•ื ื” gps_string, ื”ืคื•ื ืงืฆื™ื•ืช ื™ื™ืงืจืื• ื‘ืกื“ืจ ื”ื‘ื: ื”ื•ืง_ืžื‘ื•ืฆืข_ืชืžื™ื“, read_attr_hardware ะธ ืžื—ืจื•ื–ืช_gps_read. 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

ื‘ืงืจื•ืช ื˜ื ื’ื•

ื™ืฉ ื›ื‘ืจ ื›ืžื” ืžื›ืฉื™ืจื™ื ื‘ืžืกื“ ื”ื ืชื•ื ื™ื, ื‘ื•ืื• ื ื™ืฆื•ืจ ืขื›ืฉื™ื• ืืช ืฉืœื ื• ืขืจื™ื›ื”->ืฆื•ืจ ืฉืจืช

ื‘ืงืจื•ืช ื˜ื ื’ื•

ืขื›ืฉื™ื• ื ื ืกื” ืœื”ืชื—ื‘ืจ ืืœื™ื•:

ื‘ืงืจื•ืช ื˜ื ื’ื•

ืฉื•ื ื“ื‘ืจ ืœื ื™ืขื‘ื•ื“, ืจืืฉื™ืช ืขืœื™ื ื• ืœื”ืคืขื™ืœ ืืช ื”ืชื•ื›ื ื™ืช ืฉืœื ื•:

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

ื›ื™ืฆื“ ืœื”ืจื›ื™ื‘:

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

ื”ื•ืกืคืช ืชื’ื•ื‘ื”