VoiceAttack
General => Feature Suggestions => Topic started by: Malic on November 30, 2018, 12:02:54 AM
-
What I am imagining would be a native option in the "add a command" section to detect a double tap or pressing and holding a button.
Examples of how I would use these would be for example, with the upcoming Elite Dangerous 3.3 update:
The button I use to target ships, if I press and hold it instead, would activate the analysis mode.
Could also make a single button do up to three different things:
Example:
Single press: Chaff
Double press: Cargo Scoop
Press and hold: Landing Gear
Second example:
Single press: Lights
Douple press: N/A
Press and hold: Night vision
Much like the ability to use the {CMDSEGMENT:0} Token to have the command grab what word was said, might need to make a new Token type to have it check to see if the button press was a single press, double tap or a press and hold so you can make a single command that could do all the different things.
Also would need options to be able to customize how quickly the double tap needs to be to be registered as a double tap, and how long the button needs to be held too. Am thinking 1000 = 1 second ( 200 would be "standard" for most double taps/clicks
Might be able to use this for detecting mouse clicks and joystick buttons as well.
EDIT by Pfeil: Double tap/hold/double tap hold functionality has been implemented.
-
I agree, it would be cool if it could be integrated in to va.
If you would like a press and hold function though. Here is my well tested one. It allows for single taps, and press and hold actions.
Set small int (condition) [Seconds] value to 0
Start Loop While : Keyboard Key 'F14' Is Pressed
Set small int (condition) [Seconds] value as incremented by 1
Write [Blue] '{SMALL:Seconds}' to log
Pause 0.1 seconds
Begin Small Integer Compare : [Seconds] Is Greater Than 3
Put here the press and hold command to be run!
End Condition - Exit when condition met
End Loop
Begin Small Integer Compare : [Seconds] Is Less Than 3
Here for single tap commands
End Condition - Exit when condition met
Begin Small Integer Compare : [Seconds] Is Less Than 3
End Condition - Exit when condition met
^ This really isn't needed, because it will happen by default if Seconds never reaches 4. 4 would be 0.4 seconds. Most normal single key presses are under 0.3 seconds. Fast key presses are under 0.1 seconds.
The time delay, is just long enough, that you never accidentally trigger the press and hold command, but also, that you don't feel like you're holding the key down for a long time either. I've been using this for a long time, and works great. I actually have a command just with this command in it, so I can copy and paste it into other commands. I use a 20 button mouse, and most every button now has 2 possible trigger actions.
I decided to make a profile for just this command, and attached it for download. Hope it comes in handy for you, and others. Very useful command.
-
Here's one way of implementing all three functions into a command:
Begin Boolean Compare : [{CMD}Running] Equals True
End Condition - Exit when condition met
Set Boolean [{CMD}Running] to True
Set date [~commandStart] to [~commandStart] plus [300] milliseconds
Start Loop While : (Keyboard Key 'F14' Is Pressed AND [~commandStart] Is Greater Than Current Date/Time)
End Loop
Begin Date Compare : [~commandStart] Is Less Than Current Date/Time
Execute command, 'press and hold command' (by name)
Else
Start Loop While : [~commandStart] Is Greater Than Current Date/Time
Begin Device State Check : Keyboard Key 'F14' Is Pressed
Execute command, 'double tap command' (by name)
Set Boolean [{CMD}Running] to [Not Set]
End Condition - Exit when condition met
End Loop
Execute command, 'press command' (by name)
End Condition
Set Boolean [{CMD}Running] to [Not Set]
The command must check for a running instance and stop itself if there is one already, as the double tap will run the command again(you can uncheck the "Allow other command to execute while this one is running and do away with the check, but that may not be desirable).
Waiting for a second press also necessitates waiting before executing the single press command, meaning in this example ±300ms will elapse between the initial keypress and continuation of the command.
-
Only question I have about the above,
this line:
Begin Device State Check : Keyboard Key 'F14' Is Pressed
Because of all the different control setups, am trying to make my profile as pain free as I can so if I have this on my joystick, and I press it, vs holding it down it will toggle lights, or toggle night vision if held.
But
With this, does each user require that they manually change that line on their control, or is there a way to have this automatically change to the button that is being pressed in the "When I press" portion of the command?
-
With this, does each user require that they manually change that line on their control, or is there a way to have this automatically change to the button that is being pressed in the "When I press" portion of the command?
Yes, they'll have to manually change it. No there is no way to automatically set it to whatever's mapped to trigger the command.
I requested the latter some time ago, so it may make its way in, still.
-
Shouldnt "Greater then" and "Less then" be "is after" and "is before"?
-
In the current version, yes. That example was written using an older version.
-
Did something else change? I cant get the double-tab to work.
I tried changing stuff and googled before asking. :D
Begin Boolean Compare : [{CMD}Running] Equals True
End Condition - Exit when condition met
Set Boolean [{CMD}Running] to True
Set date [~usr1.joystick1.button5] to [~usr1.joystick1.button5] plus [250] milliseconds
Start Loop While : (Joystick 1 Button 5 Is Pressed AND [~usr1.joystick1.button5] Is After Current Date/Time)
End Loop
Begin Date Compare : [~usr1.joystick1.button5] Is Before Current Date/Time
Start Loop While : Joystick 1 Button 5 Is Pressed
Press down Left Shift key
End Loop
Release Left Shift key
Else
Start Loop While : (Joystick 1 Button 5 Is Pressed AND [~usr1.joystick1.button5] Is Before Current Date/Time)
Begin Device State Check : Joystick 1 Button 5 Is Pressed
Press H key and hold for 0,1 seconds and release
Set Boolean [{CMD}Running] to [Not Set]
End Condition - Exit when condition met
End Loop
Press U key and hold for 0,1 seconds and release
End Condition
Set Boolean [{CMD}Running] to [Not Set]
-
The command should still work. Backward-compatibility is normally maintained.
However, you added an "AND" to the loop just after the "Condition Else" action, which may be relevant
-
Ah mah gawd, I did not see that...
Edit: actually i found a few errors... i'll report back!
-
That is part of why it's important to understand how a command actually functions.
As an aside, changing the name of the "~commandStart" variable makes no difference, but there is also no point in doing so.
It is explicitly command-scoped, so that the same variable name can be used in multiple commands while still creating separate instances, I.E. the data is only available in the command instance it's used in, so one will not affect the other.
-
Allrighty then! Sometimes I feel stupid for asking stuff. But its working now. Thank you. :D