Jump to content
NobbyNobbs

Программирование джойстиков CH Products

Recommended Posts

Приветствую, камрады! 

Кто-нибудь здесь джойстики CH программирует?

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

В частности в БЗС, мне кажется, всем могут пригодиться две фичи, первая из которых, надеюсь, со временем станет ненужной, а вот вторая 100% должна пригодиться мессоводам.

В общем так:

 

 

 

Скрипт намба 1, "Триммирование"  РВ.

Данный скрипт моделирует "как бэ триммирирование (поэтому в кавычках) РВ", а вернее "привязанный резинкой к приборной доске (или креслу, тут по обстоятельствам) РУС". В принципе этого же эффекта можно добиться аналоговыми "триммерами" имеющимися в основании джойстика, но я предпочитаю лишний раз резисторы не беспокоить. Код:

 
sequence          
 wait(js1.b6 and (not js2.b4));
  a2=js1.a2-128;
 endsequence
 if(not (js1.b6)) then
  cms.a2=js1.a2+a2;
 endif
 
Вышеизложенная часть скрипта внаглую скопирована из мануала (ссылка на его русский перевод в подписи) и в пояснениях вряд ли нуждается. Вы просто отклоняете РУС в положение, которое по вашему разумению должно соответствовать нейтрали, нажимаете кнопку B6 (у меня комбатстик, поэтому у владельцев файтерстика обозначения кнопок вероятнее всего будут другими), возвращаете РУС в центр, отпускаете кнопку... самолет летит прямо (относительно). Вроде как прикольно, но есть одно но: смещая "начало координат" (или нейталь джойстика, кому как нравится), к примеру на пикирование (чтобы компенсировать кабрирующий момент) мы приходим к ситуации, что выбрать ручку полностью на себя не представляется возможным, так как у нас теперь есть только 128 отсчетов ручки на себя при необходимости иметь 128+a2. поэтому пришлось придумать этому скрипту продолжение:
 
sequence
while([a2<0]and[js1.a2==255]);
a2=a2+1;
endsequence
sequence
while([a2>0]and[js1.a2==0]);
a2=a2-1;
endsequence

 

То есть, в случае нехватки хода полностью "отдатой" или выбранной ручки джойстика мы наш "триммер" постепенно обращаем в нуль, возвращая нейтраль в центр. Такой вот костыль для костыля.

 

Скрипт намба 2, "Лимитатор" 

 

Написал я его лишь для того, чтобы лишний раз не поджаривать двигатель мессершмита, летая на постоянном 1.42 ata (а по-другому, учитывая легкость хода РУСа от CH у меня просто не получается). Выглядит он вот так:

 
if ([js2.a3<25] and ([a3==0])) then 
cms.a3=229;
else if ([js2.a3<18] and ([a3==1])) then
cms.a3=237;
else if ([js2.a3<12] and ([a3==2])) then
cms.a3=242;
else
cms.a3=255-js2.a3;
endif
endif
endif
 
sequence
wait((js2.b6)and[a3<3]);
a3=a3+1;
endsequence
sequence
wait((js2.b8)and[a3>0]);
a3=a3-1;
endsequence

 

Здесь a3 это виртуальная ось, которая на самом деле будет отвечать за выбранный режима работы нашего "лимитатора", а их у меня получилось 4:

a3=0, 90% или 229 отсчетов, соответствует 1.2 ata при горизонтальном полете;

a3=1, 93% или 237 отсчетов, соответствует 1.3 ata при горизонтальном полете;

a3=2, 95% или 242 отсчета, соответствует 1.3 ata на горках, петлях и т.д.,

a3=3, 100%, 1.42 ata.

Режимы переключаются кнопками 6 и 8 на РУДе (это четырехпозиционная хатка под указательным пальцем), вправо - увеличить наддув, влево - уменьшить наддув.

Что еще? Вангую, что оси управления газом у владельцев CH ProThrottle в настройках игры инвертированы, и если возникнет желание поюзать скрипт, то придется эту галку в настройках убрать.

Ну и сразу признаюсь, что цифры 90%, 93%, 95%, 100% по большому счету взяты с потолка, в том смысле, что когда я тестил скрипт, то выше 3 000 м. вообще не забирался.

 

 

Ну и делитесь своими скриптами и идеями, не жадничайте.

  • Upvote 6

Share this post


Link to post
Share on other sites

Классная тема.

Попробуем.

Я недавно купил комплект, так что очень интересно

Share this post


Link to post
Share on other sites

Там инструкция на английском. Я попереводил и бысто утух. Вот теперь с русским мануалом всё будет повеселей, спасибо :good:

Edited by ROSS_Wespe

Share this post


Link to post
Share on other sites

Там инструкция на английском. Я попереводил и бысто утух. Вот теперь с русским мануалом всё будет повеселей, спасибо :good:

спасибо неизвестному герою, сподобившемуся на перевод этого манускрипта ))

Share this post


Link to post
Share on other sites

подсмотрел у Икса видео о том, как оптимально настроить функцию "прильнуть к прицелу" (вот здесь). действительно, на мой взгляд оптимально, так как в отличие от "фиксированных взглядов" при "Иксовской" реализации остается возможность управлять обзором.

что не нравится: под реализацию зачем-то нужно две кнопки. 

делаем одну кнопку: при первом нажатии влипаем в прицел, при повторном возвращаемся в более естественное положение.

