
چه شده است ?
این سیستمی برای مدیریت تجهیزات و نرمافزارهای مختلف است.
تانگو در حال حاضر از ۴ پلتفرم پشتیبانی میکند: Linux, Windows انتی، سولاریس و اچپی-یوایکس.
در اینجا به شرح کار با آن خواهیم پرداخت Linux(Ubuntu 18.04)
برای چیست؟
کار با تجهیزات و نرمافزارهای مختلف را ساده میکند.
- لازم نیست در مورد نحوه ذخیره دادهها در پایگاه داده فکر کنید، این کار از قبل برای شما انجام شده است.
- فقط لازم است مکانیسم حسگرهای نمونهبرداری (polling) شرح داده شود.
- تمام کدهای شما را در یک استاندارد تجمیع میکند.
از کجا دریافت کنم؟
من نتوانستم آن را از روی کد منبع اجرا کنم، بنابراین از یک تصویر آماده TangoBox 9.3 برای کار استفاده کردم.
دستورالعملها نحوه نصب از بستهها را شرح میدهند.
از چه چیزهایی تشکیل شده است؟
- واضح — برای مشاهده و ویرایش پایگاه داده TANGO استفاده میشود.
- POGO — مولد کد برای سرورهای دستگاه TANGO.
- آستور — مدیر نرمافزار برای سیستم TANGO.
ما فقط به دو جزء اول علاقهمند خواهیم بود.
زبانهای برنامهنویسی پشتیبانیشده
- C
- ++C
- جاوه
- جاوا اسکریپت
- پــایتــون
- متلب
- LabVIEW
من با آن در پایتون و ++C کار کردم. در اینجا، ++C به عنوان مثال استفاده خواهد شد.
حالا بیایید به توضیح نحوه اتصال دستگاه به TANGO و نحوه کار با آن بپردازیم. ما از برد به عنوان مثال استفاده خواهیم کرد. جیپیاس نئو-6m-0-001:

همانطور که در تصویر مشاهده میکنید، برد را از طریق UART CP2102 به کامپیوتر متصل میکنیم. هنگام اتصال به کامپیوتر، دستگاه به صورت زیر نمایش داده میشود: /dev/ttyUSB[0-N]، معمولاً /dev/ttyUSB0.
POGO
حالا بیایید راه اندازی کنیم POGOو ما یک کد اسکلتی برای کار با برد خود تولید میکنیم.
pogo
من قبلاً کد را ایجاد کردهام، بیایید دوباره آن را ایجاد کنیم فایل->جدید.

موارد زیر را دریافت می کنیم:

دستگاه ما (از این پس، اصطلاح «دستگاه» به بخش نرمافزار اشاره خواهد داشت) خالی است و دو دستور کنترلی دارد: دولت & وضعیت.
باید با ویژگیهای مورد نیاز پر شود:
ویژگی دستگاه — مقادیر پیشفرض که برای مقداردهی اولیه به دستگاه منتقل میکنیم؛ برای برد GPS، باید نام برد را به سیستم منتقل کنید کام="/dev/ttyUSB0" و سرعت پورت COM باودراد=۹۶۰۰
دستورات — دستوراتی برای کنترل دستگاه ما، میتوانند آرگومانها و مقدار بازگشتی داشته باشند.
- حالت - وضعیت فعلی را برمیگرداند، از ایالات
- وضعیت - وضعیت فعلی را برمیگرداند، این یک مکمل رشتهای برای حالت
- آرایه GPS — بازده GPS یک خط در فرم آرایه DevVChar
در مرحله بعد، ویژگیهای دستگاه که میتوانند از/به آن خوانده/نوشته شوند، مشخص میشوند.
ویژگیهای اسکالر — ویژگیهای ساده (char، string، long و غیره)
ویژگیهای طیف - آرایههای یک بعدی
ویژگیهای تصویر - آرایههای دوبعدی
ایالات — وضعیتی که دستگاه ما در آن قرار دارد.
- باز کن - دستگاه باز است.
- نزدیک - دستگاه بسته است.
- شکست - خطا.
- 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 لحاظ نخواهد شد. برو بیرون!هر چیزی که در بلاکها نباشد، خواهد بود! اینها مکانهایی هستند که میتوانیم در آنها برنامهریزی کنیم و ویرایشهای خودمان را انجام دهیم.
حالا توابع اصلی که این کلاس شامل میشود چیست؟ نئو6 ام:
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، توابع به ترتیب زیر فراخوانی میشوند: همیشه_اجرا_شده_قلاب, سختافزار_خواندنی и رشته_خواندن_جیپیاس. در 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);
}
}نحوه کامپایل:
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ما نتیجه را به صورت یک دستور return دریافت کردیم که ویژگیهای رشته و آرایهای از کاراکترها را دریافت میکرد.
مراجع
من این مقاله را برای خودم نوشتم، چون بعد از مدتی کمکم فراموش میکنم که چطور و چه کاری باید انجام دهم.
با تشکر از توجه شما.
منبع: www.habr.com
