Тема для тех у кого собран MJoy-16 и нет зарегистрированного модуля FSUIPC4. Самая большая проблема в том, что есть события в симе, на которые нет возможности назначить комбинацию кнопок. Меня в частности прильщала возможность задействовать четыре энкодера в симе в блоке автопилота. В симе не выведены в настройки такие функции как увеличение-уменьшение высоты (автопилот), увеличение-уменьшение скорости…. список необходимых и вместе с тем недоступных функций достаточно большой… Слышал о том что такое заложено в SimConnect. Информации о его использовании для решения данной проблемы не нашел.
Используя примеры из SDK вобщем то за один неполный день разобрался как это работает. На С++ програмить не умею, но тем не мение на текущий момент есть набросок програмки, которая позволяет назначить на определенные действия фиксированную комбинацию кнопок.
Используя примеры из 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
Flyrus (30.06.2007 10:09) писал:
С другой стороны , чтобы оживить Mjoy энкодер из под собственной программы , по мойму необходимо писать обработчик этог энкодра и уже потом давить на батоны и дергать рычаги из симконнекта
Хотя и то и то прекрасно осуществимо в любой среде разработки. Удачи..
Ну энкодеры то уже заработали, тут вот проблемы возникают такого плана: Есть события, имеющие две команды, например Вкл/Выкл Автопилот… То тут все просто, на первую команду (Вкл. Автопилот) — одну комбинацию клавиш, на вторую (Выкл. Автопилот) команду — другую комбинацию, вешаем все на один тумблер и все прекрасно. Есть события имеющие одну команду, например Автотяга, но с параметрами, как я понимаю — Вкл. или Выкл. Вот тут пока не понятно: как дать команду с параметрами, но это уже сложности языка, причем ковырять приходится одновременно и С++ и SDK (мало мне 1С
Тут даже не понятно пока чем события от переменных отличаются в симе 
С другой стороны , чтобы оживить Mjoy энкодер из под собственной программы , по мойму необходимо писать обработчик этог энкодра и уже потом давить на батоны и дергать рычаги из симконнекта
Хотя и то и то прекрасно осуществимо в любой среде разработки. Удачи..
Вот те курс.
Для Вкл/Выкл автопилота и heading клавиши и в симе назначаются.
Да и вместо C++ можно C# пользовать, все попроще.
_ak (30.06.2007 12:32) писал:
Вот те курс.
Для Вкл/Выкл автопилота и 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 …
В этом случае ваша утилита должна «слушать клавиши» и по нажатию на оной выдавать в сим коннект нужные события в обход конфигуратора. Тогда на одну клавишу можно повесить хоть 200 событий ..А то что вы делает — это даете просто коману для сима переназначить событие ctrl+5 на AUTOPILOT_ON без какой либо логики вэтом случае симконнект ругается. По мойму было так
_ak (30.06.2007 17:55) писал:
Ну это можно конечно. Но тогда возникает необходимость согласовывать положение тумблера на физической панели с тумблером в симе. Иначе может быть веселая картина: у меня тумблер в положении вверх, а в симе — вниз. Вот с автопилотом такой проблемы нет, так как там два евента, один на включение, а другой на выключение. Мне вот интересно, а может те евенты, которые имеют одну команду могут выполняться с параметрами? Ну например: включить автотягу (1)… включить автотягу (0)…
И еще… если никаких параметров нет, тогда можно прописать логику, основываясь на положение тумблера в симе. Но тут мне нужно знать значение переменных. А я пока не представляю как это сделать…
Только не везде так есть, местами только _TOGGLE
Они более гибки ! И читаются параметры !
sahob (30.06.2007 19:47) писал:
Почта дошла? Получилось запустить?
Flyrus (1.07.2007 09:56) писал:
Они более гибки ! И читаются параметры !
Не все переменные позволяют запись
imitator (1.07.2007 23:03) писал:
sahob (30.06.2007 19:47) писал:
Почта дошла? Получилось запустить?
Спасибо, сегодня получил и начну завтра же копаться, постараюсь разобраться.
1) Запускаем сим.
2) Запускаем MJoy Mapper.
3) Запускаем мою програмку.
MJoy Mapper эмулирует нажатие определенных комбинаций кнопок, програмка перехватывает эти нажатия и посылает команды в сим…
Все!
Плюсы:
1) Работают энкодеры.
2) Назначенные утилитой комбинации кнопок имеют приоритет перед настройками сима, следовательно в самом симе эти комбинации если и назначены на что-то другое — игнорируются.
Минусы:
1) Консольное… выглядит некрасиво
2) Нельзя никак переназначить комбинацию кнопок. (только переписание и перекомпиляция программы)
3) Нельзя добавить функционал (см. пункт 2…)
з.ы. может кому интересно: через некоторое время планируется виндовое приложение, с настройками. Но это как сложится
так как 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{ (>K:KOHLSMAN_INC) } </On> <On Key="Ctrl+Shift+0">0 0 == if{ (>K:KOHLSMAN_DEC) } </On> <On Key="Ctrl+Shift+L">0 1 (>K:TOGGLE_NAV_LIGHTS) </On> <On Key="Ctrl+I">0 (L:MyVar, Bool) ! (>L:MyVar, Bool) </On> </Keys> </Gauge>Изобретение не мое, но может кто и не знает
Это часть кода делает три вещи, недоступные из панели управления FS (меняет давление на высотомере и включает/выключает навигационные огни). Прибор размещается на главной панели или первой секции VC. Маппим соотетствующие комбинации клавишь на нужные кнопки джойстика или энкодеры и радуемся жизни. Плюс способа — легко редактируемый код, можно управлять не только стандартными переменными симулятора, но ище и L-переменными. Так можно адаптировать под свои нужды любой крафт, причем если в его родных XML приборах используются переменные для анимации визуальной моделью, с помошью своего прибора и ими сможете управлять. Минусы, это во-первых, само использование промежуточной ступени (маппера кнопок), во-вторых, отсутствие приоритета над сочетаниями кнопок используемых в симуляторе по умолчанию ли настроенных в панели управления.
Конечно-же, захотелось уйти от этих недостатков и обратил я свой взор на Simconnect. Ну родился я наверное для изучения Pascal, пока еще воротит от синтаксиса C/C++ (да простят меня последователи этого прекрасного, но ихмо очень запутанного языка програмирования). Так как для изучения возможностей Simconnect нужно-былобы создать простейшую оконную программу на С++, а сделать этого я не смог (освоил только то, что делается в рамках GAU-приборов и SDK). Поэтому изучение сабжа постепенно заглохло. Но т ут произошло чудо, хорошие дяденьки, знатоки Delphi из http://home.exetel.c…nnectDelphi.htm , смиловались над нами грешными
и адаптировали заголовочные файлы и часть примеров под родную среду програмирования. Поизучал я все это, и к сожалению для себя, пришол к неутешительным выводам, что за рамки стандартных функций симулятора, а также ограничения в 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 прибор типа
Связка этих двух элементов обеспечит управление 300 переменных кнопками джойстика, а уж анализируя эти переменные в своем XML или GAU приборе, иожно делать все что угодно. Причем для каждго отдельного самолета код может быть свой. Менять главный GAU прибор необходимости не будет.
Обращение к знатокам C++. Давайте сообща сделаем такой прибор, Сим сообщество скажет нам спасибо
.
Так универсального решения быть и не может. Для каждого самолета/вертолета у Вас будет своя комбинация кнопок джойстика и т.д. Вот как вы пишите: …но не посылать в систему комбинацию клавишь, а сразу посылать команды в сим. А какие это команды и на каком уровне их посылать? Если будет список команд, расчитанных на выполнение конкретных функций, как это сделано в FSUIPC или сервисном приборе Ту-154, то это же тупиковый вариант. Вы только сможете управлять стандартными функциями симулятора, или заданными Вами в Вашем приборе. Что-то изменив можно только ковыряя исходники кода c последующей перекомпиляцией.
Ихмо в симулятор надо посылать просто абстактные состояния всех возможных кнопок джойстика, не привязанных ни к чему, только нажата или отпущена. А сделать это наиболее просто можно работая с named_variable переменными. Прослойка из одного XML файла будет как раз служить интерфейсом между прибором на C++, опрашивающим джойстик и прибором, будь то XML, или GAU, или даже кастомной анимацией в модели, в которых создатель прибора уже сам определит, что должно происходить при нажатии/отпускании/удержании конкретной кнопки.
Примерно на таком-же уровне работает замечательный прибор Douga Dawsona dsd_xml_sound, в котором абстрактные, определенные в XML-приборе пользователя команды управляют описанными в соответствующем конфигурационном файле звуками.
… у меня простая задача: собрать панель, которая меня устроит, а не создать некую универсаьную систему.