Simconnect как альтернатива Fsuipc (fsuipc4)

Тема для тех у кого собран MJoy-16 и нет зарегистрированного модуля FSUIPC4. Самая большая проблема в том, что есть события в симе, на которые нет возможности назначить комбинацию кнопок. Меня в частности прильщала возможность задействовать четыре энкодера в симе в блоке автопилота. В симе не выведены в настройки такие функции как увеличение-уменьшение высоты (автопилот), увеличение-уменьшение скорости…. список необходимых и вместе с тем недоступных функций достаточно большой… Слышал о том что такое заложено в SimConnect. Информации о его использовании для решения данной проблемы не нашел.
Используя примеры из SDK вобщем то за один неполный день разобрался как это работает. На С++ програмить не умею, но тем не мение на текущий момент есть набросок програмки, которая позволяет назначить на определенные действия фиксированную комбинацию кнопок.

это удобно повесить на один тумблер:

Ctrl+F5 — AP On
Shift+F5 — AP Off

…………………………………………
а это на энкодеры:

Shift+F2 Ias/Mach —
Ctrl+F2 Ias/Mach +
Shift+F3 Heading —
Ctrl+F3 Heading +
Shift+F4 Altitude —
Ctrl+F4 Altitude +

Все бы ничего, но есть много вопросов. В частности не могу найти переменные сима, которые отвечают за Course. Кроме того намного удобнее иметь не фиксированную комбинацию кнопок, а иметь возможность назначать их как в той же FSUIPC…

Вобщем кому интересно — вышлю для пробы готовую програмку, или исходники для продолжения работы.

p.s. разработано под 10-й сим с сервиспаком, с установленным симконнектом…

Сообщение отредактировал imitator: 29 June 2007 — 23:35

Ответов: 39

1 2
Если можно, то на art-azatov@yandex.ru

Получил. Спасибо.

Flyrus (30.06.2007 10:09) писал:

Там в симконеекте можно почти все. Особенно посмотрте список евентов и переменных.. Правда есть одно НО .. Если нет нужной переменной в списке — придется искать её в памяти процесса …. со всеми вытика.щими от сюда напрягами для программиста..
С другой стороны , чтобы оживить Mjoy энкодер из под собственной программы , по мойму необходимо писать обработчик этог энкодра и уже потом давить на батоны и дергать рычаги из симконнекта :)
Хотя и то и то прекрасно осуществимо в любой среде разработки. Удачи..

Ну энкодеры то уже заработали, тут вот проблемы возникают такого плана: Есть события, имеющие две команды, например Вкл/Выкл Автопилот… То тут все просто, на первую команду (Вкл. Автопилот) — одну комбинацию клавиш, на вторую (Выкл. Автопилот) команду — другую комбинацию, вешаем все на один тумблер и все прекрасно. Есть события имеющие одну команду, например Автотяга, но с параметрами, как я понимаю — Вкл. или Выкл. Вот тут пока не понятно: как дать команду с параметрами, но это уже сложности языка, причем ковырять приходится одновременно и С++ и SDK (мало мне 1С:) Тут даже не понятно пока чем события от переменных отличаются в симе :bad:

Там в симконеекте можно почти все. Особенно посмотрте список евентов и переменных.. Правда есть одно НО .. Если нет нужной переменной в списке — придется искать её в памяти процесса …. со всеми вытика.щими от сюда напрягами для программиста..
С другой стороны , чтобы оживить Mjoy энкодер из под собственной программы , по мойму необходимо писать обработчик этог энкодра и уже потом давить на батоны и дергать рычаги из симконнекта :)
Хотя и то и то прекрасно осуществимо в любой среде разработки. Удачи..

NAV OBS:index OBS setting. Index of 1 or 2.

Вот те курс.

Для Вкл/Выкл автопилота и heading клавиши и в симе назначаются.

Да и вместо C++ можно C# пользовать, все попроще.

_ak (30.06.2007 12:32) писал:

NAV OBS:index OBS setting. Index of 1 or 2.

Вот те курс.

Для Вкл/Выкл автопилота и heading клавиши и в симе назначаются.

Да и вместо C++ можно C# пользовать, все попроще.