скрипт:

 
sequence
wait(js1.b4);
cms.b8=true;
delay(3);
cms.b8=false;
wait(js1.b4);
cms.b3=true;
delay(3);
cms.b3=false;
endsequence
 
код прост и понятен, но если просто забить его в редактор, естественно ни фига работать не будет, поэтому на данном примере напишу пару слов о том, как вообще пользоваться CH Control Manager-ом, так как с ним все не очень очевидно.
 
как создать профиль (карту, map) с поддержкой cms объяснять не буду, это просто, там есть волшебник. создали.
теперь по обозначениям устройств:
js1, js2, js3 это физические устройства, обычно в последовательности РУС, РУД, Педали.
cms1, cms2, cms3 - это виртуальные устройства, соответствующие js1, js2, js3.
cms4, cms5 и т.д. это видимые системе виртуальные устройства, которых вы можете насоздавать не помню сколько, кажется до cms16.
cms - созданное контрол манагером "устройство", кнопки и оси которого отображены на вкладке CMS Controls в GUI. важно понимать, что системе непосредственно это устройство не видно.
 
теперь непосредственно по скрипту, а именно - что делать чтобы он работал:
так как мы "забираем" четвертую кнопку на первом джойстике, нам нужно найти ее в GUI [график юзер интерфейс], (для этого просто нажимаем её на устройстве или кликаем мышью на миниатюре в GUI) и снять галку с чекбокса DX Mode. мы отключили кнопку на физическом устройстве.
по первому нажатию js1.b4 у нас включается кнопка cms.b8, которой не соответствует никакое устройство видимое системе, поэтому находим кнопку 8 на вкладке CMS Controls, кликаем по ней, в поле DirectX Device выбираем cms1, в поле DirectX Control - button 4 (можно было выбрать cms4 и любую кнопку на нем, но я использовал пустой слот от js1, чтобы без дела не болтался).
для cms.b3 как раз таки выбираем cms4 и какую-нибудь кнопку, у меня оказалась свободной button 2.
 
post-14111-0-87735600-1387641459_thumb.jpg
 
теперь нажимаем кнопку download, прописываем все это безобразие в джойстик и пользуемся.
 
сразу оговорюсь, что в принципе в данном случаем можно вообще обойтись без программирования и реализовать эту фичу иначе, а именно - по нажатию кнопки приближать взгляд, при отпускании удалять. делается это следующим образом:
 
post-14111-0-82102200-1387641663_thumb.jpg
 
что по русски означает - при нажатии кнопки на джойстике срабатывает кнопка плюс на нумпаде, при отпускании - минус.

Share this post


Link to post
Share on other sites

Огромное спасибо за инфу.

Просветите по важному вопросу: в Вин 8 про после перезагрузки система не видит Fighterstick. Только передергивание кабеля помогает.

Джой не брал в руки с 2010 (когда была XP), потому сам не могу понять, а Гугл не помогает.

Share this post


Link to post
Share on other sites

Просветите по важному вопросу: в Вин 8 про после перезагрузки система не видит Fighterstick. Только передергивание кабеля помогает.

 

у меня аналогичная беда с комбатстиком, правда я лечу её перезагрузкой (клин клином). вообще системы в этом лично я не смог увидеть - он то сразу подхватывается, то вообще не подхватывается.

Share this post


Link to post
Share on other sites

А в диспетчере устройств, когда джойстик пропадает, неопознанных или неверно работающих устройств не появляется? Если появляются, можно попробовать их отключить (программно) и обнаружить/включить заново. У меня МДжой16 с неинтеловскими чипсетами таким страдал, написал командный файлик, который занимался отключением/включением (через утилитку devcon) Мало ли кому поможет.

Share this post


Link to post
Share on other sites

А в диспетчере устройств, когда джойстик пропадает, неопознанных или неверно работающих устройств не появляется? Если появляются, можно попробовать их отключить (программно) и обнаружить/включить заново. У меня МДжой16 с неинтеловскими чипсетами таким страдал, написал командный файлик, который занимался отключением/включением (через утилитку devcon) Мало ли кому поможет.

 

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

 

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

 

а вообще, буржуи на своих форумах, в том числе и на официальном майкрософтовском, говорят, что изначально надо было инсталлятор дров запускать в режиме совместимости с семеркой, потому как на дрова для восьмерки CH Products никак не разродятся.

 

p.s. а с девконом почти разобрался. почти - потому что cmd для этой утилиты надо запускать с правами администратора, иначе ни фига не получается, а как это сделать через батник я ХЗ. 

Share this post


Link to post
Share on other sites

Спасибо! С "устранением неполадок" работает. Что интересно иногда есть в системе джой, но нет отклика по осям, а сейчас заходил, винда видит его только в группе "Нет данных" в "Устройствах и принтерах".

Share this post


Link to post
Share on other sites

А могёте написать скрипт, чтобы на кнопку ось виртуальную повесить. Я на лагге кнопку тормоза хочу в ось тормоза превратить. А птом через скрипт подобрать удобную мне скорость нажатия.

С триммерами можно так же сделать.

PS По триммированию в инструкции ещё один интересный скрипт приложен для пружинных джоев: там ещё одной осью можно двигать 0 джойстика. Т.е. владельцы СН могут получить триммера на ЛаГГ уже сейчас.

Share this post


Link to post
Share on other sites

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

вариант: при нажатии и удержании кнопки гашетка тормоза нажимается, при отпускании - отпускается; 

выглядеть это будет примерно вот так:

 

