Tango Controls

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ TANGO?

Π­Ρ‚ΠΎ систСма для управлСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ обСспСчСниСм.
TANGO ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ 4 ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚: Linux, Windows NT, Solaris ΠΈ HP-UX.
Π—Π΄Π΅ΡΡŒ Π±ΡƒΠ΄Π΅Ρ‚ описана Ρ€Π°Π±ΠΎΡ‚Π° с Linux(Ubuntu 18.04)

Для Ρ‡Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ?

Π£ΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ софтом.

  • Π’Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ ΠΊΠ°ΠΊ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π‘Π”, это ΡƒΠΆΠ΅ сдСлано Π·Π° Вас.
  • НуТно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ опроса Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠΎΠ².
  • Π‘Π²ΠΎΠ΄ΠΈΡ‚ вСсь Π’Π°Ρˆ ΠΊΠΎΠ΄ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ стандарту.

Π“Π΄Π΅ Π²Π·ΡΡ‚ΡŒ?

Из исходников Π½Π΅ смог Π΅Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ, для Ρ€Π°Π±ΠΎΡ‚Ρ‹ использовал Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π· TangoBox 9.3.
Π’ инструкции описано ΠΊΠ°ΠΊ ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ· ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ².

Из Ρ‡Π΅Π³ΠΎ ΠΎΠ½Π° состоит?

  • JIVE β€” слуТит для просмотра ΠΈ рСдактирования Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… TANGO.
  • POGO β€” Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊΠΎΠ΄Π° для сСрвСров устройств TANGO.
  • Astor β€” ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ для систСмы TANGO.

Нас Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°.

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ языки программирования

  • C
  • C++
  • Java
  • JavaScript
  • Python
  • Matlab
  • LabVIEW

Π― Ρ€Π°Π±ΠΎΡ‚Π°Π» с Π½Π΅ΠΉ Π½Π° python & c++. Π—Π΄Π΅ΡΡŒ Π² качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ c++.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ описанию ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ устройство ΠΊ TANGO ΠΈ ΠΊΠ°ΠΊ с Π½ΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π±ΡƒΠ΄Π΅Ρ‚ взята ΠΏΠ»Π°Ρ‚Π° GPS neo-6m-0-001:

Tango Controls

Как Π²ΠΈΠ΄Π½ΠΎ Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅ ΠΏΠ»Π°Ρ‚Ρƒ ΠΊ ПК ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Ρ‡Π΅Ρ€Π΅Π· UART CP2102. ΠŸΡ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΊ ПК появляСтся устройство /dev/ttyUSB[0-N], ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ /dev/ttyUSB0.

POGO

Π’Π΅ΠΏΠ΅Ρ€ΡŒ запустим pogo, ΠΈ с Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ скСлСт ΠΊΠΎΠ΄ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с нашСй ΠΏΠ»Π°Ρ‚ΠΎΠΉ.

pogo

Tango Controls

Π£ мСня ΡƒΠΆΠ΅ Π±Ρ‹Π» создан ΠΊΠΎΠ΄, создадим Π΅Π³ΠΎ Π·Π°Π½ΠΎΠ²ΠΎ File->New.

Tango Controls

ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

Tango Controls

НашС устройство(ΠΏΠΎΠ΄ устройством Π² дальнСйшСм Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒΡΡ Π²Π²ΠΈΠ΄Ρƒ программная Ρ‡Π°ΡΡ‚ΡŒ) пустоС ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ управлСния: State & Status.

Π•Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ:

Device Property β€” значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π² устройство для Π΅Π³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, для ΠΏΠ»Π°Ρ‚Ρ‹ GPS Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ имя ΠΏΠ»Π°Ρ‚Ρ‹ Π² систСмС com="/dev/ttyUSB0" ΠΈ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ com ΠΏΠΎΡ€Ρ‚Π° baudrade=9600