Спасибо, слово «OBS» — было ключевое. Нашлись события!
KEY_VOR1_OBI_DEC — VOR1_OBI_DEC (Decrements VOR 1’s OBS setting)
и…
KEY_VOR1_OBI_INC — VOR1_OBI_INC (Increments VOR 1’s OBS setting)

… так что все четрые энкодера задействованы!

Сообщение отредактировал imitator: 30 June 2007 — 17:48

Flyrus (30.06.2007 13:25) писал:

Хорошо, с этим в целом понятно, а как быть с такой ситуацией:
Нужно включать Автотягу одной комбинацией клавиш, а /выключать другой.

Есть переменная AUTOPILOT THROTTLE ARM
есть событие AUTO_THROTTLE_ARM
…..

для автопилота сделал так:
hr = SimConnect_MapInputEventToClientEvent(hSimConnect, INPUT0, «ctrl+f5», AUTOPILOT_ON);
hr = SimConnect_MapInputEventToClientEvent(hSimConnect, INPUT0, «shift+f5», AUTOPILOT_OFF);

но у автопилота две переменные, а у автотяги одна :)

Там в симконнекте достаточно сложно , но если вникнуть — программировать просто уждовольствие.

Переменные от евентов отличаются тем что евент — это событие , типа шасси вверх или вниз. Или событие — прибавить на 1 газку , или убавить на 1 газку.. Бывают эвенты , в параметрах которых ты указываеш на сколько единиц прибавить throttle или убавить.. Но это все комманды — тоесть events.

С переменными ты работаеш в «живом виде» и переменные имеют свой диапазон . Скажем переменная Throttle имеет диапазон от 0 до 100% .. Мало того , в каком виде предсталять переменную ( в процентах или скажем в метрах или в градусах) ты заказываеш сам , когда подготавливаеш эту переменную к общению.

Так вот , чтобы изменить throttlle от 0 до максимума , с евентами тебе надо пошагово каждый раз давать евент — Throttle set+1
столько раз сколько требует модель самолета. ( тут ты никогда не узнаеш реально сколько раз надо подать в симконнект этот евент и тем более никогда не узнаеш в каком положении находится в данный момент throttle)

А вот с переменными делаеш просто —
подаеш переменную Throttle engine 1 в процентах — скажем 100 . И всё. Ручка throttle не максимум.. Тоесть евенты — это прямое общение с переменными с их фактическими значениями…

В своих утилитах я пользую и переменные и евенты. Например выпуск шасси — переменная есть такая , только она указывает физический угол выпуска шассии у самолета (анимация) .. Чтобы выпустить шасси через переменную из собственой программы , я должен в програмном цикле «проиграть» переменную от 0 до 100 …. И таким образом анимировать выпуск шасси собственными силами. Однако используя евенты я не заморачиваюсь этим и просто посылаю событие — выпустить шасси , а движок сима сам все за меня делает.. Очень удобно…

Переменные можно читать , и моджифицировать.. А вот евенты прочитать никак нельзя , однако есть какието евенты которые позволяют прочитать свои данные..
Кстати , многие переменные и евенты не работают . Имейте ввиду. Например скорость изменения симуляции сима SimRate — не пашет… Или нет переменной ZOOM .. Есть только евент — ZOOM IN или ZOOM OUT …

назначь 2 сочетания на один евент :)
Он ругается на то что 2 команды забиндены на одну клавиишу ?

В этом случае ваша утилита должна «слушать клавиши» и по нажатию на оной выдавать в сим коннект нужные события в обход конфигуратора. Тогда на одну клавишу можно повесить хоть 200 событий ..А то что вы делает — это даете просто коману для сима переназначить событие ctrl+5 на AUTOPILOT_ON без какой либо логики вэтом случае симконнект ругается. По мойму было так

А можно получить в sahob@mail.ru?

_ak (30.06.2007 17:55) писал:

назначь 2 сочетания на один евент :)

Ну это можно конечно. Но тогда возникает необходимость согласовывать положение тумблера на физической панели с тумблером в симе. Иначе может быть веселая картина: у меня тумблер в положении вверх, а в симе — вниз. Вот с автопилотом такой проблемы нет, так как там два евента, один на включение, а другой на выключение. Мне вот интересно, а может те евенты, которые имеют одну команду могут выполняться с параметрами? Ну например: включить автотягу (1)… включить автотягу (0)…
И еще… если никаких параметров нет, тогда можно прописать логику, основываясь на положение тумблера в симе. Но тут мне нужно знать значение переменных. А я пока не представляю как это сделать…