sequence

while (js1.b9 and ([cms.a1<255]));
cms.a1=cms.a1+2;
//delay(1);
endsequence
sequence
while ((not js1.b9) and ([cms.a1>0]));
cms.a1=cms.a1-3;
//delay(1);
endsequence

 

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

минус подобной реализации я вижу в невозможности зафиксировать тормоз в промежуточном положении без необходимости яростно задрачивать многократно нажимать кнопку.

 

если есть возможность выделить под тормоз целых две кнопки, то запрограммировать ось можно вот так:

 

sequence                            
while ((js2.b2)and([cms.a9<255])); 
CMS.A9=CMS.A9+1;
delay(1);
endsequence
sequence
while ((js2.b3)and([cms.a9>0]));
CMS.A9=CMS.A9-1;
delay(1);
endsequence
 
if ((js2.b4)and(js2.b3)and([cms.a9>0])) then
CMS.A9=CMS.A9-1;
else if ((js2.b4)and(js2.b2)and([cms.a9<255]))then
CMS.A9=CMS.A9+1;
endif
endif
 
так у меня сделано управление шагом винта на Лагге (мне показалось, что так шаг меняется точнее). 
нажимаем кнопку Б2 - медленно увеличиваем значение, нажимаем Б3 - медленно уменьшаем (задержка между итерациями 1 такт (сколько это в секундах - ХЗ, пишут, конечно, что 10 тактов~полсекунды, но это вранье). 
если нажимаем эти кнопки в сочетании с Б4 (использую как шифт), то значение меняется быстро. ИХМА - тормозу хватит и половины такого скрипта, два режима работы ему ни к чему.
 
естественно, через GUI эту ось можно прикрутить как к новому девайсу, так и к уже имеющемуся.
 
ну а если изложите свое видение реализации тормозов - можно покумекать :gamer: 

Share this post


Link to post
Share on other sites

При нажатии кнопки тормоз нажимается до 100%.При отпускании ось опять возвращается в 0. Скорость перехода от 0% к 100%.

Тормоза - это реальная кнопка HAT3 Down [b15] на Fighterstick, а нажиматься должна виртуальная ось R на CM Device 1.

Share this post


Link to post
Share on other sites

тогда можно взять первый скрипт из предыдущего моего поста, поменять B9 на B15 и пользоваться. фактически то же самое, но покороче вот здесь (я бы взял этот)



if (js1.b15 and ([cms.a1<255])) then

cms.a1=cms.a1+10;

else if ((not js1.b15) and ([cms.a1>0]))then

cms.a1=cms.a1-10;

endif

endif

 


в GUI для сms.a1 надо сделать вот так:


post-14111-0-80324200-1387834252_thumb.png

 


а для B15 отключить DX Mode.


после этого нажимаете download, и в test/calibrate смотрите что получилось (если включен mapped mode конечно).


 


p.s. +/- 10 надо поварьировать, пока не получите удовлетворительную скорость срабатывания. 


Edited by saatanaperkele

Share this post


Link to post
Share on other sites

Спасибо, всё отлично работает. :)

 

вы на Лагге обкатайте и если это в использовании удобно будет отпишитесь - я и себе так сделаю  :)

Edited by saatanaperkele

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Да хотя бы со скачком. Главное чтобы при отпускание кнопки сохранялось значение виртуальной оси. Хотел на радиаторы повесить, скачок на доли секунды думаю не критичен.

а сам газ там же будет?

Share this post


Link to post
Share on other sites

Да хотя бы со скачком. Главное чтобы при отпускание кнопки сохранялось значение виртуальной оси. Хотел на радиаторы повесить, скачок на доли секунды думаю не критичен.

И еще я имел ввиду не ось руда, а ось колесика, которое внизу на корпусе РУСа.

Share this post


Link to post
Share on other sites
в общем скрипт будет до неприличия простым:

 

if (js1.b4)then

cms.a1=js1.a3;

else if(js1.b3) then

cms.a2=js1.a3;

endif

endif

 

где в js1.b4 и js1.b3 надо заменить циферки соответствующие кнопкам на те, которые нужны непосредственно вам.

ну и в GUI соответственно надо физическую ось и кнопки выключить, а для виртуальных осей №№ 1, 2 проставить устройства и оси (выше есть примеры как это делается).

Edited by saatanaperkele

Share this post


Link to post
Share on other sites

Спасибо, попробуем.

И за тему большое спасибо. До этого вообще понять ничего не мог.

Share this post


Link to post
Share on other sites

Все работает. Повесил три виртуальные оси на одну физическую.

 
if(JS1.B2) THEN
CMS.A5=JS1.A3;
else if(JS1.B7) THEN
CMS.A4=JS1.A3;
else if(JS1.B3)THEN
CMS.A6=JS1.A3;
endIF
endIF
endIF
  • Upvote 1

Share this post


Link to post
Share on other sites

РОФ, БзС и микростик РУДа CH.

 

есть мнение, что упомянутый микростик в виде "как есть" вообще непригоден для использования в РОФ и БЗС, однако его очень легко переделать в очередную четырехпозиционную хатку, примерно вот так:

 
cms.b2=[js2.a1<10];
cms.b4=[js2.a1>245];
cms.b7=[js2.a2<10];
cms.b10=[js2.a2>245];
 
как итог - еще четыре кнопки, на две из которых (бывшая ось X) очень очень удобно повесить ФОВ+ и ФОВ-, а еще две фиг знает зачем нужны  ;)
Edited by saatanaperkele
  • Upvote 1

