ACwing FC firmware
STM32WB55: attitude IEKF, altitude Kalman filter, flight core, protocol v2
Loading...
Searching...
No Matches
ack_cache.c
Go to the documentation of this file.
1
4#include "ack_cache.h"
5#include <string.h>
6
7typedef struct { uint8_t used, state, op, seq, result, reason; uint32_t age; } entry_t;
8
10static uint32_t s_clock;
11
12void ackc_reset(void) { memset(s_e, 0, sizeof s_e); s_clock = 0; }
13
14static entry_t *find(uint8_t op, uint8_t seq)
15{
16 for (unsigned i = 0; i < ACK_CACHE_LEN; ++i)
17 if (s_e[i].used && s_e[i].op == op && s_e[i].seq == seq) return &s_e[i];
18 return 0;
19}
20
21static entry_t *slot(void)
22{
23 entry_t *best = &s_e[0];
24 for (unsigned i = 0; i < ACK_CACHE_LEN; ++i) {
25 if (!s_e[i].used) return &s_e[i];
26 if (s_e[i].age < best->age) best = &s_e[i]; /* oldest */
27 }
28 return best;
29}
30
31uint8_t ackc_begin(uint8_t op, uint8_t seq, uint8_t *result, uint8_t *reason)
32{
33 entry_t *e = find(op, seq);
34 if (e) {
35 if (e->state == ACKC_DONE) { *result = e->result; *reason = e->reason; }
36 return e->state;
37 }
38 e = slot();
39 e->used = 1; e->state = ACKC_PENDING; e->op = op; e->seq = seq;
40 e->result = e->reason = 0; e->age = ++s_clock;
41 return ACKC_NEW;
42}
43
44void ackc_finish(uint8_t op, uint8_t seq, uint8_t result, uint8_t reason)
45{
46 entry_t *e = find(op, seq);
47 if (!e) { e = slot(); e->used = 1; e->op = op; e->seq = seq; e->age = ++s_clock; }
48 e->state = ACKC_DONE; e->result = result; e->reason = reason;
49}
static entry_t * slot(void)
Definition ack_cache.c:21
void ackc_finish(uint8_t op, uint8_t seq, uint8_t result, uint8_t reason)
Completes the entry (or creates it if it was evicted meanwhile).
Definition ack_cache.c:44
static entry_t * find(uint8_t op, uint8_t seq)
Definition ack_cache.c:14
static uint32_t s_clock
Definition ack_cache.c:10
uint8_t ackc_begin(uint8_t op, uint8_t seq, uint8_t *result, uint8_t *reason)
Looks up (op, seq).
Definition ack_cache.c:31
static entry_t s_e[ACK_CACHE_LEN]
Definition ack_cache.c:9
void ackc_reset(void)
Definition ack_cache.c:12
Last (op, seq) -> ACK pairs (HANDOVER_FW.md ยง5, "Sequence and ACK rules").
#define ACK_CACHE_LEN
>= 16 required
Definition ack_cache.h:18
@ ACKC_PENDING
Definition ack_cache.h:19
@ ACKC_NEW
Definition ack_cache.h:19
@ ACKC_DONE
Definition ack_cache.h:19
float used
Definition calib_mgr.c:50
static void result(const fc_cmd_t *c, uint8_t res, uint8_t why)
Definition fc_core.c:224
uint8_t seq
Definition log_task.c:48
uint8_t result
Definition ack_cache.c:7
uint8_t seq
Definition ack_cache.c:7
uint8_t op
Definition ack_cache.c:7
uint8_t used
Definition ack_cache.c:7
uint32_t age
Definition ack_cache.c:7
uint8_t reason
Definition ack_cache.c:7
uint8_t state
Definition ack_cache.c:7