replaced loggers

This commit is contained in:
2022-05-09 00:09:39 +02:00
parent e1aa39f5e4
commit 6f2e03f003
9 changed files with 238 additions and 312 deletions

View File

@ -80,24 +80,16 @@ object_id_t FsfwExampleTask::getSender() {
ReturnValue_t FsfwExampleTask::initialize() {
// Get the dataset of the sender. Will be cached for later checks.
object_id_t sender = getSender();
HasLocalDataPoolIF* senderIF = ObjectManager::instance()->get<HasLocalDataPoolIF>(sender);
auto* senderIF = ObjectManager::instance()->get<HasLocalDataPoolIF>(sender);
if (senderIF == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "FsfwDemoTask::initialize: Sender object invalid!" << std::endl;
#else
sif::printError("FsfwDemoTask::initialize: Sender object invalid!\n");
#endif
std::cerr << "FsfwDemoTask::initialize: Sender object invalid!" << std::endl;
return HasReturnvaluesIF::RETURN_FAILED;
}
// we need a private copy of the previous dataset.. or we use the shared dataset.
senderSet = new FsfwDemoSet(senderIF);
if (senderSet == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "FsfwDemoTask::initialize: Sender dataset invalid!" << std::endl;
#else
sif::printError("FsfwDemoTask::initialize: Sender dataset invalid!\n");
#endif
std::cerr << "FsfwDemoTask::initialize: Sender dataset invalid!" << std::endl;
return HasReturnvaluesIF::RETURN_FAILED;
}
return poolManager.initialize(commandQueue);
@ -128,11 +120,7 @@ ReturnValue_t FsfwExampleTask::performMonitoringDemo() {
ReturnValue_t result = demoSet.variableLimit.read(MutexIF::TimeoutType::WAITING, 20);
if (result != HasReturnvaluesIF::RETURN_OK) {
/* Configuration error */
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "DummyObject::performOperation: Could not read variableLimit!" << std::endl;
#else
sif::printError("DummyObject::performOperation: Could not read variableLimit!\n");
#endif
std::cerr << "DummyObject::performOperation: Could not read variableLimit!" << std::endl;
return result;
}
if (this->getObjectId() == objects::TEST_DUMMY_5) {
@ -151,11 +139,7 @@ ReturnValue_t FsfwExampleTask::performSendOperation() {
FsfwExampleTask* target = ObjectManager::instance()->get<FsfwExampleTask>(nextRecipient);
if (target == nullptr) {
/* Configuration error */
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "DummyObject::performOperation: Next recipient does not exist!" << std::endl;
#else
sif::printError("DummyObject::performOperation: Next recipient does not exist!\n");
#endif
std::cerr << "DummyObject::performOperation: Next recipient does not exist!" << std::endl;
return HasReturnvaluesIF::RETURN_FAILED;
}
@ -167,22 +151,14 @@ ReturnValue_t FsfwExampleTask::performSendOperation() {
/* Send message using own message queue */
ReturnValue_t result = commandQueue->sendMessage(target->getMessageQueueId(), &message);
if (result != HasReturnvaluesIF::RETURN_OK && result != MessageQueueIF::FULL) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "FsfwDemoTask::performSendOperation: Send failed with " << result << std::endl;
#else
sif::printError("FsfwDemoTask::performSendOperation: Send failed with %hu\n", result);
#endif
std::cerr << "FsfwDemoTask::performSendOperation: Send failed with " << result << std::endl;
}
/* Send message without via MessageQueueSenderIF */
result = MessageQueueSenderIF::sendMessage(target->getMessageQueueId(), &message,
commandQueue->getId());
if (result != HasReturnvaluesIF::RETURN_OK && result != MessageQueueIF::FULL) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "FsfwDemoTask::performSendOperation: Send failed with " << result << std::endl;
#else
sif::printError("FsfwDemoTask::performSendOperation: Send failed with %hu\n", result);
#endif
std::cerr << "FsfwDemoTask::performSendOperation: Send failed with " << result << std::endl;
}
demoSet.variableWrite.value = randomNumber;
@ -197,9 +173,7 @@ ReturnValue_t FsfwExampleTask::performReceiveOperation() {
CommandMessage receivedMessage;
result = commandQueue->receiveMessage(&receivedMessage);
if (result != HasReturnvaluesIF::RETURN_OK && result != MessageQueueIF::EMPTY) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::debug << "Receive failed with " << result << std::endl;
#endif
FSFW_FLOGD("performReceiveOperation: Receive failed with {}\n", result);
break;
}
if (result != MessageQueueIF::EMPTY) {
@ -221,11 +195,11 @@ ReturnValue_t FsfwExampleTask::performReceiveOperation() {
}
if (senderSet->variableRead.value != receivedMessage.getParameter()) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "FsfwDemoTask::performReceiveOperation: Variable " << std::hex << "0x"
<< senderSet->variableRead.getDataPoolId() << std::dec << " has wrong value."
<< std::endl;
sif::error << "Value: " << demoSet.variableRead.value
<< ", expected: " << receivedMessage.getParameter() << std::endl;
std::cerr << "FsfwDemoTask::performReceiveOperation: Variable " << std::hex << "0x"
<< senderSet->variableRead.getDataPoolId() << std::dec << " has wrong value."
<< std::endl;
std::cerr << "Value: " << demoSet.variableRead.value
<< ", expected: " << receivedMessage.getParameter() << std::endl;
#endif
}
}

View File

@ -35,10 +35,10 @@ ReturnValue_t FsfwReaderTask::performOperation(uint8_t operationCode) {
#if OBSW_VERBOSE_LEVEL >= 1
if (opDivider.checkAndIncrement() and printoutEnabled) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::info << "FsfwPeriodicTask::performOperation: Reading variables." << std::endl;
sif::info << "Variable read from demo object 1: " << variable1 << std::endl;
sif::info << "Variable read from demo object 2: " << variable2 << std::endl;
sif::info << "Variable read from demo object 3: " << variable3 << std::endl;
std::cout << "FsfwPeriodicTask::performOperation: Reading variables." << std::endl;
std::cout << "Variable read from demo object 1: " << variable1 << std::endl;
std::cout << "Variable read from demo object 2: " << variable2 << std::endl;
std::cout << "Variable read from demo object 3: " << variable3 << std::endl;
#else
sif::printInfo("FsfwPeriodicTask::performOperation: Reading variables.\n\r");
sif::printInfo("Variable read from demo object 1: %d\n\r", variable1);

View File

@ -1,7 +1,7 @@
#include "MutexExample.h"
#include <fsfw/ipc/MutexFactory.h>
#include <fsfw/serviceinterface/ServiceInterface.h>
#include <fsfw/serviceinterface.h>
void MutexExample::example() {
MutexIF* mutex = MutexFactory::instance()->createMutex();
@ -9,37 +9,21 @@ void MutexExample::example() {
ReturnValue_t result = mutex->lockMutex(MutexIF::TimeoutType::WAITING, 2 * 60 * 1000);
if (result != HasReturnvaluesIF::RETURN_OK) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "MutexExample::example: Lock Failed with " << result << std::endl;
#else
sif::printError("MutexExample::example: Lock Failed with %hu\n", result);
#endif
FSFW_FLOGET("MutexExample::example: Lock Failed with {}\n", result);
}
result = mutex2->lockMutex(MutexIF::TimeoutType::BLOCKING);
if (result != HasReturnvaluesIF::RETURN_OK) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "MutexExample::example: Lock Failed with " << result << std::endl;
#else
sif::printError("MutexExample::example: Lock Failed with %hu\n", result);
#endif
FSFW_FLOGET("MutexExample::example: Lock Failed with {}\n", result);
}
result = mutex->unlockMutex();
if (result != HasReturnvaluesIF::RETURN_OK) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "MutexExample::example: Unlock Failed with " << result << std::endl;
#else
sif::printError("MutexExample::example: Unlock Failed with %hu\n", result);
#endif
FSFW_FLOGET("MutexExample::example: Unlock Failed with {}\n", result);
}
result = mutex2->unlockMutex();
if (result != HasReturnvaluesIF::RETURN_OK) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "MutexExample::example: Unlock Failed with " << result << std::endl;
#else
sif::printError("MutexExample::example: Unlock Failed with %hu\n", result);
#endif
FSFW_FLOGET("MutexExample::example: Unlock Failed with {}\n", result);
}
}

View File

@ -1,14 +1,14 @@
#include "testFmt.h"
#include "fsfw/serviceinterface/fmtWrapper.h"
void fmtTests() {
sif::fdebug(__FILENAME__, __LINE__, "Hello {} {}", "World\n");
sif::fdebug_t(__FILENAME__, __LINE__, "Hallo\n");
FSFW_LOGD("{}", "Hallo\n");
// MY_LOG("{}", "test\n");
// sif::finfo_t("Hallo\n");
// sif::finfo("Hallo\n");
// sif::fwarning("Hello\n");
// sif::fwarning_t("Hello\n");
// sif::ferror("Hello\n");
// sif::ferror_t("Hello\n");
sif::initialize();
sif::debug(__FILENAME__, __LINE__, "Hello {}", "World\n");
sif::debug_t(__FILENAME__, __LINE__, "Hallo\n");
FSFW_FLOGD("{}", "Hallo\n");
sif::info_t("Hallo\n");
sif::info("Hallo\n");
sif::warning(__FILENAME__, __LINE__, "Hello\n");
sif::warning_t(__FILENAME__, __LINE__, "Hello\n");
sif::error(__FILENAME__, __LINE__, "Hello\n");
sif::error_t(__FILENAME__, __LINE__, "Hello\n");
}

View File

@ -1,159 +1,180 @@
#ifndef FSFW_EXAMPLE_HOSTED_TESTFMT_H
#define FSFW_EXAMPLE_HOSTED_TESTFMT_H
#include <fmt/chrono.h>
#include <fmt/color.h>
#include <fmt/compile.h>
#include <fmt/core.h>
#include <array>
#include <cstdint>
#include "fsfw/ipc/MutexFactory.h"
#include "fsfw/ipc/MutexGuard.h"
#include "fsfw/ipc/MutexIF.h"
#include "fsfw/timemanager/Clock.h"
#define __FILENAME_REL__ (((const char*)__FILE__ + SOURCE_PATH_SIZE))
#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
//#ifndef FSFW_EXAMPLE_HOSTED_TESTFMT_H
//#define FSFW_EXAMPLE_HOSTED_TESTFMT_H
//
//#include <fmt/chrono.h>
//#include <fmt/color.h>
//#include <fmt/compile.h>
//#include <fmt/core.h>
//
//#include <array>
//#include <cstdint>
//
//#include "fsfw/ipc/MutexFactory.h"
//#include "fsfw/ipc/MutexGuard.h"
//#include "fsfw/ipc/MutexIF.h"
//#include "fsfw/timemanager/Clock.h"
//
//#define __FILENAME_REL__ (((const char*)__FILE__ + SOURCE_PATH_SIZE))
//#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
//
void fmtTests();
namespace sif {
static std::array<char, 524> PRINT_BUF = {};
static const char INFO_PREFIX[] = "INFO";
static const char DEBUG_PREFIX[] = "DEBUG";
static const char WARNING_PREFIX[] = "WARNING";
static const char ERROR_PREFIX[] = "ERROR";
enum class LogLevel : unsigned int { DEBUG = 0, INFO = 1, WARNING = 2, ERROR = 3 };
static const char* PREFIX_ARR[4] = {DEBUG_PREFIX, INFO_PREFIX, WARNING_PREFIX, ERROR_PREFIX};
static const std::array<fmt::color, 4> LOG_COLOR_ARR = {
fmt::color::deep_sky_blue, fmt::color::forest_green, fmt::color::orange_red, fmt::color::red};
static MutexIF* PRINT_MUTEX = MutexFactory::instance()->createMutex();
static size_t writeTypePrefix(LogLevel level) {
auto idx = static_cast<unsigned int>(level);
const auto result =
fmt::format_to_n(PRINT_BUF.begin(), PRINT_BUF.size() - 1,
fmt::runtime(fmt::format(fg(LOG_COLOR_ARR[idx]), PREFIX_ARR[idx])));
return result.size;
}
template <typename... T>
size_t logTraced(LogLevel level, const char* file, unsigned int line, bool timed,
fmt::format_string<T...> fmt, T&&... args) noexcept {
try {
MutexGuard mg(PRINT_MUTEX);
size_t bufPos = writeTypePrefix(level);
auto currentIter = PRINT_BUF.begin() + bufPos;
if (timed) {
Clock::TimeOfDay_t logTime;
Clock::getDateAndTime(&logTime);
const auto result = fmt::format_to_n(currentIter, PRINT_BUF.size() - 1 - bufPos,
" | {}[l.{}] | {:02}:{:02}:{:02}.{:03} | {}", file, line,
logTime.hour, logTime.minute, logTime.second,
logTime.usecond / 1000, fmt::format(fmt, args...));
*result.out = '\0';
bufPos += result.size;
} else {
const auto result = fmt::format_to_n(currentIter, PRINT_BUF.size() - 1 - bufPos,
" | {}[l.{}] | {}", file, line, fmt::format(fmt, args...));
*result.out = '\0';
bufPos += result.size;
}
fmt::print(fmt::runtime(PRINT_BUF.data()));
return bufPos;
} catch (const fmt::v8::format_error& e) {
fmt::print("Printing failed with error: {}\n", e.what());
return 0;
}
}
template <typename... T>
size_t log(LogLevel level, bool timed, fmt::format_string<T...> fmt, T&&... args) noexcept {
try {
MutexGuard mg(PRINT_MUTEX);
size_t bufPos = writeTypePrefix(level);
auto currentIter = PRINT_BUF.begin() + bufPos;
if (timed) {
Clock::TimeOfDay_t logTime;
Clock::getDateAndTime(&logTime);
const auto result = fmt::format_to_n(
currentIter, PRINT_BUF.size() - bufPos, " | {:02}:{:02}:{:02}.{:03} | {}", logTime.hour,
logTime.minute, logTime.second, logTime.usecond / 1000, fmt::format(fmt, args...));
bufPos += result.size;
}
fmt::print(fmt::runtime(PRINT_BUF.data()));
return bufPos;
} catch (const fmt::v8::format_error& e) {
fmt::print("Printing failed with error: {}\n", e.what());
return 0;
}
}
template <typename... T>
void fdebug(const char* file, unsigned int line, fmt::format_string<T...> fmt, T&&... args) noexcept {
logTraced(LogLevel::DEBUG, file, line, false, fmt, args...);
}
template <typename... T>
void fdebug_t(const char* file, unsigned int line, fmt::format_string<T...> fmt, T&&... args) noexcept {
logTraced(LogLevel::DEBUG, file, line, true, fmt, args...);
}
template <typename... T>
void finfo_t(fmt::format_string<T...> fmt, T&&... args) {
log(LogLevel::INFO, true, fmt, args...);
}
template <typename... T>
void finfo(fmt::format_string<T...> fmt, T&&... args) {
log(LogLevel::INFO, false, fmt, args...);
}
template <typename... T>
void fwarning(const char* file, unsigned int line, fmt::format_string<T...> fmt, T&&... args) {
logTraced(LogLevel::WARNING, file, line, false, fmt, args...);
}
template <typename... T>
void fwarning_t(const char* file, unsigned int line, fmt::format_string<T...> fmt, T&&... args) {
logTraced(LogLevel::WARNING, file, line, true, fmt, args...);
}
template <typename... T>
void ferror(const char* file, unsigned int line, fmt::format_string<T...> fmt, T&&... args) {
logTraced(LogLevel::ERROR, file, line, false, fmt, args...);
}
template <typename... T>
void ferror_t(const char* file, unsigned int line, fmt::format_string<T...> fmt, T&&... args) {
logTraced(LogLevel::ERROR, file, line, true, fmt, args...);
}
} // namespace sif
#define FSFW_LOGI(format, ...) finfo(FMT_STRING(format), __VA_ARGS__)
#define FSFW_LOGIT(format, ...) finfo_t(FMT_STRING(format), __VA_ARGS__)
#define FSFW_LOGD(format, ...) sif::fdebug(__FILENAME__, __LINE__, FMT_STRING(format), __VA_ARGS__)
#define FSFW_LOGDT(format, ...) fdebug_t(__FILENAME__, __LINE__, FMT_STRING(format), __VA_ARGS__)
#define FSFW_LOGW(format, ...) fdebug(__FILENAME__, __LINE__, FMT_STRING(format), __VA_ARGS__)
#define FSFW_LOGWT(format, ...) fdebug_t(__FILENAME__, __LINE__, FMT_STRING(format), __VA_ARGS__)
#define FSFW_LOGE(format, ...) fdebug(__FILENAME__, __LINE__, FMT_STRING(format), __VA_ARGS__)
#define FSFW_LOGET(format, ...) fdebug_t(__FILENAME__, __LINE__, FMT_STRING(format), __VA_ARGS__)
#endif // FSFW_EXAMPLE_HOSTED_TESTFMT_H
//
// namespace sif {
//
// static std::array<char, 524> _PRINT_BUF = {};
//
// static const char INFO_PREFIX[] = "INFO";
// static const char DEBUG_PREFIX[] = "DEBUG";
// static const char WARNING_PREFIX[] = "WARNING";
// static const char ERROR_PREFIX[] = "ERROR";
//
// enum class LogLevel : unsigned int { DEBUG = 0, INFO = 1, WARNING = 2, ERROR = 3 };
//
// static const char* PREFIX_ARR[4] = {DEBUG_PREFIX, INFO_PREFIX, WARNING_PREFIX, ERROR_PREFIX};
//
// static const std::array<fmt::color, 4> LOG_COLOR_ARR = {
// fmt::color::deep_sky_blue, fmt::color::forest_green, fmt::color::orange_red, fmt::color::red};
//
// static MutexIF* PRINT_MUTEX = nullptr;
//
////static ReturnValue_t initialize() {
//// PRINT_MUTEX = MutexFactory::instance()->createMutex();
//// if(PRINT_MUTEX == nullptr) {
//// return HasReturnvaluesIF::RETURN_FAILED;
//// }
//// return HasReturnvaluesIF::RETURN_OK;
////}
//
// static size_t writeTypePrefix(LogLevel level) {
// auto idx = static_cast<unsigned int>(level);
// const auto result =
// fmt::format_to_n(_PRINT_BUF.begin(), _PRINT_BUF.size() - 1,
// fmt::runtime(fmt::format(fg(LOG_COLOR_ARR[idx]), PREFIX_ARR[idx])));
// return result.size;
//}
//
// template <typename... T>
// size_t logTraced(LogLevel level, const char* file, unsigned int line, bool timed,
// fmt::format_string<T...> fmt, T&&... args) noexcept {
// if(PRINT_MUTEX == nullptr) {
// fmt::print("Please call sif::initialize at program startup\n");
// return 0;
// }
// try {
// MutexGuard mg(PRINT_MUTEX);
// size_t bufPos = writeTypePrefix(level);
// auto currentIter = _PRINT_BUF.begin() + bufPos;
// if (timed) {
// Clock::TimeOfDay_t logTime;
// Clock::getDateAndTime(&logTime);
// const auto result = fmt::format_to_n(currentIter, _PRINT_BUF.size() - 1 - bufPos,
// " | {}[l.{}] | {:02}:{:02}:{:02}.{:03} | {}", file,
// line, logTime.hour, logTime.minute, logTime.second,
// logTime.usecond / 1000, fmt::format(fmt, args...));
// *result.out = '\0';
// bufPos += result.size;
// } else {
// const auto result = fmt::format_to_n(currentIter, _PRINT_BUF.size() - 1 - bufPos,
// " | {}[l.{}] | {}", file, line, fmt::format(fmt,
// args...));
// *result.out = '\0';
// bufPos += result.size;
// }
//
// fmt::print(fmt::runtime(_PRINT_BUF.data()));
// return bufPos;
// } catch (const fmt::v8::format_error& e) {
// fmt::print("Printing failed with error: {}\n", e.what());
// return 0;
// }
//}
//
// template <typename... T>
// size_t log(LogLevel level, bool timed, fmt::format_string<T...> fmt, T&&... args) noexcept {
// if(PRINT_MUTEX == nullptr) {
// fmt::print("Please call sif::initialize at program startup\n");
// return 0;
// }
// try {
// MutexGuard mg(PRINT_MUTEX);
// size_t bufPos = writeTypePrefix(level);
// auto currentIter = _PRINT_BUF.begin() + bufPos;
// if (timed) {
// Clock::TimeOfDay_t logTime;
// Clock::getDateAndTime(&logTime);
// const auto result = fmt::format_to_n(
// currentIter, _PRINT_BUF.size() - bufPos, " | {:02}:{:02}:{:02}.{:03} | {}",
// logTime.hour, logTime.minute, logTime.second, logTime.usecond / 1000, fmt::format(fmt,
// args...));
// bufPos += result.size;
// }
// fmt::print(fmt::runtime(_PRINT_BUF.data()));
// return bufPos;
// } catch (const fmt::v8::format_error& e) {
// fmt::print("Printing failed with error: {}\n", e.what());
// return 0;
// }
//}
//
// template <typename... T>
// void fdebug(const char* file, unsigned int line, fmt::format_string<T...> fmt, T&&... args)
// noexcept {
// logTraced(LogLevel::DEBUG, file, line, false, fmt, args...);
//}
//
// template <typename... T>
// void fdebug_t(const char* file, unsigned int line, fmt::format_string<T...> fmt, T&&... args)
// noexcept {
// logTraced(LogLevel::DEBUG, file, line, true, fmt, args...);
//}
//
// template <typename... T>
// void finfo_t(fmt::format_string<T...> fmt, T&&... args) {
// log(LogLevel::INFO, true, fmt, args...);
//}
//
// template <typename... T>
// void finfo(fmt::format_string<T...> fmt, T&&... args) {
// log(LogLevel::INFO, false, fmt, args...);
//}
//
// template <typename... T>
// void fwarning(const char* file, unsigned int line, fmt::format_string<T...> fmt, T&&... args) {
// logTraced(LogLevel::WARNING, file, line, false, fmt, args...);
//}
//
// template <typename... T>
// void fwarning_t(const char* file, unsigned int line, fmt::format_string<T...> fmt, T&&... args) {
// logTraced(LogLevel::WARNING, file, line, true, fmt, args...);
//}
//
// template <typename... T>
// void ferror(const char* file, unsigned int line, fmt::format_string<T...> fmt, T&&... args) {
// logTraced(LogLevel::ERROR, file, line, false, fmt, args...);
//}
//
// template <typename... T>
// void ferror_t(const char* file, unsigned int line, fmt::format_string<T...> fmt, T&&... args) {
// logTraced(LogLevel::ERROR, file, line, true, fmt, args...);
//}
//
//} // namespace sif
//
//#define FSFW_FLOGI(format, ...) finfo(FMT_STRING(format), __VA_ARGS__)
//
//#define FSFW_FLOGIT(format, ...) finfo_t(FMT_STRING(format), __VA_ARGS__)
//
//#define FSFW_FLOGD(format, ...) sif::fdebug(__FILENAME__, __LINE__, FMT_STRING(format),
//__VA_ARGS__)
//
//#define FSFW_FLOGDT(format, ...) fdebug_t(__FILENAME__, __LINE__, FMT_STRING(format), __VA_ARGS__)
//
//#define FSFW_FLOGW(format, ...) fdebug(__FILENAME__, __LINE__, FMT_STRING(format), __VA_ARGS__)
//
//#define FSFW_FLOGWT(format, ...) fdebug_t(__FILENAME__, __LINE__, FMT_STRING(format), __VA_ARGS__)
//
//#define FSFW_FLOGE(format, ...) fdebug(__FILENAME__, __LINE__, FMT_STRING(format), __VA_ARGS__)
//
//#define FSFW_FLOGET(format, ...) fdebug_t(__FILENAME__, __LINE__, FMT_STRING(format), __VA_ARGS__)
//
//#endif // FSFW_EXAMPLE_HOSTED_TESTFMT_H