GCC Code Coverage Report


Directory: ./
File: Svc/ActiveTextLogger/ActiveTextLogger.cpp
Date: 2026-09-03 22:12:29
Exec Total Coverage
Lines: 0 64 0.0%
Functions: 0 7 0.0%
Branches: 0 40 0.0%

Line Branch Exec Source
1 // \copyright
2 // Copyright 2009-2015, by the California Institute of Technology.
3 // ALL RIGHTS RESERVED. United States Government Sponsorship
4 // acknowledged.
5
6 #include <Fw/Logger/Logger.hpp>
7 #include <Fw/Types/Assert.hpp>
8 #include <Svc/ActiveTextLogger/ActiveTextLogger.hpp>
9 #include <ctime>
10
11 namespace Svc {
12 static_assert(std::numeric_limits<FwSizeType>::max() >= ACTIVE_TEXT_LOGGER_ID_FILTER_SIZE,
13 "ACTIVE_TEXT_LOGGER_ID_FILTER_SIZE must fit within range of FwSizeType");
14
15 // ----------------------------------------------------------------------
16 // Initialization/Exiting
17 // ----------------------------------------------------------------------
18
19 ActiveTextLogger::ActiveTextLogger(const char* name)
20 : ActiveTextLoggerComponentBase(name), m_log_file(), m_numFilteredIDs(0), m_severityFilter() {
21 // Set severity filter defaults from config
22 this->m_severityFilter.setFilter(Fw::LogSeverity::WARNING_HI, ACTIVE_TEXT_LOGGER_FILTER_WARNING_HI_DEFAULT);
23 this->m_severityFilter.setFilter(Fw::LogSeverity::WARNING_LO, ACTIVE_TEXT_LOGGER_FILTER_WARNING_LO_DEFAULT);
24 this->m_severityFilter.setFilter(Fw::LogSeverity::COMMAND, ACTIVE_TEXT_LOGGER_FILTER_COMMAND_DEFAULT);
25 this->m_severityFilter.setFilter(Fw::LogSeverity::ACTIVITY_HI, ACTIVE_TEXT_LOGGER_FILTER_ACTIVITY_HI_DEFAULT);
26 this->m_severityFilter.setFilter(Fw::LogSeverity::ACTIVITY_LO, ACTIVE_TEXT_LOGGER_FILTER_ACTIVITY_LO_DEFAULT);
27 this->m_severityFilter.setFilter(Fw::LogSeverity::DIAGNOSTIC, ACTIVE_TEXT_LOGGER_FILTER_DIAGNOSTIC_DEFAULT);
28 }
29
30 ActiveTextLogger::~ActiveTextLogger() {}
31
32 void ActiveTextLogger::configure(const FwEventIdType* filteredIds, FwSizeType count) {
33 FW_ASSERT(filteredIds != nullptr || count == 0);
34 FW_ASSERT(count <= ACTIVE_TEXT_LOGGER_ID_FILTER_SIZE, static_cast<FwAssertArgType>(count),
35 ACTIVE_TEXT_LOGGER_ID_FILTER_SIZE);
36
37 this->m_numFilteredIDs = count;
38 for (FwSizeType entry = 0; entry < count; entry++) {
39 this->m_filteredIDs[entry] = filteredIds[entry];
40 }
41 }
42
43 void ActiveTextLogger::setSeverityFilter(Fw::LogSeverity severity, bool enabled) {
44 this->m_severityFilter.setFilter(severity, enabled);
45 }
46
47 // ----------------------------------------------------------------------
48 // Handlers to implement for typed input ports
49 // ----------------------------------------------------------------------
50
51 void ActiveTextLogger::TextLogger_handler(FwIndexType portNum,
52 FwEventIdType id,
53 Fw::Time& timeTag,
54 const Fw::LogSeverity& severity,
55 Fw::TextLogString& text) {
56 // Check severity filter
57 if (this->m_severityFilter.isFiltered(severity)) {
58 return;
59 }
60
61 // Check event ID filters
62 for (FwSizeType i = 0; i < this->m_numFilteredIDs; i++) {
63 if (this->m_filteredIDs[i] == id) {
64 return;
65 }
66 }
67
68 // Format the string here, so that it is done in the task context
69 // of the caller. Format doc borrowed from PassiveTextLogger.
70 const char* severityString = nullptr;
71 switch (severity.e) {
72 case Fw::LogSeverity::FATAL:
73 severityString = "FATAL";
74 break;
75 case Fw::LogSeverity::WARNING_HI:
76 severityString = "WARNING_HI";
77 break;
78 case Fw::LogSeverity::WARNING_LO:
79 severityString = "WARNING_LO";
80 break;
81 case Fw::LogSeverity::COMMAND:
82 severityString = "COMMAND";
83 break;
84 case Fw::LogSeverity::ACTIVITY_HI:
85 severityString = "ACTIVITY_HI";
86 break;
87 case Fw::LogSeverity::ACTIVITY_LO:
88 severityString = "ACTIVITY_LO";
89 break;
90 case Fw::LogSeverity::DIAGNOSTIC:
91 severityString = "DIAGNOSTIC";
92 break;
93 default:
94 severityString = "SEVERITY ERROR";
95 break;
96 }
97 FW_ASSERT(severityString != nullptr);
98 // Overflow is allowed and truncation accepted
99 Fw::InternalInterfaceString intText;
100 (void)intText.format("EVENT: (%" PRI_FwEventIdType ") (%" PRI_FwTimeBaseStoreType ":%" PRIu32 ",%" PRIu32
101 ") %s: %s\n",
102 id, static_cast<FwTimeBaseStoreType>(timeTag.getTimeBase()), timeTag.getSeconds(),
103 timeTag.getUSeconds(), severityString, text.toChar());
104
105 // Call internal interface so that everything else is done on component thread,
106 // this helps ensure consistent ordering of the printed text:
107 this->TextQueue_internalInterfaceInvoke(intText);
108 }
109
110 // ----------------------------------------------------------------------
111 // Internal interface handlers
112 // ----------------------------------------------------------------------
113
114 void ActiveTextLogger::TextQueue_internalInterfaceHandler(const Fw::InternalInterfaceString& text) {
115 // Print to console:
116 Fw::Logger::log(text);
117
118 // Print to file if there is one:
119 (void)this->m_log_file.write_to_log(text.toChar(), text.length()); // Ignoring return status
120 }
121
122 // ----------------------------------------------------------------------
123 // Helper Methods
124 // ----------------------------------------------------------------------
125
126 bool ActiveTextLogger::set_log_file(const char* fileName, const U32 maxSize, const U32 maxBackups) {
127 FW_ASSERT(fileName != nullptr);
128
129 return this->m_log_file.set_log_file(fileName, maxSize, maxBackups);
130 }
131
132 } // namespace Svc
133