Това е система за управление на различен хардуер и софтуер.
В момента TANGO поддържа 4 платформи: Linux, Windows NT, Solaris и HP-UX.
Тук ще опишем работата с Linux (Ubuntu 18.04)
За какво е?
Улеснява работата с различно оборудване и софтуер.
Не е нужно да мислите как да съхранявате данни в базата данни, това вече е направено вместо вас.
Необходимо е само да се опише механизмът за анкетиране на сензори.
Не можах да го стартирам от изходния код; използвах готово изображение на TangoBox 9.3, за да работя.
Инструкциите описват как да инсталирате от пакети.
В какво се състои?
ДЖИВ — използва се за преглед и редактиране на базата данни TANGO.
POGO — генератор на код за сървъри на устройства TANGO.
Астор — програмен мениджър на системата TANGO.
Ще ни интересуват само първите два компонента.
Поддържани езици за програмиране
C
C + +
Ява
JavaScript
Питон
MATLAB
LabVIEW
Работих с него в python & c++. Тук C++ ще бъде използван като пример.
Сега нека да преминем към описание на това как да свържете устройството към TANGO и как да работите с него. Таксата ще бъде взета като пример GPS нео-6м-0-001:
Както можете да видите на снимката, свързваме платката към компютъра чрез UART CP2102. При свързване към компютър устройството се появява /dev/ttyUSB[0-N], обикновено /dev/ttyUSB0.
POGO
Сега да стартираме пого, и генериране на скелетен код за работа с нашата дъска.
pogo
Вече създадох кода, нека го създадем отново Файл->Нов.
Получаваме следното:
Нашето устройство (в бъдеще под устройство ще разбираме софтуерната част) е празно и има две команди за управление: Област & Статус.
Той трябва да бъде попълнен с необходимите атрибути:
Свойство на устройството — стойности по подразбиране, които прехвърляме към устройството, за да го инициализираме; за GPS платката трябва да прехвърлите името на платката в системата com="/dev/ttyUSB0" и скорост на com порта бод = 9600
Команди — команди за управление на нашето устройство; могат да им бъдат дадени аргументи и върната стойност.
ДЪРЖАВНА - връща текущото състояние, от членки
СТАТУТ - връща текущия статус, това е допълнение към низа ДЪРЖАВНА
GPSArray - се завръща GPS низ във формата DevVarCharArray
След това задайте атрибутите на устройството, които могат да се четат/записват на/от него. Скаларни атрибути — прости атрибути (char, string, long и т.н.) Атрибути на спектъра - едномерни масиви Атрибути на изображението - двумерни масиви
членки — състоянието, в което се намира нашето устройство.
OPEN — устройството е отворено.
CLOSE — устройството е затворено.
ГРЕШКА - грешка.
ON — получаване на данни от устройството.
OFF — няма данни от устройството.
Пример за добавяне на атрибут gps_низ:
Избирателен период време в 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_низ & gps_масив, но не е важно. Най-важното тук, това са коментарите:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1
Всичко, което е вътре в този блок за коментари, няма да бъде включено в pogo по време на следващите регенерации на кода Махни се!. Всичко, което не е в блокове, ще бъде! Това са местата, където можем да програмираме и правим собствени редакции.
Сега какви са основните функции, които съдържа класът? NEO6M:
Когато искаме да прочетем стойността на атрибута gps_низ, функциите ще бъдат извикани в следния ред: винаги_изпълнена_кука, 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
Вече има някои устройства в базата данни, нека сега създадем нашето Редактиране->Създаване на сървър
Сега нека се опитаме да се свържем с него:
Нищо няма да работи, първо трябва да стартираме нашата програма:
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);
}
}