![]() |
Может лекарство переложить в ог-д....
|
Речь про поворотный джойстик сони??? Все кнопки работают? Поворотные работают? Хотел бы какие-нибудь фотографии как делали, плиз!!!
|
Ребята, второй раз прочитал но так и не нашёл ответа как всё-таки подключить его к USB? И что такое оси вообще, о которыхз тут постоянно говорите? Какой джойстик USB раздербанивал для переделки сони? И самое главное! Как работает джойтик сони, по какому принципу вообще?
Какой софт надо использовать для работы под USB? К Centrafuse можно подцепить? |
Цитата:
А что будет делать джойстик зависит от того, что ты в autohotkey запрограмишь. |
Паяю я отлично, а вот хотелось бы узнать принцип работы джойстика, я его не разбирал, так как был не мой (отдал уже) а пока новый не купил...
|
Имеет значение количество кнопок на джойстике Genius и на джойстике Sony для автомагнитолы??? Все кнопки будут функционировать?
|
не знаю о каком genius идет речь и как он устроен, но в сони все предельно просто, два провода замыкаются разными кнопками, к которым последовательно включены резисторы разного номинала, по номиналам резисторов и определяется какую кнопку ты нажал.
|
genuis maxfighter f16 нужен как usb устройство, которое сможет преобразовать различные сопротивления в стандартное устройство "джойстик" и виртуальные положения ручек в нем. То есть вместо переменника впаиваешь два провода джойстика (ну еще может добавочное сопротивление придется накинуть последовательно с сонькой, а то у меня две кнопки с самыми маленькими сопротивлениями путал) и получаешь, что при нажатии на рычаг/кнопку джойстика sony меняется положение по одной из осей джойстика.
Дальше autohotkey в руки. Для большей понятности схемы разных джойстиков - почти все в реальности резистивные... http://elektron.pol.lublin.pl/users/...e/pilotyca.htm А по поводу модели джойстика - это реально самая дешевая и хорошо работающая плата джойстика. Поэтому лучше купи именно такой. Я купил другой в 1.5 раза дороже и выкинул, у него значения плавали... |
непонятно что такое ось???
|
это одна из плоскостей аналогового манипулятора (вверх/вниз)
|
....
|
Цитата:
Так и не разобрался в первом скрипте... укажите на строчки, в которых выполняется действие в винде? Каким образом скрипт связывается с остальными программами? Билн, как это сформалировать... Вот если бы надо было двинуть нажать enter - написали бы Send, {ENTER}... А тут как взаимодействие происходит? |
Откомпилировал первый скрипт, запустил. Откомпилировал второй - запустил. оба запущены. Во всплывающем окошке от второго скрипта при поворачивании резисторов видно как меняются показания по осям X,Y,Z, но в то же время как ни крути не срабатывает ни одна функция (Send F11, к примеру (активно окно браузера, должно развернуться на полный экран)...) В чём дело? На каких значениях будет срабатывать?
|
Цитата:
1. убери весь лишний код из скрипта. так будет проще... 2. расширь диапазон, при котором срабатывает нужное тебе событие. 3. назначь какое-либо более простое событие. К примеру, запуск приложения 4. Лучше сначала научись обрабатывать события клавиатуры как тебе надо, ибо они одномоментные, нажал - действие. Приведенный ниже скрипт будет запускать notpad 4 раза в секунду если ось X находится между 20 и 30... 5. Кури эту страницу http://www.script-coding.info/AutoHotkey/Tutorial.html а также хелп к AHK. Там есть почти все, что нужно, чтобы управлять чем угодно. пример: #SingleInstance SetFormat, float, 0.1 ; Omit decimal point from axis position percentages. ; Читаем инфу по жостику. Пока с ней ничего не делаем GetKeyState, joy_buttons, %JoystickNumber%JoyButtons GetKeyState, joy_name, %JoystickNumber%JoyName GetKeyState, joy_info, %JoystickNumber%JoyInfo SoundGet, MUTE_SOUND Loop { ; Читаем состояние кнопок. Если кнопарь нажат, то переменная button(№кнопки)= D Loop, %joy_buttons% { GetKeyState, button%a_index%, %JoystickNumber%joy%a_index% } ; Читаем показания оси Х - по сути основных кнопок жостика GetKeyState, joyx, %JoystickNumber%JoyX If (joyx <= 30) and (joyx >= 20) ; если джойстик по оси х там где надо - запускаем блокнот { Run, Notepad ; запуск Блокнота } Sleep, 250 } return |
Понял фишку, написал на основе первого и второго скриптов утилитку. Если надо будет - могу дать исходник. Качайте!
http://slil.ru/26243353 теперь возникло два вопроса: кто как назначил кнопки джойтика? у меня так: SOURCE =Play/Pause VOLUME = как положено SEEKUP - следующая песня SEEKDOWN - предыдущая ATT - само собой... вообще не понимаю зачем ATT нужен, если можно на паузу нажать???? кто какие действия назначил на остальные кнопки? и второй вопрос: как сделать в скрипте анализ двойного нажатия и тройного нажатия??? было бы очень полезно таким образом расширить количество возможных комбинаций |
Посмотри мой журнал. Только что скрипт писал. Правда, под РР.
|
Настроил кнопки, изменил в двух местах в самом конце таким образом:
; JKey_PREV if (jz = joyz_default) { ; если отпустили кнопу prev или next до того, как началась перемотка, то меняем трек. If (jx <= JKey_PREV_max) and (jx >= JKey_PREV_min) and (time_from_pressing < 10) { SEND ^!+{B} } ; JKey_NEXT If (jx <= JKey_NEXT_max) and (jx>= JKey_NEXT_min) and (time_from_pressing < 10) { SEND ^!+{N} } } } return не работает... странно.... один раз заработало, когда CF , была свёрнута, вхожу - не работает... сворачиваю - опять работает... |
1. Поставь пиликалку на это действие.
2. Сначала активируй CF. И скорее всего все получится. |
Спасибо тебе за скрипт! Сегодня расширил его! Сдеал порежиное управление и кучу всего...
Проблема была в том, что при редактировании горячих клавиш в CF они почему-то активироались, но не все, а как-то беспорядочно, а у меня в это время внастройфках горячие клавиши были отключены... Включил - и всё заработало!!! :big: |
#Singleinstance force
; Скрипт для подключения автомобильного джойстика Sony X4S к CarPc ; *********************** Секция настроек начало *********************** SetFormat, float, 0.1 ; Omit decimal point from axis position percentages. JoystickNumber = 1 First_VolumeStep = 1 Repeat_VolumeStep_default = 2 Repeat_VolumeStep_Amplifier = 1.2 First_MouseStep = 1 Repeat_MouseStep_default = 2 Repeat_MouseStep_Amplifier = 1.2 sleeptime_default = 50 sleeptime = sleeptime_default ; Погрешность определения значений ;KeyGetDelta = 0.3 ; Значения кнопок joyx_default=100 joyz_default=100 jKey_shift_min=2 jKey_shift_max=10 JKey_OFF_min = 3.6 JKey_OFF_max = 4.2 JKey_SOURCE_min = 4.6 JKey_SOURCE_max = 5.2 JKey_ATT_min = 5.0 JKey_ATT_max = 5.5 JKey_X1_min = 7.0 JKey_X1_max = 7.5 JKey_NEXT_min = 10.9 JKey_NEXT_max = 11.4 JKey_PREV_min = 8.0 JKey_PREV_max = 9.0 JKey_VOLU_min = 19.00 JKey_VOLU_max = 21.00 JKey_VOLD_min = 14.4 JKey_VOLD_max = 14.9 JKey_X2_min = 38.6 JKey_X2_max = 39.1 JKey_X3_min = 26.9 JKey_X3_max = 27.9 ; Переменная в которой запоминаем громкость (для Mute) MUTE_SOUND = 0 ; *********************** Секция настроек конец *********************** ; Читаем инфу по жостику. Пока с ней ничего не делаем GetKeyState, joy_buttons, %JoystickNumber%JoyButtons GetKeyState, joy_name, %JoystickNumber%JoyName GetKeyState, joy_info, %JoystickNumber%JoyInfo prev_joyx = joyx_default prev_joyz = joyz_default joyx = joyx_default joyz = joyz_default timer = 0 joymode = 1 joymodes = 2 SoundGet, MUTE_SOUND Loop { ; Читаем состояние кнопок. Если кнопарь нажат, то переменная button(№кнопки)= D Loop, %joy_buttons% { GetKeyState, button%a_index%, %JoystickNumber%joy%a_index% } ; Читаем показания оси Х - по сути основных кнопок жостика GetKeyState, joyx, %JoystickNumber%JoyX GetKeyState, joyz, %JoystickNumber%joyZ ;ToolTip, %joyx% ; Читаем мышиный скролл (пока не пользуем) ; GetKeyState, mouse_Down, WheelDown ; GetKeyState, mouse_Up, WheelUp ; Генерим нужные действия: ;ToolTip, joyx=%joyx% (%joyx_default%) joyz=%joyz% (%joyz_default%) ;tooltip, %joymode% if (joyx<>"") and((joyx<>prev_joyx) or (joyz<>prev_joyz)) { if (prev_joyx <> joyx_default) or (prev_joyz<>joyz_default) { res_button_released( prev_joyx , prev_joyz , timer) } timer = 0 prev_joyx := joyx prev_joyz := joyz if (joyx <> joyx_default) or (joyz<>joyz_default) { res_button_pressed(joyx, joyz, timer) ; SoundPlay beep.wav } } else { if (joyx <> joyx_default) or (joyz<>joyz_default) { timer := timer + 1 res_button_pressed(prev_joyx, prev_joyz, timer) } } Sleep, sleeptime } ;--------------------------------------------------------------------------------- res_button_pressed(jx, jz , time_from_pressing) { global ; чтобы иметь доступ к глобальным переменным ; SoundPlay, beep.wav ; tooltip, %jx% %jz% %time_from_pressing% if (jz = joyz_default) and (time_from_pressing = 0) ; то есть обрабатываем непосредственно нажатия, а не удерживания кнопок, БЕЗ ШИФТА! { ; JKey_X1 If (jx <= JKey_X1_max) and (jx >= JKey_X1_min) { SoundPlay, beep.wav if (joymode=1) { SEND ^{F4} } if (joymode=2) { } } ; JKey_OFF If (jx <= JKey_OFF_max) and (jx_min >= JKey_OFF) and (jz = joyz_default) { SoundPlay, beep.wav if (joymode=1) { SEND ^{F6} } if (joymode=2) { ;Действие кнопки OFF в режиме 2 MouseGetPos, xpos, ypos MouseClick, left, xpos, ypos } } ; JKey_ATT ;Выключаем микрофон If (jx <= JKey_ATT_max) and (jx>= JKey_ATT_min) { SoundSet, +1, MICROPHONE, mute, 2 SoundPlay, beep.wav } ; JKey_X2 - переключение режимов работы джойстика If (jx <= JKey_X2_max) and (jx>= JKey_X2_min) { if (joymode>=joymodes) { joymode=1 sleeptime := sleeptime_default } else { joymode:=joymode+1 } SoundPlay, joymode%joymode%.wav } ; JKey_X3 If (jx <= JKey_X3_max) and (jx>= JKey_X3_min) { SoundPlay, beep.wav if (joymode=1) { SEND ^{F5} } if (joymode=2) { SEND {RBUTTON} } } ; JKey_SOURCE If (jx<= JKey_SOURCE_max) and (jx>= JKey_SOURCE_min) { SoundPlay, beep.wav if (joymode=1) { SEND ^{F3} } if (joymode=2) { MouseGetPos, xpos, ypos MouseClick, left, xpos, ypos } } } ;если не надавлен shift if (jz = joyz_default) { ; переключение песен предыдущая-следующая, движение мыши вверх-вниз If (jx <= JKey_PREV_max) and (jx>= JKey_PREV_min) and ((time_from_pressing/5) = round(time_from_pressing/5)) { if time_from_pressing = 0 { SoundPlay, beep.wav if (joymode=1) { SEND ^{F1} } if (joymode=2) { MouseGetPos, xpos, ypos MouseMove, xpos,ypos+First_MouseStep Repeat_MouseStep:=Repeat_MouseStep_default sleeptime := sleeptime_default } } else if time_from_pressing >= 15 { if (joymode=1) { ;Перемотка песни назад } if (joymode=2) { MouseGetPos, xpos, ypos Repeat_MouseStep:=Repeat_MouseStep_Amplifier*Repea t_MouseStep MouseMove, xpos,ypos+Repeat_MouseStep sleeptime = 0 } } } If (jx <= JKey_NEXT_max) and (jx>= JKey_NEXT_min) and ((time_from_pressing/5) = round(time_from_pressing/5)) { if time_from_pressing = 0 { SoundPlay, beep.wav if (joymode=1) { SEND ^{F2} } if (joymode=2) { MouseGetPos, xpos, ypos MouseMove, xpos,ypos-First_MouseStep Repeat_MouseStep:=Repeat_MouseStep_default sleeptime := sleeptime_default } } else if time_from_pressing >= 15 { if (joymode=1) { ;Перемотка песни вперёд } if (joymode=2) { MouseGetPos, xpos, ypos Repeat_MouseStep:=Repeat_MouseStep_Amplifier*Repea t_MouseStep MouseMove, xpos,ypos-Repeat_MouseStep sleeptime = 0 } } } } ; изменение громкости, движение мыши влево-вправо If (jx <= JKey_VOLD_max) and (jx>= JKey_VOLD_min) and ((time_from_pressing/5) = round(time_from_pressing/5)) { if time_from_pressing = 0 { SoundPlay, beep.wav if (joymode=1) { sleeptime := sleeptime_default Repeat_VolumeStep:=Repeat_VolumeStep_default SoundGet, master_volume master_volume := master_volume-First_VolumeStep SoundSet, master_volume } if (joymode=2) { MouseGetPos, xpos, ypos MouseMove, xpos-First_MouseStep,ypos Repeat_MouseStep:=Repeat_MouseStep_default sleeptime := sleeptime_default } } else if time_from_pressing >= 15 { if (joymode=1) { sleeptime := sleeptime_default Repeat_VolumeStep:=Repeat_VolumeStep_Amplifier*Rep eat_VolumeStep SoundGet, master_volume master_volume := master_volume-Repeat_VolumeStep SoundSet, master_volume } if (joymode=2) { MouseGetPos, xpos, ypos Repeat_MouseStep:=Repeat_MouseStep_Amplifier*Repea t_MouseStep MouseMove, xpos-Repeat_MouseStep,ypos sleeptime = 0 } } } If (jx <= JKey_VOLU_max) and (jx>= JKey_VOLU_min) and ((time_from_pressing/5) = round(time_from_pressing/5)) { if time_from_pressing = 0 { SoundPlay, beep.wav if (joymode=1) { sleeptime := sleeptime_default Repeat_VolumeStep:=Repeat_VolumeStep_default SoundGet, master_volume master_volume := master_volume+First_VolumeStep SoundSet, master_volume } if (joymode=2) { MouseGetPos, xpos, ypos MouseMove, xpos+First_MouseStep,ypos Repeat_MouseStep:=Repeat_MouseStep_default sleeptime := sleeptime_default } } else if time_from_pressing >= 15 { if (joymode=1) { sleeptime := sleeptime_default Repeat_VolumeStep:=Repeat_VolumeStep_Amplifier*Rep eat_VolumeStep SoundGet, master_volume master_volume := master_volume+Repeat_VolumeStep SoundSet, master_volume } if (joymode=2) { MouseGetPos, xpos, ypos Repeat_MouseStep:=Repeat_MouseStep_Amplifier*Repea t_MouseStep MouseMove, xpos+Repeat_MouseStep,ypos sleeptime = 0 } } } ;если надавлен shift if (jz <> joyz_default) { ; выделение файлов If (jx <= JKey_PREV_max) and (jx>= JKey_PREV_min) and ((time_from_pressing/5) = round(time_from_pressing/5)) { if time_from_pressing = 0 { SoundPlay, beep.wav if (joymode=1) { } if (joymode=2) { SEND +{DOWN} } } else if time_from_pressing >= 15 { if (joymode=1) { } if (joymode=2) { SEND +{DOWN} } } } If (jx <= JKey_NEXT_max) and (jx>= JKey_NEXT_min) and ((time_from_pressing/5) = round(time_from_pressing/5)) { if time_from_pressing = 0 { SoundPlay, beep.wav if (joymode=1) { } if (joymode=2) { SEND +{UP} } } else if time_from_pressing >= 15 { if (joymode=1) { } if (joymode=2) { SEND +{UP} } } } If ((time_from_pressing/5) = round(time_from_pressing/5)) and (jx <= JKey_X3_max) and (jx>= JKey_X3_min) { if time_from_pressing = 0 { SoundPlay, beep.wav if (joymode=1) { } if (joymode=2) { SEND ^{LBUTTON} } } else if time_from_pressing >= 15 { if (joymode=1) { } if (joymode=2) { } } } } } ;--------------------------------------------------------------------------------- ;Действие при отпускании res_button_released(jx, jz , time_from_pressing) { global ; чтобы иметь доступ к глобальным переменным ; SoundPlay, beep.wav if (jz >= jKey_shift_min) and (jz <= jKey_shift_max) ; отпустили кнопку регулировку масштаба { If (jx <= JKey_NEXT_max) and (jx>= JKey_NEXT_min) { } If (jx <= JKey_prev_max) and (jx>= JKey_prev_min) { } } ; JKey_PREV if (jz = joyz_default) { ; если отпустили кнопу prev или next до того, как началась перемотка, то меняем трек. If (jx <= JKey_PREV_max) and (jx >= JKey_PREV_min) and (time_from_pressing < 10) { } ; JKey_NEXT If (jx <= JKey_NEXT_max) and (jx>= JKey_NEXT_min) and (time_from_pressing < 10) { } } } return |
Функции джойстика:
X2 (MODE) - Переключение режимов (2 режима) - сопровождается аудио-сообщением из файлов joymode1.wav, joymode1.wav. При необходимости количество режимов можно увеличить до бесконечности. Режим 1 - режим проигрывателя SOURCE - CTRL+F3 NEXT - CTRL+F2 (следующая песня) PREV - CTRL+F1 (предыдущая песня) VOLU - увеличение Master-громкости Windows VOLD - уменьшение Master-громкости Windows OFF - CTRL+F6 (компьютер в ждущий режим), режим сна - отдельной кнопкой на панели автомобиля, ей же и включается ATT - выключение микрофона второй звуковой карты (у меня подключен USB SOUND ADAPTER) X1(SEL) - CTRL+F4 (поднять трубку), Загрузить "ТЕЛЕФОН" X3 (DSPL) - CTRL+F5 (повесить трубку) Режим 2 - режим Windows VOLU - движение мыши вправо VOLD - движение мыши влево NEXT - движение мыши верх PREV - движение мыши вниз SOURCE - клик левой кнопкой мыши SHIFT+NEXT - выделение файлов в проводнике вверх (SHIFT+вверх) SHIFT+NEXT - выделение файлов в проводнике вниз (SHIFT+вниз) X3 (DSPL) - правая кнопка мыши SHIFT + X3 (DSPL) - CTRL+левая кнопка мыши (SHIFT+SOURCE) почему-то не работает... Чтобы отключить оповещение о действии (пищание) можно просто удалить файл beep.wav |
Отличная работа!
Я когда писал этот скрипт конечно совсем не заморачивался :) |
2 alexsorockin
Ты еще не использовал возможности различия длинного и короткого нажатия. Я, к примеру, ща сделал так, чтобы длинное нажатие power сворачивало РР, а короткое - восстанавливало. Также можно поступить и с какими-нить еще действиями. Жмешь коротко - открывается один экран, долго - другой (но желательно похожие, чтобы голова не пухла :big:). То есть ты можешь комп выключать только при длинном нажатии, а при коротком - делать что-нить другое. Меня прикалывает, что почему-то нигде не видел кода, который позволяет полноценно обратабывать нажатия разной длительности, обрабатывать повторения и пр. Хотя самого когда там 10 строк. Все обрабатывали статические состояния кнопок, не учитывая время, так сказать. |
таймер вставить и обрабатывать различия по времени между нажатиями в двух сканах цикла...
можешь дать код, а то думать самому в лом, ПОЖАЛУЙСТА! ВОСКРЕСЕНЬЕ ВЕДЬ! У меня пока голова забита как делать двойное и тройное нажатие... |
Цитата:
На onpressing пикаешь на нажатие (timer=0), но ничего более не делаешь! Далее, если дожидаешься onpressing с timer=xxx, то делаешь действие, которое опеределено по длинному нажатию (можно заодно еще раз пикнуть). Если же случилось onrelease с таймером менее xxx, то это означает, что произошло короткое нажатие (тут не пикаешь, но выполняешь действие, связанное с коротким нажатием). То есть короткое нажатие ты определяешь не по нажатию, а по отпусканию. У меня именно так была сделана перемотка треков/переключение. Там путанно с константами в плане определения времени, но суть именно такая. Определи, что короткое нажатие, к примеру, меньше 0.5 секунды. Задержка, связанная с тем, что событие короткого нажатия привязано к отпусканю, не ощущается. |
назначаемые действия:
кратковременное нажатие: OFF X1 (SEL) X2 (MODE) X3 (DSPL) ATT NEXT PREV VOLU VOLD SOURCE суперкратковременное нажатие SHIFT (100мс) SHIFT+OFF SHIFT+X1 (SEL) SHIFT+X2 (MODE) SHIFT+X3 (DSPL) SHIFT+ATT SHIFT+NEXT SHIFT+PREV SHIFT+SOURCE нажатие с задержкой 1с: OFF X1 (SEL) X2 (MODE) X3 (DSPL) ATT NEXT PREV VOLU VOLD SOURCE суперзадержка нажатия SHIFT (2,5 с) SHIFT+OFF SHIFT+X1 (SEL) SHIFT+X2 (MODE) SHIFT+X3 (DSPL) SHIFT+ATT SHIFT+NEXT SHIFT+PREV SHIFT+SOURCE итого: 38 действий --- замечания: подбирал резистор. получилось, что при одновременном нажатии SHIFT+X2 (MODE) изменялась не координата первой оси X, а координата Y.. При одномременном нажатии изменяются значения координат X и Z по отношению к нажатию без шифта... Может быть, надо было дальше подбирать резистор, но я остановился на этом... |
а вот и сам скрипт, который осталось только откомпилировать, предварительно подставив ваши значения кнопок...
#Singleinstance force ; Скрипт для подключения автомобильного джойстика Sony X4S к CarPc ; *********************** Секция настроек начало *********************** SetFormat, float, 0.1 ; Omit decimal point from axis position percentages. JoystickNumber = 1 First_VolumeStep = 1 Repeat_VolumeStep = 2 Repeat_VolumeStep_Default = 2 Repeat_VolumeStep_Amplifier = 1.1 First_MouseStep = 1 Repeat_MouseStep_default = 2 Repeat_MouseStep_Amplifier = 1.2 sleepdelay_default = 50 sleepdelay := sleepdelay_default time_from_pressing_delay = 30 joymodes = 2 joyx_default=100 joyy_default=100 joyz_default=100 ; Значения кнопок БЕЗ ШИФТА JKey_OFF_min = 3.6 JKey_OFF_max = 4.1 JKey_X1_min = 7.71 JKey_X1_max = 8.9 JKey_X2_min = 39.00 JKey_X2_max = 41.00 JKey_X3_min = 27.00 JKey_X3_max = 30.00 JKey_ATT_min = 6.15 JKey_ATT_max = 6.74 JKey_NEXT_min = 11.50 JKey_NEXT_max = 12.60 JKey_PREV_min = 9.0 JKey_PREV_max = 10.0 JKey_VOLU_min = 20.0 JKey_VOLU_max = 21.50 JKey_VOLD_min = 15.00 JKey_VOLD_max = 16.10 JKey_SOURCE_min = 4.25 JKey_SOURCE_max = 4.8 jKey_SHIFT_min=2 jKey_SHIFT_max=10 ; Значения кнопок С ШИФТОМ JKey_OFF_SHIFT_min = 7.0 JKey_OFF_SHIFT_max = 8.0 JKey_SHIFT_OFF_min = 6.34 JKey_SHIFT_OFF_max = 7.33 JKey_X1_SHIFT_min = 21.0 JKey_X1_SHIFT_max = 25.0 JKey_SHIFT_X1_min = 3.6 JKey_SHIFT_X1_max = 4.1 JKey_X2_SHIFT_min = 3.6 ;Y JKey_X2_SHIFT_max = 4.1 ;Y JKey_SHIFT_X2_min = 3.6 JKey_SHIFT_X2_max = 4.1 JKey_X3_SHIFT_min = 69.94 JKey_X3_SHIFT_max = 70.54 JKey_SHIFT_X3_min = 3.6 JKey_SHIFT_X3_max = 4.1 JKey_ATT_SHIFT_min = 17.0 JKey_ATT_SHIFT_max = 19.0 JKey_SHIFT_ATT_min = 3.6 JKey_SHIFT_ATT_max = 4.1 JKey_NEXT_SHIFT_min = 34.0 JKey_NEXT_SHIFT_max = 38.0 JKey_SHIFT_NEXT_min = 3.6 JKey_SHIFT_NEXT_max = 4.1 JKey_PREV_SHIFT_min = 27.0 JKey_PREV_SHIFT_max = 29.50 JKey_SHIFT_PREV_min = 3.6 JKey_SHIFT_PREV_max = 4.1 JKey_SOURCE_SHIFT_min = 11.50 JKey_SOURCE_SHIFT_max = 13.00 JKey_SHIFT_SOURCE_min = 4.2 JKey_SHIFT_SOURCE_max = 4.5 ; Переменная в которой запоминаем громкость (для Mute) MUTE_SOUND = 0 ; *********************** Секция настроек конец *********************** ; Читаем инфу по жостику. Пока с ней ничего не делаем GetKeyState, joy_buttons, %JoystickNumber%JoyButtons GetKeyState, joy_name, %JoystickNumber%JoyName GetKeyState, joy_info, %JoystickNumber%JoyInfo prev_joyx := joyx_default prev_joyy := joyy_default prev_joyz := joyz_default timer = 0 joymode = 1 CoordMode, ToolTip SoundGet, MUTE_SOUND Loop { ; Читаем состояние кнопок. Если кнопарь нажат, то переменная button(№кнопки)= D Loop, %joy_buttons% { GetKeyState, button%a_index%, %JoystickNumber%joy%a_index% } ; Читаем показания оси Х - по сути основных кнопок жостика GetKeyState, joyx, %JoystickNumber%JoyX GetKeyState, joyy, %JoystickNumber%JoyY GetKeyState, joyz, %JoystickNumber%joyZ ; Генерим нужные действия: ; if (joyx=50) and (joyy=50) and (joyz=50) { goto, 1 } if ((joyx=joyx_default) and (AxisX=1)) or ((joyy=joyy_default) and (AxisY=1)) or ((joyz=joyz_default) and (AxisZ=1)) { res_button_released(joyx_prev, joyy_prev, joyz_prev, timer) timer=0 if (joyx<>joyx_default) { AxisX=1 } else { AxisX=0 } if (joyy<>joyy_default) { AxisY=1 } else { AxisY=0 } if (joyz<>joyz_default) { AxisZ=1 } else { AxisZ=0 } } if (joyx<>joyx_default) or (joyy<>joyy_default) or (joyz<>joyz_default) { if (joyx<>joyx_default) { AxisX=1 } else { AxisX=0 } if (joyy<>joyy_default) { AxisY=1 } else { AxisY=0 } if (joyz<>joyz_default) { AxisZ=1 } else { AxisZ=0 } timer := timer + 1 joyx_prev:=joyx joyy_prev:=joyy joyz_prev:=joyz res_button_pressed(joyx, joyy, joyz, timer) } 1: ;tooltip, %message%,0,0 Sleep, sleepdelay } ;--------------------------------------------------------------------------------- res_button_pressed(jx, jy, jz , time_from_pressing) { global ; чтобы иметь доступ к глобальным переменным if (joymode=1) ; режим 1 { ;обрабатываем задержку нажатия только одной кнопки SHIFT if (time_from_pressing >= time_from_pressing_delay+30) and (jx = joyx_default) and (jy = joyy_default) and (jz <> joyz_default) { ;подаём звук if (time_from_pressing = time_from_pressing_delay+30) { SoundPlay, beep.wav } message=удержание SHIFT } ;обрабатываем задержку нажатия любой другой кнопки, кроме SHIFT if (time_from_pressing >= time_from_pressing_delay) and (jz = joyz_default) { ;подаём звук if (time_from_pressing = time_from_pressing_delay) { SoundPlay, beep.wav } ;обрабатываем кнопки, кроме SHIFT ; JKey_OFF If (jx >= JKey_OFF_min) and (jx <= JKey_OFF_max) { message=удержание OFF } ; JKey_X1 If (jx >= JKey_X1_min) and (jx <= JKey_X1_max) { message=удержание X1 } ; JKey_X2 If (jx >= JKey_X2_min) and (jx <= JKey_X2_max) { message=удержание X2 } ; JKey_X3 If (jx >= JKey_X3_min) and (jx <= JKey_X3_max) { message=удержание X3 } ; JKey_ATT If (jx >= JKey_ATT_min) and (jx <= JKey_ATT_max) { message=удержание ATT - выключаем/включаем микрофон If (time_from_pressing = time_from_pressing_delay) { SoundSet, +1, microphone, mute, 2 } } ; JKey_NEXT If (jx >= JKey_NEXT_min) and (jx <= JKey_NEXT_max) { message=удержание NEXT } ; JKey_PREV If (jx >= JKey_PREV_min) and (jx <= JKey_PREV_max) { message=удержание PREV } ; JKey_VOLU If (jx >= JKey_VOLU_min) and (jx <= JKey_VOLU_max) { message=удержание VOLU Repeat_VolumeStep:=Repeat_VolumeStep_Amplifier*Rep eat_VolumeStep SoundGet, master_volume master_volume:=master_volume+Repeat_VolumeStep SoundSet, master_volume } ; JKey_VOLD If (jx >= JKey_VOLD_min) and (jx <= JKey_VOLD_max) { message=удержание VOLD Repeat_VolumeStep:=Repeat_VolumeStep_Amplifier*Rep eat_VolumeStep SoundGet, master_volume master_volume:=master_volume-Repeat_VolumeStep SoundSet, master_volume } ; JKey_SOURCE If (jx >= JKey_SOURCE_min) and (jx <= JKey_SOURCE_max) { message=удержание SOURCE } } ;обрабатываем задержку нажатия любой кнопки в паре с SHIFT if (time_from_pressing >= time_from_pressing_delay) and (jz <> joyz_default) and ((jx <> joyx_default) or (jy <> joyy_default)) { ;подаём звук if (time_from_pressing = time_from_pressing_delay) { SoundPlay, beep.wav } ; JKey_OFF+SHIFT If (jx >= JKey_OFF_SHIFT_min) and (jx <= JKey_OFF_SHIFT_max) and (jz >= JKey_SHIFT_OFF_min) and (jz <= JKey_SHIFT_OFF_max) { message=удержание SHIFT+OFF } ; JKey_X1+SHIFT If (jx >= JKey_X1_SHIFT_min) and (jx <= JKey_X1_SHIFT_max) and (jz >= JKey_SHIFT_X1_min) and (jz <= JKey_SHIFT_X1_max) { message=удержание SHIFT+X1 } ; JKey_X2+SHIFT If (jy >= JKey_X2_SHIFT_min) and (jy <= JKey_X2_SHIFT_max) and (jz >= JKey_SHIFT_X2_min) and (jz <= JKey_SHIFT_X2_max) { message=удержание SHIFT+X2 } ; JKey_X3+SHIFT If (jx >= JKey_X3_SHIFT_min) and (jx <= JKey_X3_SHIFT_max) and (jz >= JKey_SHIFT_X3_min) and (jz <= JKey_SHIFT_X3_max) { message=удержание SHIFT+X3 } ; JKey_ATT+SHIFT If (jx >= JKey_ATT_SHIFT_min) and (jx <= JKey_ATT_SHIFT_max) and (jz >= JKey_SHIFT_ATT_min) and (jz <= JKey_SHIFT_ATT_max) { message=удержание SHIFT+ATT } ; JKey_NEXT+SHIFT If (jx >= JKey_NEXT_SHIFT_min) and (jx <= JKey_NEXT_SHIFT_max) and (jz >= JKey_SHIFT_NEXT_min) and (jz <= JKey_SHIFT_NEXT_max) { message=удержание SHIFT+NEXT } ; JKey_PREV+SHIFT If (jx >= JKey_PREV_SHIFT_min) and (jx <= JKey_PREV_SHIFT_max) and (jz >= JKey_SHIFT_PREV_min) and (jz <= JKey_SHIFT_PREV_max) { message=удержание SHIFT+PREV } ; JKey_SOURCE+SHIFT If (jx >= JKey_SOURCE_SHIFT_min) and (jx <= JKey_SOURCE_SHIFT_max) and (jz >= JKey_SHIFT_SOURCE_min) and (jz <= JKey_SHIFT_SOURCE_max) { message=удержание SHIFT+SOURCE } } } } ;--------------------------------------------------------------------------------- res_button_released(jx, jy, jz , time_from_pressing) { global ; чтобы иметь доступ к глобальным переменным if (joymode=1) ; режим 1 { ;обрабатываем одиночное нажатие SHIFT if (time_from_pressing < time_from_pressing_delay-18) and (jx = joyx_default) and (jy = joyy_default) and (jz<>joyz_default) { ;подаём звук if (time_from_pressing = time_from_pressing_delay-18) { SoundPlay, beep.wav } message=кратковременно SHIFT } ;обрабатываем одиночное нажатие без SHIFT if (time_from_pressing < time_from_pressing_delay) and (jz = joyz_default) { SoundPlay, beep.wav ; JKey_OFF If (jx >= JKey_OFF_min) and (jx <= JKey_OFF_max) { message=кратковременно OFF } ; JKey_X1 If (jx >= JKey_X1_min) and (jx <= JKey_X1_max) { message=кратковременно X1 } ; JKey_X2 If (jx >= JKey_X2_min) and (jx <= JKey_X2_max) { message=кратковременно X2 } ; JKey_X3 If (jx >= JKey_X3_min) and (jx <= JKey_X3_max) { message=кратковременно X3 } ; JKey_ATT If (jx >= JKey_ATT_min) and (jx <= JKey_ATT_max) { message=кратковременно ATT } ; JKey_NEXT If (jx >= JKey_NEXT_min) and (jx <= JKey_NEXT_max) { message=кратковременно NEXT } ; JKey_PREV If (jx >= JKey_PREV_min) and (jx <= JKey_PREV_max) { message=кратковременно PREV } ; JKey_VOLU If (jx >= JKey_VOLU_min) and (jx <= JKey_VOLU_max) { message=кратковременно VOLU Repeat_VolumeStep:=Repeat_VolumeStep_Default SoundGet, master_volume master_volume:=master_volume+Repeat_VolumeStep SoundSet, master_volume } ; JKey_VOLD If (jx >= JKey_VOLD_min) and (jx <= JKey_VOLD_max) { message=кратковременно VOLD Repeat_VolumeStep:=Repeat_VolumeStep_Default SoundGet, master_volume master_volume:=master_volume-Repeat_VolumeStep SoundSet, master_volume } ; JKey_SOURCE If (jx >= JKey_SOURCE_min) and (jx <= JKey_SOURCE_max) { message=кратковременно SOURCE } } ;обрабатываем одиночное нажатие любой кнопки в паре с SHIFT if (time_from_pressing < time_from_pressing_delay) and (jz <> joyz_default) and ((jx <> joyx_default) or (jy <> joyy_default)) { SoundPlay, beep.wav ; JKey_OFF+SHIFT If (jx >= JKey_OFF_SHIFT_min) and (jx <= JKey_OFF_SHIFT_max) and (jz >= JKey_SHIFT_OFF_min) and (jz <= JKey_SHIFT_OFF_max) { message=кратковременно SHIFT+OFF } ; JKey_X1+SHIFT If (jx >= JKey_X1_SHIFT_min) and (jx <= JKey_X1_SHIFT_max) and (jz >= JKey_SHIFT_X1_min) and (jz <= JKey_SHIFT_X1_max) { message=кратковременно SHIFT+X1 } ; JKey_X2+SHIFT If (jy >= JKey_X2_SHIFT_min) and (jy <= JKey_X2_SHIFT_max) and (jz >= JKey_SHIFT_X2_min) and (jz <= JKey_SHIFT_X2_max) { message=кратковременно SHIFT+X2 } ; JKey_X3+SHIFT If (jx >= JKey_X3_SHIFT_min) and (jx <= JKey_X3_SHIFT_max) and (jz >= JKey_SHIFT_X3_min) and (jz <= JKey_SHIFT_X3_max) { message=кратковременно SHIFT+X3 } ; JKey_ATT+SHIFT If (jx >= JKey_ATT_SHIFT_min) and (jx <= JKey_ATT_SHIFT_max) and (jz >= JKey_SHIFT_ATT_min) and (jz <= JKey_SHIFT_ATT_max) { message=кратковременно SHIFT+ATT } ; JKey_NEXT+SHIFT If (jx >= JKey_NEXT_SHIFT_min) and (jx <= JKey_NEXT_SHIFT_max) and (jz >= JKey_SHIFT_NEXT_min) and (jz <= JKey_SHIFT_NEXT_max) { message=кратковременно SHIFT+NEXT } ; JKey_PREV+SHIFT If (jx >= JKey_PREV_SHIFT_min) and (jx <= JKey_PREV_SHIFT_max) and (jz >= JKey_SHIFT_PREV_min) and (jz <= JKey_SHIFT_PREV_max) { message=кратковременно SHIFT+PREV } ; JKey_SOURCE+SHIFT If (jx >= JKey_SOURCE_SHIFT_min) and (jx <= JKey_SOURCE_SHIFT_max) and (jz >= JKey_SHIFT_SOURCE_min) and (jz <= JKey_SHIFT_SOURCE_max) { message=кратковременно SHIFT+SOURCE } } ;обрабатываем отпускание удержанной кнопки без SHIFT (для сброса некоторых переменных, нужных для режима удержания (например, увеличение громкости)) if (time_from_pressing > time_from_pressing_delay) and (jz = joyz_default) { ; JKey_OFF If (jx >= JKey_OFF_min) and (jx <= JKey_OFF_max) { } ; JKey_X1 If (jx >= JKey_X1_min) and (jx <= JKey_X1_max) { } ; JKey_X2 If (jx >= JKey_X2_min) and (jx <= JKey_X2_max) { } ; JKey_X3 If (jx >= JKey_X3_min) and (jx <= JKey_X3_max) { } ; JKey_ATT If (jx >= JKey_ATT_min) and (jx <= JKey_ATT_max) { } ; JKey_NEXT If (jx >= JKey_NEXT_min) and (jx <= JKey_NEXT_max) { } ; JKey_PREV If (jx >= JKey_PREV_min) and (jx <= JKey_PREV_max) { } ; JKey_VOLU If (jx >= JKey_VOLU_min) and (jx <= JKey_VOLU_max) { Repeat_VolumeStep:=Repeat_VolumeStep_Default } ; JKey_VOLD If (jx >= JKey_VOLD_min) and (jx <= JKey_VOLD_max) { Repeat_VolumeStep:=Repeat_VolumeStep_Default } ; JKey_SOURCE If (jx >= JKey_SOURCE_min) and (jx <= JKey_SOURCE_max) { } } } } return |
у меня видимо аппаратная проблема на связке Sony RM-X4S + F16U
при выходе из спящего режима через раз не работает джойстик. в системе висит, но значения не изменяются... внешнее питание на USBхаб подаётся до включения компа... как то раз удалось заставить работать удалением/определением в устройствах... может как то возможно заставить переинициировать? |
Цитата:
|
Господа, объясните идиоту, уже 2 часа мучаюсь, но понять никак не могу! Как организована функция удержания кнопки, где и как считаеться время нажатия, если можно на примере с одной переменной!
|
Цитата:
Там цикл, который реагирует на любое изменение координат осей. Вот мой главный цикл Loop { ; Читаем состояние кнопок. Если кнопарь нажат, то переменная button(№кнопки)= D Loop, %joy_buttons% { GetKeyState, button%a_index%, %JoystickNumber%joy%a_index% } ; Читаем показания оси Х - по сути основных кнопок жостика GetKeyState, joyx, %JoystickNumber%JoyX GetKeyState, joyz, %JoystickNumber%joyZ ;ToolTip, %joyx% if (joyx<>"") and((joyx<>prev_joyx) or (joyz<>prev_joyz)) { ; если состояние джойстика изменилось if (prev_joyx <> joyx_default) or (prev_joyz<>joyz_default) { ; если было не дефолтное положение - считаем, что прошлое положение отпущено, вызываем обработчик. res_button_released( prev_joyx , prev_joyz , timer) } timer = 0 prev_joyx := joyx prev_joyz := joyz if (joyx <> joyx_default) or (joyz<>joyz_default) { ; Если новое положение не дефолтное, то вызываем обработчик нажатия и начинаем счет времени res_button_pressed(joyx, joyz, timer) } } else { if (joyx <> joyx_default) or (joyz<>joyz_default) { ; если ничего не изменилось и положение НЕ дефолтное, то увеличиваем таймер на 1 и вызываем обработчик нажатия. timer := timer + 1 res_button_pressed(prev_joyx, prev_joyz, timer) } } Sleep, 50 } 0. То есть систему включили, у нее все по дефолту, ничего не происходит. далее: 1. Нажали кнопку. Начал вызываться обработчик нажатия. У него есть параметр Timer, который последовательно увеличивается. Если Timer=0, то кнопку только что нажали 2. Кнопку отпустили (или нажали что-то другое) Вызвался обработчик отпускания с параметром Timer, соответствующим времени нажатия на кнопку. Затем см пункт 0 или 1. Теперь пишем обработчик для единственной кнопки res_button_pressed(jx, jz , time_from_pressing) { global ; чтобы иметь доступ к глобальным переменным if (jz = joyz_default) and (time_from_pressing = 0) ; то есть обрабатываем непосредственно нажатия, а не удерживания кнопок. If (jx <= JKey_VOLU_max) and (jx>= JKey_VOLU_min) and ((time_from_pressing/5) = round(time_from_pressing/5)) { SoundGet, master_volume if time_from_pressing = 0 { master_volume := master_volume*(1+(First_VolumeStep/100)) } else if time_from_pressing >= 15 { master_volume := master_volume*(1+(Repeat_VolumeStep/100)) } SoundSet, master_volume } } Тут смысл такой - если только что нажали - меняем громкость на First_VolumeStep, а если ужерживаем - меняем на Repeat_VolumeStep каждые 5 циклов вызова, но если время от нажатия не менее 15. Если же надо выполнять разные действия в зависимости от длительности - надо обрабатывать отпускание кнопки и по нему определять длинное или короткое нажатие, я чуть выше писал... зы. Скопируй отсюда текст и расставь сдвиги вправо, чтобы понимать какой if на что действует, иначе непонятно... Я вставлял tab, но форум их съел :-(. |
Спасибо, просто очень в неудобной для читания форме скрипт напечатан (по крайней мере для меня)сложно уловить начало и конец цикла я уже почти весь скрипт по if ам разложил, пока пост заметил! Респект вам ребята очень нужное дело сделали)
|
А почему никто не использует другие кнопки F-16U? Там ведь еще 4 кнопки. Да, я понимаю что на SONY их не повесишь, но можно же вывести еще 4 кнопки, для спец нужд. Кто что думает по этому поводу?
|
люди.... а подскажите pls
как сделать так чтобы распознать нажатие Button 1(Pin 2) на game порте? |
Вложений: 1
Вот последняя версия для джойстика.
Функции: -Кратковременное нажатие каждой кнопки -Кратковременное нажатие пары кнопок -Долгое нажатие каждой кнопки -Долгое нажатие пары кнопок -Ini файл с настройками -32 горячие клавиши, задаются в Ini файле -прочие настройки |
Еще 5 копеек к скрипту перешел на виндовс 7 и обнаружил что звук перестал регулироваться командами Soudset вот решения с форума
On Windows Vista, SoundSet and SoundGet affect only the script itself (this may be resolved in a future version). There are at least two ways to work around this: 1) In the properties dialog for the file "AutoHotkey.exe" (or a compiled script), change the compatibility setting to "Windows XP". 2) Have the script send volume-control keystrokes to change the master volume for the entire system. For example:Code (Copy): Send {Volume_Up} ; Raise the master volume by 1 interval (typically 5%). Send {Volume_Down 3} ; Lower the master volume by 3 intervals. Send {Volume_Mute} ; Mute/unmute the master volume |
Скоро снова напишу программку на делфи - можно будет настроить:
- любую кнопку - любую комбинацию кнопок - любую последовательность отдельно нажатых кнопок - любую последовательность отдельно нажатых кнопок или комбинаций - долгое нажатие отдельной кнопки - долгое нажатие комбинации кнопок - завершение долгим нажатием отдельной кнопки после любой последовательности отдельно нажатых кнопок - завершение долгим нажатием комбинации кнопок после любой последовательности отдельно нажатых кнопок - завершение долгим нажатием комбинации кнопок после любой последовательности отдельно нажатых кнопок или комбинаций а также: - оконный интерфейс - назначение любых горячих клавиш - режим мыши и многое другое... пишите ваши предложения, всё равно заново писать придётся... Программа была практически готова, но флешка, с которой работал неожиданно сбойнула и всё пропало, не зарезервировал ))) быстро не обещаю - времени свободного практически нет, уже 2 месяца как компьютер домой принёс, поставил Win7, а езжу без музыки... |
Цитата:
|
Народ привет. Извиняюсь за никрофильство :)
Есть возможность прикупить сей девайс. Вы его юзали смотрю и удачно. Хотел поинтересоваться джойстик удобный или лучше кнопки на руле? |
Цитата:
Возможность прикупить новый или бу? а то мне пришлось как запчасть его покупать |
Часовой пояс GMT +4, время: 05:41. |
Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot