Jump to content
Sign in to follow this  
Pilot718

Озвучивание событий через XML [FS9]

Recommended Posts

Bor

У Вас в ReadMe написано

gauge77=xss!process,0,0,1,1, Aircraft\SCS An-12\xss\xss.cfg

т.е. прибору xss!process передается фактический параметр Aircraft\SCS An-12\xss\xss.cfg.

 

Прошу прощения, но не подскажите, как Вы его читаете. Я пошарился, но у меня ничего не получилось. Пробовал модифицировать GAUGE_HEADER_FS800, подставил parameters, он похоже в макросе пропущен, но что-то нифига в буфер не падает.

 

Как-то раньше не было особой надобности, а сейчас вот очень надо. Занялся исследование gau из Ил-18. Кое чего получилось. Нашел некоторые статические переменные и некоторые CallBack-и и сделал gateway для обмена с L:переменными, но хотелось бы, что бы gau использовалась и в il-18 и в il38. Собственно gau ПНК и систем БИ в Ил-18 и Ил-38 одинаковые, изменялись похоже ресурсы ресхаком, ну и имя. Вот имя то мне и надо передать в мою gau. Вернее два имени, одно имя - имя gau ПНК, а другое - имя gau систем БИ.

Share this post


Link to post
Share on other sites

Bor

У Вас в ReadMe написано

gauge77=xss!process,0,0,1,1, Aircraft\SCS An-12\xss\xss.cfg

т.е. прибору xss!process передается фактический параметр Aircraft\SCS An-12\xss\xss.cfg.

 

Прошу прощения, но не подскажите, как Вы его читаете. Я пошарился, но у меня ничего не получилось. Пробовал модифицировать GAUGE_HEADER_FS800, подставил parameters, он похоже в макросе пропущен, но что-то нифига в буфер не падает.

 

 

Сергей, тебе узнать путь до папки(папок) загруженого самолёта или именно передать кусок пути? В первом случае могу помочь добраться до всех папок загруженого самолёта либо папок сима (сам использую это в тамагочи для конфигов, звуков и т.п.)

Share this post


Link to post
Share on other sites

Сергей, тебе узнать путь до папки(папок) загруженого самолёта или именно передать кусок пути?

Ни то и ни другое. Он хочет вытащить шестой параметр gaugeXX

Edited by gosha-z

Share this post


Link to post
Share on other sites

Ага, именно так, Игорь.

Нужно просто получить строку из шестого параметра gaugeXX. В ней будут имена gau ПНК и БИ. Эти имена я буду передавать в GetModuleHandle, что получить базовые адреса загрузки этих gau (dll). Ну и уже прибавлять к ним, найденные относительные адреса Callback функций и статических переменных.

Сейчас все работает, только вот имена gau прошиты в приборе, который является шлюзом межу нужными gau (на данный момент пока одна) и L:переменными.

Edited by serg_p

Share this post


Link to post
Share on other sites

Ага, именно так, Игорь.

Нужно просто получить строку из шестого параметра gaugeXX. В ней будут имена gau ПНК и БИ. Эти имена я буду передавать в GetModuleHandle, что получить базовые адреса загрузки этих gau (dll). Ну и уже прибавлять к ним, найденные относительные адреса Callback функций и статических переменных.

Сейчас все работает, только вот имена gau прошиты в приборе, который является шлюзом межу нужными gau (на данный момент пока одна) и L:переменными.

 

Вопрос, а зачем дёргать коллбэки одной гауги из другой? Сама цель интересна. По самому предмету твоего вопроса - вроде у Гриффитса было это. Разве так не идёт (типо полупсевдокод :diablo: )

 

void FSAPI gau_update(PGAUGEHDR pgauge, SINT32 service_id, UINT extra_data){
 PCHAR gauparams=NULL;
 switch(service_id){
   case PANEL_SERVICE_PRE_INSTALL:
     gauparams = (PCHAR)pgauge->parameters; //это вся строка по сути
     break;
 }
}

Share this post


Link to post
Share on other sites

Доброго времни суток!

 