Если евент на _SET заканичвается, до да, параметр идет.
Только не везде так есть, местами только _TOGGLE

Исползуйте переменные !
Они более гибки ! И читаются параметры !

sahob (30.06.2007 19:47) писал:

А можно получить в sahob@mail.ru?

Почта дошла? Получилось запустить?

Flyrus (1.07.2007 09:56) писал:

Исползуйте переменные !
Они более гибки ! И читаются параметры !

Не все переменные позволяют запись

imitator (1.07.2007 23:03) писал:

sahob (30.06.2007 19:47) писал:

А можно получить в sahob@mail.ru?

Почта дошла? Получилось запустить?

Спасибо, сегодня получил и начну завтра же копаться, постараюсь разобраться.

Уважаемый imitator, держите народ в курсе событий — тема актуальная! Недавно приобрел МДжой от Константина (kitsok), все енкодеры планирую на панель АП — проблемы, соотв. те же. Собирался достать енкодеры с кнопками и задействовать на кнопки доступные функции FSX (уже писал в личку), но — нигде нет, даже в интернет-магазине. Довольствуюсь оными без кнопок серии ECW. Поэтому — либо ваш вариант, либо аппаратный обработчик «поворот ручки — имитация нажатия доп.кнопки (третьей)». Но, кажись, второй вариант не жизнеспособен, т.к. будут активными сразу две кнопки — штатная мджоевская и доп.кнопка. Можно конечно задержку на один импульс ввести, чтобы доп.кнопка первой была видна, вобщем — сложно это все как-то. Как дела с вашим вариантом? При удачном исходе, имхо, хорошо было бы некий мануал для народа выложить…

Консольный вариант приложения давно готов и работает. Принцип использования:
1) Запускаем сим.
2) Запускаем MJoy Mapper.
3) Запускаем мою програмку.

MJoy Mapper эмулирует нажатие определенных комбинаций кнопок, програмка перехватывает эти нажатия и посылает команды в сим…
Все!

Плюсы:
1) Работают энкодеры.
2) Назначенные утилитой комбинации кнопок имеют приоритет перед настройками сима, следовательно в самом симе эти комбинации если и назначены на что-то другое — игнорируются.
Минусы:
1) Консольное… выглядит некрасиво :)
2) Нельзя никак переназначить комбинацию кнопок. (только переписание и перекомпиляция программы)
3) Нельзя добавить функционал (см. пункт 2…)

з.ы. может кому интересно: через некоторое время планируется виндовое приложение, с настройками. Но это как сложится :D

Решил убрать из связки Simconnect >>> MJoy Mapper >>> Sim … MJoy Mapper
так как Simconnect работает и с джоем напрямую. Но если нажатие кнопок с малыми номерами 01, 02,03…. 08… видны,

hr = SimConnect_MapInputEventToClientEvent(hSimConnect, INPUT_1, «joystick:0:button:05», EVENT_1);
hr = SimConnect_MapInputEventToClientEvent(hSimConnect, INPUT_1, «joystick:0:button:06», EVENT_1);
hr = SimConnect_MapInputEventToClientEvent(hSimConnect, INPUT_1, «joystick:0:button:07», EVENT_1);

то с большими номерами — нет, возможно потому что на них висят тумблеры и энкодеры:

hr = SimConnect_MapInputEventToClientEvent(hSimConnect, INPUT_1, «joystick:0:button:98», EVENT_1);
hr = SimConnect_MapInputEventToClientEvent(hSimConnect, INPUT_1, «joystick:0:button:99», EVENT_1);
hr = SimConnect_MapInputEventToClientEvent(hSimConnect, INPUT_1, «joystick:0:button:100», EVENT_1);
hr = SimConnect_MapInputEventToClientEvent(hSimConnect, INPUT_1, «joystick:0:button:101», EVENT_1);

хотя MJoy Mapper их видит… Как справится с проблемой?

Уфф. Нашел таки брата по несчастью :) .

