Тоа е систем за управување со различен хардвер и софтвер.
TANGO моментално поддржува 4 платформи: Linux, Windows NT, Solaris и HP-UX.
Овде ќе ја опишеме работата со Linux (Ubuntu 18.04)
За што е?
Ја поедноставува работата со различна опрема и софтвер.
Не треба да размислувате како да складирате податоци во базата на податоци, тоа е веќе направено за вас.
Потребно е само да се опише механизмот за сензори за гласање.
Не можев да го стартувам од изворниот код, користев готова слика на TangoBox 9.3 за работа.
Упатствата опишуваат како да инсталирате од пакети.
Од што се состои?
JIVE — се користи за прегледување и уредување на базата на податоци на TANGO.
ПОГО — генератор на код за сервери на уреди TANGO.
Астор — програмски менаџер за системот TANGO.
Ќе нè интересираат само првите две компоненти.
Поддржани програмски јазици
C
C + +
Јава
Го вклучите Javascript-
Пајтон
Матлаб
LabVIEW
Работев со него во python & c++. Овде C++ ќе се користи како пример.
Сега да преминеме на опис на тоа како да го поврзете уредот со TANGO и како да работите со него. Надоместокот ќе се земе како пример GPS нео-6м-0-001:
Како што можете да видите на сликата, плочката ја поврзуваме со компјутерот преку UART CP2102. Кога е поврзан со компјутер, уредот се појавува /dev/ttyUSB[0-N], обично /dev/ttyUSB0.
ПОГО
Сега да започнеме пого, и генерира скелет код за работа со нашата табла.
pogo
Веќе го создадов кодот, ајде да го креираме повторно Датотека->Ново.
Го добиваме следново:
Нашиот уред (во иднина под уред ќе го мислиме софтверскиот дел) е празен и има две контролни команди: Држава & Статус.
Мора да се пополни со потребните атрибути:
Својство на уредот — стандардните вредности што ги пренесуваме на уредот за да го иницијализираме за таблата GPS, треба да го пренесете името на таблата во системот; com="/dev/ttyUSB0" и брзината на пристаништето баудрејд=9600
Команди — наредбите за контрола на нашиот уред може да добијат аргументи и повратна вредност.
ДРЖАВА - ја враќа моменталната состојба, од Државите
СТАТУС - го враќа тековниот статус, ова е дополнување на низата ДРЖАВА
GPSArray - враќа GPS низа во форма DevVarCharArray
Следно, поставете ги атрибутите на уредот што може да се читаат/пишуваат на/од него. Скаларни атрибути - едноставни атрибути (кар, стринг, долг, итн.) Спектар атрибути - еднодимензионални низи Атрибути на слика - дводимензионални низи
Државите — состојбата во која се наоѓа нашиот уред.
ОТВОРЕНО — уредот е отворен.
CLOSE - уредот е затворен.
НЕСПЕШЕН - грешка.
ON — примајте податоци од уредот.
OFF — нема податоци од уредот.
Пример за додавање атрибут 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
Сè што е во овој блок за коментари нема да биде вклучено во пого за време на последователните регенерации на кодот тргни се!. Сè што не е во блокови ќе биде! Ова се местата каде што можеме да програмираме и да правиме свои уредувања.
Сега кои се главните функции што ги содржи класата? NEO6M:
Кога сакаме да ја прочитаме вредноста на атрибутот gps_string, функциите ќе се повикуваат по следниот редослед: секогаш_извршена_кука, 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
Веќе има некои уреди во базата на податоци, ајде сега да го создадеме нашиот Уреди->Креирај сервер
Сега да се обидеме да се поврземе со него:
Ништо нема да работи, прво треба да ја извршиме нашата програма:
sudo ./NEO6M neo6m -v2
Можам да се поврзам на ком-портот само со права корен-А. 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);
}
}