F´ Flight Software - C/C++ Documentation  devel
A framework for building embedded system applications to NASA flight quality standards.
Version.cpp
Go to the documentation of this file.
1 // ======================================================================
2 // \title Version.cpp
3 // \author sreddy
4 // \brief cpp file for Version component implementation class
5 // ======================================================================
6 
8 #include "FpConfig.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 Version ::Version(const char* const compName)
19  : VersionComponentBase(compName), m_enable(false), m_num_custom_elements(0) {
20  Fw::String version_string = "no_ver";
21  // initialize all custom entries
23  // setVersion_enum is by default set to the first enum value, so not setting it here
24  this->verId_db[id].setversion_value(version_string);
25  this->verId_db[id].setversion_status(VersionStatus::FAILURE);
26  }
27 }
28 
30 
31 void Version::config(bool enable) {
32  // Set Verbosity for custom versions
33  this->m_enable = enable;
34 
35  // Setup and send startup TLM
36  this->fwVersion_tlm();
37  this->projectVersion_tlm();
38  this->libraryVersion_tlm();
39 }
40 // ----------------------------------------------------------------------
41 // Handler implementations for user-defined typed input ports
42 // ----------------------------------------------------------------------
43 
44 void Version ::getVersion_handler(FwIndexType portNum,
45  const Svc::VersionCfg::VersionEnum& version_id,
46  Fw::StringBase& version_string,
47  Svc::VersionStatus& status) {
48  FW_ASSERT(version_id.isValid(), version_id.e);
49  U8 version_slot = VersionSlot(version_id.e);
50  version_string = this->verId_db[version_slot].getversion_value();
51  status = this->verId_db[version_slot].getversion_status();
52 }
53 
54 void Version ::setVersion_handler(FwIndexType portNum,
55  const Svc::VersionCfg::VersionEnum& version_id,
56  Fw::StringBase& version_string,
57  Svc::VersionStatus& status) {
58  FW_ASSERT(version_id.isValid(), version_id.e);
59  VersionSlot ver_slot = VersionSlot(version_id.e);
60  this->verId_db[ver_slot].setversion_enum(version_id);
61  this->verId_db[ver_slot].setversion_value(version_string);
62  this->verId_db[ver_slot].setversion_status(status);
63  this->m_num_custom_elements++;
64  this->customVersion_tlm(ver_slot);
65 }
66 
67 // ----------------------------------------------------------------------
68 // Handler implementations for commands
69 // ----------------------------------------------------------------------
70 
71 void Version ::ENABLE_cmdHandler(FwOpcodeType opCode, U32 cmdSeq, Svc::VersionEnabled enable) {
72  this->m_enable = (enable == VersionEnabled::ENABLED);
73 
74  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK);
75 }
76 
77 // Command handler to event versions
78 void Version ::VERSION_cmdHandler(FwOpcodeType opCode, U32 cmdSeq, Svc::VersionType version_type) {
79 
80  FW_ASSERT(version_type.isValid(),version_type.e);
81 
82  switch (version_type) {
84  this->projectVersion_tlm();
85  break;
86 
88  this->fwVersion_tlm();
89  break;
90 
92  this->libraryVersion_tlm();
93  break;
94 
96  this->customVersion_tlm_all();
97  break;
98 
99  case (Svc::VersionType::ALL):
100  this->projectVersion_tlm();
101  this->fwVersion_tlm();
102  this->libraryVersion_tlm();
103  this->customVersion_tlm_all();
104  break;
105  default:
106  FW_ASSERT(0, version_type);
107  break;
108  }
109 
110  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK);
111 }
112 // ----------------------------------------------------------------------
113 // implementations for internal functions
114 // ----------------------------------------------------------------------
115 // functions to log tlm on versions
116 void Version ::fwVersion_tlm() {
118  this->log_ACTIVITY_LO_FrameworkVersion(fw_event);
120  this->tlmWrite_FrameworkVersion(fw_tlm);
121 }
122 
123 void Version ::projectVersion_tlm() {
125  this->log_ACTIVITY_LO_ProjectVersion(proj_event);
127  this->tlmWrite_ProjectVersion(proj_tlm);
128 }
129 
130 void Version ::libraryVersion_tlm() {
131 
132  // Process libraries array
133  for (U8 i = 0; i < Project::Version::LIBRARY_VERSIONS_COUNT; i++) {
134  // Emit Event/TLM on library versions
136  // Write to Events
137  switch (i) {
138  case VER_SLOT_00:
140  break;
141  case VER_SLOT_01:
143  break;
144  case VER_SLOT_02:
146  break;
147  case VER_SLOT_03:
149  break;
150  case VER_SLOT_04:
152  break;
153  case VER_SLOT_05:
155  break;
156  case VER_SLOT_06:
158  break;
159  case VER_SLOT_07:
161  break;
162  case VER_SLOT_08:
164  break;
165  case VER_SLOT_09:
167  break;
168  default:
169  // It is possible to have more than 10 library versions; however design agreed to only
170  // provide 10 TLM channels for it
171  break;
172  }
173  }
174 }
175 
176 void Version ::customVersion_tlm_all() {
177  for (U8 i = 0; (m_enable == true) && (m_num_custom_elements != 0) && (i < Svc::VersionCfg::VersionEnum::NUM_CONSTANTS);
178  i++) {
179  Version::customVersion_tlm(VersionSlot(i));
180  }
181 }
182 
183 void Version ::customVersion_tlm(VersionSlot custom_slot) {
184  // Process custom version TLM only if verbosity is enabled and there are any valid writes to it;
185  // it doesn't necessarily have to be consecutive
186  if ((this->verId_db[custom_slot].getversion_value() != "no_ver") && m_enable == true &&
187  (this->m_num_custom_elements > 0)) { // Write TLM for valid writes
188 
189  // Emit Events/TLM on library versions
190  this->log_ACTIVITY_LO_CustomVersions(this->verId_db[custom_slot].getversion_enum(),
191  this->verId_db[custom_slot].getversion_value());
192 
193  // Write to TLM
194  switch (custom_slot) {
195  case VER_SLOT_00:
196  this->tlmWrite_CustomVersion01(verId_db[custom_slot]);
197  break;
198  case VER_SLOT_01:
199  this->tlmWrite_CustomVersion02(verId_db[custom_slot]);
200  break;
201  case VER_SLOT_02:
202  this->tlmWrite_CustomVersion03(verId_db[custom_slot]);
203  break;
204  case VER_SLOT_03:
205  this->tlmWrite_CustomVersion04(verId_db[custom_slot]);
206  break;
207  case VER_SLOT_04:
208  this->tlmWrite_CustomVersion05(verId_db[custom_slot]);
209  break;
210  case VER_SLOT_05:
211  this->tlmWrite_CustomVersion06(verId_db[custom_slot]);
212  break;
213  case VER_SLOT_06:
214  this->tlmWrite_CustomVersion07(verId_db[custom_slot]);
215  break;
216  case VER_SLOT_07:
217  this->tlmWrite_CustomVersion08(verId_db[custom_slot]);
218  break;
219  case VER_SLOT_08:
220  this->tlmWrite_CustomVersion09(verId_db[custom_slot]);
221  break;
222  case VER_SLOT_09:
223  this->tlmWrite_CustomVersion10(verId_db[custom_slot]);
224  break;
225  default:
226  // There are only 10 custom slots available
227  FW_ASSERT(0, custom_slot);
228  break;
229  }
230  }
231 }
232 
233 } // namespace Svc
#define FW_ASSERT(...)
Definition: Assert.hpp:14
uint8_t U8
8-bit unsigned integer
Definition: BasicTypes.h:26
U32 FwOpcodeType
Definition: FpConfig.h:78
PlatformIndexType FwIndexType
Definition: FpConfig.h:20
C++-compatible configuration header for fprime configuration.
@ OK
Command successfully executed.
void setversion_status(Svc::VersionStatus::T version_status)
Set member version_status.
Fw::ExternalString & getversion_value()
Get member version_value.
void setversion_value(const Fw::StringBase &version_value)
Set member version_value.
Svc::VersionStatus::T getversion_status() const
Get member version_status.
void setversion_enum(Svc::VersionCfg::VersionEnum::T version_enum)
Set member version_enum.
@ NUM_CONSTANTS
The number of enumerated constants.
bool isValid() const
Check raw enum value for validity.
Auto-generated base for Version component.
void tlmWrite_CustomVersion04(const Svc::CustomVersionDb &arg, Fw::Time _tlmTime=Fw::Time())
Write telemetry channel CustomVersion04.
void log_ACTIVITY_LO_CustomVersions(Svc::VersionCfg::VersionEnum version_enum, const Fw::StringBase &version_value)
void tlmWrite_ProjectVersion(const Fw::StringBase &arg, Fw::Time _tlmTime=Fw::Time())
void tlmWrite_FrameworkVersion(const Fw::StringBase &arg, Fw::Time _tlmTime=Fw::Time())
void tlmWrite_CustomVersion03(const Svc::CustomVersionDb &arg, Fw::Time _tlmTime=Fw::Time())
Write telemetry channel CustomVersion03.
void tlmWrite_LibraryVersion09(const Fw::StringBase &arg, Fw::Time _tlmTime=Fw::Time())
Write telemetry channel LibraryVersion09.
void tlmWrite_LibraryVersion03(const Fw::StringBase &arg, Fw::Time _tlmTime=Fw::Time())
Write telemetry channel LibraryVersion03.
void tlmWrite_CustomVersion07(const Svc::CustomVersionDb &arg, Fw::Time _tlmTime=Fw::Time())
Write telemetry channel CustomVersion07.
void tlmWrite_LibraryVersion05(const Fw::StringBase &arg, Fw::Time _tlmTime=Fw::Time())
Write telemetry channel LibraryVersion05.
void log_ACTIVITY_LO_FrameworkVersion(const Fw::StringBase &version)
void tlmWrite_CustomVersion01(const Svc::CustomVersionDb &arg, Fw::Time _tlmTime=Fw::Time())
void tlmWrite_LibraryVersion04(const Fw::StringBase &arg, Fw::Time _tlmTime=Fw::Time())
Write telemetry channel LibraryVersion04.
void tlmWrite_CustomVersion08(const Svc::CustomVersionDb &arg, Fw::Time _tlmTime=Fw::Time())
Write telemetry channel CustomVersion08.
void log_ACTIVITY_LO_LibraryVersions(const Fw::StringBase &version)
void tlmWrite_LibraryVersion08(const Fw::StringBase &arg, Fw::Time _tlmTime=Fw::Time())
Write telemetry channel LibraryVersion08.
void tlmWrite_LibraryVersion07(const Fw::StringBase &arg, Fw::Time _tlmTime=Fw::Time())
Write telemetry channel LibraryVersion07.
void tlmWrite_CustomVersion09(const Svc::CustomVersionDb &arg, Fw::Time _tlmTime=Fw::Time())
Write telemetry channel CustomVersion09.
void tlmWrite_LibraryVersion01(const Fw::StringBase &arg, Fw::Time _tlmTime=Fw::Time())
void log_ACTIVITY_LO_ProjectVersion(const Fw::StringBase &version)
void tlmWrite_LibraryVersion06(const Fw::StringBase &arg, Fw::Time _tlmTime=Fw::Time())
Write telemetry channel LibraryVersion06.
void tlmWrite_CustomVersion02(const Svc::CustomVersionDb &arg, Fw::Time _tlmTime=Fw::Time())
Write telemetry channel CustomVersion02.
void cmdResponse_out(FwOpcodeType opCode, U32 cmdSeq, Fw::CmdResponse response)
Emit command response.
void tlmWrite_LibraryVersion02(const Fw::StringBase &arg, Fw::Time _tlmTime=Fw::Time())
Write telemetry channel LibraryVersion02.
void tlmWrite_CustomVersion05(const Svc::CustomVersionDb &arg, Fw::Time _tlmTime=Fw::Time())
Write telemetry channel CustomVersion05.
void tlmWrite_LibraryVersion10(const Fw::StringBase &arg, Fw::Time _tlmTime=Fw::Time())
Write telemetry channel LibraryVersion10.
void tlmWrite_CustomVersion06(const Svc::CustomVersionDb &arg, Fw::Time _tlmTime=Fw::Time())
Write telemetry channel CustomVersion06.
void tlmWrite_CustomVersion10(const Svc::CustomVersionDb &arg, Fw::Time _tlmTime=Fw::Time())
Write telemetry channel CustomVersion10.
Tracks versions for project, framework and user defined versions etc.
@ ENABLED
verbosity enabled
Version(const char *const compName)
Construct Version object.
Definition: Version.cpp:18
void config(bool enable)
configure version's verbosity and startup
Definition: Version.cpp:31
~Version()
Destroy Version object.
Definition: Version.cpp:29
An enumeration for version status.
@ FAILURE
Failure to get version.
An enumeration for Version Type.
bool isValid() const
Check raw enum value for validity.
T e
The raw enum value.
@ LIBRARY
library version
@ FRAMEWORK
framework version
@ CUSTOM
custom version
@ ALL
all above versions
@ PROJECT
project version
static const char *const LIBRARY_VERSIONS[]
Definition: version.hpp:15
static const char *const PROJECT_VERSION
Definition: version.hpp:13
static const FwIndexType LIBRARY_VERSIONS_COUNT
Definition: version.hpp:14
static const char *const FRAMEWORK_VERSION
Definition: version.hpp:12