С этим вопросом я уже давно пытаюсь бороться, с переменным успехом. И все что получилось, и что задумано выложу тут. У самого 2 джойстика, один из которых — РУД со смонтированными всевозможными кнопками и тумблерами на основе Mj0y16. Собираюсь еще второй делать — что-то типа оверхеда (панели над монитором).

При использовании комбинации клавиш клавиатуры и маппера кнопок, как указано в первом сообщении автора, без Simconnect вполне можно обойтись. В этом случае пишем простенький прибор на XML примерно такого содержания:

<Gauge Name="My_Keys" Version="1.0">
	<Size X="3" Y="3"/>

  <Keys>
	<On Key="Ctrl+Shift+9">0
		0 == if{ (&gt;K:KOHLSMAN_INC) }
	</On>
	<On Key="Ctrl+Shift+0">0
		0 == if{ (&gt;K:KOHLSMAN_DEC) }
	</On>
	<On Key="Ctrl+Shift+L">0
		1 (&gt;K:TOGGLE_NAV_LIGHTS)
	</On>
	<On Key="Ctrl+I">0
		(L:MyVar, Bool) ! (&gt;L:MyVar, Bool)
	</On>
  </Keys>
</Gauge>

Изобретение не мое, но может кто и не знает :pilot: Это часть кода делает три вещи, недоступные из панели управления FS (меняет давление на высотомере и включает/выключает навигационные огни). Прибор размещается на главной панели или первой секции VC. Маппим соотетствующие комбинации клавишь на нужные кнопки джойстика или энкодеры и радуемся жизни. Плюс способа — легко редактируемый код, можно управлять не только стандартными переменными симулятора, но ище и L-переменными. Так можно адаптировать под свои нужды любой крафт, причем если в его родных XML приборах используются переменные для анимации визуальной моделью, с помошью своего прибора и ими сможете управлять. Минусы, это во-первых, само использование промежуточной ступени (маппера кнопок), во-вторых, отсутствие приоритета над сочетаниями кнопок используемых в симуляторе по умолчанию ли настроенных в панели управления.

Конечно-же, захотелось уйти от этих недостатков и обратил я свой взор на Simconnect. Ну родился я наверное для изучения Pascal, пока еще воротит от синтаксиса C/C++ (да простят меня последователи этого прекрасного, но ихмо очень запутанного языка програмирования). Так как для изучения возможностей Simconnect нужно-былобы создать простейшую оконную программу на С++, а сделать этого я не смог (освоил только то, что делается в рамках GAU-приборов и SDK). Поэтому изучение сабжа постепенно заглохло. Но т ут произошло чудо, хорошие дяденьки, знатоки Delphi из http://home.exetel.c…nnectDelphi.htm , смиловались над нами грешными :rolleyes: и адаптировали заголовочные файлы и часть примеров под родную среду програмирования. Поизучал я все это, и к сожалению для себя, пришол к неутешительным выводам, что за рамки стандартных функций симулятора, а также ограничения в 32 кнопки на джойстик с Simconnect не уйти.

Остался крайний вариант, наверное самы работоспособный, но пока, из-за плохого знания мной C++, весьма отдаленный. Примеры из DirectX SDK я пытался изучать, но там идет опрос первого джойстика, как работать с остальными, пока еще не понял. Что-то аналогичное сделал уважаемый Роман Петкевич в своей библиотеке, на основе которой созданы сервисные приборы для Ту-154 и т.п. Но к сожалению, эти приборы несовместимы с FSX, так как используют для записи конфигурации бортовой номер самолета, извлекаемый при помощи библиотеки Traffic.DLL, котоая в FSX недоступна. Суть моего варианта такова:
Создаем GAU-прибор. В нем создаем код, который посредством DirectInput находит и опрашивает все имеющиеся джойстики. В приборе инициализируем переменные состояния по 100 кнопок (к примеру, если это Mjoy16) для трех джойстиков. Итого 300 кнопок. Аи вот работаем с этими переменными посредством механизмов get_named_variable_value и set_named_variable_value. В папке Panel своего самолета создаем XML прибор типа

