GCC Code Coverage Report


Directory: ./
File: Svc/Version/Version.cpp
Date: 2026-09-03 22:12:29
Exec Total Coverage
Lines: 31 159 19.5%
Functions: 7 13 53.8%
Branches: 22 130 16.9%

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 this->verId_db[ver_slot].set_version_enum(version_id);
69 this->verId_db[ver_slot].set_version_value(version_string);
70 this->verId_db[ver_slot].set_version_status(status);
71 this->m_num_custom_elements++;
72 this->customVersion_tlm(ver_slot);
73 }
74
75 // ----------------------------------------------------------------------
76 // Handler implementations for commands
77 // ----------------------------------------------------------------------
78
79 void Version ::ENABLE_cmdHandler(FwOpcodeType opCode, U32 cmdSeq, const Svc::VersionEnabled& enable) {
80 this->m_enable = (enable == VersionEnabled::ENABLED);
81
82 this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK);
83 }
84
85 // Command handler to event versions
86 void Version ::VERSION_cmdHandler(FwOpcodeType opCode, U32 cmdSeq, const Svc::VersionType& version_type) {
87 FW_ASSERT(version_type.isValid(), version_type.e);
88
89 switch (version_type) {
90 case (Svc::VersionType::PROJECT):
91 this->projectVersion_tlm();
92 break;
93
94 case (Svc::VersionType::FRAMEWORK):
95 this->fwVersion_tlm();
96 break;
97
98 case (Svc::VersionType::LIBRARY):
99 this->libraryVersion_tlm();
100 break;
101
102 case (Svc::VersionType::CUSTOM):
103 this->customVersion_tlm_all();
104 break;
105
106 case (Svc::VersionType::ALL):
107 this->projectVersion_tlm();
108 this->fwVersion_tlm();
109 this->libraryVersion_tlm();
110 this->customVersion_tlm_all();
111 break;
112 default:
113 FW_ASSERT(false, version_type);
114 break;
115 }
116
117 this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK);
118 }
119 // ----------------------------------------------------------------------
120 // implementations for internal functions
121 // ----------------------------------------------------------------------
122 // Send both events and tlm for framework version
123 1 void Version ::fwVersion_tlm() {
124
1/1
✓ Branch 1 taken 1 times.
1 Fw::LogStringArg fw_event = (Project::Version::FRAMEWORK_VERSION);
125
1/1
✓ Branch 1 taken 1 times.
1 this->log_ACTIVITY_LO_FrameworkVersion(fw_event);
126
1/1
✓ Branch 1 taken 1 times.
1 Fw::TlmString fw_tlm = (Project::Version::FRAMEWORK_VERSION);
127
2/2
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
1 this->tlmWrite_FrameworkVersion(fw_tlm);
128 1 }
129
130 // Send both events and tlm for project version
131 1 void Version ::projectVersion_tlm() {
132
1/1
✓ Branch 1 taken 1 times.
1 Fw::LogStringArg proj_event = Project::Version::PROJECT_VERSION;
133
1/1
✓ Branch 1 taken 1 times.
1 this->log_ACTIVITY_LO_ProjectVersion(proj_event);
134
1/1
✓ Branch 1 taken 1 times.
1 Fw::TlmString proj_tlm = Project::Version::PROJECT_VERSION;
135
2/2
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
1 this->tlmWrite_ProjectVersion(proj_tlm);
136 1 }
137
138 // Send both events and tlm for library versions
139 1 void Version ::libraryVersion_tlm() {
140 // Process libraries array
141
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 for (U8 i = 0; i < Project::Version::LIBRARY_VERSIONS_COUNT; i++) {
142 FW_ASSERT(Project::Version::LIBRARY_VERSIONS[i] != nullptr, static_cast<FwAssertArgType>(i));
143 // Emit Event/TLM on library versions
144 this->log_ACTIVITY_LO_LibraryVersions(Fw::LogStringArg(Project::Version::LIBRARY_VERSIONS[i]));
145 // Write to Events
146 switch (i) {
147 case VER_SLOT_00:
148 this->tlmWrite_LibraryVersion01(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i]));
149 break;
150 case VER_SLOT_01:
151 this->tlmWrite_LibraryVersion02(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i]));
152 break;
153 case VER_SLOT_02:
154 this->tlmWrite_LibraryVersion03(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i]));
155 break;
156 case VER_SLOT_03:
157 this->tlmWrite_LibraryVersion04(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i]));
158 break;
159 case VER_SLOT_04:
160 this->tlmWrite_LibraryVersion05(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i]));
161 break;
162 case VER_SLOT_05:
163 this->tlmWrite_LibraryVersion06(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i]));
164 break;
165 case VER_SLOT_06:
166 this->tlmWrite_LibraryVersion07(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i]));
167 break;
168 case VER_SLOT_07:
169 this->tlmWrite_LibraryVersion08(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i]));
170 break;
171 case VER_SLOT_08:
172 this->tlmWrite_LibraryVersion09(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i]));
173 break;
174 case VER_SLOT_09:
175 this->tlmWrite_LibraryVersion10(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i]));
176 break;
177 default:
178 // It is possible to have more than 10 library versions; however design agreed to only
179 // provide 10 TLM channels for it
180 break;
181 }
182 }
183 1 }
184
185 // Send all events and tlm (if verbosity is enabled) for custom versions
186 void Version ::customVersion_tlm_all() {
187 for (U8 i = 0;
188 (m_enable == true) && (m_num_custom_elements != 0) && (i < Svc::VersionCfg::VersionEnum::NUM_CONSTANTS); i++) {
189 Version::customVersion_tlm(VersionSlot(i));
190 }
191 }
192
193 // Send events and tlm (if verbosity is enabled) for custom versions
194 void Version ::customVersion_tlm(VersionSlot custom_slot) {
195 // Process custom version TLM only if verbosity is enabled and there are any valid writes to it;
196 // it doesn't necessarily have to be consecutive
197 if ((this->verId_db[custom_slot].get_version_value() != "no_ver") &&
198 (this->m_num_custom_elements > 0)) { // Write TLM for valid writes
199
200 // Emit Events/TLM on custom versions
201 this->log_ACTIVITY_LO_CustomVersions(this->verId_db[custom_slot].get_version_enum(),
202 this->verId_db[custom_slot].get_version_value());
203
204 if (m_enable == true) { // Send TLM only if verbosity is enabled
205 // Write to TLM
206 switch (custom_slot) {
207 case VER_SLOT_00:
208 this->tlmWrite_CustomVersion01(verId_db[custom_slot]);
209 break;
210 case VER_SLOT_01:
211 this->tlmWrite_CustomVersion02(verId_db[custom_slot]);
212 break;
213 case VER_SLOT_02:
214 this->tlmWrite_CustomVersion03(verId_db[custom_slot]);
215 break;
216 case VER_SLOT_03:
217 this->tlmWrite_CustomVersion04(verId_db[custom_slot]);
218 break;
219 case VER_SLOT_04:
220 this->tlmWrite_CustomVersion05(verId_db[custom_slot]);
221 break;
222 case VER_SLOT_05:
223 this->tlmWrite_CustomVersion06(verId_db[custom_slot]);
224 break;
225 case VER_SLOT_06:
226 this->tlmWrite_CustomVersion07(verId_db[custom_slot]);
227 break;
228 case VER_SLOT_07:
229 this->tlmWrite_CustomVersion08(verId_db[custom_slot]);
230 break;
231 case VER_SLOT_08:
232 this->tlmWrite_CustomVersion09(verId_db[custom_slot]);
233 break;
234 case VER_SLOT_09:
235 this->tlmWrite_CustomVersion10(verId_db[custom_slot]);
236 break;
237 default:
238 // There are only 10 custom slots available
239 FW_ASSERT(false, custom_slot);
240 break;
241 }
242 }
243 }
244 }
245
246 } // namespace Svc
247