AVSIM.su Forums: Тумблеры, галетники и "крутилки" VC - AVSIM.su Forums

Перейти к содержимому

Страница 1 из 1
  • Вы не можете начинать новые темы
  • Вы не можете отвечать в этой теме

Тумблеры, галетники и "крутилки" VC Оценить тему: -----

#1 Пользователь не на сайте   Drum27 

  • Новичок
  • Pip
  • Группа: Members
  • Сообщений: 11
  • Регистрация: 23-Октябрь 06

Отправлено 29 Июль 2010 - 20:01

Вопрос который меня мучает уже долго и нудно... Может плохо ищу, но вижу в форуме только намеки на решение.
Собственно, я не могу до конца понять как сделать чтобы гаугой можно было управлять из ВК. Простейший пример любой переключатель, ну допустим, тот же переключатель аккумулятора или еще чего, без разницы. Допустим, есть реализованный он на си, т.е. в панели все переключается битмапы перещелкиваются и т.д. и есть он же с анимацией с использованием L: переменной в ВК. Как реализовать данный переключатель на XML понятно, но вопрос именно в принципе управления гаугой из виртуальной кабины, так как есть куча приборов на панели, а вот из ВК я их достать не могу.
Т.е. хотелось бы увидеть не намеки на мою тупость и "посмотри то, посмотри это" "ты че тупой?":) и т.д. А хочется увидеть живой код на си и сопутствующий кусок XML, конкретную реализацию какой нибудь простейшей вещи. Я думаю, это не только мне будет полезно. Заранее спасибо откликнувшимся спецам.

Сообщение изменено: Drum27 (29 Июль 2010 - 20:02)

0

#2 Пользователь не на сайте   Mihail Stepanov 

  • Профи
  • PipPipPipPipPip
  • Группа: Members
  • Сообщений: 645
  • Регистрация: 25-Ноябрь 06
  • Location:Оренбург UWOO

Отправлено 31 Июль 2010 - 13:33

Если честно, я почти не понял вопроса. Насколько мне известно, приборы в 2Д кабине и в ВК используются одни и теже. Берите обычные приборы и прописывайте их в ВК. Или в чём то другом проблема?
0

#3 Пользователь не на сайте   serg_p 

  • Продвинутый
  • PipPipPipPip
  • Группа: Membersmem
  • Сообщений: 448
  • Регистрация: 02-Май 06

Отправлено 31 Июль 2010 - 14:04

Просмотреть сообщениеDrum27, 29 Июль 2010 - 20:01, сказал(а):

... Как реализовать данный переключатель на XML понятно, но вопрос именно в принципе управления гаугой из виртуальной кабины, так как есть куча приборов на панели, а вот из ВК я их достать не могу. ...

И не достаните, если конечно gau писали не Вы сами.

Про внутренние переменные gau и L:переменные (а именно они доступны в 3D модели ВК и в XML приборах) я относительно недавно объяснял:

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

serg_p сказал(а):

gau пишется на C/С++.

Язык C/С++ это тот язык, на котором пишутся все остальные языки. В том числе и тот язык, который используется в XML приборах. Т.е. это базовый язык. Ниже его только ассемблер. Ну, а еще ниже - машинный код. Машиный код языком назвать трудно. Это последовательность команд процессора. Хотя, нередко можно встретить термин - машинный язык.

Переменная простого типа (неструктурированного типа данных) (число, целое или с плавающей запятой), это есть фактически именованная область памяти длиной в нескольких байт, обычно 4 или 8 (фактически процессор оперирует с переменными таких длин). Разные типы чисел могут по-разному кодироваться битами этих байтов. Соответственно и интерпретироваться. В процессе компиляции и сборки gau (gau - есть dll библиотека) имена переменных заменяются на уже конкретные адреса памяти в процессорных командах. Вот пример адреса "сишной" статической переменной, сложив который с базовым адресом загрузки gau (dll) можно получить реальный адрес статической переменной в памяти, в процессе выполнения программы, т.е. в процессе полета:
0x00051f68

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

Получить базовый адрес загрузки gau (dll) можно только через вызов API функции и только в процессе выполнения программы. Да и собственно запрограммировать доступ к переменной, по вычисленному адресу, можно только на C/C++. Т.е., в коде XML-прибора, никак не добраться до "сишной" переменной. Да и при следующей компиляции и сборки gau (dll) ее относительный адрес может измениться (в процессорной команде, в скомпилированном и собранном gau, будет прописан другой адрес).

Обычно переменных (естественно, "сишных" статических переменных dll (gau)) в gau - море.