Каким образом в XML можно задать "и, или"? Хочу сделать чтобы звук проигрывался если давление bleed air возрастает в любом из двух двигателей, но звук проигрывается только если возрастает давление в ENG2. Где я допустил ошибку? :)

 

<Value>(A:TURB ENG1 BLEED AIR, psi) 35 == (A:TURB ENG2 BLEED AIR, psi) 35 < if{ 0 (>L:PACKS_SOUND,bool) } els{ 1 (>L:PACKS_SOUND,bool) }</Value>

 

Спасибо!

Edited by Bombaklat

Share this post


Link to post
Share on other sites

<Value>(A:TURB ENG1 BLEED AIR, psi) 35 < (A:TURB ENG2 BLEED AIR, psi) 35 < && if{ 0 (>L:PACKS_SOUND,bool) } els{ 1 (>L:PACKS_SOUND,bool) }</Value>

Share this post


Link to post
Share on other sites

Да, так и читаю строку дополнительных параметров:

 

void FSAPI cbf_sound_engine(
	PGAUGEHDR pgauge, SINT32 service_id, UINT32 extra_data)
{
   switch( service_id )
   {
	case PANEL_SERVICE_PRE_INSTALL:
	break;
       case PANEL_SERVICE_CONNECT_TO_WINDOW:
       break;
       case PANEL_SERVICE_POST_INSTALL:
		InitSoundEngine(pgauge->parameters);
       break;
       case PANEL_SERVICE_PRE_KILL:	
		UninitSoundEngine();
       break;
       case PANEL_SERVICE_PRE_UPDATE:
		if( g_pXMLSoundServer )
			g_pXMLSoundServer->Process();
	break;
       case PANEL_SERVICE_POST_UPDATE:
	break;
       case PANEL_SERVICE_PRE_DRAW:
       break;
       case PANEL_SERVICE_POST_DRAW:
       break;
   }
}

 

а еще согласно SDK ее можно тут взять:

 

typedef struct	GAUGEHDR
{
UINT32			gauge_header_version;
char				*gauge_name;
PPELEMENT_HEADER		elements_list;
PQUERY_ROUTINE		query_routine;
PINSTALL_ROUTINE		install_routine;
PINITIALIZE_ROUTINE	initialize_routine;
PUPDATE_ROUTINE		update_routine;
PGENERATE_ROUTINE		generate_routine;
PDRAW_ROUTINE		draw_routine;
PKILL_ROUTINE		kill_routine;
char				reserved_1[4];
UINT32			size_x_mm;
char				reserved_2[40];
PMOUSERECT			mouse_rect;
PGAUGE_CALLBACK		gauge_callback;
UINT32			user_data;
PVOID				parameters;
char*				usage;
char				reserved_3[16];
}
GAUGEHDR, *PGAUGEHDR, **PPGAUGEHDR;

Edited by Bor

Share this post


Link to post
Share on other sites

Спасибо автору за прибор, подскажите есть ли у кого после прописки в конфиге панели вылеты из FS Panel Studio при открытии секции в которой прописали прибор?

post-56751-0-72908300-1291731041_thumb.jpg

Edited by DT-75

Share this post


Link to post
Share on other sites

DT-75, попробую проверить. Правда я никогда не работал с Panel Studo. Какая у вас версия и в какой момент происходит выброс исключения?

Share this post


Link to post
Share on other sites

DT-75, попробую проверить. Правда я никогда не работал с Panel Studo. Какая у вас версия и в какой момент происходит выброс исключения?

Выброс происходит при попытке открыть ту секцию, где прописан прибор, например в Ту-144 это [Vcockpit01], но ничего страшного, другие открываются нормально, версия Panel Studo 1.2; XSS-1.0

Вообще сначала показалось не сложно, озвучить тумблер просто, но уже на радиовысотомере ... пока не получается в XML в правильном месте поставить правильную строчку.

Edited by DT-75

Share this post


Link to post
Share on other sites

Вообще сначала показалось не сложно, озвучить тумблер просто, но уже на радиовысотомере ... пока не получается в XML в правильном месте поставить правильную строчку.

 

А, что вы конкретно хотите? Чтобы зачитывалась высота? Дайте ваш кусок кода для затравки.

