На главную страницу

Многопортовый плагин для X-Plane с интерфейсом USB/CDC

СОДЕРЖАНИЕ

1. ВВЕДЕНИЕ
2. СТРУКТУРНАЯ СХЕМА ПЛАГИНА
3. ПРОТОКОЛ ПРИ ПЕРЕДАЧЕ СОБЫТИЙ ОРГАНОВ УПРАВЛЕНИЯ
4. ПРОТОКОЛ ДАННЫХ ДЛЯ ИНДИКАЦИИ
5. КОНФИГУРАЦИОННЫЙ ФАЙЛ
6. УСТАНОВКА

1. ВВЕДЕНИЕ

Плагин xfcmcp.xpl представляет собой 64-хбитное (Windows) дополенние к симулятору X-Plane и служит для связи с "железом" пользователя, обеспечивая доступ к datarefs и commands. Интерфейс связи с USB устройствами пользователя осуществляется по последовательному протоколу (Communication Device Class, CDC). На рис.1 показана структурная схема, иллюстрирующая взаимодействие симулятора, плагина и устройств пользователя.

Рис.1

Подключение устройств пользователя вызывет появление виртуальных COM портов, с которыми и работает плагин. Всего допускается подключение до восьми устройств. Возможно расширение этого ограничения, делается это на этапе сборки плагина заданием значения максимального количества портов.

Связь устройств (органов управления и индикации) пользователя настраивается в специальном конфигурационном файле xfcmcp.ini. В папку Resources\plugins помешается дефолтный экземпляр конфигурационного файла, использующий только встроенные datarefs и commands. Возможно создание множества конфигурационных файлов для конкретных моделей самолётов, хранящихся в папках моделей. При загрузке плагин сначала открывает файл дефолтных настроек, из которого берёт параметры коммуникационных портов и создаёт связи органов управления со встроенными datarefs и commands. Затем, получив сообщение от симулятора о типе загруженного самолёта, пытается найти конфигурационный файл xfcmcp.ini в папке самолёта.

Плагин можно скачать здесь: xfcfmc-0.6.0.zip.

История изменений: changelog.txt.

Исходный код проекта https://bitbucket.org/xflyingcat/mcp757_arduino.

Скачать актуальное состояние исходников на момент выпуска версии 0.6.0 можно здесь:
https://bitbucket.org/xflyingcat/mcp757_arduino/get/Revision_0.6.0.zip.

2. СТРУКТУРНАЯ СХЕМА ПЛАГИНА

Рис.2

3. ПРОТОКОЛ ПРИ ПЕРЕДАЧЕ СОБЫТИЙ ОРГАНОВ УПРАВЛЕНИЯ

Имеет вид как показано ниже:

{252}

Это текстовый протокол с STX/ETX маркерами начала и конца текстового сообщения. Обычно STX имеет код 0x02, a ETX - код 0x03. В текущей реализации эту же самую роль играют символы { и } соответственно.
В примере, указанном выше, каждый символ означает:
{ - Start of text (STX)
2 - один из один из кодов типа событий
52 - код события органа управления в шестнадцатеричном представлении
} - End of text (ETX)

Коды типов событий
1 - событие переключения на позицию
2 - событие энкодера
4 - цепь разомкнута
8 - цепь замкнута

4. ПРОТОКОЛ ДАННЫХ ДЛЯ ИНДИКАЦИИ

3. Формат сообщения от плагина к устройству для семисегментных индикаторов

Рис.3

4. Формат сообщения от плагина к устройству для одиночных светодиодных индикаторов

Рис.4

5. КОНФИГУРАЦИОННЫЙ ФАЙЛ

За основу формата конфигурационного файла был взят формат файла xarduino.ini из проекта Криса Штроссера (Chris Strosser) https://github.com/cstrosser/XArduino.

Примеры

1. Команды

#############################
#     A L T I T U D E       # 
#############################
#
# энкодер - вращение против часовой стрелки
#
[Key0081]
mode: command
command: x737/mcp/ALTSEL-100

#
# энкодер - вращение по часовой стрелке
#
[Key0080]
mode: command
command: x737/mcp/ALTSEL+100

#
#  просто кнопка
#
[Key0013]
mode: command
command: x737/mcp/ALTHLD_TOGGLE


