Jump to content
NobbyNobbs

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

Recommended Posts

Отличная тема,много примеров...

Вот такой есть вопросик - где бы резисторами разжиться ихними?

Может кто знает?Раньше в КомпТуРу были...

Share this post


Link to post
Share on other sites

У меня вопрос к освоившим программирование СН джентльменам. Каким образом вы определяете какая ось какого устройства соответствует определенному наименованию?

 

%DEFINE J_Pedals JS1.A3 // Педали ( CH ProPedals, педали на первой вкладке )
  вот как в цитате,  почему педали не JS3.A1 например?

У кота  все оси поименованы и там невозможно их перепутать. А вот СН у меня возникли проблемы, не понимаю что откуда. Хотел разобраться подробнее с системой программирования СН и чего то много неочевидных вещей как-то.

Share this post


Link to post
Share on other sites

вот как в цитате,  почему педали не JS3.A1 например? У кота  все оси поименованы и там невозможно их перепутать. А вот СН у меня возникли проблемы, не понимаю что откуда. Хотел разобраться подробнее с системой программирования СН и чего то много неочевидных вещей как-то.

 

в принципе, в ГУЕ всегда видно ху есть кто.

 

post-14111-0-74590000-1407847039_thumb.png

 

vs

 

post-14111-0-11824100-1407847394_thumb.png

Edited by NobbyNobbs
  • Upvote 1

Share this post


Link to post
Share on other sites

Спасибо за оперативный ответ!

Share this post


Link to post
Share on other sites

Отличная тема,много примеров...

Вот такой есть вопросик - где бы резисторами разжиться ихними?

Может кто знает?Раньше в КомпТуРу были...

Раньше были, да..  Потому что у CH был собственный "магазин" запчастей к их джоям. Резюки, пружины, кнопули. Удивительно дело! Тока закрыли они его. Их джои и так по десятку лет служат игрокам, и если им еще и резюки в запчасти давать, то кому они новые продавать будут???

Ну это все лирика.  

 

Я недавно озадачился темой, хотел купить в запас (Комбатстику уже почти 6 лет наверное,). Ведь раньше то были!  ОКазалось:

Чичас нигде не купить.  Даже на ебае.    Резюки там военные ( CTS HP 100) с MIL допуском.   2 млн. циклов наработки на отказ!!!!   (для сравнения, типовые потенциометры в бытовой радиоэлектронике и дешевых джоях имеют заявленную жизнь 15000 циклов )

 

Оригинальные карбоновые: 

post-4254-0-30899500-1407864561_thumb.gif

 

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

post-4254-0-27466200-1407864808_thumb.gif

Share this post


Link to post
Share on other sites

Отличная тема,много примеров...

Вот такой есть вопросик - где бы резисторами разжиться ихними?

Может кто знает?Раньше в КомпТуРу были...

 

Сейчас с ними -- беда. Самый простой вариант (за исключением аналогов) -- купить БУ ручку (на запчасти) на ebay.

Share this post


Link to post
Share on other sites

Угу, и самый классный БУ вариант, это  наверное ТроттлКвадрант.    Там резюков Аж 6, и износ будет минимальный, ведь не РУС.    

 

Тока бушных квадрантов очень мало предлагается, и цена вовсе не бросовая... Хотя... может просто долго не лежат?

Edited by [I.B.]Zulu

Share this post


Link to post
Share on other sites

Может что-то в Чип-Дипе поискать?

 

Комбатстику уже почти 6 лет наверное

А я Файтерстик где-то в 2005-2006 брал если память не изменяет.Один раз резюки менял уже.

В общем,написал в саппорт СН,посмотрим что ответят.

Насчёт Квадранта идея хорошая :biggrin: !!!

Edited by =DF=Metr

Share this post


Link to post
Share on other sites

Угу, и самый классный БУ вариант, это  наверное ТроттлКвадрант.    Там резюков Аж 6, и износ будет минимальный, ведь не РУС.    

 

Тока бушных квадрантов очень мало предлагается, и цена вовсе не бросовая... Хотя... может просто долго не лежат?

По слухам в квадранте они припаяны, их оттеда трудно выдрать. Хотя, очень трудно поверить в это.

Edited by 72AG_terror

Share this post


Link to post
Share on other sites

Ну да, которые на рычагах (т.е. HP100). Ножками впаяны. Верно. Но пяльник и шинка для впитывания припоя тебе в помощь. Смотри тут: 

Edited by [I.B.]Zulu

Share this post


Link to post
Share on other sites

Вот нашёл кой чего:http://www.ebay.com/itm/CTS-100k-Ohm-Rotary-Potentiometer-295-S1064-Qty-3-/221168438352?pt=LH_DefaultDomain_0&hash=item337eaa8c50#ht_1389wt_1363

Похожи?

ЗЫ Надеюсь,не будет рекламой...