Share this post


Link to post
Share on other sites
Прочитал инструкцию внимательно, вроде начало приходить понимание:

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

Дело в том, что , как я понял, виртуальной кнопке устройства CMS можно присвоить только нажатие определённой кнопки джойстика. Если вы используете кнопку джойстика для ещё какой либо функции с шифтом, то это значение при простом присвоении виртуальной кнопке значения кнопки  джойстика теряется. В моём случае кнопка джойстика В15 используется без шифта как ось тормозов, а с шифтом-как пуск сигнальной ракеты.

Соответственно кнопка-В15-это и есть рабочая кнопка, В4-кнопка "шифт" на джойстике. Кнопка cms.B1-отвечает за ось тормоза, кнопка cms.b2-отвечает за стрельбу из ракетницы.

 

if (not cms.b1 and not cms.b2) then

cms.b1=(js1.b15 and not js1.b4);

cms.b2=(js1.b15 and js1.b4);

else if (cms.b1 and not cms.b2) then

cms.b1=js1.b15;

else if (not cms.b1 and cms.b2) then

cms.b2=js1.b15;

endif

endif

endif

 

Эта часть отвечает за двойное действие кнопки джойстика.

Весь скрипт стал выглядеть теперь так:


script

sequence

if (not cms.b1 and not cms.b2) then

cms.b1=(js1.b15 and not js1.b4);

cms.b2=(js1.b15 and js1.b4);

else if (cms.b1 and not cms.b2) then

cms.b1=js1.b15;

else if (not cms.b1 and cms.b2) then

cms.b2=js1.b15;

endif

endif

endif

if (cms.b1 and ([cms.a1<255])) then

cms.a1=cms.a1+20;

else if ((not cms.b1) and ([cms.a1>0]))then

cms.a1=cms.a1-50;

endif

endif

endsequence

endScript

Edited by ROSS_Wespe
  • Upvote 1

Share this post


Link to post
Share on other sites

 

Прочитал инструкцию внимательно, вроде начало приходить понимание:
Написал небольшое дополнение к скрипту, где к нажатию кнопки приравнивается ось.
Дело в том, что , как я понял, виртуальной кнопке устройства CMS можно присвоить только нажатие определённой кнопки джойстика. Если вы используете кнопку джойстика для ещё какой либо функции с шифтом, то это значение при простом присвоении виртуальной кнопке значения кнопки  джойстика теряется. В моём случае кнопка джойстика В15 используется без шифта как ось тормозов, а с шифтом-как пуск сигнальной ракеты.
Соответственно кнопка-В15-это и есть рабочая кнопка, В4-кнопка "шифт" на джойстике. Кнопка cms.B1-отвечает за ось тормоза, кнопка cms.b2-отвечает за стрельбу из ракетницы.
 

if (not cms.b1 and not cms.b2) then
cms.b1=(js1.b15 and not js1.b4);
cms.b2=(js1.b15 and js1.b4);
else if (cms.b1 and not cms.b2) then
cms.b1=js1.b15;
else if (not cms.b1 and cms.b2) then
cms.b2=js1.b15;
endif
endif
endif

 
Эта часть отвечает за двойное действие кнопки джойстика.
Весь скрипт стал выглядеть теперь так:

script
sequence
if (not cms.b1 and not cms.b2) then
cms.b1=(js1.b15 and not js1.b4);
cms.b2=(js1.b15 and js1.b4);
else if (cms.b1 and not cms.b2) then
cms.b1=js1.b15;
else if (not cms.b1 and cms.b2) then
cms.b2=js1.b15;
endif
endif
endif
if (cms.b1 and ([cms.a1<255])) then
cms.a1=cms.a1+20;
else if ((not cms.b1) and ([cms.a1>0]))then
cms.a1=cms.a1-50;
endif
endif
endsequence
endScript

 

 

давайте по пунктам.

"1. Если вы используете кнопку джойстика для ещё какой либо функции с шифтом, то это значение при простом присвоении виртуальной кнопке значения кнопки джойстика теряется."

в общем случае нет. то есть, если назначить что-нибудь в духе

cms.b1=js1.b1;

то эта виртуальная кнопка будет точно такой же кнопкой как и настоящая, просто у нее скорее всего будет другой ID и ее надо переназначить в игре. в том числе она будет работать с шифтом или другими клавишами-модификаторами. в случае с тормозом она действительно "потерялась", но только потому, что в GUI была отключена кнопка b15, то есть сама кнопка как-бы была "удалена" для системы, а никаких клавиш вместо нее мы с вами не назначали, только ось. 

2. Скрипт.

немножко теории: синтаксис типа cms.b1 стоит использовать только в случае если вы будете использовать значение этой переменной как кнопку для вывода в систему. если вам нужна просто булева переменная, то лучше использовать b1, b2,..., b128. такая же ситуация с осями - если мы не будет отдавать значение во вне, надо использовать a1, a2...an

в вашем случае (если оставить скрипт как есть) нужна одна кнопка cms.b1 и одна переменная b1.

 

практика. 

на мой взгляд первый блок if где вы сравниваете cms.b1 и cms.b2 просто не нужен, потому как в нем вы сравниваете переменные, значения которых определяются внутри самого блока. спрашивается - а зачем, если вы и так заведомо знаете их значение? вернуть ракеты можно малыми усилиями, обозначив, что тормозить надо при ненажатом шифте. а для сочетания (шифт+b15) прописать кнопку, которой в GUI поставить в соответсвие cms1 -> button 15. иначе говоря:

 

