summaryrefslogtreecommitdiff
path: root/common/rawaccel-base.hpp
blob: cee1a3edd8aa2e74c70e89ade5aceb0c11ed5d19 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#pragma once

#include "math-vec2.hpp"

namespace rawaccel {
    using milliseconds = double;

    inline constexpr int POLL_RATE_MIN = 125;
    inline constexpr int POLL_RATE_MAX = 8000;

    inline constexpr milliseconds DEFAULT_TIME_MIN = 1000.0 / POLL_RATE_MAX / 2;
    inline constexpr milliseconds DEFAULT_TIME_MAX = 1000.0 / POLL_RATE_MIN * 2;

    inline constexpr milliseconds WRITE_DELAY = 1000;

    inline constexpr size_t MAX_DEV_ID_LEN = 200;
    inline constexpr size_t MAX_NAME_LEN = 256;

    inline constexpr size_t LUT_RAW_DATA_CAPACITY = 514;
    inline constexpr size_t LUT_POINTS_CAPACITY = LUT_RAW_DATA_CAPACITY / 2;

    inline constexpr double MAX_NORM = 16;

    inline constexpr bool LEGACY = 0;
    inline constexpr bool GAIN = 1;
    
    enum class accel_mode {
        classic,
        jump,
        natural,
        motivity,
        power,
        lookup,
        noaccel
    };

    enum class classic_cap_mode {
        io, in, out
    };

    struct accel_args {
        accel_mode mode = accel_mode::noaccel;
        bool gain = 1;

        double input_offset = 0;
        double output_offset = 0;
        double acceleration = 0.005;
        double decay_rate = 0.1;
        double growth_rate = 1;
        double motivity = 1.5;
        double exponent_classic = 2;
        double scale = 1;
        double exponent_power = 0.05;
        double limit = 1.5;
        double midpoint = 5;
        double smooth = 0.5;

        vec2d cap = { 15, 1.5 };
        classic_cap_mode cap_mode = classic_cap_mode::out;

        int length = 0;
        mutable float data[LUT_RAW_DATA_CAPACITY] = {};
    };


    struct profile {
        wchar_t name[MAX_NAME_LEN] = L"default";

        bool whole = true;
        double lp_norm = 2;
        vec2d domain_weights = { 1, 1 };
        vec2d range_weights = { 1, 1 };

        double sensitivity = 1;
        double yx_sens_ratio = 1;

        accel_args accel_x;
        accel_args accel_y;

        double speed_min = 0;
        double speed_max = 0;

        vec2d dir_multipliers = { 1, 1 };

        double degrees_rotation = 0;

        double degrees_snap = 0;
    };


}