Ой, похоже, что да, они!  Продают по 3 шт. в руки.   Если будешь брать, возьми и мне два комплекта, что бы хоть не оплачивать несколько раз пересылку копеечных бандеролек.   Деньги сразу тебе вышлю. Цену доставки досюда можешь делить пополам   :)

Edited by [I.B.]Zulu

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

Хе, а ты сюда смотрел: http://www.project-parts.com/itempix/530-014B.jpg   - резьбы нет!  Но это правда фигня, можно верхнюю крышку от исходного поставить ( с резьбой).  Просто меня стали терзать смутные сомнения, что же это за резюки такие, и откуда они взялись в таком количестве, по такой смешной цене, и без резьбы.  :)

Share this post


Link to post
Share on other sites

"Этот продавец будет отсутствовать до 29.08.2014 и в данный момент не может обработать заказ. Вы можете добавить этот товар в список отслеживания и купить его позже."

Вот наверное почему не получается связаться.Кстати,саппорт СН тоже молчит.

Share this post


Link to post
Share on other sites

"Этот продавец будет отсутствовать до 29.08.2014 и в данный момент не может обработать заказ. Вы можете добавить этот товар в список отслеживания и купить его позже."

Вот наверное почему не получается связаться.Кстати,саппорт СН тоже молчит.

Пожалуй, что так.  Кстати - в Throttle Quadrant именно такие, без резьбы оказывается.  Они там за ножки в плату впаяны. Так что, ждем 29-го

Edited by [I.B.]Zulu

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

 

Здравствуйте,

Я сожалею, но мы не продаем частей части.

 

Джон Soucy

Технический Представитель

APEM, Inc.

970 Park Center Drive

Vista, CA 92081

Офис: (760) 598-2518 

 

ответ от CH Products на мой вопрос по поводу резисторов.Жаль.

Разбирал Файтерстик,резьбы нету.Просто вставляются в отверстия они.

Share this post


Link to post
Share on other sites

 

 

Разбирал Файтерстик,резьбы нету.Просто вставляются в отверстия они.
 

 

Ок. Отлично. Значит надо заказывать! :)

Share this post


Link to post
Share on other sites

Братья пацаки :scratch_one-s_head: тупой вопрос но всё таки.Один скрипт я сделал,он работает.А как сделать другой скрипт?Как открыть новую вкладку в CM editor?

 



 

 

 

 

Edited by beretta5

Share this post


Link to post
Share on other sites

Всю логику можно реальзовать в одном скрипте. Как я понимаю каждой конфигурации (map файл), может соответсвовать один скрипт файл. Т.е. возможности открыть еще одну вкладку нет.

 

CH Control Manager штука, конечно, архаичная, но дело свое делает на отлично.

Share this post


Link to post
Share on other sites

 

День добрый!

К сожалению, сейчас резисторов нет в наличии. Мы попробуем уточнить у

производителя возможность отгрузки резисторов, но поставка может растянуться

на пару месяцев.

 

С уважением,

Светлана Шахова

www.comp2.ru

Ответили из комптуру.

Share this post


Link to post
Share on other sites

Прикол, думаю они спросят там же где и ты :)  И получат тот же ответ :)

 

 

ИМХО, надо ждать 29-го, когда возобновит поставку "отпускник" с ebay :)

Share this post


Link to post
Share on other sites

 

 Ещё немного о программировании "правильных" Sрiftов...

Как известно в самом GUI ControlManagera шифтование "неправильное" :(. Правильное, это когда кнопка Shift определяет сценарий действия только в момент нажатия "рабочей" кнопки, и не может изменить/заменить выполняемую команду, пока рабочая кнопка остается нажатой.

И эту тему здесь поднимали. И, спасибо Wespe, был предложен "алгоритм Wespe" (c)  работающий с одним шифтом, а затем и "расширенный алгоритм Wespe" от Nobby аж с тремя шифтами... Опыт программирования с этим алгоритмом показал его удобство для шифтования одной - двух-трех кнопок или сразу нескольких шифтов. Однако, при увеличении количества шифтуемых кнопок скрипт начинает увеличиваться как... "Война и мир" :)

Решал очередной раз задачки по назначению нескольких функций на одну позицию хатки с помощью доп. кнопок Shift... Захотелось зашифтовать все 3 Hatки(Hat POV, Hat2 и Hat3) моего ProThrottle, что "задействованы" под большой палец. И пришел к более компактному решению... Кстати, это решение актуально и для владельцев Fighterstick. У него вообще, вместе с POV хаток под большой палец аж четыре! Расположение всех хаток "под большой палец" исключает нажатие 2-х и более Hat одновременно.

 

Поскольку правильно "считать" значение Shifta именно в момент нажатия рабочей кнопки/отклонения любой хатки. С этой задачей прекрасно справляется последовательность:

поехали (с)

SEQUENCE

