任務:
獲取DCS-World的姿態數據,發送到6自由度平台。
過程:
1.獲取dcs-bios
https://github.com/DCSFlightpanels/dcs-bios
2.復制DCS-BIOS文件夾和Export.lua放到游戲指定位置:
用戶/保存的游戲/DCS/Scripts/
3.根據數據輸出協議獲取數據。
以下部分翻譯自 https://github.com/DCSFlightpanels/dcs-bios/blob/master/Scripts/DCS-BIOS/doc/developerguide.adoc
1.數據輸出
駕駛艙當前狀態使用二進制協議從 DCS 導出(參見下方 DCS-BIOS 導出協議)。此數據通過 UDP 發送到多播地址 239.255.50.10,環回接口 (127.0.0.1) 上的端口 5010。
如果不能或不想處理多播 UDP,您也可以通過編輯 BIOSConfig.lua 使 DCS-BIOS 將導出數據流的副本發送到單播地址。
還可以使用 socat 程序將串行端口連接到 DCS-BIOS 導入和導出流。
另一種方法是打開到端口 7778 的 TCP 連接。可以使用此連接向 DCS-BIOS 發送命令並接收導出數據。
2.DCS-BIOS 導出協議
每個駕駛艙狀態都被編碼為整數或字符串,並在 16 位地址空間內分配一個地址。
(1)整數值
整數值的位置由一個 16 位字地址定義,該地址指定數據所在的 16 位字的開始,一個 16 位掩碼指定該字中的哪些位屬於該值,以及一個移位值(也可以從掩碼中推導出來)。
給定起始地址、掩碼和移位值,以下偽 C 代碼解碼一個值:
char[] state;
unsigned int value = (((uint16_t*)state)[start_address/2] & mask) >> shift
對狀態數據的更改被編碼為對該地址空間的寫訪問,並以下列格式寫入導出數據流:
<起始地址(16位)> <數據長度(16位)>數據
起始地址和數據長度總是偶數(在內部,DCS-BIOS 將數據視為 16 位整數列表)。這確保沒有寫訪問部分更新整數值(整數可能占用不超過 16 位)。
所有整數值都以 litte-endian 字節順序寫入。
以下字節序列是從地址 0x1000 開始的四個字節的寫訪問示例:
0x00 0x10 0x04 0x00 0x41 0x2d 0x31 0x30
(2)字符串值
字符串的位置由它的 16 位起始地址和以字節為單位的長度定義(所有字符串值都有一個固定的最大長度,並且從 16 位對齊的地址開始)。
可以部分更新最大長度大於兩個字符的字符串值。為避免不一致的中間狀態,接收 DCS-BIOS 導出數據的應用程序應在下一個幀同步序列中應用對字符串值的更改(參見下一節)。
(3)同步順序
DCS-BIOS 嘗試每秒發送 30 次更新。
DCS-BIOS 將在每次更新開始時發送四個字節 0x55 0x55 0x55 0x55。如果字節序列 0x55 0x55 0x55 0x55 出現在單個寫入訪問中,DCS-BIOS 將通過將其分成兩個單獨的寫入來避免這種情況。
3. 添加新的飛機模塊
DCS-BIOS 中的導出模塊。DCS-BIOS 包含幾個導出模塊,每個導出模塊分配給一架或多架飛機,可以同時激活多個導出模塊。
MetadataStart 和 MetadataEnd 模塊始終處於活動狀態,即使沒有活動的飛機(例如,多人游戲中的旁觀者模式)。
當 AircraftList.lua 中的任何飛機處於活動狀態時,CommonData 模塊始終處於活動狀態。它導出高度、位置和航向等通用信息。
每個導出模塊都在 lib 子目錄中自己的文件中定義。
每個導出模塊都由 BIOS.lua 中的 dofile(...) 行加載。
每個導出模塊都需要 control-reference.html 中的 <script> 標記以顯示在控件參考文檔中。