PDA

View Full Version : Relative Microstick



Torpedovisk
30th June 2004, 10:48 PM
Unless i missed a command on the Control Manager, you can't set any axis to relative mode(x/yrelative is for trackball only, right?).

If such command exists, just ignore the rest... :oops: :stupid:

A relative axis for the designator and radar would be great in LOMAC. My Microstick mouse mode was already set for the cockpit view, so i made this script.

I'm still a noob with CMS, so there's probably a lot of room for improvement.

While holding the Fighterstick hatswitch(in the middle of the stick) to the right, inputs from the microstick control one virtual mouse/slider, while holding the hatswitch to the left controls the other virtual mouse/slider. If none are pressed, or if you use them while the pinkie switch is pressed, the microstick controls the mouse.

The division in the end is just to decrease the max speed. Adjust it according to your own preferences.

Deadzone in the CMS Painel must be set to zero, but you can control it by changing the number in the "IF ( [ JS2.A1 > 128 ] ) THEN" lines and similars.

It's working fine for me, but if the cut and paste somehow damages it, i can post the CMS file.

// Microstick

//// Radar Axes

CMS.A7 = A50;
CMS.A8 = A51;

///// X Axis

SEQUENCE
WHILE( JS1.B14 AND NOT JS1.B4 );
IF ( [ JS2.A1 > 128 ] ) THEN
SEQUENCE
A50 = A50 + ( JS2.A1 - 128 ) / 10;
DELAY ( 1 );
ENDSEQUENCE
ELSE
IF ( [ JS2.A1 < 128 ] ) THEN
SEQUENCE
A50 = A50 - ( 128 - JS2.A1 ) / 10;
DELAY ( 1 );
ENDSEQUENCE
ENDIF
ENDIF
ENDSEQUENCE

///// Y Axis

SEQUENCE
WHILE( JS1.B14 AND NOT JS1.B4 );
IF ( [ JS2.A2 > 128 ] ) THEN
SEQUENCE
A51 = A51 + ( JS2.A2 - 128 ) / 10;
DELAY ( 1 );
ENDSEQUENCE
ELSE
IF ( [ JS2.A2 < 128 ] ) THEN
SEQUENCE
A51 = A51 - ( 128 - JS2.A2 ) / 10;
DELAY ( 1 );
ENDSEQUENCE
ENDIF
ENDIF
ENDSEQUENCE

//// Designator Axes

CMS.A9 = A52;
CMS.A10 = A53;

///// X Axis

SEQUENCE
WHILE( JS1.B16 AND NOT JS1.B4 );
IF ( [ JS2.A1 > 128 ] ) THEN
SEQUENCE
A52 = A52 + ( JS2.A1 - 128 ) / 10;
DELAY ( 1 );
ENDSEQUENCE
ELSE
IF ( [ JS2.A1 < 128 ] ) THEN
SEQUENCE
A52 = A52 - ( 128 - JS2.A1 ) / 10;
DELAY ( 1 );
ENDSEQUENCE
ENDIF
ENDIF
ENDSEQUENCE

///// Y Axis

SEQUENCE
WHILE( JS1.B16 AND NOT JS1.B4 );
IF ( [ JS2.A2 > 128 ] ) THEN
SEQUENCE
A53 = A53 + ( JS2.A2 - 128 ) / 10;
DELAY ( 1 );
ENDSEQUENCE
ELSE
IF ( [ JS2.A2 < 128 ] ) THEN
SEQUENCE
A53 = A53 - ( 128 - JS2.A2 ) / 10;
DELAY ( 1 );
ENDSEQUENCE
ENDIF
ENDIF
ENDSEQUENCE

//// Mouse Mode

SEQUENCE
WHILE( NOT JS1.B14 AND NOT JS1.B16 );
CMS.A5 = JS2.A1;
CMS.A6 = JS2.A2;
ENDSEQUENCE

MichaelCHProd
1st July 2004, 01:06 AM
ooooh.... where is JNOV when I need him :D

JNOV
1st July 2004, 02:49 PM
Nice work!

I&#39;ve used a similar scheme to implement analog-axis trim controls in IL-2. The way it works is that holding down particular keys increases the corresponding trim axes at a rate "proportional" (see banding discussion below) to the offset of the axis that drives the primary control surface (e.g., holding down the "aileron trim" key causes the joystick x axis to affect the analog trim axis while still providing normal aileron control).

One thing you might consider adding is to add a sense of "velocity" rather than simply on/off (but then again, if on/off is good enough, why bother?). That&#39;s the idea of "proportional" rates that I noted above. It&#39;s a bit tricky to set up a truly proportional scheme with integer math, but you can approximate it, for example, by setting up a number of velocity bands (i.e., ranges of axis displacement), each of which would trigger, in your scheme, different values for the divisor (i.e., 10). The more bands you have, the less coarse the approximation.

Welcome to the forum!

- JNOV

Torpedovisk
31st July 2004, 10:56 PM
Thanks JNOV, good advice!

I&#39;ve update my script, if anyone is interested:

// Microstick

//// Radar Axes

CMS.A7 = A50;
CMS.A8 = A51;

///// X Axis

////// X Slow

SEQUENCE
WHILE( JS1.B14 AND NOT JS1.B4 );
IF ( [ JS2.A1 >= 145 ] AND [ JS2.A1 <= 165 ] AND NOT [ A50 >= 255 ] ) THEN
SEQUENCE
A50 = A50 + ( JS2.A1 - 145 ) / 10;
DELAY ( 2 );
ENDSEQUENCE
ELSE
IF ( [ JS2.A1 <= 100 ] AND [ JS2.A1 >= 80 ] AND NOT [ A50 <= 0 ] ) THEN
SEQUENCE
A50 = A50 - ( 100 - JS2.A1 ) / 10;
DELAY ( 2 );
ENDSEQUENCE
ENDIF
ENDIF
ENDSEQUENCE

