Bu turli xil apparat va dasturiy ta'minotni boshqarish tizimi.
TANGO hozirda 4 ta platformani qo'llab-quvvatlaydi: Linux, Windows NT, Solaris va HP-UX.
Bu erda biz Linux bilan ishlashni tasvirlaymiz (Ubuntu 18.04)
Chego kerakmi?
Turli uskunalar va dasturiy ta'minot bilan ishlashni soddalashtiradi.
Ma'lumotlar bazasida ma'lumotlarni qanday saqlash haqida o'ylashingiz shart emas, bu siz uchun allaqachon qilingan.
Men uni manba kodidan ishga tushira olmadim; ishlash uchun TangoBox 9.3 ning tayyor tasviridan foydalandim.
Ko'rsatmalar paketlardan qanday o'rnatishni tasvirlaydi.
U nimadan iborat?
JIVE — TANGO ma'lumotlar bazasini ko'rish va tahrirlash uchun ishlatiladi.
POGO — TANGO qurilma serverlari uchun kod generatori.
Astor — TANGO tizimi uchun dastur menejeri.
Bizni faqat dastlabki ikkita komponent qiziqtiradi.
Qo'llab-quvvatlanadigan dasturlash tillari
C
C ++
Java
JavaScript
Python
matlab
Laboratoriya
Men u bilan python va c++ da ishladim. Bu erda C++ dan misol sifatida foydalaniladi.
Keling, qurilmani TANGO ga qanday ulash va u bilan ishlashning tavsifiga o'tamiz. To'lov misol sifatida olinadi GPS neo-6m-0-001:
Rasmda ko'rib turganingizdek, biz platani UART CP2102 orqali shaxsiy kompyuterga ulaymiz. Kompyuterga ulanganda qurilma paydo bo'ladi /dev/ttyUSB[0-N], odatda /dev/ttyUSB0.
POGO
Endi ishga tushamiz pogo, va kengashimiz bilan ishlash uchun skelet kodini yarating.
pogo
Men allaqachon kodni yaratdim, uni yana yarataylik Fayl -> Yangi.
Biz quyidagilarni olamiz:
Bizning qurilmamiz (kelajakda qurilma deganda biz dasturiy ta'minot qismini nazarda tutamiz) bo'sh va ikkita boshqaruv buyrug'iga ega: Davlat & holat.
U kerakli atributlar bilan to'ldirilishi kerak:
Qurilma xususiyati - biz uni ishga tushirish uchun qurilmaga o'tkazadigan standart qiymatlar; GPS platasi uchun siz tizimdagi plata nomini o'tkazishingiz kerak com="/dev/ttyUSB0" va com port tezligi bodrade = 9600
Buyruqlar — qurilmamizni boshqarish buyruqlari; ularga argumentlar va qaytarish qiymati berilishi mumkin.
STATE - joriy holatni qaytaradi, dan Shtatlar
STATUS - joriy holatni qaytaradi, bu satrning to'ldiruvchisidir STATE
GPSArray - qaytadi GPS shakldagi qator DevVarCharArray
Keyinchalik, unga o'qilishi/yozilishi mumkin bo'lgan qurilma atributlarini o'rnating. Skalyar atributlar — oddiy atributlar (char, string, long va boshqalar) Spektr atributlari - bir o'lchovli massivlar Tasvir atributlari - ikki o'lchovli massivlar
Shtatlar — qurilmamiz joylashgan davlat.
OPEN — qurilma ochiq.
CLOSE - qurilma yopiq.
MUQADAT - xato.
ON — qurilmadan maʼlumotlarni qabul qilish.
OFF — qurilmadan maʼlumot yoʻq.
Atribut qo'shishga misol gps_string:
Saylov davri vaqt ms, gps_string qiymati qanchalik tez-tez yangilanadi. Yangilash vaqti ko'rsatilmagan bo'lsa, atribut faqat so'rov bo'yicha yangilanadi.
Bo'lib o'tdi:
Endi siz kodni yaratishingiz kerak Fayl->Yaratish
Odatiy bo'lib, Makefile yaratilmaydi; uni yaratish uchun birinchi marta katakchani belgilashingiz kerak. Bu yangi avlod davrida unga kiritilgan o'zgarishlar o'chirilmasligi uchun amalga oshiriladi. Uni bir marta yaratib, uni loyihangiz uchun sozlaganingizdan so'ng (ro'yxatdan o'tish kompilyatsiya kalitlari, qo'shimcha fayllar), siz bu haqda unutishingiz mumkin.
Endi dasturlashga o'tamiz. pogo bilan biz uchun quyidagilarni yaratdi:
Biz NEO6M.cpp & NEO6M.h bilan qiziqamiz. Keling, sinf konstruktoriga misol keltiraylik:
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
}
Bu erda nima bor va bu erda nima muhim? init_device() funksiyasi atributlarimiz uchun xotira ajratadi: gps_string & gps_massivi, lekin bu muhim emas. Bu erda eng muhimi, bu sharhlar:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1
Ushbu sharh blokidagi hamma narsa keyingi kodni qayta tiklash paytida pogoga kiritilmaydi uzoqlashish!. Bloklarda bo'lmagan hamma narsa bo'ladi! Bular biz dasturlashimiz va o'z tahrirlarimizni amalga oshirishimiz mumkin bo'lgan joylar.
Endi sinfda qanday asosiy funktsiyalar mavjud? NEO6M:
Biz atribut qiymatini o'qimoqchi bo'lganimizda gps_string, funksiyalar quyidagi tartibda chaqiriladi: har doim_bajariladigan_kanca, read_attr_apparat и read_gps_string. Read_gps_string gps_string qiymatini to'ldiradi.
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
}
Jamlama
Manba jildiga o'ting va:
make
Dastur ~/DeviceServers jildiga kompilyatsiya qilinadi.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6M
JIVE
jive
Ma'lumotlar bazasida allaqachon ba'zi qurilmalar mavjud, endi o'zimiznikini yarataylik Tahrirlash-> Server yaratish
Endi unga ulanishga harakat qilaylik:
Hech narsa ishlamaydi, avval dasturimizni ishga tushirishimiz kerak:
sudo ./NEO6M neo6m -v2
Men faqat huquqlar bilan com portiga ulanishim mumkin ildiz-A. v - ro'yxatga olish darajasi.
Endi biz ulanishimiz mumkin:
Xaridor
Grafikada rasmlarga qarash albatta yaxshi, lekin sizga foydaliroq narsa kerak. Keling, qurilmamizga ulanadigan va undan o'qishni oladigan mijoz yozaylik.
#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);
}
}