Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Ardupilot
GitHub Repository: Ardupilot/ardupilot
Path: blob/master/AntennaTracker/mode.h
9688 views
1
#pragma once
2
3
#include <stdint.h>
4
#include <AP_Math/AP_Math.h>
5
6
class Mode {
7
public:
8
enum class Number {
9
MANUAL=0,
10
STOP=1,
11
SCAN=2,
12
SERVOTEST=3,
13
GUIDED=4,
14
AUTO=10,
15
INITIALISING=16
16
// Mode number 30 reserved for "offboard" for external/lua control.
17
};
18
19
Mode() {}
20
21
// do not allow copying
22
CLASS_NO_COPY(Mode);
23
24
// returns a unique number specific to this mode
25
virtual Mode::Number number() const = 0;
26
virtual const char* name() const = 0;
27
28
virtual bool requires_armed_servos() const = 0;
29
30
virtual void update() = 0;
31
32
protected:
33
void update_scan();
34
void update_auto();
35
36
bool get_ef_yaw_direction();
37
38
void calc_angle_error(float pitch, float yaw, bool direction_reversed);
39
void convert_ef_to_bf(float pitch, float yaw, float& bf_pitch, float& bf_yaw);
40
bool convert_bf_to_ef(float pitch, float yaw, float& ef_pitch, float& ef_yaw);
41
};
42
43
class ModeAuto : public Mode {
44
public:
45
Mode::Number number() const override { return Mode::Number::AUTO; }
46
const char* name() const override { return "Auto"; }
47
bool requires_armed_servos() const override { return true; }
48
void update() override;
49
50
void set_target(float target_yaw_deg, float target_pitch_deg) {
51
_target_yaw_deg = target_yaw_deg;
52
_target_pitch_deg = target_pitch_deg;
53
}
54
float get_auto_target_yaw_deg() const { return _target_yaw_deg; }
55
float get_auto_target_pitch_deg() const { return _target_pitch_deg; }
56
57
private:
58
float _target_yaw_deg;
59
float _target_pitch_deg;
60
};
61
62
class ModeGuided : public Mode {
63
public:
64
Mode::Number number() const override { return Mode::Number::GUIDED; }
65
const char* name() const override { return "Guided"; }
66
bool requires_armed_servos() const override { return true; }
67
void update() override;
68
69
void set_angle(const Quaternion &target_att,
70
bool use_yaw_rate, float yaw_rate_rads,
71
bool use_pitch_rate, float pitch_rate_rads) {
72
_target_att = target_att;
73
_use_yaw_rate = use_yaw_rate;
74
_yaw_rate_rads = yaw_rate_rads;
75
_use_pitch_rate = use_pitch_rate;
76
_pitch_rate_rads = pitch_rate_rads;
77
}
78
Quaternion get_attitude_target_quat() { return _target_att; }
79
bool get_attitude_target_use_yaw_rate() const { return _use_yaw_rate; }
80
float get_attitude_target_yaw_rate_rads() const { return _yaw_rate_rads; }
81
bool get_attitude_target_use_pitch_rate() const { return _use_pitch_rate; }
82
float get_attitude_target_pitch_rate_rads() const { return _pitch_rate_rads; }
83
84
private:
85
Quaternion _target_att;
86
bool _use_yaw_rate;
87
float _yaw_rate_rads;
88
bool _use_pitch_rate;
89
float _pitch_rate_rads;
90
};
91
92
class ModeInitialising : public Mode {
93
public:
94
Mode::Number number() const override { return Mode::Number::INITIALISING; }
95
const char* name() const override { return "Initialising"; }
96
bool requires_armed_servos() const override { return false; }
97
void update() override {};
98
};
99
100
class ModeManual : public Mode {
101
public:
102
Mode::Number number() const override { return Mode::Number::MANUAL; }
103
const char* name() const override { return "Manual"; }
104
bool requires_armed_servos() const override { return true; }
105
void update() override;
106
};
107
108
class ModeScan : public Mode {
109
public:
110
Mode::Number number() const override { return Mode::Number::SCAN; }
111
const char* name() const override { return "Scan"; }
112
bool requires_armed_servos() const override { return true; }
113
void update() override;
114
};
115
116
class ModeServoTest : public Mode {
117
public:
118
Mode::Number number() const override { return Mode::Number::SERVOTEST; }
119
const char* name() const override { return "ServoTest"; }
120
bool requires_armed_servos() const override { return true; }
121
void update() override {};
122
123
bool set_servo(uint8_t servo_num, uint16_t pwm);
124
};
125
126
class ModeStop : public Mode {
127
public:
128
Mode::Number number() const override { return Mode::Number::STOP; }
129
const char* name() const override { return "Stop"; }
130
bool requires_armed_servos() const override { return false; }
131
void update() override {};
132
};
133
134