if ((not js1.b4) and js1.b15 and ([cms.a1<255])) then
cms.a1=cms.a1+20;
else if ((not js1.b15) and ([cms.a1>0]))then
cms.a1=cms.a1-50;
endif
endif
cms.b1=js1.b4 and js1.b15;
 
как-то так  :)   ;)
 
апдейт: не увидел sequence endsequence. блоки sequence нужны для работы с командами wait и while, для if они лишние.
Edited by saatanaperkele

Share this post


Link to post
Share on other sites

Мужики, вы бы в коментах в скриптах хоть вкратце писали, что делаете. А то скрипт видно, а что, зачем и почему - не особо.

Вот пример моего скрипта в БоБе для раздельных тормозов и выпуска закрылков в различные положения для мессера. Правда я использую только руд. Может кому пригодиться.

 

// CMS Script File
//
//     Game Title: CoD
//     Written By:
//           Date:
//
 
script
cms.b3 = js1.b4 and js1.b11; // левый тормоз
cms.b4 = js1.b3 and js1.b11; // правый тормоз
cms.b12 = js1.b4 and js1.b29; // левый тормоз на оси
cms.b13 = js1.b3 and js1.b29; // правый тормоз на оси
 
 
cms.b6 = JS1.B14;
cms.b7 = JS1.B16;
cms.b8 = js1.b3 and JS1.B14;
cms.b9 = js1.b3 and JS1.B16;
cms.b10 = js1.b4 and JS1.B14;
cms.b11 = js1.b4 and JS1.B16;
 
if ((js1.b3 and js1.b14) or (js1.b4 and JS1.B14)) then
cms.b6 = not js1.b14;
endif
 
if ((js1.b3 and js1.b16) or (js1.b4 and JS1.B16)) then
cms.b7 = not js1.b16;
endif
 
SEQUENCE   // закрылки боевое положение выпустить
WAIT( cms.b6 ); // Ждать нажатия кнопки B14 на JS1
CMS.B1 = TRUE; // Нажать Кнопку CMS
DELAY( 177 ); // Ждать 7 секунд
CMS.B1 = FALSE; // Отжать кнопку CMS
ENDSEQUENCE
 
SEQUENCE  // закрылки боевое положение убрать
WAIT( cms.b7 ); // Ждать нажатия кнопки B14 на JS1
CMS.B2 = TRUE; // Нажать Кнопку CMS
DELAY( 177 ); // Ждать 7 секунд
CMS.B2 = FALSE; // Отжать кнопку CMS
ENDSEQUENCE
 
SEQUENCE   // закрылки взлетное положение выпустить
WAIT( cms.b8 ); // Ждать нажатия кнопки B14 на JS1
CMS.B1 = TRUE; // Нажать Кнопку CMS
DELAY( 350 ); // Ждать 15 секунд
CMS.B1 = FALSE; // Отжать кнопку CMS
ENDSEQUENCE
 
SEQUENCE  // закрылки взлетное положение убрать
WAIT( cms.b9 ); // Ждать нажатия кнопки B14 на JS1
CMS.B2 = TRUE; // Нажать Кнопку CMS
DELAY( 360 ); // Ждать 15 секунд
CMS.B2 = FALSE; // Отжать кнопку CMS
ENDSEQUENCE
 
SEQUENCE   // закрылки посадочное положение выпустить
WAIT( cms.b10 ); // Ждать нажатия кнопки B14 на JS1
CMS.B1 = TRUE; // Нажать Кнопку CMS
DELAY( 530 ); // Ждать 23 секунды
CMS.B1 = FALSE; // Отжать кнопку CMS
ENDSEQUENCE
 
SEQUENCE  // закрылки посадочное положение убрать
WAIT( cms.b11 ); // Ждать нажатия кнопки B14 на JS1
CMS.B2 = TRUE; // Нажать Кнопку CMS
DELAY( 530 ); // Ждать 23 секунды
CMS.B2 = FALSE; // Отжать кнопку CMS
ENDSEQUENCE
 
endScript

Share this post


Link to post
Share on other sites

Спасибо, как всё просто, а я голову сломал, пока придумывал.

Share this post


Link to post
Share on other sites

Почему выражение not js1.b4 в скобках?

 if ((not js1.b4) and js1.b15 and ([cms.a1<255])) then

Share this post


Link to post
Share on other sites

Почему выражение not js1.b4 в скобках?

 if ((not js1.b4) and js1.b15 and ([cms.a1<255])) then

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

Share this post


Link to post
Share on other sites

Попробовал Ваш скрипт, есть одно но.

Если я нажал шифт и кнопку 15, то сработало как надо, нажалась кнопка выстрел, но если я при нажатой кнопке 15 отпустил шифт, то кнопка выстрел отжимается. Так же если я проста нажал кнопку 15, то срабатывает ось тормоза, но если в это время я нажал кнопку шифт, то ось тормоза перестаёт нажиматься.

А я сделал, чтобы кнопка работала точно так же, как в классическом варианте-т.е. нажатие шифта контролируется только для выбора какой сценарий для этой кнопки запустить-ось или выстрел. Пока кнопка 15 не будет отжата снова, повторное нажатие шифта ни на что не влияет. Насчёт использования не кнопки на CMS, а переменной  согласен.

Share this post


