Compare commits

...

7 Commits

13 changed files with 112 additions and 467 deletions

View File

@ -6,7 +6,7 @@
#include <cstdint> #include <cstdint>
#cmakedefine01 FSFW_ADD_FMT_TESTS #cmakedefine01 OBSW_ADD_FMT_TESTS
//! Specify the debug output verbose level //! Specify the debug output verbose level
#define OBSW_VERBOSE_LEVEL 1 #define OBSW_VERBOSE_LEVEL 1

View File

@ -33,13 +33,7 @@ ReturnValue_t pst::pollingSequenceExamples(FixedTimeslotTaskIF *thisSequence) {
if (thisSequence->checkSequence() == HasReturnvaluesIF::RETURN_OK) { if (thisSequence->checkSequence() == HasReturnvaluesIF::RETURN_OK) {
return HasReturnvaluesIF::RETURN_OK; return HasReturnvaluesIF::RETURN_OK;
} else { } else {
#if FSFW_CPP_OSTREAM_ENABLED == 1 FSFW_LOGE("pst::pollingSequenceInitFunction: Initialization errors\n");
sif::error << "pst::pollingSequenceInitFunction: Initialization errors!"
<< std::endl;
#else
sif::printError(
"pst::pollingSequenceInitFunction: Initialization errors!\n");
#endif
return HasReturnvaluesIF::RETURN_FAILED; return HasReturnvaluesIF::RETURN_FAILED;
} }
} }
@ -75,13 +69,7 @@ ReturnValue_t pst::pollingSequenceDevices(FixedTimeslotTaskIF *thisSequence) {
if (thisSequence->checkSequence() == HasReturnvaluesIF::RETURN_OK) { if (thisSequence->checkSequence() == HasReturnvaluesIF::RETURN_OK) {
return HasReturnvaluesIF::RETURN_OK; return HasReturnvaluesIF::RETURN_OK;
} else { } else {
#if FSFW_CPP_OSTREAM_ENABLED == 1 FSFW_LOGE("pst::pollingSequenceTestFunction: Initialization errors\n");
sif::error << "pst::pollingSequenceTestFunction: Initialization errors!"
<< std::endl;
#else
sif::printError(
"pst::pollingSequenceTestFunction: Initialization errors!\n");
#endif
return HasReturnvaluesIF::RETURN_FAILED; return HasReturnvaluesIF::RETURN_FAILED;
} }
} }

View File