Edited by Bor

Share this post


Link to post
Share on other sites

 

А, что вы конкретно хотите? Чтобы зачитывалась высота? Дайте ваш кусок кода для затравки.


Радиовысотомер РВ-5 от SCS Ту-134, прикручен к Ан-24, при включении уходит бланкер (rv_blanker.bmp), должен подаваться сигнал 400гц в течении 3-5 сек. и загорается жёлтая лампа (rv_lamp.bmp), при снижении на установленной в нём высоте (зелёный треугольник rv_des.bmp) также должен звучать сигнал и горит лампа.

<Gauge Name="A-037" Version="1.0">
<Image Name="rv_back.bmp" Luminous="Yes" ImageSizes="220,220,0,0"/>
<Element>
<Position X="110" Y="110"/>
<Image Name="rv_needle.bmp" Luminous="Yes" ImageSizes="27,99,0,0">
<Axis X="14" Y="85" PointsTo="East"/>
</Image>
<Rotate>
<Value Minimum="0" Maximum="800">(L:RV power,bool) if{ (G:Var1) if{ 15 } els{ (A:Radio height, meters) 3 - } } els{ 0 }</Value>
<Nonlinearity>
<Item Value="0" Degrees="0"/>
<Item Value="20" Degrees="31"/>
<Item Value="40" Degrees="62"/>
<Item Value="60" Degrees="93"/>
<Item Value="80" Degrees="126"/>
<Item Value="100" Degrees="159"/>
<Item Value="300" Degrees="208"/>
<Item Value="500" Degrees="255"/>
<Item Value="700" Degrees="303"/>
</Nonlinearity>
<Delay DegreesPerSecond="90"/>
<Failures>
<SYSTEM_ELECTRICAL_AVIONICS Action="Freeze"/>
</Failures>
</Rotate>
</Element>
<Element>
<Position X="159" Y="33"/>
<Image Name="rv_blanker.bmp" Luminous="Yes" ImageSizes="42,62,0,0">
<Axis X="0" Y="0"/>
</Image>
<Rotate>
<Value>(A:Radio height, meters) 4000 > (L:RV power, bool) ! ||</Value>
<Nonlinearity>
<Item Value="0" Degrees="-29"/>
<Item Value="1" Degrees="0"/>
</Nonlinearity>
<Delay DegreesPerSecond="120"/>
</Rotate>
</Element>
<Element>
<Position X="0" Y="0"/>
<Image Name="rv_upper.bmp" ImageSizes="220,220,0,0"/>
</Element>
<Element>
<Position X="110" Y="110"/>
<Image Name="rv_des.bmp" Bright="Yes" ImageSizes="16,91,0,0">
<Axis X="8" Y="91"/>
</Image>
<Rotate>
<Value Minimum="0" Maximum="700">(A:Decision height, meters)</Value>
<Nonlinearity>
<Item Value="0" Degrees="0"/>
<Item Value="20" Degrees="31"/>
<Item Value="40" Degrees="62"/>
<Item Value="60" Degrees="93"/>
<Item Value="80" Degrees="126"/>
<Item Value="100" Degrees="159"/>
<Item Value="300" Degrees="208"/>
<Item Value="500" Degrees="255"/>
<Item Value="700" Degrees="303"/>
</Nonlinearity>
<Delay DegreesPerSecond="90"/>
</Rotate>
</Element>
<Element>
<Position X="182" Y="181"/>
<Select>
<Value>(L:RV power, bool) if{ (A:Decision height, meters) (A:Radio height, meters) > (G:Var1) || } els{ 0 } </Value>
<Case Value="1">
<Image Name="rv_lamp.bmp" Bright="Yes" ImageSizes="24,24,0,0"/>
</Case>
</Select>
</Element>
<Element>
<Position X="194" Y="193"/>
<Image Name="rv_triangle.bmp" ImageSizes="24,24,0,0">
<Axis X="12" Y="12"/>
</Image>
<Rotate>
<Value Minimum="0" Maximum="700">(A:Decision height, meters) 10 /</Value>
</Rotate>
</Element>
<Mouse>
<Area Left="15" Top="187" Width="16" Height="16">
<Cursor Type="Hand"/>
<Click Kind="LeftSingle+LeftRelease+Leave">
(M:Event) 'LeftSingle' scmp 0 == if{ 1 (>G:Var1) }
(M:Event) 'LeftRelease' scmp 0 == if{ 0 (>G:Var1) }
(M:Event) 'Leave' scmp 0 == if{ 0 (>G:Var1) }
</Click>
</Area>
<Area Left="195" Top="181" Width="15" Height="30">
<Tooltip>VPR %( (A:Decision height, meters) )%!d!</Tooltip>
<Cursor Type="UpArrow"/>
<Click Repeat="Yes">(A:Decision height, meters) 700 < if{ 0 (>K:INCREASE_DECISION_HEIGHT) }</Click>
</Area>
<Area Left="180" Top="181" Width="15" Height="30">
<Tooltip>VPR %( (A:Decision height, meters) )%!d!</Tooltip>
<Cursor Type="DownArrow"/>
<Click Repeat="Yes">(A:Decision height, meters) 0 > if{ 0 (>K:DECREASE_DECISION_HEIGHT) }</Click>
</Area>
</Mouse>
</Gauge>