Link to post
Share on other sites

Попробовал Ваш скрипт, есть одно но.

Если я нажал шифт и кнопку 15, то сработало как надо, нажалась кнопка выстрел, но если я при нажатой кнопке 15 отпустил шифт, то кнопка выстрел отжимается. Так же если я проста нажал кнопку 15, то срабатывает ось тормоза, но если в это время я нажал кнопку шифт, то ось тормоза перестаёт нажиматься.

А я сделал, чтобы кнопка работала точно так же, как в классическом варианте-т.е. нажатие шифта контролируется только для выбора какой сценарий для этой кнопки запустить-ось или выстрел. Пока кнопка 15 не будет отжата снова, повторное нажатие шифта ни на что не влияет. Насчёт использования не кнопки на CMS, а переменной  согласен.

 

понял вас. просто у меня комбатстик, и поэтому о том как положено работать каноническому шифту от CH я не знал.

Share this post


Link to post
Share on other sites

Товарищ Веспе! Посмотрел повнимательнее придуманную Вами фишку с шифтом - это круто! Пара лишних букв в коде есть, но сам алгоритм шикарный  :good:

 

if (not (cms.b1 or cms.b2)) then
cms.b1=(js1.b9 and not js1.b4);
cms.b2=(js1.b4 and js1.b9);
else if (cms.b1) then
cms.b1=js1.b9;
else if (cms.b2) then
cms.b2=js1.b9;
endif
endif
endif

Share this post


Link to post
Share on other sites

Триммирование кнопками хатки элеронов и руля высоты. Сброс триммеров одной кнопкой.

 

 

 

%DEFINE TRIMMER_CENTER                 0
%DEFINE TRIMMER_STEP                   1
%DEFINE js_eleron                     JS1.A1
%DEFINE js_elevator                    JS1.A2
%DEFINE js_trim_up                     JS1.B25
%DEFINE js_trim_all_center             JS1.B9
%DEFINE js_trim_down                   JS1.B29
%DEFINE js_trim_right                  JS1.B27
%DEFINE js_trim_left                   JS1.B31
%DEFINE cms_eleron                     CMS.A1
%DEFINE cms_elevator                   CMS.A2
%DEFINE a_trimmer_eleron               A1
%DEFINE a_trimmer_elevator             A2
 
%DEFINE b_trimmer_direction_elevator   B5
%DEFINE b_trimmer_direction_eleron   B4
script
cms.A1=JS1.A1;
cms.A2=JS1.A2;
sequence
        wait(js_trim_all_center);
        a_trimmer_elevator             = TRIMMER_CENTER;
        a_trimmer_eleron = TRIMMER_CENTER;
        
endsequence
sequence
wait(js_trim_up);
        if(b_trimmer_direction_elevator) then
                a_trimmer_elevator = a_trimmer_elevator + TRIMMER_STEP;
            else if([0 < a_trimmer_elevator]) then
                a_trimmer_elevator = a_trimmer_elevator - TRIMMER_STEP;
            else
                b_trimmer_direction_elevator = TRUE;
                a_trimmer_elevator           = TRIMMER_STEP;
            endif endif                
endsequence
    sequence
        wait(js_trim_down);
        if(b_trimmer_direction_elevator) then
                if([0 < a_trimmer_elevator]) then
                    a_trimmer_elevator = a_trimmer_elevator - TRIMMER_STEP;
                else
                    b_trimmer_direction_elevator = FALSE;
                    a_trimmer_elevator           = TRIMMER_STEP;
                endif
            else
                a_trimmer_elevator = a_trimmer_elevator + TRIMMER_STEP;
            endif
            endsequence
    if(b_trimmer_direction_elevator) then
        cms_elevator = js_elevator +  a_trimmer_elevator;
    else
        cms_elevator = js_elevator -  a_trimmer_elevator;
    endif
sequence
wait(js_trim_right);
        if(b_trimmer_direction_eleron) then
                a_trimmer_eleron = a_trimmer_eleron + TRIMMER_STEP;
            else if([0 < a_trimmer_eleron]) then
                a_trimmer_eleron = a_trimmer_eleron - TRIMMER_STEP;
            else
                b_trimmer_direction_eleron = TRUE;
                a_trimmer_eleron           = TRIMMER_STEP;
            endif endif
endsequence
 
    sequence
        wait(js_trim_left);
        if(b_trimmer_direction_eleron) then
                if([0 >a_trimmer_eleron]) then
                    a_trimmer_eleron = a_trimmer_eleron - TRIMMER_STEP;
                else
                    b_trimmer_direction_eleron = FALSE;
                    a_trimmer_eleron           = TRIMMER_STEP;
                endif
            else
                a_trimmer_eleron= a_trimmer_eleron + TRIMMER_STEP;
            endif
            endsequence
    if(b_trimmer_direction_eleron) then
        cms_eleron = js_eleron +  a_trimmer_eleron;
    else
        cms_eleron = js_eleron -  a_trimmer_eleron;
    endif
  
    endscript

Долго парился, т.к. нуб в деле программирования. Где-то нашел скрипт и редактировал его под один джойстик. Может можно и проще скрипт написать. Кто врубается посмотрите.

Share this post


Link to post
Share on other sites

Докладываю. Кнопка в виде оси на тормоза ЛаГГ работает отлично. Нажимаются тормоза гораздо быстрей, чем при назначении кнопки на тормоз в игре. Притом интенсивность нажатия и отпускания можно регулировать не зависимо от игры.