WAIT(Что-то нажали); // Как только что-то из рабочих кнопок/хаток нажали

  ФлагШифта = Кнопка__Для_Шифта; // Запоминаем состояние Кнопка__Для_Шифта на этот момент

ENDSEQUENCE

//Потом, собственно пользуемся плодами...

IF  (ФлагШифта был нажат) THEN

  команда1 с шифтом

  команда2 с шифтом

  ......
  командаN с шифтом

ELSE // ...а если ФлагШифта был не нажат

  команда1 без шифта

  команда2 без шифта

  ......
  командаN
без шифта

ENDIF

IF (Все_кнопки_отпустили) THEN // кончаем!!!

   ФлагШифта = False; // сбрасываем т.е.

ENDIF

приехали

 

Осталось определиться с условиями "Что-то нажали" и "Все_кнопки_отпустили". И тут нам в помощь ещё одна особенность Managera. Это "...четыре дополнительные кнопки, которые указывают на положение кнюппеля и хаток в их центральном положении...":

 B21 - Центр Хатки 1

B22 - Центр Хатки 2

B23 - Центр Хатки 3

B24 - Центр Кнюппеля (4)

Тогда условие "Все_кнопки_отпустили" =( js1.B22 and js1.b23 and js1.b24), а "Что-то нажали" = NOT("Все_кнопки_отпустили").

 

Итоговый скрипт для одного шифта (кнопка В2 под указ. пралец) 2-х хаток и кнюппеля:

 

//
% define shift b1//флаг шифта
%define HatRel b2 //флага отпусканя всех хаток
///
script
HatRel = js1.B22 and js1.b23 and js1.b24;
SEQUENCE
WAIT(not HatRel); // если любой из hat отклонён
shift = js1.b2; // Запоминаем состояние Shift1 (по кнопке JB2)
ENDSEQUENCE
//
If (shift) Then
cms.b9 = js1.b9; // hat2
cms.b10 = js1.b10; // hat2
cms.b11 = js1.b11; // hat2
cms.b12 = js1.b12; // hat2
cms.b13 = js1.b13; // hat3
cms.b14 = js1.b14; // hat3
cms.b15 = js1.b15; // hat3
cms.b16 = js1.b16; // hat3
cms.b17 = js1.b25; // hatPOV
cms.b18 = js1.b27; // hatPOV
cms.b19 = js1.b29; // hatPOV
cms.b20 = js1.b31; // hatPOV
Else
cms.b1 = js1.b9;
cms.b2 = js1.b10;
cms.b3 = js1.b11;
cms.b4 = js1.b12;
cms.b5 = js1.b13;
cms.b6 = js1.b14;
cms.b7 = js1.b15;
cms.b8 = js1.b16;
cms.b21 = js1.b25;
cms.b22 = js1.b27;
cms.b23 = js1.b29;
cms.b24 = js1.b31;
Endif
If( HatRel ) then // если все hat отпущены
shift = false; // Сбрасываем "нажатие" Shiftа
Endif
//
ENDSCRIPT

 

 

Теперь, после того как сам скрипт стал коротким, самое муторное прописать назначения в GUI. Надо будет прописать:

Buttons           DirectX Device           DirectX Control

для mcs.b1     CM Device1                Button9

для mcs.b2     CM Device1                Button10

для mcs.b3     CM Device1                Button11

 и т.д. до

для mcs.b24   CM Device1                Button32

 

Чтобы не мучаться, комплект файлов Shift_On_3_Hat внизу 

 

И ещё один демо скрипт Shift_3_On_Hat

Здесь в качестве рабочих кнопок Hat2 и Hat3, зато в качестве 3-х шифтов задействованы кнопки B2, B3, (под указ. и средн. палец) и их сочетание (B2+B3). Результат смотреть на Device2

 

// CMS Script File
// Реализация 3-х шифтов для 2-х Хаток
%DEFINE shift1 b1//флаг для 1-ого шифта
%DEFINE shift2 b2//флаг для 2-ого шифта
%DEFINE shift3 b3//флаг для 3-ого шифта
//
script
// cms.b17 = js1.B22 and js1.b23; // контроль нажатия/отпускания хаток
SEQUENCE
WAIT( not (js1.B22 and js1.b23 )); // если любой hat отклонён
shift1 = js1.b2 and not js1.b3; // Запоминаем состояние Shift1 (по кнопке b2)
shift2 = js1.b3 and not js1.b2; // Запоминаем состояние Shift2 (по кнопке b3)
shift3 = js1.b2 and js1.b3; // Запоминаем состояние Shift3 (по кнопкfv b2+b3 вместе)
ENDSEQUENCE
//
If (shift1) then // действия если активен шифт1
cms.b9 = js1.b9;
cms.b10 = js1.b10;
cms.b11 = js1.b11;
cms.b12 = js1.b12;
cms.b13 = js1.b13;
cms.b14 = js1.b14;
cms.b15 = js1.b15;
cms.b16 = js1.b16;
else
If (shift2) then // действия если активен шифт2
cms.b17 = js1.b9;
cms.b18 = js1.b10;
cms.b19 = js1.b11;
cms.b20 = js1.b12;
cms.b21 = js1.b13;
cms.b22 = js1.b14;
cms.b23 = js1.b15;
cms.b24 = js1.b16;
else
If (shift3) then // действия если активен шифт3
cms.b25 = js1.b9;
cms.b26 = js1.b10;
cms.b27 = js1.b11;
cms.b28 = js1.b12;
cms.b29 = js1.b13;
cms.b30 = js1.b14;
cms.b31 = js1.b15;
cms.b32 = js1.b16;
else // действия если без шифта
cms.b1 = js1.b9;
cms.b2 = js1.b10;
cms.b3 = js1.b11;
cms.b4 = js1.b12;
cms.b5 = js1.b13;
cms.b6 = js1.b14;
cms.b7 = js1.b15;
cms.b8 = js1.b16;
Endif
Endif
Endif
If( js1.B22 and js1.b23) then // если все hat отпущены
shift1 = false; // Сбрасываем "нажатие" Shift1
Endif
//
endscript

 

 

