ACwing FC firmware
STM32WB55: attitude IEKF, altitude Kalman filter, flight core, protocol v2
Loading...
Searching...
No Matches
params.c
Go to the documentation of this file.
1
5
#include "
params.h
"
6
#include "
proto_v2.h
"
7
#include <math.h>
8
#include <string.h>
9
10
/* Same table as 02 - Tools/02 - App/src/protocol/ids.ts (PARAMS), same order. */
11
const
param_def_t
g_param_def
[
PARAM_COUNT
] = {
12
[
P_TAKEOFF_ALT
] = { 1, 1.0f, 0.5f, 3.0f, 0 },
13
[
P_LAND_SPEED
] = { 2, 0.7f, 0.3f, 1.5f, 0 },
14
[
P_AUTO_DISARM
] = { 3, 2.0f, 1.0f, 10.0f, 0 },
15
[
P_MAX_TILT
] = { 4, 30.0f, 10.0f, 45.0f, 0 },
16
[
P_MAX_YAW_RATE
] = { 5, 120.0f, 30.0f, 360.0f, 0 },
17
[
P_MAX_CLIMB
] = { 6, 2.0f, 0.5f, 5.0f, 0 },
18
[
P_MAX_HSPEED
] = { 7, 8.0f, 1.0f, 15.0f, 0 },
19
[
P_BEGINNER
] = { 8, 0.0f, 0.0f, 1.0f, 0 },
20
[
P_FS_APP_SHORT
] = { 10, 0.0f, 0.0f, 1.0f, 0 },
21
[
P_FS_APP_LONG
] = { 11, 2.0f, 0.0f, 2.0f, 0 },
22
[
P_FS_RADIO
] = { 12, 2.0f, 0.0f, 2.0f, 0 },
23
[
P_FS_GPS_LOST
] = { 13, 0.0f, 0.0f, 2.0f,
PV2_S_GNSS
},
24
[
P_FS_FLOW_LOST
] = { 14, 0.0f, 0.0f, 1.0f,
PV2_S_FLOW
},
25
[
P_BATT_WARN
] = { 20, 3.6f, 3.3f, 3.9f, 0 },
26
[
P_BATT_CRIT
] = { 21, 3.5f, 3.2f, 3.8f, 0 },
27
[
P_BATT_EMERG
] = { 22, 3.3f, 3.0f, 3.6f, 0 },
28
[
P_GF_MAX_ALT
] = { 30, 30.0f, 5.0f, 120.0f, 0 },
29
[
P_GF_CEILING
] = { 31, 2.5f, 1.0f, 4.0f,
PV2_S_TOF
},
30
[
P_GF_MAX_DIST
] = { 32, 150.0f, 20.0f, 500.0f,
PV2_S_GNSS
},
31
[
P_GF_ACTION
] = { 33, 0.0f, 0.0f, 2.0f, 0 },
32
[
P_RTH_ALT
] = { 40, 30.0f, 5.0f, 60.0f,
PV2_S_GNSS
},
33
[
P_RTH_STICK_CANCEL
] = { 41, 1.0f, 0.0f, 1.0f,
PV2_S_GNSS
},
34
[
P_ARM_REQUIRE_CHECKS
] = { 50, 1.0f, 0.0f, 1.0f, 0 },
35
[
P_COMPASS_PRIMARY
] = { 60, 1.0f, 0.0f, 1.0f,
PV2_S_MAG_GPS
},
36
/* firmware extensions */
37
[
P_BATT_CAPACITY
] = { 23, 0.0f, 0.0f, 20000.0f,
PV2_S_CURRENT
},
/* mAh, 0 = unknown */
38
[
P_BATT_CELLS
] = { 24, 0.0f, 0.0f, 6.0f, 0 },
/* 0 = detect */
39
[
P_LOG_MODE
] = { 70, 1.0f, 0.0f, 2.0f,
PV2_S_FLASH_LOG
},
/* 0 off, 1 armed, 2 always */
40
};
41
42
static
volatile
float
s_val
[
PARAM_COUNT
];
43
static
float
s_saved
[
PARAM_COUNT
];
44
45
void
params_defaults
(
void
)
46
{
47
for
(
int
i = 0; i <
PARAM_COUNT
; ++i)
s_val
[i] =
g_param_def
[i].def;
48
}
49
50
int
params_index
(uint16_t
id
)
51
{
52
for
(
int
i = 0; i <
PARAM_COUNT
; ++i)
if
(
g_param_def
[i].
id
==
id
)
return
i;
53
return
-1;
54
}
55
56
float
param_get
(
int
idx)
57
{
58
if
(idx < 0 || idx >=
PARAM_COUNT
)
return
0.0f;
59
return
s_val
[idx];
60
}
61
62
static
int
in_range
(
int
i,
float
v)
63
{
64
const
float
eps = 1e-6f;
65
return
isfinite(v) && v >=
g_param_def
[i].
min
- eps && v <=
g_param_def
[i].
max
+ eps;
66
}
67
68
uint8_t
params_set
(uint16_t
id
,
float
v, uint8_t *reason)
69
{
70
const
int
i =
params_index
(
id
);
71
if
(i < 0) { *reason =
PV2_R_UNKNOWN_PARAM
;
return
PV2_ACK_INVALID
; }
72
if
(!
in_range
(i, v)) { *reason =
PV2_R_OUT_OF_RANGE
;
return
PV2_ACK_INVALID
; }
73
/* battWarn > battCrit > battEmerg must hold after the change */
74
float
w =
s_val
[
P_BATT_WARN
], c =
s_val
[
P_BATT_CRIT
], e =
s_val
[
P_BATT_EMERG
];
75
if
(i ==
P_BATT_WARN
) w = v;
76
if
(i ==
P_BATT_CRIT
) c = v;
77
if
(i ==
P_BATT_EMERG
) e = v;
78
if
(!(w > c && c > e)) { *reason =
PV2_R_OUT_OF_RANGE
;
return
PV2_ACK_INVALID
; }
79
s_val
[i] = v;
80
*reason =
PV2_R_NONE
;
81
return
PV2_ACK_OK
;
82
}
83
84
void
params_load
(
const
float
*values, uint16_t
n
)
85
{
86
params_defaults
();
87
for
(
int
i = 0; i <
PARAM_COUNT
&& i < (int)
n
; ++i)
88
if
(
in_range
(i, values[i]))
s_val
[i] = values[i];
89
if
(!(
s_val
[
P_BATT_WARN
] >
s_val
[
P_BATT_CRIT
] &&
s_val
[
P_BATT_CRIT
] >
s_val
[
P_BATT_EMERG
])) {
90
s_val
[
P_BATT_WARN
] =
g_param_def
[
P_BATT_WARN
].
def
;
91
s_val
[
P_BATT_CRIT
] =
g_param_def
[
P_BATT_CRIT
].
def
;
92
s_val
[
P_BATT_EMERG
] =
g_param_def
[
P_BATT_EMERG
].
def
;
93
}
94
}
95
96
void
params_get_all
(
float
*values)
97
{
98
for
(
int
i = 0; i <
PARAM_COUNT
; ++i) values[i] =
s_val
[i];
99
}
100
101
void
params_mark_saved
(
void
)
102
{
103
for
(
int
i = 0; i <
PARAM_COUNT
; ++i)
s_saved
[i] =
s_val
[i];
104
}
105
106
uint8_t
params_dirty
(
int
idx)
107
{
108
if
(idx < 0 || idx >=
PARAM_COUNT
)
return
0;
109
return
fabsf(
s_val
[idx] -
s_saved
[idx]) > 1e-6f ? 1u : 0u;
110
}
111
112
uint8_t
params_visible
(
int
idx, uint16_t sensors)
113
{
114
if
(idx < 0 || idx >=
PARAM_COUNT
)
return
0;
115
const
uint16_t need =
g_param_def
[idx].
needs
;
116
return
(uint8_t)((need & sensors) == need);
117
}
118
119
uint16_t
params_visible_count
(uint16_t sensors)
120
{
121
uint16_t
n
= 0;
122
for
(
int
i = 0; i <
PARAM_COUNT
; ++i)
n
+=
params_visible
(i, sensors);
123
return
n
;
124
}
125
126
int
params_visible_pos
(
int
idx, uint16_t sensors)
127
{
128
if
(!
params_visible
(idx, sensors))
return
-1;
129
int
pos
= 0;
130
for
(
int
i = 0; i < idx; ++i)
pos
+=
params_visible
(i, sensors);
131
return
pos
;
132
}
pos
uint8_t pos
Definition
calib_mgr.c:34
n
uint32_t n
Definition
calib_mgr.c:35
params_set
uint8_t params_set(uint16_t id, float v, uint8_t *reason)
PARAM_SET rules: returns an ACK result (PV2_ACK_*) and sets *reason.
Definition
params.c:68
params_visible_count
uint16_t params_visible_count(uint16_t sensors)
Definition
params.c:119
g_param_def
const param_def_t g_param_def[PARAM_COUNT]
Definition
params.c:11
param_get
float param_get(int idx)
lock-free read, any thread
Definition
params.c:56
params_visible
uint8_t params_visible(int idx, uint16_t sensors)
listing: parameters whose sensor is missing are omitted
Definition
params.c:112
params_get_all
void params_get_all(float *values)
PARAM_COUNT values.
Definition
params.c:96
params_mark_saved
void params_mark_saved(void)
saved <- RAM
Definition
params.c:101
params_defaults
void params_defaults(void)
RAM <- defaults (dirty until saved)
Definition
params.c:45
params_index
int params_index(uint16_t id)
-1 if unknown
Definition
params.c:50
params_load
void params_load(const float *values, uint16_t n)
flash image
Definition
params.c:84
params_dirty
uint8_t params_dirty(int idx)
RAM != flash.
Definition
params.c:106
s_saved
static float s_saved[PARAM_COUNT]
Definition
params.c:43
s_val
static volatile float s_val[PARAM_COUNT]
Definition
params.c:42
in_range
static int in_range(int i, float v)
Definition
params.c:62
params_visible_pos
int params_visible_pos(int idx, uint16_t sensors)
index in PARAM_LIST, -1 if hidden
Definition
params.c:126
params.h
Drone parameters of protocol v2 (HANDOVER_FW.md ยง8, ids.ts PARAMS).
P_LOG_MODE
@ P_LOG_MODE
Definition
params.h:28
P_BATT_CELLS
@ P_BATT_CELLS
Definition
params.h:28
P_RTH_ALT
@ P_RTH_ALT
Definition
params.h:24
P_BATT_WARN
@ P_BATT_WARN
Definition
params.h:22
P_GF_MAX_DIST
@ P_GF_MAX_DIST
Definition
params.h:23
P_FS_GPS_LOST
@ P_FS_GPS_LOST
Definition
params.h:21
PARAM_COUNT
@ PARAM_COUNT
Definition
params.h:29
P_TAKEOFF_ALT
@ P_TAKEOFF_ALT
Definition
params.h:19
P_FS_APP_LONG
@ P_FS_APP_LONG
Definition
params.h:21
P_BATT_CAPACITY
@ P_BATT_CAPACITY
Definition
params.h:28
P_MAX_YAW_RATE
@ P_MAX_YAW_RATE
Definition
params.h:19
P_GF_CEILING
@ P_GF_CEILING
Definition
params.h:23
P_AUTO_DISARM
@ P_AUTO_DISARM
Definition
params.h:19
P_LAND_SPEED
@ P_LAND_SPEED
Definition
params.h:19
P_BATT_EMERG
@ P_BATT_EMERG
Definition
params.h:22
P_FS_RADIO
@ P_FS_RADIO
Definition
params.h:21
P_FS_APP_SHORT
@ P_FS_APP_SHORT
Definition
params.h:21
P_BATT_CRIT
@ P_BATT_CRIT
Definition
params.h:22
P_MAX_TILT
@ P_MAX_TILT
Definition
params.h:19
P_MAX_HSPEED
@ P_MAX_HSPEED
Definition
params.h:20
P_COMPASS_PRIMARY
@ P_COMPASS_PRIMARY
Definition
params.h:26
P_GF_MAX_ALT
@ P_GF_MAX_ALT
Definition
params.h:23
P_GF_ACTION
@ P_GF_ACTION
Definition
params.h:23
P_RTH_STICK_CANCEL
@ P_RTH_STICK_CANCEL
Definition
params.h:24
P_MAX_CLIMB
@ P_MAX_CLIMB
Definition
params.h:19
P_ARM_REQUIRE_CHECKS
@ P_ARM_REQUIRE_CHECKS
Definition
params.h:25
P_BEGINNER
@ P_BEGINNER
Definition
params.h:20
P_FS_FLOW_LOST
@ P_FS_FLOW_LOST
Definition
params.h:21
proto_v2.h
ACwing Pilot app protocol v2: identifiers and frame layouts.
PV2_ACK_OK
@ PV2_ACK_OK
Definition
proto_v2.h:87
PV2_ACK_INVALID
@ PV2_ACK_INVALID
Definition
proto_v2.h:87
PV2_S_FLASH_LOG
#define PV2_S_FLASH_LOG
Definition
proto_v2.h:132
PV2_R_NONE
@ PV2_R_NONE
Definition
proto_v2.h:91
PV2_R_UNKNOWN_PARAM
@ PV2_R_UNKNOWN_PARAM
Definition
proto_v2.h:95
PV2_R_OUT_OF_RANGE
@ PV2_R_OUT_OF_RANGE
Definition
proto_v2.h:94
PV2_S_TOF
#define PV2_S_TOF
Definition
proto_v2.h:127
PV2_S_FLOW
#define PV2_S_FLOW
Definition
proto_v2.h:126
PV2_S_GNSS
#define PV2_S_GNSS
Definition
proto_v2.h:125
PV2_S_CURRENT
#define PV2_S_CURRENT
Definition
proto_v2.h:129
PV2_S_MAG_GPS
#define PV2_S_MAG_GPS
Definition
proto_v2.h:124
param_def_t
Definition
params.h:32
param_def_t::max
float max
Definition
params.h:34
param_def_t::min
float min
Definition
params.h:34
param_def_t::def
float def
Definition
params.h:34
param_def_t::needs
uint16_t needs
CAPS sensor bits required to list it (0 = always)
Definition
params.h:35
app
params.c
Generated by
1.9.8