| 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 |