Безусловно, есть определенное подмножество переменных, которые непосредственно связаны с визуальными элементами приборов. Т.е. именно их значения передаются симу для управления битмапами визуальных элементов. Но бывает, что симу передается значение локальной переменной функции, собственно значение которой получается непосредственно в CallBack-функции визуального элемента, функции, которая вызывается 18 раз в секунду, и в теле которой могут производиться определенные вычисления до передачи значения симу. Здесь вообще засада с доступом даже из программ, написанных на C.

Для того, что бы в XML приборе можно было читать/писать значение определенной "сишной" переменной, нужно специально запрограммировать создание L-переменной и обмен данными между ней и "сишной" переменной. Это не одна строчка "сишного" кода, их нужно написать несколько, разбросав по нескольким местам в коде, т.е. увязать в логике, в алгоритме.

Для того, что бы в ВК были свои анимированные 3D объекты в качестве нужных органов управления, при построении ВК, нужно изначально работать в паре с программистом.

Правда есть одни выход. Но это работает только, когда нужные переменные в gau не автоматические (т.е. к локальным переменным функций вряд ли удасться получить доступ). Есть методы отыскания их адресов в памяти. Адреса статических переменных не меняются до следующей перекомпиляции gau (компиляция и сборка gau может быть осуществлена тем, у кого есть исходные тексты). После того, как отыскали адреса нужных переменных, пишется своя gau, в которой создаются нужные L:переменные и код обмена данными, между найденными статическими переменными и своими L:переменными. Но это целая морока. Ну и квалификация тоже должна быть соответствующей.

Сообщение изменено: serg_p (31 Июль 2010 - 16:24)

0

#4 Пользователь не на сайте   serg_p 

  • Продвинутый
  • PipPipPipPip
  • Группа: Membersmem
  • Сообщений: 448
  • Регистрация: 02-Май 06

Отправлено 31 Июль 2010 - 16:48

Если gau Ваша, то в module_init() или в разделе инициализации, в CallBack-е, какого либо прибора (лучше прибора, в котором крутится логика, если уровень логики выделен и размещен в отдельном приборе), проверяете наличие L:переменной. Если ее нет, то создаете ее:
if((ID_L_VAR_XXX = check_named_variable("VAR_XXX")) == -1)
    ID_L_VAR_XXX = register_named_variable("VAR_XXX"); 

Естественно ID_L_VAR_XXX (числовой идентификатор L:переменной) должна быть определена, где-нибудь, как статическая переменная типа ID, т.е. где нибудь до CallBack функции нудно написать:
ID ID_L_VAR_XXX = -1;

Имя переменной ID может быть любым, но лучше использовать имя L:переменной с префиксом ID_. Что бы потом не запутаться, когда таких переменных будет куча. VAR_XXX - чисто условное имя L:переменной. Лучше конечно, что бы все имена были "говорящими"

А далее уже читаете и пишите в Вашу L:переменную там, где это Вам надо (в тех местах PRE_UPDATE, где по смыслу нужно организовать обмен данными с Вашей L:переменной).

Небольшое отступление.
Вообще конечно, весь уровень логики стоит разбить на классы (если логики много), каждый класс унаследовать от одного родителя, в котором будут обозначены виртуальные методы создания L:переменных и виртуальные методы обмена с ними данными. В самих классах, в указанных виртуальных методах уже реализовать непосредственно само создание L:переменных и обмен данными с ними. Далее, если указатели на все экземпляры классов логики загнать в массив, то можно будет однообразно запускать в циклах, указанные выше методы, в определенных для этого местах. Т.е. так можно унифицировать обмен с L: переменными
Это конечно совет для тех случаев, когда создается gau с большим объемом кода логики и с интенсивным обменом через L:перменные. Ну и естественно, когда классы уровня логики правильно организуются.

Чтение L:переменной производся так:
перменная_с = get_named_variable_value(ID_L_VAR_XXX);
...
// или если нужно привести значение к нужной размерности,
// то где-нибудь в инициализации пишете еще
id_единицы_измерения = get_units_enum("название единицы измерения");
...
// в PRE_UPDATE
перменная_с = get_named_variable_typed_value(ID_L_VAR_XXX, id_единицы_измерения);

Запись так:
set_named_variable_value(ID_L_VAR_XXX, перменная_с)
// или с помошью set_named_variable_typed_value(ID id, FLOAT64 value, ENUM units), когда нужно приводить значение к нужной размерности;

Естественно в примере русские символы в именах переменных - только для наглядности. Все пишем по английски.

Сообщение изменено: serg_p (31 Июль 2010 - 18:00)

0

#5 Пользователь не на сайте   Drum27 

  • Новичок
  • Pip
  • Группа: Members
  • Сообщений: 11
  • Регистрация: 23-Октябрь 06

Отправлено 03 Август 2010 - 00:23

