GCC Code Coverage Report


Directory: ./
File: Svc/ActiveTextLogger/ActiveTextLogger.cpp
Date: 2026-09-23 22:11:34
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