Jump to content
Sign in to follow this  
FortRoss

Вопросы по созданию приборов на С++

Recommended Posts

Е-е-е-е-е! Заиграл родимый! =)
icebear, спасибо большое.
Пользовался вот этим руководством, может кому-нибудь пригодится, там и исходные коды с примером есть.
Завтра всё причешу под FSX, пока есть затруднения с проигрыванием лишь при изменении значения переменной. Ни как не могу "проиграть" функцию без участия внутреннего таймера FSX.

Всем ещё раз большое спасибо!

Share this post


Link to post
Share on other sites

Ни как не могу "проиграть" функцию без участия внутреннего таймера FSX.

Это как понять? И ещё, Вы пишите гаугу "по старинке" или с симконнектом? Просто с симконнектом руки у Вас сильно развязаны и возможностей море.

  • Upvote 1

Share this post


Link to post
Share on other sites

Это как понять?

В смысле делаю так:

 

 

void LogicType::update(void)
{
	FLOAT64 gen_mast = 0;
	execute_calculator_code ("(A:GENERAL ENG MASTER ALTERNATOR:1, Bool)", &gen_mast, NULL, NULL);

	if(gen_mast == gen_mast_st)
	{
		m_Sound->PlayNow();
		gen_mast_st = 0;
	}
}
Этот метод вызывается в секции PANEL_SERVICE_PRE_UPDATE основной функции прибора. К слову, изменения условия с рано на неравенство, проигрывание звука лишь инвертируется, т.е. заук играет либо когда генератор в положении 1, либо когда в положении 0. Не тогда когда он переходит с состояния 1 в состояние 0 - чего, собственно, я и пытаюсь добиться.

 

И ещё, Вы пишите гаугу "по старинке" или с симконнектом?

Всё организовано с помощью gauges.h, так как, на сколько я понял, SimConnect'а может быть целых три версии - отсюда могут возникнуть проблемы с совместимостью. И основное, мне в руке пока не попадались хоть какие-нибудь примеры динамических библиотек использующих исключительно SimConnect. Модули - да, но это не то.

 

Спасибо =)

 

UPD

 

 

void LogicType::update(void)	// Make All Method 
{
	FLOAT64 gen_mast = 0;
	execute_calculator_code ("(A:GENERAL ENG MASTER ALTERNATOR:1, Bool)", &gen_mast, NULL, NULL);

	if(gen_mast == gen_mast_st)
	{
		m_Sound->PlayNow();
		gen_mast_st = gen_mast;
	}
}

 

Такой вариант так же не приводит к желаемому результату.

Edited by Flanker_AleX

Share this post


Link to post
Share on other sites

"Не, ну в таких условиях я не могу работать" :)

 

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

 

if((gen_mast != gen_mast_st) && (gen_mast == 0)){

m_Sound->PlayNow();

}

 

gen_mast_st = gen_mast;

 

Обратите внимание, присвоение идёт в каждой итерации цикла гауги, теперь оно вне скобок, это важный момент.

  • Upvote 1

Share this post


Link to post
Share on other sites

Люди добрые, подскажите кто сможите.

Остались ли тут грамотные специалисты по созданию приборов на с++? Есть некий проект. Но очень не хватает программеров. Если есть желание помочь, пишите в лс.

Share this post


Link to post
Share on other sites

Как лучше организовать обмен данными между С++ гагами в FSX?

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

Имхуется мне, разные гаги имеют разные адресные пространства и даже если напрямую передам указатель, н-р через XML-переменную, смысла не имеет.

Share this post


Link to post
Share on other sites
Это очень хорошо. Просто у Гриффитса написано в разделе "Runnig Visual C++ as a Gauge Debugger":

 

This section has been deprecated as both FS9 and FSX will refuse to start if you attach a debugger to them. Microsoft giveth and Microsoft taketh away; they‟ve considerably improved the SDK for FS9 and FSX but have made it far more difficult to debug the gauges you create.

Что за Гриффитс? Не гуглится.

Где это скачать можно?

 

icebear

Share this post


Link to post
Share on other sites

Вопрос по топливной системе: как добраться до баков EXTERNAL1 и EXTERNAL2 (FS9)?

Суть вопроса: для начала хочу просто считать количество топлива в баке (в Aircraft.cfg баки, естественно, заданы). Для всех остальных типов баков в GAUGES.H определены соответствующие токены, а для внешних - ничего не вижу. Токены FUEL_QUANTITY_RIGHT и FUEL_QUANTITY_LEFT показывают лишь суммы MAIN+AUX+TIP.

Поиск дал три зацепки:
1. Вот этот пост утверждает, что соответствующие токены ( A:FUEL TANK External1/External2 QUANTITY ) имеют место быть. И, действительно, в файле "FS2004_Value_Variables.txt" от www.FS2x.com такие токены есть. Более того, проверил в xml-приборе - токены работают. Но мне надо бы на С.
2. В модели Il-18 вроде бы реализован необходимый функционал. По крайней мере, соответствующий прибор панели показывает количество топлива в этих баках.
3. Токены определены и в SDK для АЫЧ. Но мне надо в FS9. Попытка самостоятельно прописать эти токены в GAUGES.H, естественно, успеха не имела.