Commands β€” ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ управлСния нашим устройством, ΠΈΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

  • STATE β€” Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС, ΠΈΠ· States
  • STATUS β€” Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ статус, это строковоС Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ STATE
  • GPSArray β€” Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ gps строку Π² Π²ΠΈΠ΄Π΅ DevVarCharArray

Π”Π°Π»Π΅Π΅ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ устройства ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ/ΠΏΠΈΡΠ°Ρ‚ΡŒ Π²/ΠΈΠ· Π½Π΅Π³ΠΎ.
Scalar Attributes β€” простыС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ (char, string, long ΠΈ Ρ‚.ΠΏ.)
Spectrum Attributes β€” ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹Π΅ массивы
Image Attributes β€” Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹Π΅ массивы

States β€” состояния Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ находится нашС устройство.

  • OPEN β€” устройство ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎ.
  • CLOSE β€” устройство Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎ.
  • FAILT β€” ошибка.
  • ON β€” ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ с устройства.
  • OFF β€” Π½Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Ρ… с устройства.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ добавлСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° gps_string:

Tango Controls

Polling period врСмя Π² мс, ΠΊΠ°ΠΊ часто Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ gps_string. Если врСмя обновлСния Π½Π΅ Π·Π°Π΄Π°Ρ‚ΡŒ, Ρ‚ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ запросу.

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ:

Tango Controls

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΡƒΠΆΠ½ΠΎ с Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ File->Generate

Tango Controls

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Makefile Π½Π΅ гСнСрируСтся, Π² 1-Ρ‹ΠΉ Ρ€Π°Π· Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π³Π°Π»ΠΎΡ‡ΠΊΡƒ Ρ‡Ρ‚ΠΎ Π±Ρ‹ Π΅Π³ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ. Π­Ρ‚ΠΎ сдСлано для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎ Π±Ρ‹ внСсСнныС Π² Π½Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΊΠΈ Π½Π΅ ΡƒΠ΄Π°Π»ΡΠ»ΠΈΡΡŒ ΠΏΡ€ΠΈ Π½ΠΎΠ²ΠΎΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ. Π‘ΠΎΠ·Π΄Π°Π² Π΅Π³ΠΎ Π΅Π΄ΠΈΠ½ΠΎΠΆΠ΄Ρ‹ ΠΈ настроив ΠΏΠΎΠ΄ свой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚(ΠΏΡ€ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡ΠΈ компиляции, Π΄ΠΎΠΏ. Ρ„Π°ΠΉΠ»Ρ‹) ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎ Π½Π΅Π³ΠΎ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ нСпосрСдствСнно ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ. pogo с Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π» Π½Π°ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

Tango Controls

Нас Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒ 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, Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π·Π²Π°Π½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ порядкС: always_executed_hook, 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 Controls

Π’ Π‘Π” ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ устройства, создадим Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ нашС Edit->Create Server

Tango Controls

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ Π½Π΅ΠΌΡƒ:

Tango Controls

Ни Ρ‡Π΅Π³ΠΎ Π½Π΅ Π²Ρ‹ΠΉΠ΄Π΅Ρ‚, сначала Π½Π°Π΄ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π½Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ:

sudo ./NEO6M neo6m -v2

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ com ΠΏΠΎΡ€Ρ‚Ρƒ Ρƒ мСня ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΏΡ€Π°Π²Π°ΠΌΠΈ root-Π°. v β€” ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ логирования.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ:

Tango Controls

ΠšΠ»ΠΈΠ΅Π½Ρ‚

Π’ Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Π½ΠΎ Π½ΡƒΠΆΠ½ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅. НапишСм ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ ΠΊ Π½Π°ΡˆΠ΅ΠΌΡƒ устройству ΠΈ Π·Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ с Π½Π΅Π³ΠΎ показания.

#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

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² качСствС Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, взятия Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² строки ΠΈ массива символов.

Бсылки

Π‘Ρ‚Π°Ρ‚ΡŒΡŽ писал для сСбя, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ спустя Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя Π½Π°Ρ‡ΠΈΠ½Π°ΡŽ Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΈ Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ.

Бпасибо за вниманиС.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com