F´ Flight Software - C/C++ Documentation  devel
A framework for building embedded system applications to NASA flight quality standards.
SystemResources.cpp
Go to the documentation of this file.
1 // ======================================================================
2 // \title SystemResourcesComponentImpl.cpp
3 // \author sfregoso
4 // \brief cpp file for SystemResources component implementation class
5 //
6 // \copyright
7 // Copyright 2021, by the California Institute of Technology.
8 // ALL RIGHTS RESERVED. United States Government Sponsorship
9 // acknowledged.
10 //
11 // ======================================================================
12 
13 #include <cmath> //isnan()
15 #include <versions/version.hpp>
16 #include <FpConfig.hpp>
17 
18 namespace Svc {
19 
20 // ----------------------------------------------------------------------
21 // Construction, initialization, and destruction
22 // ----------------------------------------------------------------------
23 
24 SystemResources ::SystemResources(const char* const compName)
25  : SystemResourcesComponentBase(compName), m_cpu_count(0), m_enable(true) {
26 
27  // Structure initializations
28  m_mem.used = 0;
29  m_mem.total = 0;
30  for (U32 i = 0; i < CPU_COUNT; i++) {
31  m_cpu[i].used = 0;
32  m_cpu[i].total = 0;
33  m_cpu_prev[i].used = 0;
34  m_cpu_prev[i].total = 0;
35  }
36 
38  m_cpu_count = 0;
39  }
40 
41  m_cpu_count = (m_cpu_count >= CPU_COUNT) ? CPU_COUNT : m_cpu_count;
42 
43  m_cpu_tlm_functions[0] = &Svc::SystemResources::tlmWrite_CPU_00;
44  m_cpu_tlm_functions[1] = &Svc::SystemResources::tlmWrite_CPU_01;
45  m_cpu_tlm_functions[2] = &Svc::SystemResources::tlmWrite_CPU_02;
46  m_cpu_tlm_functions[3] = &Svc::SystemResources::tlmWrite_CPU_03;
47  m_cpu_tlm_functions[4] = &Svc::SystemResources::tlmWrite_CPU_04;
48  m_cpu_tlm_functions[5] = &Svc::SystemResources::tlmWrite_CPU_05;
49  m_cpu_tlm_functions[6] = &Svc::SystemResources::tlmWrite_CPU_06;
50  m_cpu_tlm_functions[7] = &Svc::SystemResources::tlmWrite_CPU_07;
51  m_cpu_tlm_functions[8] = &Svc::SystemResources::tlmWrite_CPU_08;
52  m_cpu_tlm_functions[9] = &Svc::SystemResources::tlmWrite_CPU_09;
53  m_cpu_tlm_functions[10] = &Svc::SystemResources::tlmWrite_CPU_10;
54  m_cpu_tlm_functions[11] = &Svc::SystemResources::tlmWrite_CPU_11;
55  m_cpu_tlm_functions[12] = &Svc::SystemResources::tlmWrite_CPU_12;
56  m_cpu_tlm_functions[13] = &Svc::SystemResources::tlmWrite_CPU_13;
57  m_cpu_tlm_functions[14] = &Svc::SystemResources::tlmWrite_CPU_14;
58  m_cpu_tlm_functions[15] = &Svc::SystemResources::tlmWrite_CPU_15;
59 }
60 
63 }
64 
66 
67 // ----------------------------------------------------------------------
68 // Handler implementations for user-defined typed input ports
69 // ----------------------------------------------------------------------
70 
71 void SystemResources ::run_handler(const NATIVE_INT_TYPE portNum, U32 tick_time_hz) {
72  if (m_enable) {
73  Cpu();
74  Mem();
75  PhysMem();
76  Version();
77  }
78 }
79 
80 // ----------------------------------------------------------------------
81 // Command handler implementations
82 // ----------------------------------------------------------------------
83 
84 void SystemResources ::ENABLE_cmdHandler(const FwOpcodeType opCode,
85  const U32 cmdSeq,
86  SystemResourceEnabled enable) {
87  m_enable = (enable == SystemResourceEnabled::ENABLED);
88  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK);
89 }
90 
91 void SystemResources ::VERSION_cmdHandler(const FwOpcodeType opCode, const U32 cmdSeq) {
93  this->log_ACTIVITY_LO_FRAMEWORK_VERSION(version_string);
94 
95  version_string = Project::Version::PROJECT_VERSION;
96  this->log_ACTIVITY_LO_PROJECT_VERSION(version_string);
97  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK);
98 }
99 
100 F32 SystemResources::compCpuUtil(Os::SystemResources::CpuTicks current, Os::SystemResources::CpuTicks previous) {
101  F32 util = 100.0f;
102  // Prevent divide by zero on fast-sample
103  if ((current.total - previous.total) != 0) {
104  // Compute CPU % Utilization
105  util = (static_cast<F32>(current.used - previous.used) / static_cast<F32>(current.total - previous.total)) *
106  100.0f;
107  util = std::isnan(util) ? 100.0f : util;
108  }
109  return util;
110 }
111 
112 void SystemResources::Cpu() {
113  U32 count = 0;
114  F32 cpuAvg = 0;
115 
116  for (U32 i = 0; i < m_cpu_count && i < CPU_COUNT; i++) {
118  // Best-effort calculations and telemetry
120  F32 cpuUtil = compCpuUtil(m_cpu[i], m_cpu_prev[i]);
121  cpuAvg += cpuUtil;
122 
123  // Send telemetry using telemetry output table
124  FW_ASSERT(this->m_cpu_tlm_functions[i]);
125  (this->*m_cpu_tlm_functions[i])(cpuUtil, Fw::Time());
126 
127  // Store cpu used and total
128  m_cpu_prev[i] = m_cpu[i];
129  count++;
130  }
131  }
132 
133  cpuAvg = (count == 0) ? 0.0f : (cpuAvg / static_cast<F32>(count));
134  this->tlmWrite_CPU(cpuAvg);
135 }
136 
137 void SystemResources::Mem() {
139  this->tlmWrite_MEMORY_TOTAL(m_mem.total / 1024);
140  this->tlmWrite_MEMORY_USED(m_mem.used / 1024);
141  }
142 }
143 
144 void SystemResources::PhysMem() {
145  FwSizeType total = 0;
146  FwSizeType free = 0;
147 
148  if (Os::FileSystem::getFreeSpace("/", total, free) == Os::FileSystem::OP_OK) {
149  this->tlmWrite_NON_VOLATILE_FREE(free / 1024);
150  this->tlmWrite_NON_VOLATILE_TOTAL(total / 1024);
151  }
152 }
153 
154 void SystemResources::Version() {
156  this->tlmWrite_FRAMEWORK_VERSION(version_string);
157 
158  version_string= Project::Version::PROJECT_VERSION;
159  this->tlmWrite_PROJECT_VERSION(version_string);
160 }
161 } // end namespace Svc
#define FW_ASSERT(...)
Definition: Assert.hpp:14
PlatformIntType NATIVE_INT_TYPE
Definition: BasicTypes.h:51
float F32
32-bit floating point
Definition: BasicTypes.h:45
U32 FwOpcodeType
Definition: FpConfig.h:78
PlatformSizeType FwSizeType
Definition: FpConfig.h:30
C++-compatible configuration header for fprime configuration.
@ OK
Command successfully executed.
void init()
Object initializer.
Definition: ObjBase.cpp:27
Definition: Time.hpp:9
Auto-generated base for SystemResources component.
void tlmWrite_CPU_01(F32 arg, Fw::Time _tlmTime=Fw::Time())
void cmdResponse_out(FwOpcodeType opCode, U32 cmdSeq, Fw::CmdResponse response)
Emit command response.
void tlmWrite_CPU_02(F32 arg, Fw::Time _tlmTime=Fw::Time())
void tlmWrite_CPU_14(F32 arg, Fw::Time _tlmTime=Fw::Time())
void tlmWrite_MEMORY_USED(U64 arg, Fw::Time _tlmTime=Fw::Time())
void tlmWrite_NON_VOLATILE_TOTAL(U64 arg, Fw::Time _tlmTime=Fw::Time())
void tlmWrite_FRAMEWORK_VERSION(const Fw::StringBase &arg, Fw::Time _tlmTime=Fw::Time())
void tlmWrite_NON_VOLATILE_FREE(U64 arg, Fw::Time _tlmTime=Fw::Time())
void tlmWrite_PROJECT_VERSION(const Fw::StringBase &arg, Fw::Time _tlmTime=Fw::Time())
void tlmWrite_CPU_00(F32 arg, Fw::Time _tlmTime=Fw::Time())
void tlmWrite_CPU_09(F32 arg, Fw::Time _tlmTime=Fw::Time())
void log_ACTIVITY_LO_FRAMEWORK_VERSION(const Fw::StringBase &version)
void tlmWrite_CPU_10(F32 arg, Fw::Time _tlmTime=Fw::Time())
void tlmWrite_CPU_06(F32 arg, Fw::Time _tlmTime=Fw::Time())
void tlmWrite_CPU_08(F32 arg, Fw::Time _tlmTime=Fw::Time())
void tlmWrite_MEMORY_TOTAL(U64 arg, Fw::Time _tlmTime=Fw::Time())
void tlmWrite_CPU_07(F32 arg, Fw::Time _tlmTime=Fw::Time())
void tlmWrite_CPU_15(F32 arg, Fw::Time _tlmTime=Fw::Time())
void tlmWrite_CPU_04(F32 arg, Fw::Time _tlmTime=Fw::Time())
void tlmWrite_CPU(F32 arg, Fw::Time _tlmTime=Fw::Time())
void tlmWrite_CPU_12(F32 arg, Fw::Time _tlmTime=Fw::Time())
void tlmWrite_CPU_05(F32 arg, Fw::Time _tlmTime=Fw::Time())
void tlmWrite_CPU_11(F32 arg, Fw::Time _tlmTime=Fw::Time())
void tlmWrite_CPU_03(F32 arg, Fw::Time _tlmTime=Fw::Time())
void log_ACTIVITY_LO_PROJECT_VERSION(const Fw::StringBase &version)
void tlmWrite_CPU_13(F32 arg, Fw::Time _tlmTime=Fw::Time())
SystemResources(const char *const compName)
Status getFreeSpace(const char *path, FwSizeType &totalBytes, FwSizeType &freeBytes)
get FS free and total space in bytes on filesystem containing path
Definition: FileSystem.cpp:52
@ OP_OK
Operation was successful.
Definition: FileSystem.hpp:15
SystemResourcesStatus getCpuTicks(CpuTicks &ticks, U32 cpu_index=0)
Get the CPU tick information for a given CPU.
SystemResourcesStatus getMemUtil(MemUtil &memory_util)
Get system memory usage.
SystemResourcesStatus getCpuCount(U32 &cpu_count)
Request the count of the CPUs detected by the system.
@ SYSTEM_RESOURCES_OK
Call was successful.
@ SYSTEM_RESOURCES_ERROR
Call failed.
FwSizeType total
Filled with total CPU ticks.
FwSizeType used
Filled with non-idle (system, user) CPU ticks.
FwSizeType used
Filled with used bytes of volatile memory (permanent, paged-in)
FwSizeType total
Filled with total non-volatile memory.
static const char *const PROJECT_VERSION
Definition: version.hpp:13
static const char *const FRAMEWORK_VERSION
Definition: version.hpp:12