GCC Code Coverage Report


Directory: /home/runner/work/Flight-Computer-Firmware/Flight-Computer-Firmware/mod/telemetry/
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 100.0% 49 / 0 / 49
Functions: 100.0% 5 / 0 / 5
Branches: 83.3% 10 / 0 / 12

telemetry.c
Line Branch Exec Source
1 /**
2 ******************************************************************************
3 * @file : telemetry.c
4 * @brief : Module for LoRa (wireless) communication.
5 ******************************************************************************
6 * @copyright
7 *
8 * Copyright (c) 2025 Sun Devil Rocketry.
9 * All rights reserved.
10 *
11 * This software is licensed under terms that can be found in the LICENSE
12 * file in the root directory of this software component.
13 * If no LICENSE file comes with this software, it is covered under the
14 * BSD-3-Clause.
15 *
16 * https://opensource.org/license/bsd-3-clause
17 *
18 ******************************************************************************
19 */
20
21 /*------------------------------------------------------------------------------
22 Standard Includes
23 ------------------------------------------------------------------------------*/
24 #include <stdint.h>
25 #include <stdbool.h>
26 #include <string.h>
27
28 /*------------------------------------------------------------------------------
29 Project Includes
30 ------------------------------------------------------------------------------*/
31 #include "main.h"
32 #include "math_sdr.h"
33 #include "commands.h"
34 #include "error_sdr.h"
35 #include "debug_sdr.h"
36 #include "telemetry.h"
37 #include "lora.h"
38
39 /*------------------------------------------------------------------------------
40 Global Variables
41 ------------------------------------------------------------------------------*/
42 extern PRESET_DATA preset_data; /* Struct with preset data */
43 extern SENSOR_DATA sensor_data; /* Struct with all sensor */
44
45 static uint32_t message_idx = 0;
46
47 /*------------------------------------------------------------------------------
48 Statics
49 ------------------------------------------------------------------------------*/
50
51 static void telemetry_build_msg_vehicle_id
52 (
53 TELEMETRY_MESSAGE* msg_buf
54 );
55
56
57 static void telemetry_build_msg_calibration
58 (
59 TELEMETRY_MESSAGE* msg_buf
60 );
61
62
63 static void telemetry_build_msg_dashboard_dump
64 (
65 TELEMETRY_MESSAGE* msg_buf
66 );
67
68 /*------------------------------------------------------------------------------
69 Public APIs
70 ------------------------------------------------------------------------------*/
71
72 /**
73 * @brief Selects and constructs the next scheduled telemetry message.
74 * @param payload Telemetry message buffer to fill.
75 */
76 3 void telemetry_get_next_message
77 (
78 TELEMETRY_MESSAGE* payload /* o: constructed telemetry message */
79 )
80 {
81 3 TELEMETRY_MESSAGE_TYPES msg_type;
82
83 /* Determine which payload to send */
84
2/2
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 2 times.
3 if( ( message_idx % 3 == 0 )
85
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1 time.
1 && ( get_fc_state() == FC_STATE_LAUNCH_DETECT ) )
86 {
87 msg_type = TELEMETRY_MSG_VEHICLE_ID;
88 }
89
2/2
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 1 time.
2 else if( ( message_idx % 3 == 1 )
90
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1 time.
1 && ( get_fc_state() == FC_STATE_LAUNCH_DETECT ) )
91 {
92 msg_type = TELEMETRY_MSG_CALIBRATION;
93 }
94 else
95 {
96 msg_type = TELEMETRY_MSG_DASHBOARD_DATA;
97 }
98 3 telemetry_build_payload(payload, msg_type);
99 3 message_idx++;
100
101 3 } /* telemetry_get_next_message */
102
103
104 /**
105 * @brief Builds the requested telemetry payload and fills its message header.
106 * @param msg_buf Telemetry message buffer to fill.
107 * @param message_type Type of telemetry message to build.
108 */
109 7 void telemetry_build_payload
110 (
111 TELEMETRY_MESSAGE* msg_buf, /* o: buffer passed by caller */
112 TELEMETRY_MESSAGE_TYPES message_type /* i: what kind of message */
113 )
114 {
115 /*------------------------------------------------------------------------------
116 Construct Header
117 ------------------------------------------------------------------------------*/
118 7 memset(msg_buf, 0, TELEMETRY_MESSAGE_SIZE);
119 7 msg_buf->header.mid = message_type;
120 7 msg_buf->header.timestamp = HAL_GetTick();
121
122 /*------------------------------------------------------------------------------
123 Build Payload
124 ------------------------------------------------------------------------------*/
125
4/4
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 1 time.
7 switch( message_type )
126 {
127 2 case TELEMETRY_MSG_VEHICLE_ID:
128 {
129 2 telemetry_build_msg_vehicle_id(msg_buf);
130 2 break;
131 }
132 2 case TELEMETRY_MSG_DASHBOARD_DATA:
133 {
134 2 telemetry_build_msg_dashboard_dump(msg_buf);
135 2 break;
136 }
137 2 case TELEMETRY_MSG_CALIBRATION:
138 {
139 2 telemetry_build_msg_calibration(msg_buf);
140 2 break;
141 }
142 default:
143 {
144 /** In order to support projects with safety critical
145 * requirements, mod does not throw fail-fast errors.
146 * Thus, this should nop on release builds.
147 *
148 * This ensures that the library will only fail fast in
149 * the event of a hardfault and enables it to offload
150 * FHA requirements to the project that integrates it,
151 * if needed.
152 *
153 * GCOVR_EXCL_START
154 *
155 * A coverage hole is reported here because the debug-mode
156 * emulator tests have an actual function call here while
157 * release does not. This branch *is* tested in the release
158 * configuration.
159 */
160 debug_assert( false, ERROR_RECORD_FLIGHT_EVENTS_ERROR );
161 break;
162 /* GCOVR_EXCL_STOP */
163 }
164 }
165
166 /*------------------------------------------------------------------------------
167 Encrypt Message
168 ------------------------------------------------------------------------------*/
169 /* not yet ready */
170
171 // ETS Temp: This may not be done by v2.6.0. I'm happy to commit to dropping
172 // encryption for this release since our comms are one-way
173 // flight critical --> non-critical, so the flight critical element is never
174 // receiving outside data in-flight.
175
176 7 } /* telemetry_build_payload */
177
178 /*------------------------------------------------------------------------------
179 State Functions
180 ------------------------------------------------------------------------------*/
181
182 /*------------------------------------------------------------------------------
183 Telemetry Message Constructors
184 ------------------------------------------------------------------------------*/
185
186 /**
187 * @brief Builds a payload containing the vehicle identification and version.
188 * @param msg_buf Telemetry message buffer to fill.
189 */
190 2 static void telemetry_build_msg_vehicle_id
191 (
192 TELEMETRY_MESSAGE* msg_buf
193 )
194 {
195 /* hardware & firmware identifiers */
196 2 msg_buf->payload.vehicle_id.hw_opcode = PING_RESPONSE_CODE;
197 2 msg_buf->payload.vehicle_id.fw_opcode = FIRMWARE_APPA;
198 2 get_uid( &(msg_buf->payload.vehicle_id.uid) );
199
200 /* version string */
201 2 msg_buf->payload.vehicle_id.version |= ( VERSION_HARDWARE << 24 );
202 2 msg_buf->payload.vehicle_id.version |= ( VERSION_FIRMWARE_MAJOR << 16 );
203 2 msg_buf->payload.vehicle_id.version |= ( VERSION_FIRMWARE_PATCH << 8 );
204 2 msg_buf->payload.vehicle_id.version |= ( VERSION_PRERELEASE_NUMBER );
205
206 /* flight id (not yet implemented) */
207 2 strncpy( msg_buf->payload.vehicle_id.flight_id, "AVIONICS_TEST", 16 );
208
209 2 } /* telemetry_build_msg_vehicle_id */
210
211
212 /**
213 * @brief Builds a payload containing calibration data and QFE elevation.
214 * @param msg_buf Telemetry message buffer to fill.
215 */
216 2 static void telemetry_build_msg_calibration
217 (
218 TELEMETRY_MESSAGE* msg_buf
219 )
220 {
221 /*------------------------------------------------------------------------------
222 Local Variables
223 ------------------------------------------------------------------------------*/
224 2 SENSOR_DATA qfe_sensor_data;
225
226 2 memset( &qfe_sensor_data, 0, sizeof( SENSOR_DATA ) );
227
228 /*------------------------------------------------------------------------------
229 Construct known elements from preset data
230 ------------------------------------------------------------------------------*/
231 2 msg_buf->payload.calibration.imu_offset = preset_data.imu_offset;
232 2 msg_buf->payload.calibration.baro_preset = preset_data.baro_preset;
233 2 msg_buf->payload.calibration.servo_preset = preset_data.servo_preset;
234
235 /*------------------------------------------------------------------------------
236 Determine QFE reference elevation
237 ------------------------------------------------------------------------------*/
238 2 qfe_sensor_data.baro_pressure = preset_data.baro_preset.baro_pres;
239 2 qfe_sensor_data.baro_temp = preset_data.baro_preset.baro_temp;
240 2 sensor_baro_alt( &qfe_sensor_data );
241
242 2 msg_buf->payload.calibration.qfe_elevation = qfe_sensor_data.baro_alt;
243
244 2 } /* telemetry_build_msg_calibration */
245
246
247 /**
248 * @brief Builds a payload containing the current flight state and dashboard data.
249 * @param msg_buf Telemetry message buffer to fill.
250 */
251 2 static void telemetry_build_msg_dashboard_dump
252 (
253 TELEMETRY_MESSAGE* msg_buf
254 )
255 {
256 2 msg_buf->payload.dashboard_dump.fsm_state = get_fc_state();
257 2 dashboard_construct_dump( &(msg_buf->payload.dashboard_dump.data) );
258
259 2 } /* telemetry_build_msg_dashboard_dump */
260