Комплект файлов Shift_3_On_Hat 

 

Shift_On_3_Hat.zip

Shift_3_On_Hat.zip

Edited by =J13=Moroka
  • Upvote 1

Share this post


Link to post
Share on other sites

...Вы будете смеяться, но случайно обнаружил, что эти алгоритмы можно ещё упростить :):coffee:

Последняя проверка а-ля "Все кнопки отпустили" не нужна!

т.е. общая картина выглядит так:

SEQUENCE

WAIT(Что-то нажали); // Как только что-то из рабочих кнопок/хаток нажали
ФлагШифта = Кнопка__Для_Шифта; // Запоминаем состояние Кнопка__Для_Шифта на этот момент
ENDSEQUENCE
//Потом, собственно пользуемся плодами...
IF (ФлагШифта был нажат) THEN
команда1 с шифтом
команда2 с шифтом
......
командаN с шифтом
ELSE // ...а если ФлагШифта был не нажат
команда1 без шифта
команда2 без шифта
......
командаN без шифта
ENDIF
IF (Все_кнопки_отпустили) THEN // кончаем!!!
ФлагШифта = False; // сбрасываем т.е.
ENDIF

 

Прикрепил исправленные файлы...

 

ПыСы: Это ж надо было неделю во все это смотреть, чтобы только сейчас обнаружить :)...

Shift_On_3_Hat.zip

Shift_3_On_Hat.zip

Edited by =J13=Moroka
  • Upvote 1

Share this post


Link to post
Share on other sites

Не понял, только, зачем делать отдельный SEQUENCE, когда узнать, в каком кнопка положении нужно только один раз за проход. Не проще ли так:

%DEFINE Shift   JS1.B4   
script
   if ( Shift )
       ....
   else
       ....
   endif
endscript

sequence, по-мне, так нужен только тогда, когда нужно обсчитывать что-то непрерывно изменяющееся, например движение оси с кнопки (пока нажато, то....), но при этом нужна специфическая задержка, а основноый скрипт задерживать нельзя. Например ось с кнопки в основной последовательности двигается слишком быстро, нужна задержка. Или, например, мигание АНО со скоростью 10 раз в секунду... :)... нужна задержка. Или, например, удержание кнопки определённое время (полный выход закрылок на ЛаГГе -- около 10 секунд).

В остальных случаях, когда надо просто отследить, нажато ли то, или это, в данном конкретном проходе, совершенно не нужен sequence. Более того, на sequence наложен ряд ограничений, например он не может находится в блоке if...endif, его сложнее отлаживать и проч.

Edited by 72AG_terror
  • Upvote 1

Share this post


Link to post
Share on other sites

Не понял, только, зачем делать отдельный SEQUENCE, когда узнать, в каком кнопка положении нужно только один раз за проход. Не проще ли так:

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

Безусловно, с IF...THEN...ELSE можно обрабатывать шифты...  Но это будут неправильные пчелы шифты! Логика будет обрабатываться каждый проход ,хотя нам нужно только один раз, при нажатии хатки. Возможны ошибки: отпустил шифт раньше основной кнопки - сработала команда "без шифта" Нажал "случайно" шифт после основной кнопки - сработала "с шифтом"... и вот, вместо выпуска шасси ты катапультируешься :)

В случае SEQUENCE...WAIT...ENDSEQUENCE последовательность срабатывает один раз при появлении условия.... то, что надо!

 

...и, ещё... Terror, стало интересно 

  1. "Электротриммирование" по всем осям: с сохранением полного диапазона отклонений, как на Ка-50: нажал кнопку -- ручка (и педали) запомнили, где они (центр смещается), при этом сохраняется полный диапазон отклонения (scaling оси). Коррекция электротриммирования РУСа и педалей по пипке на РУСе. Игровыми триммерами можно вообще после этого не пользоваться + появляются "триммера" там, где их нет (РН на мессе и проч.) + возможность мгновенно затриммировать вираж.

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

