GCC Code Coverage Report


Directory: /home/runner/work/fprime/fprime/Svc/Version/
File: Version.cpp
Date: 2026-09-23 22:13:24
Exec Total Coverage
Lines: 31 160 19.4%
Functions: 7 13 53.8%
Branches: 22 134 16.4%

Line Branch Exec Source
1 // ======================================================================
2 // \title Version.cpp
3 // \author sreddy
4 // \brief cpp file for Version component implementation class
5 // ======================================================================
6
7 #include "Svc/Version/Version.hpp"
8 #include "Fw/FPrimeBasicTypes.hpp"
9
10 #include "versions/version.hpp" //autogenerated file containing hardcoded project and framework versions
11
12 namespace Svc {
13
14 // ----------------------------------------------------------------------
15 // Component construction and destruction
16 // ----------------------------------------------------------------------
17
18 1 Version ::Version(const char* const compName)
19
3/9
✓ Branch 2 taken 10 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
11 : VersionComponentBase(compName), m_enable(false), m_num_custom_elements(0) {
20
1/1
✓ Branch 1 taken 1 times.
1 Fw::String version_string = "no_ver";
21 // initialize all custom entries
22
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 1 times.
11 for (FwIndexType id = 0; id < Svc::VersionCfg::VersionEnum::NUM_CONSTANTS; id++) {
23 // setVersion_enum is by default set to the first enum value, so not setting it here
24
1/1
✓ Branch 1 taken 10 times.
10 this->verId_db[id].set_version_value(version_string);
25
1/1
✓ Branch 1 taken 10 times.
10 this->verId_db[id].set_version_status(VersionStatus::FAILURE);
26 }
27 1 }
28
29
3/4
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 1 times.
22 Version ::~Version() {}
30
31 1 void Version::config(bool enable) {
32 // Set Verbosity for custom versions
33 1 this->m_enable = enable;
34 1 }
35
36 1 void Version::start() {
37 // Send startup TLM and EVENTS
38 1 this->fwVersion_tlm();
39 1 this->projectVersion_tlm();
40 1 this->libraryVersion_tlm();
41 1 }
42 // ----------------------------------------------------------------------
43 // Handler implementations for user-defined typed input ports
44 // ----------------------------------------------------------------------
45
46 ✗ void Version ::getVersion_handler(FwIndexType portNum,
47 const Svc::VersionCfg::VersionEnum& version_id,
48 Fw::StringBase& version_string,
49 Svc::VersionStatus& status) {
50 ✗ FW_ASSERT(version_id.isValid(), version_id.e);
51 ✗ FW_ASSERT(static_cast<Svc::VersionCfg::VersionEnum::SerialType>(version_id.e) <
52 Svc::VersionCfg::VersionEnum::NUM_CONSTANTS,
53 version_id.e);
54 ✗ U8 version_slot = VersionSlot(version_id.e);
55 ✗ version_string = static_cast<const Fw::StringBase&>(this->verId_db[version_slot].get_version_value());
56 ✗ status = this->verId_db[version_slot].get_version_status();
57 ✗ }
58
59 ✗ void Version ::setVersion_handler(FwIndexType portNum,
60 const Svc::VersionCfg::VersionEnum& version_id,
61 Fw::StringBase& version_string,
62 Svc::VersionStatus& status) {
63 ✗ FW_ASSERT(version_id.isValid(), version_id.e);
64 ✗ FW_ASSERT(static_cast<Svc::VersionCfg::VersionEnum::SerialType>(version_id.e) <
65 Svc::VersionCfg::VersionEnum::NUM_CONSTANTS,
66 version_id.e);
67 ✗ auto ver_slot = VersionSlot(version_id.e);
68 // Count each slot once: rewrites of a populated slot must not grow the count
69 ✗ if ((this->verId_db[ver_slot].get_version_value() == "no_ver") &&
70 ✗ (this->m_num_custom_elements < Svc::VersionCfg::VersionEnum::NUM_CONSTANTS)) {
71 ✗ this->m_num_custom_elements++;
72 }
73 ✗ this->verId_db[ver_slot].set_version_enum(version_id);
74 ✗ this->verId_db[ver_slot].set_version_value(version_string);
75 ✗ this->verId_db[ver_slot].set_version_status(status);
76 ✗ this->customVersion_tlm(ver_slot);
77 ✗ }
78
79 // ----------------------------------------------------------------------
80 // Handler implementations for commands
81 // ----------------------------------------------------------------------
82
83 ✗ void Version ::ENABLE_cmdHandler(FwOpcodeType opCode, U32 cmdSeq, const Svc::VersionEnabled& enable) {
84 ✗ this->m_enable = (enable == VersionEnabled::ENABLED);
85
86 ✗ this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK);
87 ✗ }
88
89 // Command handler to event versions
90 ✗ void Version ::VERSION_cmdHandler(FwOpcodeType opCode, U32 cmdSeq, const Svc::VersionType& version_type) {
91 ✗ FW_ASSERT(version_type.isValid(), version_type.e);
92
93 ✗ switch (version_type) {
94 ✗ case (Svc::VersionType::PROJECT):
95 ✗ this->projectVersion_tlm();
96 ✗ break;
97
98 ✗ case (Svc::VersionType::FRAMEWORK):
99 ✗ this->fwVersion_tlm();
100 ✗ break;
101
102 ✗ case (Svc::VersionType::LIBRARY):
103 ✗ this->libraryVersion_tlm();
104 ✗ break;
105
106 ✗ case (Svc::VersionType::CUSTOM):
107 ✗ this->customVersion_tlm_all();
108 ✗ break;
109
110 ✗ case (Svc::VersionType::ALL):
111 ✗ this->projectVersion_tlm();
112 ✗ this->fwVersion_tlm();
113 ✗ this->libraryVersion_tlm();
114 ✗ this->customVersion_tlm_all();
115 ✗ break;
116 ✗ default:
117 ✗ FW_ASSERT(false, version_type);
118 ✗ break;
119 }
120
121 ✗ this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK);
122 ✗ }
123 // ----------------------------------------------------------------------
124 // implementations for internal functions
125 // ----------------------------------------------------------------------
126 // Send both events and tlm for framework version
127 1 void Version ::fwVersion_tlm() {
128
1/1
✓ Branch 1 taken 1 times.
1 Fw::LogStringArg fw_event = (Project::Version::FRAMEWORK_VERSION);
129
1/1
✓ Branch 1 taken 1 times.
1 this->log_ACTIVITY_LO_FrameworkVersion(fw_event);
130
1/1
✓ Branch 1 taken 1 times.
1 Fw::TlmString fw_tlm = (Project::Version::FRAMEWORK_VERSION);
131
2/2
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
1 this->tlmWrite_FrameworkVersion(fw_tlm);
132 1 }
133
134 // Send both events and tlm for project version
135 1 void Version ::projectVersion_tlm() {
136
1/1
✓ Branch 1 taken 1 times.
1 Fw::LogStringArg proj_event = Project::Version::PROJECT_VERSION;
137
1/1
✓ Branch 1 taken 1 times.
1 this->log_ACTIVITY_LO_ProjectVersion(proj_event);
138
1/1
✓ Branch 1 taken 1 times.
1 Fw::TlmString proj_tlm = Project::Version::PROJECT_VERSION;
139
2/2
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
1 this->tlmWrite_ProjectVersion(proj_tlm);
140 1 }
141
142 // Send both events and tlm for library versions
143 1 void Version ::libraryVersion_tlm() {
144 // Process libraries array
145
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 for (U8 i = 0; i < Project::Version::LIBRARY_VERSIONS_COUNT; i++) {
146 ✗ FW_ASSERT(Project::Version::LIBRARY_VERSIONS[i] != nullptr, static_cast<FwAssertArgType>(i));
147 // Emit Event/TLM on library versions
148 ✗ this->log_ACTIVITY_LO_LibraryVersions(Fw::LogStringArg(Project::Version::LIBRARY_VERSIONS[i]));
149 // Write to the telemetry channel for this library slot
150 ✗ switch (i) {
151 ✗ case VER_SLOT_00:
152 ✗ this->tlmWrite_LibraryVersion01(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i]));
153 ✗ break;
154 ✗ case VER_SLOT_01:
155 ✗ this->tlmWrite_LibraryVersion02(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i]));
156 ✗ break;
157 ✗ case VER_SLOT_02:
158 ✗ this->tlmWrite_LibraryVersion03(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i]));
159 ✗ break;
160 ✗ case VER_SLOT_03:
161 ✗ this->tlmWrite_LibraryVersion04(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i]));
162 ✗ break;
163 ✗ case VER_SLOT_04:
164 ✗ this->tlmWrite_LibraryVersion05(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i]));
165 ✗ break;
166 ✗ case VER_SLOT_05:
167 ✗ this->tlmWrite_LibraryVersion06(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i]));
168 ✗ break;
169 ✗ case VER_SLOT_06:
170 ✗ this->tlmWrite_LibraryVersion07(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i]));
171 ✗ break;
172 ✗ case VER_SLOT_07:
173 ✗ this->tlmWrite_LibraryVersion08(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i]));
174 ✗ break;
175 ✗ case VER_SLOT_08:
176 ✗ this->tlmWrite_LibraryVersion09(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i]));
177 ✗ break;
178 ✗ case VER_SLOT_09:
179 ✗ this->tlmWrite_LibraryVersion10(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i]));
180 ✗ break;
181 ✗ default:
182 // It is possible to have more than 10 library versions; however design agreed to only
183 // provide 10 TLM channels for it
184 ✗ break;
185 }
186 }
187 1 }
188
189 // Send all events and tlm (if verbosity is enabled) for custom versions
190 ✗ void Version ::customVersion_tlm_all() {
191 ✗ for (U8 i = 0; (m_num_custom_elements != 0) && (i < Svc::VersionCfg::VersionEnum::NUM_CONSTANTS); i++) {
192 ✗ Version::customVersion_tlm(VersionSlot(i));
193 }
194 ✗ }
195
196 // Send events and tlm (if verbosity is enabled) for custom versions
197 ✗ void Version ::customVersion_tlm(VersionSlot custom_slot) {
198 // Process custom version TLM only if verbosity is enabled and there are any valid writes to it;
199 // it doesn't necessarily have to be consecutive
200 ✗ if ((this->verId_db[custom_slot].get_version_value() != "no_ver") &&
201 ✗ (this->m_num_custom_elements > 0)) { // Write TLM for valid writes
202
203 // Emit Events/TLM on custom versions
204 ✗ this->log_ACTIVITY_LO_CustomVersions(this->verId_db[custom_slot].get_version_enum(),
205 ✗ this->verId_db[custom_slot].get_version_value());
206
207 ✗ if (m_enable == true) { // Send TLM only if verbosity is enabled
208 // Write to TLM
209 ✗ switch (custom_slot) {
210 ✗ case VER_SLOT_00:
211 ✗ this->tlmWrite_CustomVersion01(verId_db[custom_slot]);
212 ✗ break;
213 ✗ case VER_SLOT_01:
214 ✗ this->tlmWrite_CustomVersion02(verId_db[custom_slot]);
215 ✗ break;
216 ✗ case VER_SLOT_02:
217 ✗ this->tlmWrite_CustomVersion03(verId_db[custom_slot]);
218 ✗ break;
219 ✗ case VER_SLOT_03:
220 ✗ this->tlmWrite_CustomVersion04(verId_db[custom_slot]);
221 ✗ break;
222 ✗ case VER_SLOT_04:
223 ✗ this->tlmWrite_CustomVersion05(verId_db[custom_slot]);
224 ✗ break;
225 ✗ case VER_SLOT_05:
226 ✗ this->tlmWrite_CustomVersion06(verId_db[custom_slot]);
227 ✗ break;
228 ✗ case VER_SLOT_06:
229 ✗ this->tlmWrite_CustomVersion07(verId_db[custom_slot]);
230 ✗ break;
231 ✗ case VER_SLOT_07:
232 ✗ this->tlmWrite_CustomVersion08(verId_db[custom_slot]);
233 ✗ break;
234 ✗ case VER_SLOT_08:
235 ✗ this->tlmWrite_CustomVersion09(verId_db[custom_slot]);
236 ✗ break;
237 ✗ case VER_SLOT_09:
238 ✗ this->tlmWrite_CustomVersion10(verId_db[custom_slot]);
239 ✗ break;
240 ✗ default:
241 // There are only 10 custom slots available
242 ✗ FW_ASSERT(false, custom_slot);
243 ✗ break;
244 }
245 }
246 }
247 ✗ }
248
249 } // namespace Svc
250