什麼是 TANGO ?
它是一個管理各種硬體和軟體的系統。
TANGO 目前支援 4 個平台:Linux、Windows NT、Solaris 和 HP-UX。
這裡我們將描述使用 Linux (Ubuntu 18.04)
它是做什麼用的?
簡化各種設備和軟體的工作。
- 您無需考慮如何在資料庫中儲存數據,它已經為您完成了。
- 只需要描述輪詢感測器的機制。
- 將所有代碼簡化為一個標準。
到哪裡去?
我無法從原始碼啟動它;我使用了 TangoBox 9.3 的現成映像來運作。
這些說明描述如何從套件安裝。
它由什麼組成?
- 吉夫 — 用於檢視和編輯 TANGO 資料庫。
- POGO — TANGO 設備伺服器的代碼產生器。
- 阿斯特 — TANGO 系統的專案經理。
我們只對前兩個組成部分感興趣。
支援的程式語言
- C
- C + +中
- Java的
- JavaScript的
- 蟒蛇
- Matlab的
- 虛擬儀器
我在 python 和 c++ 中使用它。 這裡以C++為例。
現在讓我們繼續描述如何將裝置連接到 TANGO 以及如何使用它。 將以費用為例 GPS Neo-6m-0-001:
如圖所示,我們透過 UART CP2102 將開發板連接到 PC。 連接到 PC 時,會出現該設備 /dev/ttyUSB[0-N],通常是/dev/ttyUSB0。
POGO
現在讓我們啟動 波戈,並產生與我們的板子配合使用的框架程式碼。
pogo
我已經創建了程式碼,讓我們再次創建它 文件->新建.
我們得到以下資訊:
我們的設備(將來,我們所說的設備將指軟體部分)是空的,並且有兩個控制命令: 州 & Status.
它必須填充必要的屬性:
設備屬性 — 我們傳輸到裝置以對其進行初始化的預設值;對於 GPS 板,您需要傳輸系統中板的名稱 com=“/dev/ttyUSB0” 和 com 連接埠速度 波特率=9600
命令 — 控制我們設備的命令;它們可以被賦予參數和返回值。
- 州 - 返回目前狀態,來自 美國
- 狀態 - 傳回目前狀態,這是字串的補碼 州
- GPS陣列 - 退貨 GPS 表單中的字串 DevVarCharArray
接下來,設定可以讀取/寫入的設備屬性。
標量屬性 — 簡單屬性(char、string、long 等)
頻譜屬性 - 一維數組
圖像屬性 - 二維數組
美國 — 我們的設備所在的狀態。
- 打開 — 設備已開啟。
- 關閉 - 設備已關閉。
- 失敗 - 錯誤。
- ON — 從設備接收資料。
- OFF — 設備沒有資料。
新增屬性的範例 GPS_字串:
投票週期 時間(以毫秒為單位),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 中 走開!。 所有不在塊中的東西都將是! 這些是我們可以編程和進行自己編輯的地方。
那麼這個類別主要包含哪些功能呢? 新6M:
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_字串,函數將按以下順序呼叫: 總是執行的鉤子, 讀取屬性硬體 и 讀取 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端口 根-A。 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
我們將結果作為命令返回,採用字串和字元數組的屬性。
引用
我為自己寫這篇文章,因為一段時間後我開始忘記如何做以及做什麼。
感謝您的關注。
來源: www.habr.com