////// X Normal

SEQUENCE
WHILE( JS1.B14 AND NOT JS1.B4 );
IF ( [ JS2.A1 >= 166 ] AND NOT [ A50 >= 255 ] ) THEN
SEQUENCE
A50 = A50 + ( JS2.A1 - 166 ) / 5;
DELAY ( 1 );
ENDSEQUENCE
ELSE
IF ( [ JS2.A1 <= 79 ] AND NOT [ A50 <= 0 ] ) THEN
SEQUENCE
A50 = A50 - ( 79 - JS2.A1 ) / 5;
DELAY ( 1 );
ENDSEQUENCE
ENDIF
ENDIF
ENDSEQUENCE

///// Y Axis

////// Y Slow

SEQUENCE
WHILE( JS1.B14 AND NOT JS1.B4 );
IF ( [ JS2.A2 >= 138 ] AND [ JS2.A2 <= 158 ] AND NOT [ A51 >= 255 ] ) THEN
SEQUENCE
A51 = A51 + ( JS2.A2 - 138 ) / 10;
DELAY ( 2 );
ENDSEQUENCE
ELSE
IF ( [ JS2.A2 <= 104 ] AND [ JS2.A2 >= 84 ] AND NOT [ A51 <= 0 ] ) THEN
SEQUENCE
A51 = A51 - ( 104 - JS2.A2 ) / 10;
DELAY ( 2 );
ENDSEQUENCE
ENDIF
ENDIF
ENDSEQUENCE

///// Y Normal

SEQUENCE
WHILE( JS1.B14 AND NOT JS1.B4 );
IF ( [ JS2.A2 >= 159 ] AND NOT [ A51 >= 255 ] ) THEN
SEQUENCE
A51 = A51 + ( JS2.A2 - 159 ) / 5;
DELAY ( 1 );
ENDSEQUENCE
ELSE
IF ( [ JS2.A2 <= 83 ] AND NOT [ A51 <= 0 ] ) THEN
SEQUENCE
A51 = A51 - ( 83 - JS2.A2 ) / 5;
DELAY ( 1 );
ENDSEQUENCE
ENDIF
ENDIF
ENDSEQUENCE

//// Designator Axes

CMS.A9 = A52;
CMS.A10 = A53;

///// X Axis

////// X Slow

SEQUENCE
WHILE( JS1.B16 AND NOT JS1.B4 );
IF ( [ JS2.A1 >= 145 ] AND [ JS2.A1 <= 165 ] AND NOT [ A52 >= 255 ] ) THEN
SEQUENCE
A52 = A52 + ( JS2.A1 - 145 ) / 10;
DELAY ( 2 );
ENDSEQUENCE
ELSE
IF ( [ JS2.A1 <= 100 ] AND [ JS2.A1 >= 80 ] AND NOT [ A52 <= 0 ] ) THEN
SEQUENCE
A52 = A52 - ( 100 - JS2.A1 ) / 10;
DELAY ( 2 );
ENDSEQUENCE
ENDIF
ENDIF
ENDSEQUENCE

////// X Normal

SEQUENCE
WHILE( JS1.B16 AND NOT JS1.B4 );
IF ( [ JS2.A1 >= 166 ] AND NOT [ A52 >= 255 ] ) THEN
SEQUENCE
A52 = A52 + ( JS2.A1 - 166 ) / 10;
DELAY ( 1 );
ENDSEQUENCE
ELSE
IF ( [ JS2.A1 <= 79 ] AND NOT [ A52 <= 0 ] ) THEN
SEQUENCE
A52 = A52 - ( 79 - JS2.A1 ) / 10;
DELAY ( 1 );
ENDSEQUENCE
ENDIF
ENDIF
ENDSEQUENCE

///// Y Axis

////// Y Slow

SEQUENCE
WHILE( JS1.B16 AND NOT JS1.B4 );
IF ( [ JS2.A2 >= 138 ] AND [ JS2.A2 <= 158 ] AND NOT [ A53 >= 255 ] ) THEN
SEQUENCE
A53 = A53 + ( JS2.A2 - 138 ) / 10;
DELAY ( 2 );
ENDSEQUENCE
ELSE
IF ( [ JS2.A2 <= 104 ] AND [ JS2.A2 >= 84 ] AND NOT [ A53 <= 0 ] ) THEN
SEQUENCE
A53 = A53 - ( 104 - JS2.A2 ) / 10;
DELAY ( 2 );
ENDSEQUENCE
ENDIF
ENDIF
ENDSEQUENCE

///// Y Normal

SEQUENCE
WHILE( JS1.B16 AND NOT JS1.B4 );
IF ( [ JS2.A2 >= 159 ] AND NOT [ A53 >= 255 ] ) THEN
SEQUENCE
A53 = A53 + ( JS2.A2 - 159 ) / 10;
DELAY ( 1 );
ENDSEQUENCE
ELSE
IF ( [ JS2.A2 <= 83 ] AND NOT [ A53 <= 0 ] ) THEN
SEQUENCE
A53 = A53 - ( 83 - JS2.A2 ) / 10;
DELAY ( 1 );
ENDSEQUENCE
ENDIF
ENDIF
ENDSEQUENCE

//// Mouse Mode

SEQUENCE
WHILE( NOT JS1.B14 AND NOT JS1.B16 );
CMS.A5 = JS2.A1;
CMS.A6 = JS2.A2;
ENDSEQUENCE