@ -27,36 +27,26 @@ void FsfwTestController::performControlOperation() {
return; return;
} }
switch (currentTraceType) { switch (currentTraceType) {
case (NONE): { case (NONE): {
break; break;
} }
case (TRACE_DEV_0_UINT8): { case (TRACE_DEV_0_UINT8): {
if (traceCounter == 0) { if (traceCounter == 0) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 FSFW_LOGI("Tracing finished\n");
sif::info << "Tracing finished" << std::endl; traceVariable = false;
#else traceCounter = traceCycles;
sif::printInfo("Tracing finished\n"); currentTraceType = TraceTypes::NONE;
#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */ break;
traceVariable = false; }
traceCounter = traceCycles; PoolReadGuard readHelper(&deviceDataset0.testUint8Var);
currentTraceType = TraceTypes::NONE; FSFW_LOGI("Tracing device 0 variable 0 (UINT8), current value: {}",
static_cast<int>(deviceDataset0.testUint8Var.value));
traceCounter--;
break;
}
case (TRACE_DEV_0_VECTOR): {
break; break;
} }
PoolReadGuard readHelper(&deviceDataset0.testUint8Var);
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::info << "Tracing device 0 variable 0 (UINT8), current value: "
<< static_cast<int>(deviceDataset0.testUint8Var.value)
<< std::endl;
#else
sif::printInfo("Tracing device 0 variable 0 (UINT8), current value: %d\n",
deviceDataset0.testUint8Var.value);
#endif
traceCounter--;
break;
}
case (TRACE_DEV_0_VECTOR): {
break;
}
} }
} }
} }
@ -67,20 +57,10 @@ ReturnValue_t FsfwTestController::initializeAfterTaskCreation() {
if (result != HasReturnvaluesIF::RETURN_OK) { if (result != HasReturnvaluesIF::RETURN_OK) {
return result; return result;
} }
HasLocalDataPoolIF *device0 = auto* device0 =
ObjectManager::instance()->get<HasLocalDataPoolIF>( ObjectManager::instance()->get<HasLocalDataPoolIF>(deviceDataset0.getCreatorObjectId());
deviceDataset0.getCreatorObjectId());
if (device0 == nullptr) { if (device0 == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 FSFW_LOGW("initializeAfterTaskCreation: Test device handler 0 handle invalid\n");
sif::warning
<< "TestController::initializeAfterTaskCreation: Test device handler 0 "
"handle invalid!"
<< std::endl;
#else
sif::printWarning(
"TestController::initializeAfterTaskCreation: Test device handler 0 "
"handle invalid!");
#endif
return ObjectManagerIF::CHILD_INIT_FAILED; return ObjectManagerIF::CHILD_INIT_FAILED;
} }
ProvidesDataPoolSubscriptionIF *subscriptionIF = ProvidesDataPoolSubscriptionIF *subscriptionIF =
@ -93,20 +73,10 @@ ReturnValue_t FsfwTestController::initializeAfterTaskCreation() {
td::PoolIds::TEST_UINT8_ID, getObjectId(), getCommandQueue(), false); td::PoolIds::TEST_UINT8_ID, getObjectId(), getCommandQueue(), false);
} }
HasLocalDataPoolIF *device1 = auto* device1 =
ObjectManager::instance()->get<HasLocalDataPoolIF>( ObjectManager::instance()->get<HasLocalDataPoolIF>(deviceDataset0.getCreatorObjectId());
deviceDataset0.getCreatorObjectId());
if (device1 == nullptr) { if (device1 == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 FSFW_LOGW("initializeAfterTaskCreation: Test device handler 1 handle invalid\n");
sif::warning
<< "TestController::initializeAfterTaskCreation: Test device handler 1 "
"handle invalid!"
<< std::endl;
#else
sif::printWarning(
"TestController::initializeAfterTaskCreation: Test device handler 1 "
"handle invalid!");
#endif
} }
subscriptionIF = device1->getSubscriptionInterface(); subscriptionIF = device1->getSubscriptionInterface();
@ -142,19 +112,8 @@ void FsfwTestController::handleChangedDataset(sid_t sid,
} else { } else {
printout = "Snapshot"; printout = "Snapshot";
} }
#if FSFW_CPP_OSTREAM_ENABLED == 1 FSFW_LOGI("handleChangedDataset: {} update from object ID {:#010x} and set ID {}\n", printout,
sif::info << "FsfwTestController::handleChangedDataset: " << printout sid.objectId, sid.ownerSetId);
<< " update"
"from object ID "
<< setw(8) << setfill('0') << hex << sid.objectId
<< " and set ID " << sid.ownerSetId << dec << setfill(' ')
<< endl;
#else
sif::printInfo(
"FsfwTestController::handleChangedPoolVariable: %s update from"
"object ID 0x%08x and set ID %lu\n",
printout, sid.objectId, sid.ownerSetId);
#endif
if (storeId == storeId::INVALID_STORE_ADDRESS) { if (storeId == storeId::INVALID_STORE_ADDRESS) {
if (sid.objectId == device0Id) { if (sid.objectId == device0Id) {
@ -163,13 +122,8 @@ void FsfwTestController::handleChangedDataset(sid_t sid,
floatVec[0] = deviceDataset0.testFloat3Vec.value[0]; floatVec[0] = deviceDataset0.testFloat3Vec.value[0];
floatVec[1] = deviceDataset0.testFloat3Vec.value[1]; floatVec[1] = deviceDataset0.testFloat3Vec.value[1];
floatVec[2] = deviceDataset0.testFloat3Vec.value[2]; floatVec[2] = deviceDataset0.testFloat3Vec.value[2];
#if FSFW_CPP_OSTREAM_ENABLED == 1 FSFW_LOGI("Current float vector (3) values: [{},{},{}]\n", floatVec[0], floatVec[1],
sif::info << "Current float vector (3) values: [" << floatVec[0] << ", " floatVec[2]);
<< floatVec[1] << ", " << floatVec[2] << "]" << std::endl;
#else
sif::printInfo("Current float vector (3) values: [%f, %f, %f]\n",
floatVec[0], floatVec[1], floatVec[2]);
#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */
} }
} }
} }
@ -195,31 +149,16 @@ void FsfwTestController::handleChangedPoolVariable(gp_id_t globPoolId,
printout = "Snapshot"; printout = "Snapshot";
} }
#if FSFW_CPP_OSTREAM_ENABLED == 1 FSFW_LOGI(
sif::info << "TestController::handleChangedPoolVariable: " << printout "TestController::handleChangedPoolVariable: {} update from object "
<< " update from object " "ID {:#010x} and LPID {}\n",
"ID 0x" printout, globPoolId.objectId, globPoolId.localPoolId);
<< setw(8) << setfill('0') << hex << globPoolId.objectId
<< " and local pool ID " << globPoolId.localPoolId << dec
<< setfill(' ') << endl;
#else
sif::printInfo("TestController::handleChangedPoolVariable: %s update from "
"object ID 0x%08x and "
"local pool ID %lu\n",
printout, globPoolId.objectId, globPoolId.localPoolId);
#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */
if (storeId == storeId::INVALID_STORE_ADDRESS) { if (storeId == storeId::INVALID_STORE_ADDRESS) {
if (globPoolId.objectId == device0Id) { if (globPoolId.objectId == device0Id) {
PoolReadGuard readHelper(&deviceDataset0.testUint8Var); PoolReadGuard readHelper(&deviceDataset0.testUint8Var);
#if FSFW_CPP_OSTREAM_ENABLED == 1 FSFW_LOGI("Current test variable 0 (UINT8) value: {}",
sif::info << "Current test variable 0 (UINT8) value: " static_cast<int>(deviceDataset0.testUint8Var.value));
<< static_cast<int>(deviceDataset0.testUint8Var.value)
<< std::endl;
#else
sif::printInfo("Current test variable 0 (UINT8) value %d\n",
deviceDataset0.testUint8Var.value);
#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */
} }
} }
} }

