This post explains a mechanism for the mouse to stick translation, that allows to reach a better precision and that is required to perform a 1:1 translation.

If you don’t want to read some math, then skip this post 🙂

All values are considered positive so as to simplify the explanation.

Each 10 ms, the sixaxis emulator processes all pending events.

All mouse motion events are merged and as a result, a single mouse event is processed.

This mouse event contains cumulated x and y deltas: (dx1, dy1).

This motion vector is then translated into a stick position according to the following formula:

` (1) pos1 = dz1 + mul * pow(mv1, exp)`

pos1 = desired stick position (real)

dz1 = deadzone (real, function of dx1, dy1 and the deadzone shape)

mv1 = mouse value (integer), dx1 or dy1

mul = multiplier (real, constant)

exp = exponent (real, constant)

The result pos1 is a real. But the final stick position has to be an integer.

What emuclient was doing previously is rounding pos1 to the nearest integer.

This obviously results into a lower or higher speed than the desired one.

A much more precise solution to tackle this real to integer conversion is to truncate pos1, and compute a mouse vector remainder to be added next iteration.

The mouse event that corresponds to the applied stick position is: (dx2, dy2).

dx2 and dy2 are reals.

` (2) pos2 = dz1 + mul * pow(mv2, exp)`

pos2 = applied stick position (truncate(pos1), integer)

dz1 = deadzone (same value, the angle is considered to be the same)

mv2 = mouse value (real), dx2 or dy2

mul = multiplier (real, constant)

exp = exponent (real, constant)

Note: norm(mv1) >= norm(mv2)

` (3) vrem = mv1 - mv2`

vrem = mouse vector remainder

mv1 is known.

mv2 is computed from (2):

` (4) mv2 = pow[(pos2 - dz1)/mul, 1/exp]`

mv2 can be replaced in (3):

` (5) vrem = mv1 - pow[(pos2 - dz1)/mul, 1/exp]`

Conclusion:

- (5) gives the mouse vector remainder that has to be added the next iteration
- this emulates a subposition precision

Notes:

- this is useful with 8-bit precision for stick axes as the speed difference between two neighbor stick positions is high
- this is useless with 16-bit precision for stick axes