summaryrefslogtreecommitdiffstats
path: root/src/input_common/motion_input.h
blob: 4b8093d8c571a5e6b05e2e2fc4d83315e6934d7e (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
// Copyright 2014 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.

#pragma once

#include "common/common_types.h"
#include "common/quaternion.h"
#include "common/vector_math.h"

namespace InputCommon {

class MotionInput {
public:
    MotionInput(f32 new_kp, f32 new_ki, f32 new_kd);

    void SetAcceleration(Common::Vec3f acceleration);
    void SetGyroscope(Common::Vec3f acceleration);
    void SetQuaternion(Common::Quaternion<f32> quaternion);
    void SetGyroDrift(Common::Vec3f drift);
    void SetGyroThreshold(f32 threshold);

    void EnableReset(bool reset);
    void ResetRotations();

    void UpdateRotation(u64 elapsed_time);
    void UpdateOrientation(u64 elapsed_time);

    std::array<Common::Vec3f, 3> GetOrientation();
    Common::Vec3f GetAcceleration();
    Common::Vec3f GetGyroscope();
    Common::Vec3f GetRotations();
    Common::Quaternion<f32> GetQuaternion();

    bool IsMoving(f32 sensitivity);
    bool IsCalibrated(f32 sensitivity);

    // PID constants
    const f32 kp;
    const f32 ki;
    const f32 kd;

private:
    void resetOrientation();

    // PID errors
    Common::Vec3f real_error;
    Common::Vec3f integral_error;
    Common::Vec3f derivative_error;

    Common::Quaternion<f32> quat;
    Common::Vec3f rotations;
    Common::Vec3f accel;
    Common::Vec3f gyro;
    Common::Vec3f gyro_drift;

    f32 gyro_threshold;
    f32 reset_counter;
    bool reset_enabled;
};

} // namespace InputCommon