Share this post


Link to post
Share on other sites

Реализация дополнительных осей на CH Pro Throttle

Во первых, спасибо saatanaperkele,  что поднял тему...

Хочу поделиться парой наработок, которые могут оказаться кому-нибудь полезны...

Речь пойдет об использовании Хатки, для имитации аналоговых осей.

В БЗС имеется достаточно много параметров, управление которыми можно повесить на оси: триммера по трем осям, водо- и маслорадиаторы, шаг винта, смесь, капот (?), zoom... И на всю эту красоту у нас имеется плохо приспособленный для этих целей миниджой :( и... Хатки!

Так вот, нашлась возможность использования Хатки... но не как 8-и позиционного переключателя, а в режиме энкодера! В этом варианте мы просто крутим кончик Хатки (не саму Хатку :)) в одну или в другую сторону, и в каждой новой позиции аналоговая ось прибавляет или убавляет свое значение на величину заданного шага!

Сценарий

При реализации сценария мы будем ссылаться на позиции Хатки, обращаясь к  зарезервированным за ней кнопкам от «B25» до «B32»(8 позиций) и «B24» (среднее положение).

Введем аналоговую величину nv - индекс направления вращения, с возможными значениями -1, 0, +1 (соотв. против часовой, никуда не вращается, по часовой). Также понадобятся "флаги нажатий". Под них задействуем 8 логических переменных b25...b32.

Удобно начать с директив

 

 

%DEFINE axis cms.a4                    // назовем удобно ось cms устройства. Потом будет достаточно вписать сюда ту ось, которую будете использовать Вы.

%DEFINE Hut1 js2.b25                  // назовем удобно позицию реального js устройства.

%DEFINE Hut2 js2.b26                  // Потом будет достаточно вписать сюда Свое устройство

....

%DEFINE Hut8 js.2b32                  // ... так для всех позиций Хатки

%DEFINE step_ax4 8                    // здесь назначим значение приращения для оси (например 8). Легко менять...

%DEFINE nv a24                          // индекс направление вращения (+1, 0, -1). Храним в переменной а24

а далее так:

SEQUENCE                                  // Секция сброса...

WAIT( js1.b24 );                               // сброс всех флагов, если Хат в центре

  b25 = false;

  b26 = false;

  b27 = false;

  b28 = false;

  b29 = false;

  b30 = false;

  b31 = false;

  b32 = false;

ENDSEQUENCE

//            Секция обработка логики энкодера

nv = 0                                                   // сбрасываем nv в ноль!

SEQUENCE                                         // далее,  на примере 2-й позиции Хатки... (b26)

WAIT ( Hat2 );                   // когда нажата 2-я поз. хатки

  b26 = true;                                       // запоминаем флаг в соотв. лог. переменной

  IF ( b25 and b26 ) THEN              // сравниваем с соседним значением "флаг нажатия слева". Если перед этим была нажата позиция "слева", то...

      nv = 1;                                           //  индекс направления вращения = 1

      b25 = false;                                  // сбрасываем предыдущий "флаг слева"

    ELSE                                                 

      IF (b26 and b27) THEN            // если нет слева, то сравниваем с соседним значением "флаг нажатия справа". Если перед этим была нажата позиция "справа", то...  nv = -1

      nv = -1

      b27 = false;                                  // сбрасываем предыдущий флаг "справа"

    ENDIF

  ENDIF

ENDSEQUENCE

//

SEQUENCE                                         // Повторяем для следующего положения хатки (b27)... и т.д. до конечной позиции (b32)

WAIT ( Hat3 );                   // когда нажата 3-я поз. хатки...

  b27 = true;             // и т.д.

...........

...........

//  Секция управления осью

axis = axis + (nv * step_ax);       // собственно меняем значение оси на, на величину шага (step_ax)

                                                               // увеличивая (nv=1), уменьшая (nv=-1), или оставляя как есть (nv=0)

IF ([axis > 255]) THEN                    //  Удерживаем

    axis = 255;                                      //  полученное

  ELSE                                                    // значение

    IF ([axis < 0]) THEN                     // в рабочем

      axis = 0;                                         // диапазоне...

    ENDIF

ENDIF

 

Последняя проверка значений обязательна! Дело в том, что, как удалось выяснить опытным путем, CMS использует для своей целочисленной арифметики 4-х байтные значения в диапазоне ~ от  ‑2147483648 до 2147483647 (причем эти значения могут иметь и переменные a1, a2, и т.д. так и cms.a1, cms.a2, и т.д.). Ограничение же по диапазону (как и применение масштабирования) происходит уже "на выходе" CMS.

Поэтому можно так накрутить наш энкодер, что будет непонятно где твоя ось...

Осталось вместо одной оси объявить, например 4 (и 4 разных  шага к ним). И используя 3 кнопки на ручки и последовательности SEQUENCE...WILE... в секции управления осью получаем ещё 4 управляемые оси на нашем CH Pro Throttle.

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

Осталось уточнить имена Ваших физических и cms устройств, (Внимание! Под спойлером в тексте есть отличия в обозначениях!) И настроить GUI....Удачи...

Спойлер ЧЁЁРТТ НЕ МОГУ УБРАТЬ ПОДСПОЙЛЕР!!!!

 