Спасибо огромное, это уже похоже на полезную и наглядную информацию, хотя прямого примера какого-либо приборчик нет, чего хотелось бы увидеть, но уже можно разбираться. Gau свои, естественно, иначе бы я вопрос не задавал.
0

#6 Пользователь не на сайте   serg_p 

  • Продвинутый
  • PipPipPipPip
  • Группа: Membersmem
  • Сообщений: 448
  • Регистрация: 02-Май 06

Отправлено 03 Август 2010 - 01:21

Вот Вам приборчик (исходный текст внутри архива)
Там как раз идет работа с L:переменными.

Сообщение изменено: serg_p (03 Август 2010 - 01:27)

0

#7 Пользователь не на сайте   Drum27 

  • Новичок
  • Pip
  • Группа: Members
  • Сообщений: 11
  • Регистрация: 23-Октябрь 06

Отправлено 14 Август 2010 - 02:37

Хм. Сделано было так как ниже представлен учебно-тренировочный код. Но при этом управляется из гауги элемент ВК. Вопрос как раз в том - как сделать наоборот?

char clock_gauge_name[] = GAUGE_NAME;
extern PELEMENT_HEADER clock_list;
extern MOUSERECT clock_mouse_rect[];
void FSAPI ClockCallback( PGAUGEHDR pgauge, SINT32 service_id, UINT32 extra_data );

GAUGE_HEADER_FS700( GAUGE_W, clock_gauge_name, &clock_list, \
clock_mouse_rect, ClockCallback, 0, 0, 0 );

static FLOAT64 rh_val = 0;

///////////////////////
ID idTe stVar = -1;

void FSAPI ClockCallback( PGAUGEHDR pgauge, SINT32 service_id, UINT32 extra_data ){
if((idTestVar = check_named_variable("TestVar")) == -1)
idTestVar = register_named_variable("TestVar");
}
///////////////////////


FLOAT64 FSAPI clock_needle_cb( PELEMENT_NEEDLE pelement )
{
FLOAT64 val = pelement->source_var.var_value.n;
val*=6;
return val-180;
}

FLOAT64 FSAPI clock_rh_cb( PELEMENT_NEEDLE pelement )
{
//FLOAT64 rh_val = pelement->source_var.var_value.n;
//if (val > 60) val = 60; else if (val < 0) val = 0;
return rh_val;
}

MAKE_NEEDLE
(
clock_needle,
BMP_CLOCK_MIN_NEEDLE,
NULL,
NULL,
IMAGE_USE_TRANSPARENCY|IMAGE_USE_ERASE|IMAGE_BILINEAR_COLOR,
0,
120, 120,
7, 97,
CLOCK_SECOND, clock_needle_cb,
NULL,
0
)


MAKE_NEEDLE
(
right_head_needle,
BMP_RH_CLOCK_NEEDLE,
NULL,
NULL,
IMAGE_USE_TRANSPARENCY|IMAGE_USE_ERASE|IMAGE_BILINEAR_COLOR,
0,
220, 220,
6, 6,
MODULE_VAR_NONE, clock_rh_cb,
NULL,
0
)

PELEMENT_HEADER clock_needle_list[] =
{
(PELEMENT_HEADER)&clock_needle,
(PELEMENT_HEADER)&right_head_needle,
NULL
};



/////////////////////////////////////////////////////////////////////////////
MAKE_STATIC
(
clock_background,
BMP_CLOCK_BACKGROUND,
&clock_needle_list,
NULL,
IMAGE_USE_TRANSPARENCY,
0,
0, 0
)

PELEMENT_HEADER clock_list = &clock_background.header;

double val;

BOOL FSAPI clock_rhh_cb(PPIXPOINT relative_point, FLAGS32 mouse_flags)
{
if(mouse_flags & MOUSE_WHEEL_UP)
rh_val += 20;
if(mouse_flags & MOUSE_WHEEL_DOWN)
rh_val -= 20;

if (rh_val > 20)
rh_val = 20;
if (rh_val < 0)
rh_val = 0;

val = get_named_variable_typed_value(idTestVar, TYPE_BOOL8);
val = 10;
set_named_variable_typed_value(idTestVar, val, TYPE_BOOL8);

return TRUE;
}




/////////////////////////////////////////////////////////////////////////////
MOUSE_BEGIN( clock_mouse_rect, HELPID_GAUGE_MANIFOLD_PRESSURE, 0, 0 )
MOUSE_CHILD_FUNCT( 200,220,200,220, CURSOR_HAND, MOUSE_WHEEL, clock_rhh_cb)
MOUSE_END
0

Сообщить об этой теме:


Страница 1 из 1
  • Вы не можете начинать новые темы
  • Вы не можете отвечать в этой теме

1 пользователей читают эту тему
0 members, 1 guests, 0 anonymous users