<Gauge Name="My_Keys" Version="1.0">
   <Element>
	<Select>
	 <Value>
				   (L:Button001, bool) (&gt;L:Button001, bool) 
				   (L:Button002, bool) (&gt;L:Button002, bool) 
				   .
				   .
				   .
				   (L:Button300, bool) (&gt;L:Button300, bool) 
	 </Value>
	</Select>
   </Element>
</Gauge>

Связка этих двух элементов обеспечит управление 300 переменных кнопками джойстика, а уж анализируя эти переменные в своем XML или GAU приборе, иожно делать все что угодно. Причем для каждго отдельного самолета код может быть свой. Менять главный GAU прибор необходимости не будет.

Обращение к знатокам C++. Давайте сообща сделаем такой прибор, Сим сообщество скажет нам спасибо :umnik2: :clapping: .

С++ конечно мутный, но учитывая документацию и примеры из SDK прописать управление крафтом, приборами и пр… можно (давно уже сделано). Через дополнительные XML приборы делать не очень хочется, так как решение не универсальное. Прийдется в каждом крафте прописывать… И потом задача то решаема, люди, написавшие MJoy мапер смогди перехватить нажатие кнопок которые за 32… Ну вот и мне хочется сделать тоже самое — перехватить нажатие кнопок, но не посылать в систему комбинацию клавишь, а сразу посылать команды в сим.

Просмотр сообщенияimitator (11.03.2008 11:31) писал:

С++ конечно мутный, но учитывая документацию и примеры из SDK прописать управление крафтом, приборами и пр… можно (давно уже сделано). Через дополнительные XML приборы делать не очень хочется, так как решение не универсальное. Прийдется в каждом крафте прописывать… И потом задача то решаема, люди, написавшие MJoy мапер смогди перехватить нажатие кнопок которые за 32… Ну вот и мне хочется сделать тоже самое — перехватить нажатие кнопок, но не посылать в систему комбинацию клавишь, а сразу посылать команды в сим.

Так универсального решения быть и не может. Для каждого самолета/вертолета у Вас будет своя комбинация кнопок джойстика и т.д. Вот как вы пишите: …но не посылать в систему комбинацию клавишь, а сразу посылать команды в сим. А какие это команды и на каком уровне их посылать? Если будет список команд, расчитанных на выполнение конкретных функций, как это сделано в FSUIPC или сервисном приборе Ту-154, то это же тупиковый вариант. Вы только сможете управлять стандартными функциями симулятора, или заданными Вами в Вашем приборе. Что-то изменив можно только ковыряя исходники кода c последующей перекомпиляцией.

Ихмо в симулятор надо посылать просто абстактные состояния всех возможных кнопок джойстика, не привязанных ни к чему, только нажата или отпущена. А сделать это наиболее просто можно работая с named_variable переменными. Прослойка из одного XML файла будет как раз служить интерфейсом между прибором на C++, опрашивающим джойстик и прибором, будь то XML, или GAU, или даже кастомной анимацией в модели, в которых создатель прибора уже сам определит, что должно происходить при нажатии/отпускании/удержании конкретной кнопки.

Примерно на таком-же уровне работает замечательный прибор Douga Dawsona dsd_xml_sound, в котором абстрактные, определенные в XML-приборе пользователя команды управляют описанными в соответствующем конфигурационном файле звуками.

… ну почему тупиковый… вот у меня четыре энкодера, первый я знаю, отвечает за одно, второй за другое, третий за третье… Тумблеры опять же, расположены на панели, подписаны и выполняют определенные функции. Я их на ощупь нахожу и использую. И потом при жлании можно написать утилиту, которая позволит переназначать на кнопки необходимые действия. Но это не сильно то и нужно. Скорее всего будет собрана одна абстрактная панель, одного абстрактного крафта, так что однажды настроенная и прописанная система управления будет устраивать долгое время и не будет нуждаться в глобальных перенастройках. Ну а небольшие изменения — дело пары минут, поменять команду, перекомпилить экзешник…
… у меня простая задача: собрать панель, которая меня устроит, а не создать некую универсаьную систему.

«…не понял, переведи» :) если речь о системе FSBUS и пр… то это все впереди, я пока жду. Во первых когда сдадут мой дом, квартиру в котором я купил, а во вторых не выбрал пока систему, которую буду повторять…

1 2