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. */
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
42static volatile float s_val[PARAM_COUNT];
43static float s_saved[PARAM_COUNT];
44
46{
47 for (int i = 0; i < PARAM_COUNT; ++i) s_val[i] = g_param_def[i].def;
48}
49
50int 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
56float param_get(int idx)
57{
58 if (idx < 0 || idx >= PARAM_COUNT) return 0.0f;
59 return s_val[idx];
60}
61
62static 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
68uint8_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
84void params_load(const float *values, uint16_t n)
85{
87 for (int i = 0; i < PARAM_COUNT && i < (int)n; ++i)
88 if (in_range(i, values[i])) s_val[i] = values[i];
93 }
94}
95
96void params_get_all(float *values)
97{
98 for (int i = 0; i < PARAM_COUNT; ++i) values[i] = s_val[i];
99}
100
102{
103 for (int i = 0; i < PARAM_COUNT; ++i) s_saved[i] = s_val[i];
104}
105
106uint8_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
112uint8_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
119uint16_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
126int 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}
uint8_t pos
Definition calib_mgr.c:34
uint32_t n
Definition calib_mgr.c:35
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
uint16_t params_visible_count(uint16_t sensors)
Definition params.c:119
const param_def_t g_param_def[PARAM_COUNT]
Definition params.c:11
float param_get(int idx)
lock-free read, any thread
Definition params.c:56
uint8_t params_visible(int idx, uint16_t sensors)
listing: parameters whose sensor is missing are omitted
Definition params.c:112
void params_get_all(float *values)
PARAM_COUNT values.
Definition params.c:96
void params_mark_saved(void)
saved <- RAM
Definition params.c:101
void params_defaults(void)
RAM <- defaults (dirty until saved)
Definition params.c:45
int params_index(uint16_t id)
-1 if unknown
Definition params.c:50
void params_load(const float *values, uint16_t n)
flash image
Definition params.c:84
uint8_t params_dirty(int idx)
RAM != flash.
Definition params.c:106
static float s_saved[PARAM_COUNT]
Definition params.c:43
static volatile float s_val[PARAM_COUNT]
Definition params.c:42
static int in_range(int i, float v)
Definition params.c:62
int params_visible_pos(int idx, uint16_t sensors)
index in PARAM_LIST, -1 if hidden
Definition params.c:126
Drone parameters of protocol v2 (HANDOVER_FW.md ยง8, ids.ts PARAMS).
@ P_LOG_MODE
Definition params.h:28
@ P_BATT_CELLS
Definition params.h:28
@ P_RTH_ALT
Definition params.h:24
@ P_BATT_WARN
Definition params.h:22
@ P_GF_MAX_DIST
Definition params.h:23
@ P_FS_GPS_LOST
Definition params.h:21
@ PARAM_COUNT
Definition params.h:29
@ P_TAKEOFF_ALT
Definition params.h:19
@ P_FS_APP_LONG
Definition params.h:21
@ P_BATT_CAPACITY
Definition params.h:28
@ P_MAX_YAW_RATE
Definition params.h:19
@ P_GF_CEILING
Definition params.h:23
@ P_AUTO_DISARM
Definition params.h:19
@ P_LAND_SPEED
Definition params.h:19
@ P_BATT_EMERG
Definition params.h:22
@ P_FS_RADIO
Definition params.h:21
@ P_FS_APP_SHORT
Definition params.h:21
@ P_BATT_CRIT
Definition params.h:22
@ P_MAX_TILT
Definition params.h:19
@ P_MAX_HSPEED
Definition params.h:20
@ P_COMPASS_PRIMARY
Definition params.h:26
@ P_GF_MAX_ALT
Definition params.h:23
@ P_GF_ACTION
Definition params.h:23
@ P_RTH_STICK_CANCEL
Definition params.h:24
@ P_MAX_CLIMB
Definition params.h:19
@ P_ARM_REQUIRE_CHECKS
Definition params.h:25
@ P_BEGINNER
Definition params.h:20
@ P_FS_FLOW_LOST
Definition params.h:21
ACwing Pilot app protocol v2: identifiers and frame layouts.
@ PV2_ACK_OK
Definition proto_v2.h:87
@ PV2_ACK_INVALID
Definition proto_v2.h:87
#define PV2_S_FLASH_LOG
Definition proto_v2.h:132
@ PV2_R_NONE
Definition proto_v2.h:91
@ PV2_R_UNKNOWN_PARAM
Definition proto_v2.h:95
@ PV2_R_OUT_OF_RANGE
Definition proto_v2.h:94
#define PV2_S_TOF
Definition proto_v2.h:127
#define PV2_S_FLOW
Definition proto_v2.h:126
#define PV2_S_GNSS
Definition proto_v2.h:125
#define PV2_S_CURRENT
Definition proto_v2.h:129
#define PV2_S_MAG_GPS
Definition proto_v2.h:124
float max
Definition params.h:34
float min
Definition params.h:34
float def
Definition params.h:34
uint16_t needs
CAPS sensor bits required to list it (0 = always)
Definition params.h:35