ACwing FC firmware
STM32WB55: attitude IEKF, altitude Kalman filter, flight core, protocol v2
Loading...
Searching...
No Matches
batt_task.c
Go to the documentation of this file.
1
5#include "batt_task.h"
6#include "fc_core.h"
7#include "params.h"
8#include "proto_v2.h"
9#include "spsc.h"
10#include "log_feed.h"
11#include <string.h>
12
13typedef struct { float scale_v, scale_i; } scales_t;
15
17static uint32_t s_last;
18static uint8_t s_have_last;
19static uint8_t s_sig_level = 0xFFu, s_sig_present = 0xFFu;
20static uint8_t s_was_armed;
21static uint8_t s_log_div;
22static float s_used_at_arm;
23
24static volatile uint32_t s_fl_seq;
26
28{
29 s_cfg = *cfg;
31 spsc_reset(&s_scq);
32 s_have_last = 0u;
33 s_sig_level = s_sig_present = 0xFFu;
34 s_was_armed = 0u;
35 s_used_at_arm = 0.0f;
36 memset(&s_fl, 0, sizeof s_fl);
37 s_fl_seq = 0u;
38}
39
40int batt_task_post_scales(float sv, float si)
41{
42 const scales_t s = { sv, si };
43 return spsc_push(&s_scq, &s);
44}
45
47{
48 for (int tries = 0; tries < 8; ++tries) {
49 const uint32_t s0 = s_fl_seq;
50 if (s0 & 1u) continue;
54 if (s_fl_seq == s0) { *out = v; return; }
55 }
56}
57
58void batt_task_step(uint32_t now)
59{
60 const uint32_t dt = s_have_last ? (now - s_last) : BATT_TASK_PERIOD_MS;
61 s_last = now; s_have_last = 1u;
62
63 scales_t sc;
64 while (spsc_pop(&s_scq, &sc)) batt_set_scales(sc.scale_v, sc.scale_i);
65
66 fc_state_t f;
67 memset(&f, 0, sizeof f);
68 fc_snapshot(&f);
69
70 float pv = 0.0f, pi = 0.0f;
71 if (s_cfg.adc_read && s_cfg.adc_read(&pv, &pi) == 0) {
72 const batt_limits_t L = {
74 PARAM(P_BATT_CAPACITY), (uint8_t)(PARAM(P_BATT_CELLS) + 0.5f)
75 };
76 batt_step(pv, pi, dt, f.armed, &L);
77 }
78 const batt_state_t *b = batt_state();
79
80 /* signal the flight core on a change of level or presence */
81 if (b->level != s_sig_level || b->present != s_sig_present) {
82 const float mv = b->cell_v * 1000.0f;
83 const fc_batt_sig_t sig = { b->present, b->level, (uint16_t)(mv > 65535.0f ? 65535.0f : mv) };
84 if (fc_batt_signal(&sig) == 0) { s_sig_level = b->level; s_sig_present = b->present; }
85 /* queue full: retried at the next step */
86 }
87
88 /* charge of the flight, for the BATTERY calibration */
89 if (f.armed && !s_was_armed) s_used_at_arm = b->used_mah;
90 if (!f.armed && s_was_armed) {
91 batt_cfg_t c;
92 batt_get_cfg(&c);
93 s_fl_seq++;
95 s_fl.count++;
96 s_fl.used_mah = b->used_mah - s_used_at_arm;
99 s_fl_seq++;
100 }
101 s_was_armed = f.armed;
102
103 /* flight log, 10 Hz */
104 if (++s_log_div >= 5u) { s_log_div = 0u; logf_power(now, b); }
105
107}
108
109/* ------------------------------------------------------------------ RTOS shell */
110#ifndef HOST_TEST
111#include "cmsis_os2.h"
112
113static void BattTask(void *arg)
114{
115 (void)arg;
116 uint32_t next = osKernelGetTickCount();
117 for (;;) {
118 batt_task_step(osKernelGetTickCount());
120 (void)osDelayUntil(next);
121 }
122}
123
125{
126 batt_task_init(cfg);
127 /* above the AppTask / ExtTask, below the ImuTask: the battery state must
128 * reach the flight core even while the app protocol is busy */
129 static const osThreadAttr_t a = { .name = "batt", .priority = osPriorityNormal,
130 .stack_size = 768 };
131 (void)osThreadNew(BattTask, NULL, &a);
132}
133#endif
static uint32_t s_last
Definition batt_task.c:17
static uint8_t s_sig_level
Definition batt_task.c:19
static batt_task_cfg_t s_cfg
Definition batt_task.c:16
static float s_used_at_arm
Definition batt_task.c:22
void batt_task_last_flight(batt_flight_t *out)
last flight (any task, seqlock)
Definition batt_task.c:46
int batt_task_post_scales(float sv, float si)
AppTask -> BattTask: new calibration scales; 0 = queued.
Definition batt_task.c:40
void batt_task_step(uint32_t now)
Definition batt_task.c:58
void batt_task_init(const batt_task_cfg_t *cfg)
Definition batt_task.c:27
static void BattTask(void *arg)
Definition batt_task.c:113
static uint8_t s_was_armed
Definition batt_task.c:20
static uint8_t s_have_last
Definition batt_task.c:18
static batt_flight_t s_fl
Definition batt_task.c:25
void batt_task_start(const batt_task_cfg_t *cfg)
Definition batt_task.c:124
static uint8_t s_sig_present
Definition batt_task.c:19
static uint8_t s_log_div
Definition batt_task.c:21
static volatile uint32_t s_fl_seq
Definition batt_task.c:24
BattTask: owns the battery ADC and the battery monitor (battery.c).
#define BATT_TASK_PERIOD_MS
Definition batt_task.h:26
void batt_init(const batt_cfg_t *cfg)
Definition battery.c:57
static batt_state_t s
Definition battery.c:21
const batt_state_t * batt_state(void)
state as computed by the last step (same context)
Definition battery.c:82
void batt_get_cfg(batt_cfg_t *out)
Definition battery.c:81
void batt_set_scales(float sv, float si)
Definition battery.c:75
void batt_step(float pin_v, float cur_pin_v, uint32_t dt_ms, uint8_t armed, const batt_limits_t *L)
one sample: pin voltages, time step, armed flag (flight-control context)
Definition battery.c:145
double b[6]
Definition calib_mgr.c:53
static struct @8 L
int fc_batt_signal(const fc_batt_sig_t *b)
0 = queued, -1 = full
Definition fc_core.c:94
void fc_batt_heartbeat(uint32_t now)
every BattTask step
Definition fc_core.c:95
void fc_snapshot(fc_state_t *out)
Definition fc_core.c:121
Flight core: arming, modes, automatic actions, failsafes, motor test (HANDOVER_FW....
void logf_power(uint32_t t, const batt_state_t *b)
Definition log_feed.c:87
Producers' side of the flight log: build a record from the values the task already has and queue it (...
static uint16_t next(uint16_t s)
Definition log_store.c:50
Drone parameters of protocol v2 (HANDOVER_FW.md ยง8, ids.ts PARAMS).
#define PARAM(i)
Definition params.h:43
@ P_BATT_CELLS
Definition params.h:28
@ P_BATT_WARN
Definition params.h:22
@ P_BATT_CAPACITY
Definition params.h:28
@ P_BATT_EMERG
Definition params.h:22
@ P_BATT_CRIT
Definition params.h:22
ACwing Pilot app protocol v2: identifiers and frame layouts.
Lock-free single-producer single-consumer queue of fixed-size items.
#define SPSC_BARRIER()
Definition spsc.h:18
#define SPSC_DEFINE(name, type, n)
Definition spsc.h:29
static int spsc_push(spsc_t *q, const void *it)
Definition spsc.h:35
static void spsc_reset(spsc_t *q)
Definition spsc.h:33
static int spsc_pop(spsc_t *q, void *it)
Definition spsc.h:45
float scale_i
current multiplier (1 = nominal sensor)
Definition battery.h:45
last flight summary (AppTask persists it for the BATTERY calibration)
Definition batt_task.h:35
float used_mah
charge used between ARM and DISARM
Definition batt_task.h:37
uint16_t count
flights finished since boot
Definition batt_task.h:36
float scale_i
current scale it was counted with
Definition batt_task.h:38
thresholds and settings (from the parameters)
Definition battery.h:68
published state
Definition battery.h:51
int(* adc_read)(float *vbat_pin, float *cur_pin)
ADC binding: pin voltages of VBAT and CUR; 0 = sample ready.
Definition batt_task.h:31
batt_cfg_t batt
sensor gains, scales at boot
Definition batt_task.h:29
battery signal (BattTask -> core): sent when the level or presence changes
Definition fc_core.h:63
uint8_t present
battery connected
Definition fc_core.h:64
published state (AppTask builds FLIGHT / MOTORS from it)
Definition fc_core.h:85
uint8_t armed
Definition fc_core.h:86
float scale_i
Definition batt_task.c:13
float scale_v
Definition batt_task.c:13