ACwing FC firmware
STM32WB55: attitude IEKF, altitude Kalman filter, flight core, protocol v2
Loading...
Searching...
No Matches
proto_v2.c
Go to the documentation of this file.
1
5#include "proto_v2.h"
6#include "telemetry.h"
7#include <string.h>
8
9size_t pv2_frame(uint8_t type, const void *payload, uint8_t len, uint8_t *out, size_t cap)
10{
11 return tlm_encode(type, payload, len, out, cap);
12}
13
14size_t pv2_event(uint8_t level, uint16_t code, int32_t arg, const char *text, uint8_t *out, size_t cap)
15{
16 uint8_t pl[sizeof(pv2_event_hdr_t) + PV2_EVENT_TEXT_MAX];
17 size_t n = text ? strlen(text) : 0u;
20 h.level = level; h.code = code; h.arg = arg; h.len = (uint8_t)n;
21 memcpy(pl, &h, sizeof h);
22 if (n) memcpy(pl + sizeof h, text, n);
23 return pv2_frame(PV2_FT_EVENT, pl, (uint8_t)(sizeof h + n), out, cap);
24}
25
26size_t pv2_ack(uint8_t op, uint8_t seq, uint8_t result, uint8_t reason, uint8_t *out, size_t cap)
27{
28 const pv2_ack_t a = { op, seq, result, reason };
29 return pv2_frame(PV2_FT_ACK, &a, sizeof a, out, cap);
30}
31
32size_t pv2_param(uint16_t id, float value, uint8_t flags, uint16_t index, uint16_t count, uint8_t *out, size_t cap)
33{
35 p.id = id;
36 memcpy(&p.value, &value, sizeof value);
37 p.flags = flags; p.index = index; p.count = count;
38 return pv2_frame(PV2_FT_PARAM, &p, sizeof p, out, cap);
39}
40
41size_t pv2_checks(uint8_t ready, const pv2_check_t *items, uint8_t n, uint8_t *out, size_t cap)
42{
43 uint8_t pl[2u + 4u * PV2_CHECKS_MAX];
45 pl[0] = ready ? 1u : 0u;
46 pl[1] = n;
47 memcpy(&pl[2], items, 4u * n);
48 return pv2_frame(PV2_FT_CHECKS, pl, (uint8_t)(2u + 4u * n), out, cap);
49}
50
51size_t pv2_motors(const pv2_motor_t *m, uint8_t n, uint8_t *out, size_t cap)
52{
53 uint8_t pl[1u + 4u * PV2_MOTORS_MAX];
55 pl[0] = n;
56 memcpy(&pl[1], m, 4u * n);
57 return pv2_frame(PV2_FT_MOTORS, pl, (uint8_t)(1u + 4u * n), out, cap);
58}
59
60size_t pv2_calib(const pv2_calib_hdr_t *h, const void *data, uint8_t data_len, uint8_t *out, size_t cap)
61{
62 uint8_t pl[sizeof(pv2_calib_hdr_t) + sizeof(pv2_cal_sticks_t)];
63 if (data_len > sizeof(pv2_cal_sticks_t)) return 0;
64 memcpy(pl, h, sizeof *h);
65 if (data_len) memcpy(pl + sizeof *h, data, data_len);
66 return pv2_frame(PV2_FT_CALIB, pl, (uint8_t)(sizeof *h + data_len), out, cap);
67}
68
69float pv2_rd_f32(const uint8_t *p)
70{
71 float f;
72 memcpy(&f, p, sizeof f); /* little-endian target and host */
73 return f;
74}
uint32_t n
Definition calib_mgr.c:35
float cap[6][3]
Definition calib_mgr.c:36
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
uint16_t id
Definition log_task.c:49
size_t pv2_calib(const pv2_calib_hdr_t *h, const void *data, uint8_t data_len, uint8_t *out, size_t cap)
Definition proto_v2.c:60
size_t pv2_event(uint8_t level, uint16_t code, int32_t arg, const char *text, uint8_t *out, size_t cap)
Definition proto_v2.c:14
size_t pv2_ack(uint8_t op, uint8_t seq, uint8_t result, uint8_t reason, uint8_t *out, size_t cap)
Definition proto_v2.c:26
float pv2_rd_f32(const uint8_t *p)
Definition proto_v2.c:69
size_t pv2_param(uint16_t id, float value, uint8_t flags, uint16_t index, uint16_t count, uint8_t *out, size_t cap)
Definition proto_v2.c:32
size_t pv2_motors(const pv2_motor_t *m, uint8_t n, uint8_t *out, size_t cap)
Definition proto_v2.c:51
size_t pv2_frame(uint8_t type, const void *payload, uint8_t len, uint8_t *out, size_t cap)
Definition proto_v2.c:9
size_t pv2_checks(uint8_t ready, const pv2_check_t *items, uint8_t n, uint8_t *out, size_t cap)
Definition proto_v2.c:41
ACwing Pilot app protocol v2: identifiers and frame layouts.
#define PV2_FT_ACK
Definition proto_v2.h:39
#define PV2_FT_EVENT
Definition proto_v2.h:36
#define PV2_FT_MOTORS
Definition proto_v2.h:34
#define PV2_MOTORS_MAX
Definition proto_v2.h:316
#define PV2_FT_CHECKS
Definition proto_v2.h:40
#define PV2_FT_PARAM
Definition proto_v2.h:37
#define PV2_EVENT_TEXT_MAX
Definition proto_v2.h:314
#define PV2_CHECKS_MAX
Definition proto_v2.h:315
#define PV2_FT_CALIB
Definition proto_v2.h:38
uint16_t code
Definition proto_v2.h:240
uint8_t level
< 0x0B EVENT header, then text[len]
Definition proto_v2.h:239
uint16_t index
Definition proto_v2.h:249
uint8_t flags
bit0 dirty (RAM != flash), bit1 read-only
Definition proto_v2.h:248
float value
Definition proto_v2.h:247
uint16_t count
Definition proto_v2.h:249
uint16_t id
< 0x0C PARAM
Definition proto_v2.h:246
size_t tlm_encode(uint8_t type, const void *payload, uint8_t len, uint8_t *out, size_t cap)
Writes the complete frame into out; returns its length, 0 if cap is too small.
Definition telemetry.c:18
Telemetry packet format (shared with 02 - Tools/00 - Matlab/Telemetry/parseTelemetry....