Edited by =J13=Moroka

Share this post


Link to post
Share on other sites

Безусловно, с IF...THEN...ELSE можно обрабатывать шифты...  Но это будут неправильные пчелы шифты! Логика будет обрабатываться каждый проход ,хотя нам нужно только один раз, при нажатии хатки. Возможны ошибки: отпустил шифт раньше основной кнопки - сработала команда "без шифта" Нажал "случайно" шифт после основной кнопки - сработала "с шифтом"... и вот, вместо выпуска шасси ты катапультируешься :)

В случае SEQUENCE...WAIT...ENDSEQUENCE последовательность срабатывает один раз при появлении условия.... то, что надо!

Хм! Это интересно, может, я неправильно понимаю логику работы нашего скриптера: я так понимаю, что он обсчитывает все кнопки сразу до начала прохода. Грубо говоря, скрипт смотрит, какая кнопка нажата, не в момент if ... then, а ещё до script ... endscript. То есть кнопка весь скрипт или нажата, или нет и не может изменить своего статуса в процессе исполнения. Или же имеется ввиду ситуация: нажал Ctrl-Del, потом случайно нажал Alt?

 

Электротрим постараюсь сегодня прислать.

Share this post


Link to post
Share on other sites

Фиксированные значения на микростике 2

...продолжаю работу над ошибками :)

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

Теперь исправленный и упрощенный скрипт (в примере ось Y) выглядит так:

// Title: Fix-MJoy 2

SCRIPT

 a1 = 2*(js1.a2-127); // Расчет для 1-й половина хода мкстика

 a2 = 2*js1.a2; // Расчет для 2-й половина хода мкстика

 IF ([a1 > cms.a1]) THEN

     cms.a1 = a1;

 ENDIF

 IF ([a2 < cms.a1]) THEN

     cms.a1 = a2;

 ENDIF

ENDSCRIPT

Для наблюдения результата отвяжите в GUI ось Y ProThottle (DX Device: None). А на её место "привяжите" cms.a1 ((DX Device: CM Device 1, DX Axis: Y Axis)

 

Теперь, когда стало не страшно наращивать код, можно повесить на микростик дополнительно ещё 3 оси, добавив, например, к оси zoom (ось X) ещё смесь и радиаторы (ось Y), "зашифтовав" их по кнопкам b2...b4

 

 

// CMS Script File
// Title: Multi Axis Fix-MJoy
SCRIPT
a1 = 2*(js1.a2-127); // Расчет для 1-й половина хода по оси Y
a2 = 2*js1.a2; // Расчет для 2-й половина хода по оси Y
a3 = 2*(js1.a1-127); // -"- по оси X
a4 = 2*js1.a1; // -"- по оси X
//
IF (NOT(js1.b2 OR js1.b3 OR js1.b4)) THEN // Если ни одна из кнопок не нажата
IF ([a3 > cms.a1]) THEN // То управляем осью cms.a1
cms.a1 = a3;
ENDIF
IF ([a4 < cms.a1]) THEN
cms.a1 = a4;
ENDIF
ENDIF
IF (js1.b2) THEN // Если нажата В2
IF ([a1 > cms.a2]) THEN // То управляем осью cms.a2
cms.a2 = a1;
ENDIF
IF ([a2 < cms.a2]) THEN
cms.a2 = a2;
ENDIF
ENDIF
IF (js1.b3) THEN // Если нажата В3
IF ([a1 > cms.a3]) THEN // То управляем осью cms.a3
cms.a3 = a1;
ENDIF
IF ([a2 < cms.a3]) THEN
cms.a3 = a2;
ENDIF
ENDIF
IF (js1.b4) THEN // Если нажата В4
IF ([a1 > cms.a4]) THEN // То управляем осью cms.a4
cms.a4 = a1;
ENDIF
IF ([a2 < cms.a4]) THEN
cms.a4 = a2;
ENDIF
ENDIF
ENDSCRIPT

 

 

Для наблюдения результата отвяжите в GUI оси  X и Y у ProThottle (DX Device: None). А на для CMS "привяжите" cms.a1...cms.a4  к DX Device: CM Device 1, назначив для них оси DX Axis: X Axis, R Axis, U Axis, V Axis соответственно... или, чтобы не мучаться самим попробуйте конфигурацию из файла Multi_Axis_Fix_MJoy.arj

Mult_Axis_Fix_MJoy.zip

Edited by =J13=Moroka

Share this post


Link to post
Share on other sites

Хм! Это интересно, может, я неправильно понимаю логику работы нашего скриптера: я так понимаю, что он обсчитывает все кнопки сразу до начала прохода. Грубо говоря, скрипт смотрит, какая кнопка нажата, не в момент if ... then, а ещё до script ... endscript. То есть кнопка весь скрипт или нажата, или нет и не может изменить своего статуса в процессе исполнения. Или же имеется ввиду ситуация: нажал Ctrl-Del, потом случайно нажал Alt?

 

Ты правильно полагаешь. Текущий статус физ кнопок он смотрит еще до начала скрипта.

Цикл работы следующий (из хелпа)

1) Опрашиваются все устройства и определяются статусы физических кнопок и осей