################
#     A/T      # 
################
#
# тумблер
#
[Key0067]
mode: command-toggle
command_0: x737/mcp/ATHR_ARM_OFF
command_1: x737/mcp/ATHR_ARM_ON


2. Датарефы и органы управления


###############
#  MAP ARPT   # 
###############
#
#  Просто кнопка
#
[Key0036]
mode: dataref
dataref: x737/cockpit/EFISCTRL_0/ARPT_button
type: float 
0: 0.0
1: 1.0


#################################
#       A P P R O A C H         # 
#################################
#
#  Циклическое переключение кнопкой
#  
#
[Key0014]
mode: loop
dataref: 1-sim/AP/appButton
type: int 
min: 0
max: 1
increment: 1


#############################
#     A L T I T U D E       # 
#############################
#
# энкодер - вращение против часовой стрелки
#
[Key0081]
mode: loop
dataref: sim/cockpit/autopilot/altitude
type: float
max: 50000.0
min: 0.0
increment: -100.0
#
# энкодер - вращение по часовой стрелке
#
[Key0080]
mode: loop
dataref: sim/cockpit/autopilot/altitude
type: float
max: 50000.0
min: 0.0
increment: 100.0



#----------------------------------------------------------------------
#                                                                     
# Многопозиционный переключатель, каждая позиция генерирует свой код
#
#----------------------------------------------------------------------
#
###############################
#    HSI MODE ROTARY APP      # 
###############################
[Key0041]
mode: dataref
dataref: 1-sim/ndpanel/1/hsiModeRotary
type: int 
1: 0
###############################
#    HSI MODE ROTARY VOR      # 
###############################
[Key0042]
mode: dataref
dataref: 1-sim/ndpanel/1/hsiModeRotary
type: int 
1: 1
###############################
#    HSI MODE ROTARY MAP      # 
###############################
[Key0043]
mode: dataref
dataref: 1-sim/ndpanel/1/hsiModeRotary
type: int 
1: 2
###############################
#    HSI MODE ROTARY PLN      # 
###############################
[Key0044]
mode: dataref
dataref: 1-sim/ndpanel/1/hsiModeRotary
type: int 
1: 3


#----------------------------------------------------
#  Когда одним органом управления нужно выполнить 
#  более одного действия
#----------------------------------------------------
################
#     F/D      # 
################
[Key0066]
mode: dataref
dataref: 1-sim/AP/fd1Switcher
type: int 
0: 0
1: 1

[Key0066]
mode: dataref
dataref: 1-sim/AP/fd2Switcher
type: int 
0: 0
1: 1


#----------------------------------------------------
#  Трёхпозиционный тумблер на один датареф
#----------------------------------------------------
########################
#     VOR / ADF 1      # 
########################
[Key0069]
mode: dataref
dataref: x737/cockpit/EFISCTRL_0/VORADF1_sel
type: int
0: 1
1: 0

[Key0068]
mode: dataref
dataref: x737/cockpit/EFISCTRL_0/VORADF1_sel
type: int 
0: 1
1: 2

#----------------------------------------------------
#  Когда датареф является элементом массива
#----------------------------------------------------
################
#    PANEL     # 
################
[Key0035]
mode: dataref
array: sim/cockpit2/switches/instrument_brightness_ratio
index: 1
type: float
1: 1.0
0: 0.0

3. Датарефы и индикация


#-----------------------------------------------------------------------------------------------
#  Индикация датарефа на многоразрядном семисегментном индикаторе
#
#  devadr - номер индикатора в гирлянде (нумерация от нуля)
#  port   - порт устройства (0 для port_0, для нулевого порта допустимо опускать этот параметр)
#  pos    - начальная позиция
#  len    - длина индицируемого значения
#  INDnnnn- имя выделяемого ресурса, не привязано к устройствам, 
#           nnn должно быть уникально диапзоне 0 ... 128 * N, N - количество портов 
#-----------------------------------------------------------------------------------------------
###### ALT 7-SEGM INDICATOR ##############
[IND0000]
mode: datarefPoll
dataref:  sim/cockpit/autopilot/altitude
type: float
port:0
devadr: 3
pos: 1
len: 5