post-56751-0-15943900-1292013394_thumb.jpg

Edited by DT-75

Share this post


Link to post
Share on other sites

Ну сделайте гудок, или возьмите где нибудь гудок 400 Гц и нужной длительности. Не зацикливайте его.

Там где у вас озвучка тумблера при включении высотомера поставьте его включение:

 

<Click>(L:RV power, bool) ! (>L:RV power, bool) 1 (>L:TOGGLE_SOUND,bool) (L:RV power, bool) if{ 1 (>L:RV_SOUND,bool) } </Click> 

 

Ну тут можно оптимизировать, чтобы дважды на стек не класть RV_POWER можно или сразу это условие обрабатывать,

или дублировать его значение на стеке, я просто в симовском ХМЛ не силен.

 

Далее, в файле который вы привели, необходимо выполнять обработку некоторых условий, я сильно не вникал в тот код,

предлагаю алгоритм:

 

завести флаг взведенного высотомера L:RV_ARMED, bool сперва он false.

 

И такой код:

 

-если высотомер включен и флаг не взведен и высота больше Decision height + еще метров 10-15, взвести флаг (10-15 метров или футов обеспечивают петлю гистерезиса);

 

-если высотомер включен и флаг взведен и высота меньше Decision height, выставить сигнал RV_SOUND, сбросить флаг, выставить сигнал лампы

 

Ну это так приблизительно. Код по идее должен быть такой:

 

<Value>
(L:RV power, bool) (A:Radio height, meters) (A:Decision height, meters) 10 + > (L:RV_ARMED, bool) ! && && if{1 (>L:RV_ARMED,bool)}
</Value>

 

это первый шаг, ну тут я мог перепутать местами (надо СДК смотреть) (A:Radio height, meters) (A:Decision height, meters), что там со стеком и как проверяется.

 

<Value>
(L:RV power, bool) (A:Radio height, meters) (A:Decision height, meters) < 
(L:RV_ARMED, bool) ! && && if{1 (>L:RV_SOUND,bool) 0  (>L:RV_ARMED,bool)}
</Value>

 

Где то так, код не проверял.

Edited by Bor

Share this post


Link to post
Share on other sites

Ещё вопрос: есть лапма сигнализации SSOS, срабатывает при крутом снижении (более 7 м/с ниже ВПР, установленной радиовысотомером), есть звук с названием "SSOS" и строка, которую нужно изменить, чтобы одновременно с загоранием лампы звучал сигнал.

 

<Value>(L:RV power, bool) (A:Circuit general panel on, bool) if{ (L:AnnCheck,bool) (A:Decision height, feet) (A:Radio height, feet) > (A:Radio height, feet) 100 < || (A:Vertical speed,feet per minute) -1400 < && ||}</Value>

 

Подскажите пожалуйста, как должна выглядеть эта строка, чтобы всё заработало?

Edited by DT-75

Share this post


Link to post
Share on other sites