2) Производятся операции предусмотренные скриптом и формируются статусы и значения для осей и кнопок CMS

3) Статус осей и кнопок CMS передается в OS с учетом модификаций предусмотренных в GUI (посылаются коды клавиш, последовательностей, значений осей, движений мыши)

4) Снова переход на п. 1 - и так по кругу, бесконечно.

Share this post


Link to post
Share on other sites

Чего-то с продавцом с Ебея опять не получается связаться.

Зато вот что нашёл:

http://www.res-rich.com/chproducts_com/www.chproducts.com/shop/parts.html

Только не ясно как заказать-то..

 

 

Я так понимаю писать, звонить сюда:

post-4254-0-72181500-1409337227_thumb.gif

 

Если это все не устарело.    Хм... А ведь это копия странички старого CH магазина :)   

 

Хотя, видимо они специально и дали это маленькое окошко с контактной информацией поверх странички :)  Напишешь сам? Или мне написать?

Edited by [I.B.]Zulu

Share this post


Link to post
Share on other sites

Да,там в этом правом маленьком окне ссылка на китайский сайт с иероглифами :)Полазил там,резисторов не нашёл...

 

ЗЫ: Вот эта фирма-производитель резисторов-

http://www.ctscorp.com/default.htm ?

 

Напишешь сам? Или мне написать?

 

Напиши.Переведут на свои иероглифы переводчиком:)

Edited by =DF=Metr

Share this post


Link to post
Share on other sites

Я на английском напишу :)  На нем то они без гугла работають :)

Share this post


Link to post
Share on other sites

Вот так выглядит электротриммирование:

 

//  ****************
//  "Электротриммирование" действует следующим образом: когда мы отклоняем ручку и нажимаем кнопку триммирования,
//      скрипт запоминает положение ручки и считает это положение новым центром. Дальше все движения ручки происходят
//      от этого нового центра. Что это даёт: игра считает, что ручка постоянно отклонена на какую-то величину.
//      Таким образом мы добиваемся работы триммеров аналогично современным самолётам: триммируется не рулевая
//      поверхность, а тупо сдвигается ручка туда или сюда и удерживается в таком положении, а для лётчика это
//      становится новым "центром" ручки.
//
//      Собственно триммирование осуществляется двумя способами:
//          1. Достигаем нужного положения самолёта, зажимаем кнопку. Игра запомнила это положение. Возвращаем ручку в центр.
//          2. Двигаем хатку, таким образом сдвигаем положение центра в нужную сторону (аналогично триммированию в игре).
//      То есть мы можем как быстро затриммировать нужное положение с кнопки, так и подкорректировать текущее положение с
//      хатки.
//
//      Я использую кнопку под мизинец на Fighterstick и хатку-"пипку" на нём же.
//
//      Кроме того, триммирование по всем осям можно сбросить, для этого жмём кнопку трима, удерживая Шифт
//
// *******************

//  Зададим оси
%DEFINE J_Stick_X           JS2.A1    // Ось джойстика - Х (Fighterstick на второй вкладке, ось X)
%DEFINE J_Stick_Y           JS2.A2    // Ось джойстика - Y  (Y)
%DEFINE J_Pedals            JS1.A3   // Ось колёсика на РУСе    (CH ProPedals на первой вкладке)

//  Кнопка триммирования и ШИФТ
%DEFINE SHIFT               JS3.B2              //  SHIFT -- кнопка-шифт
%DEFINE J_Electrotrim_Button          JS2.B4    //  Кнопка "электротриммирования" (pinky -- кнопка под мизинец на РУС)

//  Хатка на Fighterstick, как кнюппель триммирования
//  Обратите внимание, что "диагональные" положения тоже учитываются, то есть, скажем, "влево-вверх" тоже можно...
%DEFINE J_Electrotrim_Nose_Down ( JS2.B25 OR JS2.B26 OR JS2.B32 ) //  Хатка РУС, она управляет электротриммированием. Нос вниз (хатка вверх)
%DEFINE J_Electrotrim_Nose_Up   ( JS2.B29 OR JS2.B28 OR JS2.B30 ) //  Нос вверх
%DEFINE J_Electrotrim_Bank_Left ( ( JS2.B31 OR JS2.B30 OR JS2.B32 ) AND NOT JS3.B2 )    //  Крен влево  (влево без шифта)
%DEFINE J_Electrotrim_Bank_Right    ( JS2.B27 OR JS2.B26 OR JS2.B28 ) AND NOT JS3.B2 )  //  Крен вправо
%DEFINE J_Electrotrim_Yaw_Left  ( ( JS2.B31 OR JS2.B30 OR JS2.B32 ) AND JS3.B2 )    //  Рысканье влево  (влево с шифтом, предвидя вопрос:
                                                                                        // нельзя использовать одну переменную в объявлении другой)
