Бұл әртүрлі аппараттық және бағдарламалық құралдарды басқаруға арналған жүйе.
TANGO қазіргі уақытта 4 платформаны қолдайды: Linux, Windows NT, Solaris және HP-UX.
Мұнда біз Linux-пен жұмыс істеуді сипаттаймыз (Ubuntu 18.04)
Ол не үшін?
Түрлі жабдықтармен және бағдарламалық қамтамасыз етумен жұмысты жеңілдетеді.
Дерекқорда деректерді қалай сақтау керектігі туралы ойлаудың қажеті жоқ, ол сіз үшін жасалған.
Мен оны бастапқы кодтан іске қоса алмадым; жұмыс істеу үшін TangoBox 9.3 дайын кескінін пайдаландым.
Нұсқаулар бумалардан орнату жолын сипаттайды.
Ол неден тұрады?
ДЖИВЕ — TANGO дерекқорын қарау және өңдеу үшін пайдаланылады.
POGO — TANGO құрылғысының серверлеріне арналған код генераторы.
Астор — TANGO жүйесіне арналған бағдарлама менеджері.
Бізді тек алғашқы екі компонент қызықтырады.
Қолдау көрсетілетін бағдарламалау тілдері
C
C ++
Java
JavaScript
Python
Матлаб
Зертханалық шолу
Мен онымен 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
Командалар — құрылғымызды басқаруға арналған командалар; оларға аргументтер мен қайтарылатын мән берілуі мүмкін.
МЕМЛЕКЕТТІК - ағымдағы күйді қайтарады, бастап мемлекеттер
STATUS - ағымдағы күйді қайтарады, бұл жолдың толықтаушысы МЕМЛЕКЕТТІК
GPSArray - қайтарады жаһандық позициялау жүйесі пішіндегі жол DevVarCharArray
Әрі қарай, оған оқуға/жазуға болатын құрылғы атрибуттарын орнатыңыз. Скалярлық атрибуттар — қарапайым атрибуттар (char, string, long, т.б.) Спектр атрибуттары - бір өлшемді массивтер Кескін атрибуттары - екі өлшемді массивтер
мемлекеттер — құрылғымыз орналасқан мемлекет.
АШЫҚ — құрылғы ашық.
ЖАБЫҚ - құрылғы жабық.
СӘТТІЛІК - қате.
ON — құрылғыдан деректерді алу.
OFF — құрылғыдан деректер жоқ.
Төлсипат қосу мысалы gps_string:
Дауыс беру кезеңі уақыты мс, gps_string мәні қаншалықты жиі жаңартылады. Жаңарту уақыты көрсетілмесе, төлсипат тек сұрау бойынша жаңартылады.
Болған оқиға:
Енді кодты жасау керек Файл->Жасау
Әдепкі бойынша, Makefile жасалмайды; оны жасау үшін бірінші рет құсбелгіні қою керек. Бұл оған енгізілген өзгерістер жаңа буын кезінде жойылмауы үшін жасалады. Оны бір рет жасап, оны жобаңызға конфигурациялағаннан кейін (тіркеу компиляция кілттері, қосымша файлдар), сіз бұл туралы ұмыта аласыз.
Енді бағдарламалауға көшейік. пого біз үшін келесіні жасады:
Бізді 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_массив, бірақ маңызды емес. Мұнда ең бастысы, бұл пікірлер:
/*----- 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
Деректер базасында бірнеше құрылғылар бар, енді өзіміздікін жасайық Өңдеу->Сервер құру
Енді оған қосылуға тырысайық:
Ештеңе жұмыс істемейді, алдымен бағдарламамызды іске қосу керек:
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);
}
}