//     Title: Хат-энкодер
//
script
%DEFINE step_ax1 2 // значение прирощения для оси1
%DEFINE step_ax2 4 // значение прирощения для оси2
%DEFINE step_ax3 6 // значение прирощения для оси3
%DEFINE step_ax4 8 // значение прирощения для оси4
%DEFINE nv a24 // индекс направление вращения: (+1,0,-1)
//
SEQUENCE // Секция сброса...
WAIT( js1.b24 );// сброс всех флагов, если Хат в центре
  b25 = false;
  b26 = false;
  b27 = false;
  b28 = false;
  b29 = false;
  b30 = false;
  b31 = false;
  b32 = false;
ENDSEQUENCE
//  Секция обработка логики энкодера
nv = 0;
SEQUENCE // обработка по первому положению Хат: b25
WAIT ( js1.b25 );
  b25 = true;
  IF ( b32 and b25 ) THEN
      nv = 1;
      b32 = false;
    ELSE
      IF (b25 and b26) THEN
      nv = -1;
      b26 = false;
    ENDIF
  ENDIF
ENDSEQUENCE
//
SEQUENCE
WAIT ( js1.b26 );
  b26 = true;
  IF ( b25 and b26 ) THEN
      nv = 1;
      b25 = false;
    ELSE
      IF (b26 and b27) THEN
      nv = -1;
      b27 = false;
    ENDIF
  ENDIF
ENDSEQUENCE
//
SEQUENCE
WAIT ( js1.b27 );
  b27 = true;
  IF ( b26 and b27 ) THEN
      nv = 1;
      b26 = false;
    ELSE
      IF (b27 and b28) THEN
      nv = -1;
      b28 = false;
    ENDIF
  ENDIF
ENDSEQUENCE
//
SEQUENCE
WAIT ( js1.b28 );
  b28 = true;
  IF ( b27 and b28 ) THEN
      nv = 1;
      b27 = false;
    ELSE
      IF (b28 and b29) THEN
      nv = -1;
      b29 = false;
    ENDIF
  ENDIF
ENDSEQUENCE
//
SEQUENCE
WAIT ( js1.b29 );
  b29 = true;
  IF ( b28 and b29 ) THEN
      nv = 1;
      b28 = false;
    ELSE
      IF (b29 and b30) THEN
      nv = -1;
      b30 = false;
    ENDIF
  ENDIF
ENDSEQUENCE
//
SEQUENCE
WAIT ( js1.b30 );
  b30 = true;
  IF ( b29 and b30 ) THEN
      nv = 1;
      b29 = false;
    ELSE
      IF (b30 and b31) THEN
      nv = -1;
      b31 = false;
    ENDIF
  ENDIF
ENDSEQUENCE
//
SEQUENCE
WAIT ( js1.b31 );
  b31 = true;
  IF ( b30 and b31 ) THEN
      nv = 1;
      b30 = false;
    ELSE
      IF (b31 and b32) THEN
      nv = -1;
      b32 = false;
    ENDIF
  ENDIF
ENDSEQUENCE
//
SEQUENCE
WAIT ( js1.b32 );
  b32 = true;
  IF ( b31 and b32 ) THEN
      nv = 1;
      b31 = false;
    ELSE
      IF (b32 and b25) THEN
      nv = -1;
      b25 = false;
    ENDIF
  ENDIF
ENDSEQUENCE
//  Секция управления осями
SEQUENCE
  WHILE (not (js1.b2 or js1.b3 or js1.b4));//ось при отпущенных кнопках
cms.a1 = cms.a1 + (nv * step_ax1);
IF ([cms.a1 > 255]) THEN
    cms.a1 = 255;
  ELSE
    IF ([cms.a1 < 0]) THEN
      cms.a1 = 0;
    ENDIF
ENDIF
ENDSEQUENCE
//
SEQUENCE
  WHILE (js1.b2);// если нажата кнопка 2
cms.a2 = cms.a2 + (nv * step_ax2);
IF ([cms.a2 > 255]) THEN
    cms.a2 = 255;
  ELSE
    IF ([cms.a2 < 0]) THEN
      cms.a2 = 0;
    ENDIF
ENDIF
ENDSEQUENCE
//
SEQUENCE
  WHILE (js1.b3);// если нажата кнопка 3
cms.a3 = cms.a3 + (nv * step_ax3);
IF ([cms.a3 > 255]) THEN
    cms.a3 = 255;
  ELSE
    IF ([cms.a3 < 0]) THEN
      cms.a3 = 0;
    ENDIF
ENDIF
ENDSEQUENCE
//
SEQUENCE
  WHILE (js1.b4);// если нажата кнопка 4
cms.a4 = cms.a4 + (nv * step_ax4);
IF ([cms.a4 > 255]) THEN
    cms.a4 = 255;
  ELSE
    IF ([cms.a4 < 0]) THEN
      cms.a4 = 0;
    ENDIF
ENDIF
ENDSEQUENCE
endScript

 

 

  • Upvote 1

Share this post


Link to post
Share on other sites

прикольно, но писать такое не для ленивых  :)

 

я ось шага винта на кнопки руда повесил, а радиаторы на микростик (отклонение от центра вверх/вниз сделал как две кнопки). 

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

 

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

Share this post


Link to post
Share on other sites

прикольно, но писать такое не для ленивых  :)

 

я ось шага винта на кнопки руда повесил, а радиаторы на микростик (отклонение от центра вверх/вниз сделал как две кнопки). 

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

 

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

Там не так страшно писать...  копипастом наращиваем :)

Я у себя zoom повесил...

Edited by =J13=Moroka

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...