#-----------------------------------------------------------------------------------------------
#  Индикация датарефа на одиночном индикаторе (светодиоде)
#
#  port   - порт устройства (0 для port_0, для нулевого порта допустимо опускать этот параметр)
#  pos    - номер позиции одиночного индикатора по спецификации устройства
#  INDnnnn- имя выделяемого ресурса, не привязано к устройствам, 
#           nnn должно быть уникально диапзоне 0 ... 128 * N, N - количество портов 
#-----------------------------------------------------------------------------------------------
#### V/S LED #####
[IND0003]
mode: datarefPoll
dataref: x737/systems/MCP/LED_VVI_on
type: int
port: 0
pos:6


#--------------------------------------------------------------------------------------------------
#   Редкий случай, когда индицируемое значение - бит в многоразрядном слове состояния
#   mask - маска для выделения нужного бита
#   Если нужный бит находится в разряде N (считая справа от нуля), маска должна иметь значение 
#   2 ^ N. Маска может быть суперпозицией масок для отдельных разрядов
#   Если в результате поразрядного перемножения битов получится ненулевое значене, светодиод будет
#   гореть
#--------------------------------------------------------------------------------------------------

#### A/T #####
[IND0005]
mode: datarefPoll
dataref: sim/cockpit/autopilot/autopilot_state
type: int
pos:1
mask: 1

#### FL.CH #####
[IND0006]
mode: datarefPoll
dataref: sim/cockpit/autopilot/autopilot_state
type: int
pos:4
mask: 8

#### HDG #####
[IND0007]
mode: datarefPoll
dataref: sim/cockpit/autopilot/autopilot_state
type: int
pos:5
mask: 2

#### CMD-L #####
[IND0008]
mode: datarefPoll
dataref: sim/cockpit/autopilot/autopilot_mode
type: int
pos:12
mask: 2

#### V/S #####
[IND0009]
mode: datarefPoll
dataref: sim/cockpit/autopilot/autopilot_state
type: int
pos:6
mask: 16

#### ALT #####
[IND0010]
mode: datarefPoll
dataref: sim/cockpit/autopilot/autopilot_state
type: int
pos:7
mask: 16384

#### APP #####
[IND0011]
mode: datarefPoll
dataref: sim/cockpit/autopilot/autopilot_state
type: int
pos:9
mask: 3072

#### LOC #####
[IND0012]
mode: datarefPoll
dataref: sim/cockpit/autopilot/autopilot_state
type: int
pos:8
mask: 768

6. УСТАНОВКА

1. Загрузить плагин xfcmcp-0.5.3.zip
и разместить файлы по своим местам, как показано ниже.

  
 Содержание архива:
 =================== 
 Resources\plugins\xfcmcp.xpl - плагин, скопировать в папку Resources\plugins\ симулятора
 
 Resources\plugins\xfcmcp.ini - дефолтные настройки, скопировать в папку Resources\plugins\ симулятора
 
 for_boeing757_767_folder\xfcmcp.ini - файл с настройками для Boeing757/767 by FF&STS, 
 поместить в папку модели самолёта (если имеется).
 
2. Отрыть файл папка_симулятора\Resources\plugins\xfcmcp.ini и отредактировать в секции [serial] значение для port_0 согласно полученному значению в разделе 6 п.4. Ниже, для справки, часть содержимого этого файла с настройками последовательного порта.
[mode]
log=on

[serial]
port_0=COM36
#port_1=
#port_2=
#port_3=

[debug]
keyinfo=on

[operation]
reload_key = 20

3. Запустить симулятор и проверить функционирование.

Примечание 1. Настроек в самом симуляторе не требуется.

Примечание 2.Лог плагина ведётся в файле папка_симулятора\Resources\plugins\xfcmcp.log и пересоздаётся при каждом запуске плагина.

Примечание 3. Текущий файл настроек можно редактировать на лету, чтобы перезагрузить настройки нужно вызвать пункт меню симулятора
Plugins/FlyingCat USB I/O hub -> Re-register all
Рис.5
или нажать специальную выделенную кнопку (по умолчанию это кнопка SPARE с кодом 20)

Примечание 4. Служебную функцию перезагрузки настроек допускается назначать на любую кнопку, занятую в обычных настройках. Но, желательно назначать малоиспользуемую кнопку.

Примечание 5. При необходимости перегрузить устройство, можно остановить плагин через Plugin Admin симулятора:
Рис.6
Останов плагина не происходит мгновенно, нужно подождать, пока чек в чекбоксе исчезнет. После этого можно переподключить устройство путём отсоединения/присоединения USB кабеля.


На главную страницу