%DEFINE J_Electrotrim_Yaw_Right ( ( JS2.B27 OR JS2.B26 OR JS2.B28 ) AND JS3.B2)       //  Рысканье вправо

//  Зададим внутренние переменные для вычислений
%DEFINE A_Stick_X   A1  //  Расчитываемое положение РУС по крену,
%DEFINE A_Stick_Y   A2  //  по тангажу.
%DEFINE A_Rudder    A3  //  по РН

//  Наконец зададим выводимые оси
%DEFINE C_Stick_X   CMS.A1  //  Крен
%DEFINE C_Stick_Y   CMS.A2  //  Тангаж
%DEFINE C_Rudder    CMS.A3  //  Руль направления

// Поехали!
script
    //  Начнём с того, что узнаем и запомним физ. положения осей на момент прохода в промежуточные переменные.
    //
      if( NOT J_Electrotrim_Button ) then  //  Если сейчас кнопка эл. триммирования НЕ нажата
                                                //    (при нажатии кнопки управление блокируется (не обсчитывается) до её отпускания,
                                                //    чтобы значение триммирования не складывалось с положением РУС (бросок).
                                                //  Именно поэтому и введены доп. переменные -- чтобы игнорировать движения
                                                //  физ. оси до момента отпускания кнопки. Доп. переменные изменяются только,
                                                //  если кнопка отпущена
          A_Stick_X = J_Stick_X ;   //  Ось крена (элероны)
          A_Stick_Y = J_Stick_Y ;   //  Ось тангажа (РВ)
          A_Rudder  = J_Pedals ;    //  Ось рысканья (РН)
          
    //  Теперь нужно добавить значения триммирования к исходным физ. положениям.
    //  Когда мы "триммируемя", мы смещаем центр той или иной оси на Х кликов. Скажем, на 10 кликов. Получится так:
    //          Пусть РУС в центре: 127 (физ. значение) + 10 (триммирование) = 137 (выводимое значение).
    //          То есть для игры наша ручка будет отклонёна всё время вперёд, хотя на деле она стоит в центре.
    //  Таким образом добиваемся триммирования.
    //  Но! Тут возникает один неприятный момент: ход ручки у нас от 0 до 255, если мы сместим центр, скажем, на +10, со 127 на 137,
    //  то диапазон выводимых значений будет [0-255] + 10 = от 10 до 265. И, так как значения больше max (255) приравниваются к 255, то
    //  получится, что у нас диапазон выводимых в игру значений будет от 10 до 255, то есть мы теряем 10 кликов хода в одну сторону,
    //  а в другу максимум оси будет достигнут до её физического максимума.
    //  Это недопустимо для воздушного боя, поэтому необходимо внести коэффициенты для отклонений в обе стороны, чтобы
    //          max-выводимый = max-физический   и   min-выводимый = 0.
    //
    //  Добавляем значения триммирования к осям и устанавливаем выводимые оси в нужное положение.
        if( [ J_Stick_X <= 128 ] ) then // Если РУС дан влево, то нужно вычислить коэффициент.
                                        //  Очень грубо: перевести в проценты отклонение ручки и умножить на длину вычисляемой оси.
                                        //  Подробно про алгоритм -- смотрим в посте.
            C_Stick_X = 128 + A_Ailerons_Trim - ((( 128 - A_Stick_X ) * ( 128 + A_Ailerons_Trim )) / 128);
        else  //  вправо
          C_Stick_X = 128 + A_Ailerons_Trim + ((( A_Stick_X - 128 ) * (( 255 - 128 ) - A_Ailerons_Trim )) / 127);
        endif

        if( [ J_Stick_Y <= 128 ] ) then // Тангаж
          C_Stick_Y = 128 + A_Elevator_Trim - ((( 128 - A_Stick_Y ) * ( 128 + A_Elevator_Trim )) / 128);
        else
          C_Stick_Y = 128 + A_Elevator_Trim + ((( A_Stick_Y - 128 ) * (( 255 - 128 ) - A_Elevator_Trim )) / 127);
        endif

        if( [ A_Rudder <= 128 ] ) then  //  Рысканье
          C_Rudder = 128 + A_Rudder_Trim - ((( 128 - A_Rudder ) * ( 128 + A_Rudder_Trim )) / 128);
        else
          C_Rudder = 128 + A_Rudder_Trim + ((( A_Rudder - 128 ) * (( 255 - 128 ) - A_Rudder_Trim )) / 127);
        endif
      endif
      
      if ( SHIFT AND J_Electrotrim_Button ) then // Сброс триммеров
        A_Elevator_Trim = 0; // Сбрасываем эл. триммирование по всем осям
        A_Ailerons_Trim = 0;
        A_Rudder_Trim = 0;
      endif
    // ************************************************** //

    // ************************************************** //
    // ******* Обработка хатки эл. триммирования ******** //
    //
    //  Хатка (пипка) на РУС. Действует очень примерно как кнюппель триммера на РУСе в современных самолётах:
    //      отклоняем, допустим, нашу хатку вверх (типа "ручка от себя"), в реальном самолёте (и на джоях с отдаче) РУС начинает
    //      сам двигаться вперёд, а нашем же случае(у нас нет отдачи) -- центр оси тангажа РУС начинает ползти "от себя".
    //
    //  Применяем sequence, так как нужно использовать определённую задержку. Иначе ось перемещается слишком быстро -- очень неудобно.
    //
      sequence
        while ( J_Electrotrim_Nose_Down );      //  Итак, удерживается кнопка "триммер - нос вниз" (от себя)...
            A_Elevator_Trim = A_Elevator_Trim - 1; // Если триммируется "нос вниз", то отнять 1 от текущего вычисляемого значения оси.
            if ([ A_Elevator_Trim < -127]) then //  Однако если значение уже максимальное, то больше не увеличивать,
                                                //    а то потом обратно выводить (кнопку держать) замучаешься
                                                //      (ведь можно и до -65535 затриммироваться). 
                A_Elevator_Trim = -127;
            endif
        delay( 1 ); //  Чтобы триммирование происходило не слишком резко, чтобы можно было плавно подстроить,
                    //      даём задержку. Она подобрана экспериментально, к сожалению delay() не воспринимает переменные,
                    //      число (аргумент-величина задержки)приходится писать прямо в команде ("1" или другое).
      endsequence // Одну кнопку отработали

      // Остальные кнопки - аналогично
      // РН триммируется "влево-вправо" с шифтом (без шифта -- элероны)
      sequence
        while ( J_Electrotrim_Nose_Up );
          A_Elevator_Trim = A_Elevator_Trim + 1;
          if ([ A_Elevator_Trim > 127]) then
            A_Elevator_Trim = 127;
          endif
          delay( 1 );
      endsequence
      
      sequence
        while ( J_Electrotrim_Bank_Left );  //  Крен
          A_Ailerons_Trim = A_Ailerons_Trim - 1;
          if ([ A_Ailerons_Trim < -127]) then
            A_Ailerons_Trim = -127;
          endif
          delay( 1 );
      endsequence

      sequence
        while ( J_Electrotrim_Bank_Right );
          A_Ailerons_Trim = A_Ailerons_Trim + 1;
          if ( [ A_Ailerons_Trim > 127 ] ) then
            A_Ailerons_Trim = 127;
          endif
          delay( 1 );
      endsequence
      
      sequence
        while ( J_Electrotrim_Yaw_Left );  //  Рысканье
          A_Rudder_Trim = A_Rudder_Trim - 1;
          if ( [ A_Rudder_Trim < -127 ] ) then
            A_Rudder_Trim = -127;
          endif
          delay( 1 );
      endsequence

      sequence
        while ( J_Electrotrim_Yaw_Right );
          A_Rudder_Trim = A_Rudder_Trim + 1;
          if ( [ A_Rudder_Trim > 127 ] ) then
            A_Rudder_Trim = 127;
          endif
          delay( 1 );
      endsequence
    // ************************************************** //    