Ещё вопрос: есть лапма сигнализации SSOS, срабатывает при крутом снижении (более 7 м/с ниже ВПР, установленной радиовысотомером), есть звук с названием "SSOS" и строка, которую нужно изменить, чтобы одновременно с загоранием лампы звучал сигнал.

 

<Value>(L:RV power, bool) (A:Circuit general panel on, bool) if{ (L:AnnCheck,bool) (A:Decision height, feet) (A:Radio height, feet) > (A:Radio height, feet) 100 < || (A:Vertical speed,feet per minute) -1400 < && ||}</Value>

 

Подскажите пожалуйста, как должна выглядеть эта строка, чтобы всё заработало?

 

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

(>L:ALARM_SOUND, bool)

Share this post


Link to post
Share on other sites

Скажите, а не планируется ли адаптация XSS для работы в Flight Simulator X?

  • Upvote 2

Share this post


Link to post
Share on other sites

У меня тоже проблема с вылетом из ФС панель студио...и симулятор отказывается грузить модель с прописанным в панели прибором :sarcastic: а мне очень бы хотелось пошаманить с озвучкой некоторых агрегатов... в чем может быть проблема? подскажите если не сложно!

С Уважением Константин

Share this post


Link to post
Share on other sites

Вот есть у меня код на HML какую строчку можно добавить, что бы раздавался щелчек тумблера?

 

<Element>

<Visible>(L:SYSTEM_POWER,bool)</Visible>

<Select>

<Value>(L:ENG_2_BLEED_VALVE,bool)</Value>

<Case Value="0">

<Image Name="onn2.bmp" Bright="Yes"/>

</Case>

</Select>

</Element>

 

<Mouse>

<Tooltip>ENG 2 BLEED VALVE</Tooltip>

<Cursor Type="Hand"/>

<Click>8 (>L:tu124_schelc.waw) (L:ENG_2_BLEED_VALVE,bool) ! (>L:ENG_2_BLEED_VALVE,bool)</Click>

</Mouse>

 

</Gauge>

 

 

 

Звук находится в папке programm files/msfs2004/sound/tu124/schelc.waw

Share this post


Link to post
Share on other sites

помогите сделать звук всу на ил-76 Варнавского!

Share this post


Link to post
Share on other sites

Есть такой код:

 

// инициализация
m_xml_var_unit = get_units_enum("BOOL");
m_xml_var_id = register_named_variable("sound_1");

...

// воспроизведение звука по нажатию кнопки №1
set_named_variable_typed_value(m_xml_var_id, 1, m_xml_var_unit);

...

// остановка звука по нажатию кнопки №2
set_named_variable_typed_value(m_xml_var_id, 0, m_xml_var_unit);

 

Звук незацикленный.

 

Результат:

1) Используя библиотеку XSS версии 1.0.0, всё работает нормально. При опции Reset "true" воспроизведение остановить нельзя, оно прекратится только после полного проигрывания; при "false" - звук остановить можно.

2) Используя библиотеку XSS версии 1.2.0, звук упорно не хочет останавливаться пока не проиграет до конца. Установка опции Reset в true/false не даёт изменений.

 

В связи с результатом по п.2, вопрос - что делаю не так? Может есть hidden опция в cfg, которая разблокировывает ручную остановку звука?

Share this post


Link to post
Share on other sites

Так, почитал я свои комментарии к этой версии. Скажите пожалуйста, Lavrik, в этом звуковом файле "sound_1" есть семплы? Если нет семплов, то, звук автоматически считается однократно проигрываемым.

 

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

// определяется режим автосброса XML переменной (Reset=true/false;),
// если семплов нет, то переменная должна сбрасываться,
// так-как она не проигрывается циклически
// теперь в конфигурационном файле нет необходимости
// определять опцию Reset=... , но для совместимости
// она оставлена как незначащая.

 

Я исходил из того, что зацикленный звук имеет семплы и им нужно управлять, если звук семплов не имеет, то он не управляется и проигрывается только один раз и все, опция Reset в версии 1.2.0 не имеет смысла.

 

Решение: зациклите звук семплами и он станет управляемым

Edited by Bor

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...