Можно, конечно, пробовать извращаться с чтением токенов через L-переменные из xml-файла, но ведь должен быть более простой путь. Что и где я упустил?

Share this post


Link to post
Share on other sites

Предыдущий вопрос порешил через дополнение GAUGES.H структурой XML_TOKEN. А вот как можно добраться до баков MAIN? В структуре FUEL_SELECT я этих баков не наблюдаю (видимо, кто-то в Microsoft решил "сэкономить" пару байтов). Пока могу добраться до них лишь опосредованно, через использование FUEL_TANK_SELECTOR_LEFT/RIGHT при уже пустых баках AUX и TIP. Но это явный костыль (к тому же, не везде работающий). Может, есть какой-то иной способ?

Share this post


Link to post
Share on other sites
Posted (edited)
В 21.04.2015 в 08:00, Krit пишет:

Как лучше организовать обмен данными между С++ гагами в FSX?

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

Имхуется мне, разные гаги имеют разные адресные пространства и даже если напрямую передам указатель, н-р через XML-переменную, смысла не имеет.

Ветка совсем загасла.  Многие, кто когда-то пытался, что-то делать, или реально делал, уже могли давно оставить в покое всякую разработку. А славные были деньки!
Может быть это просто вспоминается молодость (а воспоминания молодости обычно сопровождается приятными чувствами). А может быть действительно были совсем другие времена.
Тряхну стариной, отвечу на вопрос. Скорее всего в пустоту, но все же отвечу.

Цитата

... разные гаги имеют разные адресные пространства ...

Нет, не разные. Сам симулятор (ну, по крайней мере подсистема, которая работает с gauges) и все gauges, написанные на C/C++, живут в одном адресном пространстве. И если, каким-нибудь способом получить адрес структуры данных или функции в другом gauge (gauge-сервера), то из кода gauge-клиента можно без каких-либо проблем обратиться к структуре данных из gauge-сервера или вызвать функцию, реализованную в нем.

Для передачи адреса некой сущности в некую другую dll, всегда существовал простой и надежный, как автомат Калашникова, механизм. 
register_var_by_name

Вот ссылка на описание этой функции в документации из SDK для P3D v5
 

Эта функция вызывается один раз, для каждой структуры данных, в коде инициализации gauge-сервера (gauge, к структуре данных которого, будет осуществляться доступ из другого gauge).

Для получения указателя в коде клиента, используется функция
initialize_var_by_name

Что бы не думать о порядке инициализации gau (dll) файлов, приблизительно такой вот код вставляем в update, перед обращением к сущности из другого gauge:

if (!p_x_struct) {
	MODULE_VAR var;
	initialize_var_by_name(&var, "имя сущности");
	p_x_struct = ({Тип p_x_struct})var.var_ptr;
}

 

Edited by serg_p

Share this post


Link to post
Share on other sites
Posted (edited)
1 час назад, serg_p пишет:

 ... Что бы не думать о порядке инициализации gau (dll) файлов, приблизительно такой вот код вставляем в update, перед обращением к сущности из другого gauge: ...

Но иногда думать о порядке инициализации все же приходится. В случае, когда необходимо получить указатель на сущность в gauge-сервера, уже на этапе инициализации gauge-клиента.
В этом случае, необходимо обязательно соблюсти порядок следования gauges в Panel.cfg. gauge-сервера должна быть обязательно выше по списку gauge-клиента.
(инициализация dll обязательно срабатывает если хотя бы один прибор, пусть даже фейковый, зарегистрирован в Panel.cfg)
В своем коде, я это использую в случае, когда мне нужно прокинуть указатели на сервисы реализованные в определенном gauge, которые используются при инициализации dll gauges клиентов. И при этом обязательно слежу за порядком следования gauges в Panel.cfg.

Избавится от этой зависимости возможно, если перенести инициализацию, во всех  связанных gauges, в update. Но тут уже нужно мутить обмен, между всеми связанными gauges, информацией о состоянии, что бы отследить правильную инициализацию всех "внешних" указателей во всех связанных gauges и после этого уже разрешить update во всех gauges. Собственно весь период update разделить на две фазы. Непродолжительную фазу инициализации и фазу последующих update gauges, в процессе полета.  Но это уже вопрос изначального проектирования архитектуры всего приборного комплекса. И об этом лучше подумать сразу, при закладке нового приборного комплекса. И сразу закладывать единую функцию Update в главном gauge, которая будет дергать все остальные update, в том числе и во "внешних" gauges, вызывая проброшенные через register_var_by_name/initialize_var_by_name указатели на функции update во "внешних" gauges.

Но работая, скажем так, с унаследованными приборными комплексами (мой случай), не всегда удастся все перестроить. по этому иногда приходится использовать не очень хороший вариант, с ослеживанием порядка инициализации gauges.
 

Edited by serg_p

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...