endscript   // Усё!
  • Upvote 1

Share this post


Link to post
Share on other sites

Спасибо! Утащил. (Хочу к бомберу приделать...)

Спасибо, что "разжевал" подробно... но чувствую вопросы будут...   ;)

Edited by =J13=Moroka

Share this post


Link to post
Share on other sites

Вот так выглядит электротриммирование:...

Ура! Все отлично работает. Terror спасибо... Так все грамотно задокументировано и откомментировано, что  вопросов не возникло....

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

1. в строке

%DEFINE J_Electrotrim_Bank_Right    ( JS2.B27 OR JS2.B26 OR JS2.B28 ) AND NOT JS3.B2 )  //  Крен вправо

поставить вторую скобку

2. в блоке

......

if( [ A_Rudder <= 128 ] ) then  //  Рысканье

          C_Rudder = 128 + A_Rudder_Trim - ((( 128 - A_Rudder ) * ( 128 + A_Rudder_Trim )) / 128);

        else

          C_Rudder = 128 + A_Rudder_Trim + ((( A_Rudder - 128 ) * (( 255 - 128 ) - A_Rudder_Trim )) / 127);

        endif

     else       // А присвоить, то при нажатии ;)

        A_Elevator_Trim = A_Stick_Y-128;
        A_Ailerons_Trim = A_Stick_X-128;
        A_Rudder_Trim = A_Rudder-128;
  endif
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...