GCC Code Coverage Report


Directory: /home/runner/work/Flight-Computer-Firmware/Flight-Computer-Firmware/app/rev2/
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 100.0% 45 / 0 / 45
Functions: 100.0% 1 / 0 / 1
Branches: 88.9% 16 / 0 / 18

fin_calib.c
Line Branch Exec Source
1 /*******************************************************************************
2 * *
3 * FILE: *
4 * fin_calib.c *
5 * *
6 * DESCRIPTION: *
7 * Calibrates left and right fin individually. *
8 * *
9 * CRITICALITY: *
10 * NFQ - Non-Flight Qualified *
11 * *
12 * COPYRIGHT: *
13 * Copyright (c) 2025 Sun Devil Rocketry. *
14 * All rights reserved. *
15 * *
16 * This software is licensed under terms that can be found in the LICENSE *
17 * file in the root directory of this software component. *
18 * If no LICENSE file comes with this software, it is covered under the *
19 * BSD-3-Clause. *
20 * *
21 * https://opensource.org/license/bsd-3-clause *
22 * *
23 *******************************************************************************/
24
25 #include <stdint.h>
26 #include "main.h"
27 #include "usb.h"
28 #include "servo.h"
29 #include "led.h"
30
31 #define SERVO_1_POS 0x10
32 #define SERVO_1_NEG 0x11
33 #define SERVO_2_POS 0x12
34 #define SERVO_2_NEG 0x13
35 #define SERVO_3_POS 0x30
36 #define SERVO_3_NEG 0x31
37 #define SERVO_4_POS 0x32
38 #define SERVO_4_NEG 0x33
39 #define SET_REF 0x14
40 #define EXIT 0x15
41
42 /*------------------------------------------------------------------------------
43 Global Variables
44 ------------------------------------------------------------------------------*/
45 extern PRESET_DATA preset_data;
46
47
48 /*******************************************************************************
49 * *
50 * PROCEDURE: *
51 * finCalibration *
52 * *
53 * DESCRIPTION: *
54 * Allow SDEC to send commands to change servo reference points. *
55 * *
56 *******************************************************************************/
57 16 USB_STATUS finCalibration(uint8_t *signalIn)
58 {
59 16 uint8_t exit_calib = 0;
60 16 USB_STATUS usb_status = USB_OK;
61 16 uint8_t max_deflection_angle = preset_data.config_settings.control_max_deflection_angle;
62
2/2
✓ Branch 0 taken 25 times.
✓ Branch 1 taken 15 times.
40 while ( !exit_calib )
63 {
64 25 usb_status = usb_receive(signalIn, 1, HAL_DEFAULT_TIMEOUT);
65 25 led_set_color(LED_WHITE);
66
3/4
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 1 time.
✓ Branch 3 taken 24 times.
✗ Branch 4 not taken.
25 if ( usb_status == USB_OK && usb_detect() )
67 {
68
10/10
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 1 time.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 5 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 8 taken 15 times.
✓ Branch 9 taken 1 time.
24 switch(*signalIn)
69 {
70 1 case SERVO_1_POS:
71 {
72 1 preset_data.servo_preset.rp_servo1 = preset_data.servo_preset.rp_servo1 + 1;
73 1 break;
74 }
75 1 case SERVO_1_NEG:
76 {
77 1 preset_data.servo_preset.rp_servo1 = preset_data.servo_preset.rp_servo1 - 1;
78 1 break;
79 }
80 1 case SERVO_2_POS:
81 {
82 1 preset_data.servo_preset.rp_servo2 = preset_data.servo_preset.rp_servo2 + 1;
83 1 break;
84 }
85 1 case SERVO_2_NEG:
86 {
87 1 preset_data.servo_preset.rp_servo2 = preset_data.servo_preset.rp_servo2 - 1;
88 1 break;
89 }
90 1 case SERVO_3_POS:
91 {
92 1 preset_data.servo_preset.rp_servo3 = preset_data.servo_preset.rp_servo3 + 1;
93 1 break;
94 }
95 1 case SERVO_3_NEG:
96 {
97 1 preset_data.servo_preset.rp_servo3 = preset_data.servo_preset.rp_servo3 - 1;
98 1 break;
99 }
100 1 case SERVO_4_POS:
101 {
102 1 preset_data.servo_preset.rp_servo4 = preset_data.servo_preset.rp_servo4 + 1;
103 1 break;
104 }
105 1 case SERVO_4_NEG:
106 {
107 1 preset_data.servo_preset.rp_servo4 = preset_data.servo_preset.rp_servo4 - 1;
108 1 break;
109 }
110 case SET_REF:
111 /* Unused */
112 break;
113 15 case EXIT:
114 {
115 15 exit_calib = 1;
116 15 break;
117 }
118 default:
119 break;
120 }
121
122 /* Set a hard boundary for servo preset angle and consider max deflection angle */
123
124 24 preset_data.servo_preset.rp_servo1 = motor_snap_to_bound( preset_data.servo_preset.rp_servo1, 180 - max_deflection_angle, 0 + max_deflection_angle );
125 24 preset_data.servo_preset.rp_servo2 = motor_snap_to_bound( preset_data.servo_preset.rp_servo2, 180 - max_deflection_angle, 0 + max_deflection_angle );
126 24 preset_data.servo_preset.rp_servo3 = motor_snap_to_bound( preset_data.servo_preset.rp_servo3, 180 - max_deflection_angle, 0 + max_deflection_angle );
127 24 preset_data.servo_preset.rp_servo4 = motor_snap_to_bound( preset_data.servo_preset.rp_servo4, 180 - max_deflection_angle, 0 + max_deflection_angle );
128
129 24 motor_drive( SERVO_1, preset_data.servo_preset.rp_servo1 );
130 24 motor_drive( SERVO_2, preset_data.servo_preset.rp_servo2 );
131 24 motor_drive( SERVO_3, preset_data.servo_preset.rp_servo3 );
132 24 motor_drive( SERVO_4, preset_data.servo_preset.rp_servo4 );
133
134 }
135
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 time.
1 else if ( usb_status == USB_FAIL )
136 {
137 return USB_FAIL;
138 }
139 }
140 return usb_status;
141
142 } /* finCalibration */
143
144 /*******************************************************************************
145 * END OF FILE *
146 *******************************************************************************/
147