View File

@ -1,6 +1,8 @@
target_sources(${TARGET_NAME} PRIVATE FsfwReaderTask.cpp FsfwExampleTask.cpp target_sources(${TARGET_NAME} PRIVATE FsfwReaderTask.cpp FsfwExampleTask.cpp
MutexExample.cpp FsfwTestTask.cpp) MutexExample.cpp FsfwTestTask.cpp)
if(FSFW_ADD_FMT_TESTS) if(OBSW_ADD_FMT_TESTS)
target_sources(${TARGET_NAME} PRIVATE testFmt.cpp) target_sources(${TARGET_NAME} PRIVATE
testFmt.cpp
)
endif() endif()

View File

@ -3,7 +3,7 @@
#include <fsfw/ipc/CommandMessage.h> #include <fsfw/ipc/CommandMessage.h>
#include <fsfw/ipc/QueueFactory.h> #include <fsfw/ipc/QueueFactory.h>
#include <fsfw/objectmanager/ObjectManager.h> #include <fsfw/objectmanager/ObjectManager.h>
#include <fsfw/serviceinterface/ServiceInterface.h> #include <fsfw/serviceinterface.h>
#include <fsfw/tasks/TaskFactory.h> #include <fsfw/tasks/TaskFactory.h>
#include "OBSWConfig.h" #include "OBSWConfig.h"
@ -80,15 +80,9 @@ object_id_t FsfwExampleTask::getSender() {
ReturnValue_t FsfwExampleTask::initialize() { ReturnValue_t FsfwExampleTask::initialize() {
// Get the dataset of the sender. Will be cached for later checks. // Get the dataset of the sender. Will be cached for later checks.
object_id_t sender = getSender(); object_id_t sender = getSender();
HasLocalDataPoolIF *senderIF = auto* senderIF = ObjectManager::instance()->get<HasLocalDataPoolIF>(sender);
ObjectManager::instance()->get<HasLocalDataPoolIF>(sender);
if (senderIF == nullptr) { if (senderIF == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 FSFW_LOGE("initialize: Sender object invalid\n");
sif::error << "FsfwDemoTask::initialize: Sender object invalid!"
<< std::endl;
#else
sif::printError("FsfwDemoTask::initialize: Sender object invalid!\n");
#endif
return HasReturnvaluesIF::RETURN_FAILED; return HasReturnvaluesIF::RETURN_FAILED;
} }
@ -96,12 +90,7 @@ ReturnValue_t FsfwExampleTask::initialize() {
// dataset. // dataset.
senderSet = new FsfwDemoSet(senderIF); senderSet = new FsfwDemoSet(senderIF);
if (senderSet == nullptr) { if (senderSet == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 FSFW_LOGE("initialize: Sender dataset invalid\n");
sif::error << "FsfwDemoTask::initialize: Sender dataset invalid!"
<< std::endl;
#else
sif::printError("FsfwDemoTask::initialize: Sender dataset invalid!\n");
#endif
return HasReturnvaluesIF::RETURN_FAILED; return HasReturnvaluesIF::RETURN_FAILED;
} }
return poolManager.initialize(commandQueue); return poolManager.initialize(commandQueue);
@ -144,13 +133,7 @@ ReturnValue_t FsfwExampleTask::performMonitoringDemo() {
demoSet.variableLimit.read(MutexIF::TimeoutType::WAITING, 20); demoSet.variableLimit.read(MutexIF::TimeoutType::WAITING, 20);
if (result != HasReturnvaluesIF::RETURN_OK) { if (result != HasReturnvaluesIF::RETURN_OK) {
/* Configuration error */ /* Configuration error */
#if FSFW_CPP_OSTREAM_ENABLED == 1 FSFW_LOGE("DummyObject::performOperation: Could not read variableLimit\n");
sif::error << "DummyObject::performOperation: Could not read variableLimit!"
<< std::endl;
#else
sif::printError(
"DummyObject::performOperation: Could not read variableLimit!\n");
#endif
return result; return result;
} }
if (this->getObjectId() == objects::TEST_DUMMY_5) { if (this->getObjectId() == objects::TEST_DUMMY_5) {
@ -158,7 +141,7 @@ ReturnValue_t FsfwExampleTask::performMonitoringDemo() {
demoSet.variableLimit.value = 0; demoSet.variableLimit.value = 0;
} }
demoSet.variableLimit.value++; demoSet.variableLimit.value++;
demoSet.variableLimit.commit(20); demoSet.variableLimit.commit(true);
monitor.check(); monitor.check();
} }
return HasReturnvaluesIF::RETURN_OK; return HasReturnvaluesIF::RETURN_OK;
@ -166,18 +149,10 @@ ReturnValue_t FsfwExampleTask::performMonitoringDemo() {
ReturnValue_t FsfwExampleTask::performSendOperation() { ReturnValue_t FsfwExampleTask::performSendOperation() {
object_id_t nextRecipient = getNextRecipient(); object_id_t nextRecipient = getNextRecipient();
FsfwExampleTask *target = auto* target = ObjectManager::instance()->get<FsfwExampleTask>(nextRecipient);
ObjectManager::instance()->get<FsfwExampleTask>(nextRecipient);
if (target == nullptr) { if (target == nullptr) {
/* Configuration error */ /* Configuration error */
#if FSFW_CPP_OSTREAM_ENABLED == 1 FSFW_LOGE("performSendOperation: Next recipient does not exist\n");
sif::error
<< "DummyObject::performOperation: Next recipient does not exist!"
<< std::endl;
#else
sif::printError(
"DummyObject::performOperation: Next recipient does not exist!\n");
#endif
return HasReturnvaluesIF::RETURN_FAILED; return HasReturnvaluesIF::RETURN_FAILED;
} }
@ -187,35 +162,20 @@ ReturnValue_t FsfwExampleTask::performSendOperation() {
message.setParameter2(this->getMessageQueueId()); message.setParameter2(this->getMessageQueueId());
/* Send message using own message queue */ /* Send message using own message queue */
ReturnValue_t result = ReturnValue_t result = commandQueue->sendMessage(target->getMessageQueueId(), &message);
commandQueue->sendMessage(target->getMessageQueueId(), &message); if (result != HasReturnvaluesIF::RETURN_OK && result != MessageQueueIF::FULL) {
if (result != HasReturnvaluesIF::RETURN_OK && FSFW_LOGE("performSendOperation: Send failed with {:#06x}\n", result);
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
} }
/* Send message without via MessageQueueSenderIF */ /* Send message without via MessageQueueSenderIF */
result = MessageQueueSenderIF::sendMessage(target->getMessageQueueId(), result = MessageQueueSenderIF::sendMessage(target->getMessageQueueId(), &message,
&message, commandQueue->getId()); commandQueue->getId());
if (result != HasReturnvaluesIF::RETURN_OK && if (result != HasReturnvaluesIF::RETURN_OK && result != MessageQueueIF::FULL) {
result != MessageQueueIF::FULL) { FSFW_LOGE("performSendOperation: Send failed with {:#06x}\n", result);
#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
} }
demoSet.variableWrite.value = randomNumber; demoSet.variableWrite.value = randomNumber;
result = demoSet.variableWrite.commit(20); result = demoSet.variableWrite.commit(true);
return result; return result;
} }
@ -225,11 +185,8 @@ ReturnValue_t FsfwExampleTask::performReceiveOperation() {
while (result != MessageQueueIF::EMPTY) { while (result != MessageQueueIF::EMPTY) {
CommandMessage receivedMessage; CommandMessage receivedMessage;
result = commandQueue->receiveMessage(&receivedMessage); result = commandQueue->receiveMessage(&receivedMessage);
if (result != HasReturnvaluesIF::RETURN_OK && if (result != HasReturnvaluesIF::RETURN_OK && result != MessageQueueIF::EMPTY) {
result != MessageQueueIF::EMPTY) { FSFW_LOGD("performReceiveOperation: Receive failed with {}\n", result);
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::debug << "Receive failed with " << result << std::endl;
#endif
break; break;
} }
if (result != MessageQueueIF::EMPTY) { if (result != MessageQueueIF::EMPTY) {
@ -251,15 +208,10 @@ ReturnValue_t FsfwExampleTask::performReceiveOperation() {
return result; return result;
} }
if (senderSet->variableRead.value != receivedMessage.getParameter()) { if (senderSet->variableRead.value != receivedMessage.getParameter()) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 FSFW_LOGE(
sif::error << "FsfwDemoTask::performReceiveOperation: Variable " "FsfwDemoTask::performReceiveOperation: Variable {} has wrong value {}, expected {}\n",
<< std::hex << "0x" senderSet->variableRead.getDataPoolId(), demoSet.variableRead.value,
<< senderSet->variableRead.getDataPoolId() << std::dec receivedMessage.getParameter());
<< " has wrong value." << std::endl;
sif::error << "Value: " << demoSet.variableRead.value
<< ", expected: " << receivedMessage.getParameter()
<< std::endl;
#endif
} }
} }
} }

View File

@ -2,7 +2,7 @@
#include <OBSWConfig.h> #include <OBSWConfig.h>
#include <fsfw/datapool/PoolReadGuard.h> #include <fsfw/datapool/PoolReadGuard.h>
#include <fsfw/serviceinterface/ServiceInterface.h> #include <fsfw/serviceinterface.h>
#include <fsfw/tasks/TaskFactory.h> #include <fsfw/tasks/TaskFactory.h>
#include <fsfw/timemanager/Stopwatch.h> #include <fsfw/timemanager/Stopwatch.h>
@ -32,25 +32,11 @@ ReturnValue_t FsfwReaderTask::performOperation(uint8_t operationCode) {
uint32_t variable2 = readSet.variable2.value; uint32_t variable2 = readSet.variable2.value;
uint32_t variable3 = readSet.variable3.value; uint32_t variable3 = readSet.variable3.value;
#if OBSW_VERBOSE_LEVEL >= 1
if (opDivider.checkAndIncrement() and printoutEnabled) { if (opDivider.checkAndIncrement() and printoutEnabled) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 FSFW_LOGI(
sif::info << "FsfwPeriodicTask::performOperation: Reading variables." "FsfwPeriodicTask::performOperation: Reading variables from Demo "
<< std::endl; "Object 1,2,3\n1 {} | 2 {} | 3 {}\n",
sif::info << "Variable read from demo object 1: " << variable1 << std::endl; variable1, variable2, variable3);
sif::info << "Variable read from demo object 2: " << variable2 << std::endl;
sif::info << "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);
sif::printInfo("Variable read from demo object 2: %d\n\r", variable2);
sif::printInfo("Variable read from demo object 3: %d\n\r", variable3);
#endif
} }
#else
if (variable1 and variable2 and variable3) {
};
#endif
return HasReturnvaluesIF::RETURN_OK; return HasReturnvaluesIF::RETURN_OK;
} }

View File

@ -2,13 +2,13 @@
#include <commonConfig.h> #include <commonConfig.h>
#if FSFW_ADD_FMT_TESTS == 1 #if OBSW_ADD_FMT_TESTS == 1
#include "testFmt.h" #include "testFmt.h"
#endif #endif
FsfwTestTask::FsfwTestTask(object_id_t objectId, bool periodicEvent) FsfwTestTask::FsfwTestTask(object_id_t objectId, bool periodicEvent)
: TestTask(objectId), periodicEvent(periodicEvent) { : TestTask(objectId), periodicEvent(periodicEvent) {
#if FSFW_ADD_FMT_TESTS == 1 #if OBSW_ADD_FMT_TESTS == 1
fmtTests(); fmtTests();
#endif #endif
} }

View File

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

View File

@ -1,14 +1,20 @@
#include "testFmt.h" #include "fsfw/serviceinterface/fmtWrapper.h"
void fmtTests() { void fmtTests() {
sif::fdebug(__FILENAME__, __LINE__, "Hello {} {}", "World\n"); sif::initialize();
sif::fdebug_t(__FILENAME__, __LINE__, "Hallo\n"); sif::debug_s(__FILENAME__, __LINE__, "Hello {}", "World\n");
sif::debug_st(__FILENAME__, __LINE__, "Hallo\n");
FSFW_LOGD("{}", "Hallo\n"); FSFW_LOGD("{}", "Hallo\n");
// MY_LOG("{}", "test\n"); sif::info_t("Hallo\n");
// sif::finfo_t("Hallo\n"); sif::info("Hallo\n");
// sif::finfo("Hallo\n"); sif::warning_s(__FILENAME__, __LINE__, "Hello\n");
// sif::fwarning("Hello\n"); sif::warning_st(__FILENAME__, __LINE__, "Hello\n");
// sif::fwarning_t("Hello\n"); FSFW_LOGW("Hello World\n");
// sif::ferror("Hello\n"); FSFW_LOGW("{} World\n", "Hello");
// sif::ferror_t("Hello\n"); uint8_t test0 = 5;
float test1 = 12.0;
uint32_t test2 = 0x00ff11ff;
FSFW_LOGW("Test 0 {} | Test 1 {:.3f} | Test 2 {:#010x}\n", test0, test1, test2);
sif::error_s(__FILENAME__, __LINE__, "Hello\n");
sif::error_st(__FILENAME__, __LINE__, "Hello\n");
} }

View File

@ -1,183 +1,3 @@
#ifndef FSFW_EXAMPLE_HOSTED_TESTFMT_H #pragma once
#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(); 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

View File

@ -2,19 +2,12 @@
#define MISSION_UTILITY_TASKCREATION_H_ #define MISSION_UTILITY_TASKCREATION_H_
#include <fsfw/objectmanager/SystemObjectIF.h> #include <fsfw/objectmanager/SystemObjectIF.h>
#include <fsfw/serviceinterface/ServiceInterface.h> #include <fsfw/serviceinterface.h>
namespace task { namespace task {
void printInitError(const char *objName, object_id_t objectId) { void printInitError(const char* objName, object_id_t objectId) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 FSFW_LOGW("InitMission: Adding object {} ({:#010x}) failed\n", objName, objectId);
sif::error << "InitMission: Adding object " << objName << "(" << std::setw(8)
<< std::setfill('0') << std::hex << objectId << std::dec
<< ") failed." << std::endl;
#else
sif::printError("InitMission: Adding object %s (0x%08x) failed.\n", objName,
static_cast<unsigned int>(objectId));
#endif
} }
} // namespace task } // namespace task

View File

@ -2,7 +2,7 @@
#include <fsfw/ipc/QueueFactory.h> #include <fsfw/ipc/QueueFactory.h>
#include <fsfw/objectmanager/ObjectManager.h> #include <fsfw/objectmanager/ObjectManager.h>
#include <fsfw/serviceinterface/ServiceInterface.h> #include <fsfw/serviceinterface.h>
#include <fsfw/tmtcpacket/pus/tm.h> #include <fsfw/tmtcpacket/pus/tm.h>
object_id_t TmFunnel::downlinkDestination = objects::NO_OBJECT; object_id_t TmFunnel::downlinkDestination = objects::NO_OBJECT;
@ -58,10 +58,7 @@ ReturnValue_t TmFunnel::handlePacket(TmTcMessage *message) {
result = tmQueue->sendToDefault(message); result = tmQueue->sendToDefault(message);
if (result != HasReturnvaluesIF::RETURN_OK) { if (result != HasReturnvaluesIF::RETURN_OK) {
tmPool->deleteData(message->getStorageId()); tmPool->deleteData(message->getStorageId());
#if FSFW_CPP_OSTREAM_ENABLED == 1 FSFW_LOGET("handlePacket: Error sending to downlink handler\n");
sif::error << "TmFunnel::handlePacket: Error sending to downlink handler"
<< std::endl;
#endif
return result; return result;
} }
@ -69,10 +66,7 @@ ReturnValue_t TmFunnel::handlePacket(TmTcMessage *message) {
result = storageQueue->sendToDefault(message); result = storageQueue->sendToDefault(message);
if (result != HasReturnvaluesIF::RETURN_OK) { if (result != HasReturnvaluesIF::RETURN_OK) {
tmPool->deleteData(message->getStorageId()); tmPool->deleteData(message->getStorageId());
#if FSFW_CPP_OSTREAM_ENABLED == 1 FSFW_LOGET("handlePacket: Error sending to storage handler\n");
sif::error << "TmFunnel::handlePacket: Error sending to storage handler"
<< std::endl;
#endif
return result; return result;
} }
} }
@ -82,25 +76,18 @@ ReturnValue_t TmFunnel::handlePacket(TmTcMessage *message) {
ReturnValue_t TmFunnel::initialize() { ReturnValue_t TmFunnel::initialize() {
tmPool = ObjectManager::instance()->get<StorageManagerIF>(objects::TM_STORE); tmPool = ObjectManager::instance()->get<StorageManagerIF>(objects::TM_STORE);
if (tmPool == nullptr) { if (tmPool == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 FSFW_LOGE("{}",
sif::error << "TmFunnel::initialize: TM store not set." << std::endl; "initialize: TM store not set\n"
sif::error << "Make sure the tm store is set up properly and implements " "Make sure the tm store is set up properly and implements StorageManagerIF");
"StorageManagerIF"
<< std::endl;
#endif
return ObjectManagerIF::CHILD_INIT_FAILED; return ObjectManagerIF::CHILD_INIT_FAILED;
} }
AcceptsTelemetryIF *tmTarget = auto* tmTarget = ObjectManager::instance()->get<AcceptsTelemetryIF>(downlinkDestination);
ObjectManager::instance()->get<AcceptsTelemetryIF>(downlinkDestination);
if (tmTarget == nullptr) { if (tmTarget == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 #if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "TmFunnel::initialize: Downlink Destination not set." FSFW_LOGE("{}",
<< std::endl; "initialize: Downlink Destination not set. Make sure the downlink destination "
sif::error << "Make sure the downlink destination object is set up " "object is set up properly and implements AcceptsTelemetryIF\n");
"properly and implements "
"AcceptsTelemetryIF"
<< std::endl;
#endif #endif
return ObjectManagerIF::CHILD_INIT_FAILED; return ObjectManagerIF::CHILD_INIT_FAILED;
} }

View File

@ -1,24 +1,16 @@
#include "utility.h" #include "utility.h"
#include <FSFWConfig.h>
#include <OBSWVersion.h> #include <OBSWVersion.h>
#include <fsfw/serviceinterface/ServiceInterface.h>
#include "fsfw/serviceinterface.h"
void utility::commonInitPrint(const char *const os, const char *const board) { void utility::commonInitPrint(const char *const os, const char *const board) {
if (os == nullptr or board == nullptr) { if (os == nullptr or board == nullptr) {
return; return;
} }
#if FSFW_CPP_OSTREAM_ENABLED == 1 fmt::print("-- FSFW Example ({}) v{}.{}.{} --\n", os, FSFW_EXAMPLE_VERSION,
std::cout << "-- FSFW Example (" << os << ") v" << FSFW_EXAMPLE_VERSION << "." FSFW_EXAMPLE_SUBVERSION, FSFW_EXAMPLE_REVISION);
<< FSFW_EXAMPLE_SUBVERSION << "." << FSFW_EXAMPLE_REVISION << " --" fmt::print("-- Compiled for {}\n", board);
<< std::endl; fmt::print("-- Compiled on {} {}\n", __DATE__, __TIME__);
std::cout << "-- Compiled for " << board << " --" << std::endl; sif::initialize();
std::cout << "-- Compiled on " << __DATE__ << " " << __TIME__ << " --"
<< std::endl;
#else
printf("\n\r-- FSFW Example (%s) v%d.%d.%d --\n", os, FSFW_EXAMPLE_VERSION,
FSFW_EXAMPLE_SUBVERSION, FSFW_EXAMPLE_REVISION);
printf("-- Compiled for %s --\n", board);
printf("-- Compiled on %s %s --\n", __DATE__, __TIME__);
#endif
} }