Merge branch 'development' into feature/has-file-system-if-init
This commit is contained in:
commit
0c5050ceac
@ -7,16 +7,26 @@ PeriodicOperationDivider::PeriodicOperationDivider(uint32_t divider,
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool PeriodicOperationDivider::checkAndIncrement() {
|
bool PeriodicOperationDivider::checkAndIncrement() {
|
||||||
if(counter >= divider) {
|
bool opNecessary = check();
|
||||||
|
if(opNecessary) {
|
||||||
if(resetAutomatically) {
|
if(resetAutomatically) {
|
||||||
counter = 0;
|
counter = 0;
|
||||||
}
|
}
|
||||||
return true;
|
return opNecessary;
|
||||||
}
|
}
|
||||||
counter ++;
|
counter ++;
|
||||||
|
return opNecessary;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PeriodicOperationDivider::check() {
|
||||||
|
if(counter >= divider) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void PeriodicOperationDivider::resetCounter() {
|
void PeriodicOperationDivider::resetCounter() {
|
||||||
counter = 0;
|
counter = 0;
|
||||||
}
|
}
|
||||||
|
@ -21,17 +21,27 @@ public:
|
|||||||
*/
|
*/
|
||||||
PeriodicOperationDivider(uint32_t divider, bool resetAutomatically = true);
|
PeriodicOperationDivider(uint32_t divider, bool resetAutomatically = true);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check whether operation is necessary.
|
* Check whether operation is necessary.
|
||||||
* If an operation is necessary and the class has been
|
* If an operation is necessary and the class has been
|
||||||
* configured to be reset automatically, the counter will be reset.
|
* configured to be reset automatically, the counter will be reset.
|
||||||
* If not, the counter will be incremented.
|
*
|
||||||
* @return
|
* @return
|
||||||
* -@c true if the counter is larger or equal to the divider
|
* -@c true if the counter is larger or equal to the divider
|
||||||
* -@c false otherwise
|
* -@c false otherwise
|
||||||
*/
|
*/
|
||||||
bool checkAndIncrement();
|
bool checkAndIncrement();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether an operation is necessary.
|
||||||
|
* This function will not increment the counter!
|
||||||
|
* @return
|
||||||
|
* -@c true if the counter is larger or equal to the divider
|
||||||
|
* -@c false otherwise
|
||||||
|
*/
|
||||||
|
bool check();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Can be used to reset the counter to 0 manually.
|
* Can be used to reset the counter to 0 manually.
|
||||||
*/
|
*/
|
||||||
|
@ -46,7 +46,7 @@ FixedTimeslotTask::FixedTimeslotTask(const char *name, TaskPriority setPriority,
|
|||||||
<< GetLastError() << std::endl;
|
<< GetLastError() << std::endl;
|
||||||
}
|
}
|
||||||
#elif defined(LINUX)
|
#elif defined(LINUX)
|
||||||
// we can just copy and paste the code from linux here.
|
// TODO: we can just copy and paste the code from the linux OSAL here.
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -115,8 +115,9 @@ void FixedTimeslotTask::taskFunctionality() {
|
|||||||
this->pollingSeqTable.executeAndAdvance();
|
this->pollingSeqTable.executeAndAdvance();
|
||||||
if (not pollingSeqTable.slotFollowsImmediately()) {
|
if (not pollingSeqTable.slotFollowsImmediately()) {
|
||||||
// we need to wait before executing the current slot
|
// we need to wait before executing the current slot
|
||||||
//this gives us the time to wait:
|
// this gives us the time to wait:
|
||||||
interval = chron_ms(this->pollingSeqTable.getIntervalToPreviousSlotMs());
|
interval = chron_ms(
|
||||||
|
this->pollingSeqTable.getIntervalToPreviousSlotMs());
|
||||||
delayForInterval(¤tStartTime, interval);
|
delayForInterval(¤tStartTime, interval);
|
||||||
//TODO deadline missed check
|
//TODO deadline missed check
|
||||||
}
|
}
|
||||||
|
@ -74,7 +74,7 @@ protected:
|
|||||||
//!< Typedef for the List of objects.
|
//!< Typedef for the List of objects.
|
||||||
typedef std::vector<ExecutableObjectIF*> ObjectList;
|
typedef std::vector<ExecutableObjectIF*> ObjectList;
|
||||||
std::thread mainThread;
|
std::thread mainThread;
|
||||||
std::atomic<bool> terminateThread = false;
|
std::atomic<bool> terminateThread { false };
|
||||||
|
|
||||||
//! Polling sequence table which contains the object to execute
|
//! Polling sequence table which contains the object to execute
|
||||||
//! and information like the timeslots and the passed execution step.
|
//! and information like the timeslots and the passed execution step.
|
||||||
|
@ -4,21 +4,18 @@
|
|||||||
Mutex::Mutex() {}
|
Mutex::Mutex() {}
|
||||||
|
|
||||||
ReturnValue_t Mutex::lockMutex(TimeoutType timeoutType, uint32_t timeoutMs) {
|
ReturnValue_t Mutex::lockMutex(TimeoutType timeoutType, uint32_t timeoutMs) {
|
||||||
if(timeoutMs == MutexIF::BLOCKING) {
|
if(timeoutType == MutexIF::BLOCKING) {
|
||||||
mutex.lock();
|
mutex.lock();
|
||||||
locked = true;
|
|
||||||
return HasReturnvaluesIF::RETURN_OK;
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
}
|
}
|
||||||
else if(timeoutMs == MutexIF::POLLING) {
|
else if(timeoutType == MutexIF::POLLING) {
|
||||||
if(mutex.try_lock()) {
|
if(mutex.try_lock()) {
|
||||||
locked = true;
|
|
||||||
return HasReturnvaluesIF::RETURN_OK;
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(timeoutMs > MutexIF::POLLING){
|
else if(timeoutMs > MutexIF::POLLING){
|
||||||
auto chronoMs = std::chrono::milliseconds(timeoutMs);
|
auto chronoMs = std::chrono::milliseconds(timeoutMs);
|
||||||
if(mutex.try_lock_for(chronoMs)) {
|
if(mutex.try_lock_for(chronoMs)) {
|
||||||
locked = true;
|
|
||||||
return HasReturnvaluesIF::RETURN_OK;
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -26,11 +23,7 @@ ReturnValue_t Mutex::lockMutex(TimeoutType timeoutType, uint32_t timeoutMs) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t Mutex::unlockMutex() {
|
ReturnValue_t Mutex::unlockMutex() {
|
||||||
if(not locked) {
|
|
||||||
return MutexIF::CURR_THREAD_DOES_NOT_OWN_MUTEX;
|
|
||||||
}
|
|
||||||
mutex.unlock();
|
mutex.unlock();
|
||||||
locked = false;
|
|
||||||
return HasReturnvaluesIF::RETURN_OK;
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ public:
|
|||||||
|
|
||||||
std::timed_mutex* getMutexHandle();
|
std::timed_mutex* getMutexHandle();
|
||||||
private:
|
private:
|
||||||
bool locked = false;
|
//bool locked = false;
|
||||||
std::timed_mutex mutex;
|
std::timed_mutex mutex;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -89,25 +89,26 @@ ReturnValue_t PeriodicTask::sleepFor(uint32_t ms) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void PeriodicTask::taskFunctionality() {
|
void PeriodicTask::taskFunctionality() {
|
||||||
|
for (const auto& object: objectList) {
|
||||||
|
object->initializeAfterTaskCreation();
|
||||||
|
}
|
||||||
|
|
||||||
std::chrono::milliseconds periodChrono(static_cast<uint32_t>(period*1000));
|
std::chrono::milliseconds periodChrono(static_cast<uint32_t>(period*1000));
|
||||||
auto currentStartTime {
|
auto currentStartTime {
|
||||||
std::chrono::duration_cast<std::chrono::milliseconds>(
|
std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||||
std::chrono::system_clock::now().time_since_epoch())
|
std::chrono::system_clock::now().time_since_epoch())
|
||||||
};
|
};
|
||||||
auto nextStartTime{ currentStartTime };
|
auto nextStartTime { currentStartTime };
|
||||||
|
|
||||||
/* Enter the loop that defines the task behavior. */
|
/* Enter the loop that defines the task behavior. */
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if(terminateThread.load()) {
|
if(terminateThread.load()) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
for (ObjectList::iterator it = objectList.begin();
|
for (const auto& object: objectList) {
|
||||||
it != objectList.end(); ++it) {
|
object->performOperation();
|
||||||
(*it)->performOperation();
|
|
||||||
}
|
}
|
||||||
if(not delayForInterval(¤tStartTime, periodChrono)) {
|
if(not delayForInterval(¤tStartTime, periodChrono)) {
|
||||||
sif::warning << "PeriodicTask: " << taskName <<
|
|
||||||
" missed deadline!\n" << std::flush;
|
|
||||||
if(deadlineMissedFunc != nullptr) {
|
if(deadlineMissedFunc != nullptr) {
|
||||||
this->deadlineMissedFunc();
|
this->deadlineMissedFunc();
|
||||||
}
|
}
|
||||||
@ -121,6 +122,7 @@ ReturnValue_t PeriodicTask::addComponent(object_id_t object) {
|
|||||||
if (newObject == nullptr) {
|
if (newObject == nullptr) {
|
||||||
return HasReturnvaluesIF::RETURN_FAILED;
|
return HasReturnvaluesIF::RETURN_FAILED;
|
||||||
}
|
}
|
||||||
|
newObject->setTaskIF(this);
|
||||||
objectList.push_back(newObject);
|
objectList.push_back(newObject);
|
||||||
return HasReturnvaluesIF::RETURN_OK;
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
}
|
}
|
||||||
|
@ -69,7 +69,7 @@ protected:
|
|||||||
//!< Typedef for the List of objects.
|
//!< Typedef for the List of objects.
|
||||||
typedef std::vector<ExecutableObjectIF*> ObjectList;
|
typedef std::vector<ExecutableObjectIF*> ObjectList;
|
||||||
std::thread mainThread;
|
std::thread mainThread;
|
||||||
std::atomic<bool> terminateThread = false;
|
std::atomic<bool> terminateThread { false };
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief This attribute holds a list of objects to be executed.
|
* @brief This attribute holds a list of objects to be executed.
|
||||||
|
@ -44,7 +44,7 @@ MessageQueueIF* QueueMapManager::getMessageQueue(
|
|||||||
return queueIter->second;
|
return queueIter->second;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
sif::warning << "QueueMapManager::getQueueHandle: The ID" <<
|
sif::warning << "QueueMapManager::getQueueHandle: The ID " <<
|
||||||
messageQueueId << " does not exists in the map" << std::endl;
|
messageQueueId << " does not exists in the map" << std::endl;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@ TmTcWinUdpBridge::TmTcWinUdpBridge(object_id_t objectId,
|
|||||||
uint16_t serverPort, uint16_t clientPort):
|
uint16_t serverPort, uint16_t clientPort):
|
||||||
TmTcBridge(objectId, tcDestination, tmStoreId, tcStoreId) {
|
TmTcBridge(objectId, tcDestination, tmStoreId, tcStoreId) {
|
||||||
mutex = MutexFactory::instance()->createMutex();
|
mutex = MutexFactory::instance()->createMutex();
|
||||||
|
communicationLinkUp = false;
|
||||||
|
|
||||||
// Initiates Winsock DLL.
|
// Initiates Winsock DLL.
|
||||||
WSAData wsaData;
|
WSAData wsaData;
|
||||||
@ -90,7 +91,6 @@ ReturnValue_t TmTcWinUdpBridge::sendTm(const uint8_t *data, size_t dataLen) {
|
|||||||
// sif::debug << "TmTcUnixUdpBridge::sendTm: " << bytesSent << " bytes were"
|
// sif::debug << "TmTcUnixUdpBridge::sendTm: " << bytesSent << " bytes were"
|
||||||
// " sent." << std::endl;
|
// " sent." << std::endl;
|
||||||
return HasReturnvaluesIF::RETURN_OK;
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
return HasReturnvaluesIF::RETURN_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TmTcWinUdpBridge::checkAndSetClientAddress(sockaddr_in newAddress) {
|
void TmTcWinUdpBridge::checkAndSetClientAddress(sockaddr_in newAddress) {
|
||||||
@ -101,6 +101,7 @@ void TmTcWinUdpBridge::checkAndSetClientAddress(sockaddr_in newAddress) {
|
|||||||
// &newAddress.sin_addr.s_addr, ipAddress, 15) << std::endl;
|
// &newAddress.sin_addr.s_addr, ipAddress, 15) << std::endl;
|
||||||
// sif::debug << "IP Address Old: " << inet_ntop(AF_INET,
|
// sif::debug << "IP Address Old: " << inet_ntop(AF_INET,
|
||||||
// &clientAddress.sin_addr.s_addr, ipAddress, 15) << std::endl;
|
// &clientAddress.sin_addr.s_addr, ipAddress, 15) << std::endl;
|
||||||
|
registerCommConnect();
|
||||||
|
|
||||||
// Set new IP address if it has changed.
|
// Set new IP address if it has changed.
|
||||||
if(clientAddress.sin_addr.s_addr != newAddress.sin_addr.s_addr) {
|
if(clientAddress.sin_addr.s_addr != newAddress.sin_addr.s_addr) {
|
||||||
@ -114,7 +115,7 @@ void TmTcWinUdpBridge::handleSocketError() {
|
|||||||
switch(errCode) {
|
switch(errCode) {
|
||||||
case(WSANOTINITIALISED): {
|
case(WSANOTINITIALISED): {
|
||||||
sif::info << "TmTcWinUdpBridge::handleSocketError: WSANOTINITIALISED: "
|
sif::info << "TmTcWinUdpBridge::handleSocketError: WSANOTINITIALISED: "
|
||||||
<< "WSAStartup(...) call " << "necessary" << std::endl;
|
<< "WSAStartup(...) call necessary" << std::endl;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
@ -154,11 +155,11 @@ void TmTcWinUdpBridge::handleSendError() {
|
|||||||
switch(errCode) {
|
switch(errCode) {
|
||||||
case(WSANOTINITIALISED): {
|
case(WSANOTINITIALISED): {
|
||||||
sif::info << "TmTcWinUdpBridge::handleSendError: WSANOTINITIALISED: "
|
sif::info << "TmTcWinUdpBridge::handleSendError: WSANOTINITIALISED: "
|
||||||
<< "WSAStartup(...) call " << "necessary" << std::endl;
|
<< "WSAStartup(...) call necessary" << std::endl;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case(WSAEADDRNOTAVAIL): {
|
case(WSAEADDRNOTAVAIL): {
|
||||||
sif::info << "TmTcWinUdpBridge::handleReadError: WSAEADDRNOTAVAIL: "
|
sif::info << "TmTcWinUdpBridge::handleSendError: WSAEADDRNOTAVAIL: "
|
||||||
<< "Check target address. " << std::endl;
|
<< "Check target address. " << std::endl;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
#include "CatchDefinitions.h"
|
#include "CatchDefinitions.h"
|
||||||
|
#include "CatchFactory.h"
|
||||||
|
|
||||||
#include <testcfg/cdatapool/dataPoolInit.h>
|
#include <testcfg/cdatapool/dataPoolInit.h>
|
||||||
#include <testcfg/objects/Factory.h>
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef GCOV
|
#ifdef GCOV
|
||||||
#include <gcov.h>
|
#include <gcov.h>
|
||||||
|
60
unittest/testcfg/CatchFactory.cpp
Normal file
60
unittest/testcfg/CatchFactory.cpp
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
#include "CatchFactory.h"
|
||||||
|
|
||||||
|
#include <fsfw/events/EventManager.h>
|
||||||
|
#include <fsfw/health/HealthTable.h>
|
||||||
|
|
||||||
|
#include <fsfw/internalError/InternalErrorReporter.h>
|
||||||
|
#include <fsfw/objectmanager/frameworkObjects.h>
|
||||||
|
#include <fsfw/storagemanager/PoolManager.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Produces system objects.
|
||||||
|
* @details
|
||||||
|
* Build tasks by using SystemObject Interface (Interface).
|
||||||
|
* Header files of all tasks must be included
|
||||||
|
* Please note that an object has to implement the system object interface
|
||||||
|
* if the interface validity is checked or retrieved later by using the
|
||||||
|
* get<TargetInterface>(object_id) function from the ObjectManagerIF.
|
||||||
|
*
|
||||||
|
* Framework objects are created first.
|
||||||
|
*
|
||||||
|
* @ingroup init
|
||||||
|
*/
|
||||||
|
void Factory::produce(void) {
|
||||||
|
setStaticFrameworkObjectIds();
|
||||||
|
new EventManager(objects::EVENT_MANAGER);
|
||||||
|
new HealthTable(objects::HEALTH_TABLE);
|
||||||
|
//new InternalErrorReporter(objects::INTERNAL_ERROR_REPORTER);
|
||||||
|
|
||||||
|
{
|
||||||
|
static constexpr uint8_t NUMBER_OF_POOLS = 5;
|
||||||
|
const uint16_t element_sizes[NUMBER_OF_POOLS] = {16, 32, 64, 128, 1024};
|
||||||
|
const uint16_t n_elements[NUMBER_OF_POOLS] = {100, 50, 25, 15, 5};
|
||||||
|
new PoolManager<NUMBER_OF_POOLS>(objects::TC_STORE, element_sizes,
|
||||||
|
n_elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
static constexpr uint8_t NUMBER_OF_POOLS = 5;
|
||||||
|
const uint16_t element_sizes[NUMBER_OF_POOLS] = {16, 32, 64, 128, 1024};
|
||||||
|
const uint16_t n_elements[NUMBER_OF_POOLS] = {100, 50, 25, 15, 5};
|
||||||
|
new PoolManager<NUMBER_OF_POOLS>(objects::TM_STORE, element_sizes,
|
||||||
|
n_elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
static constexpr uint8_t NUMBER_OF_POOLS = 6;
|
||||||
|
const uint16_t element_sizes[NUMBER_OF_POOLS] = {32, 64, 512,
|
||||||
|
1024, 2048, 4096};
|
||||||
|
const uint16_t n_elements[NUMBER_OF_POOLS] = {200, 100, 50, 25, 15, 5};
|
||||||
|
new PoolManager<NUMBER_OF_POOLS>(objects::IPC_STORE, element_sizes,
|
||||||
|
n_elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Factory::setStaticFrameworkObjectIds() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
|||||||
#include "Factory.h"
|
|
||||||
|
|
||||||
#include <fsfw/events/EventManager.h>
|
|
||||||
#include <fsfw/health/HealthTable.h>
|
|
||||||
|
|
||||||
#include <fsfw/internalError/InternalErrorReporter.h>
|
|
||||||
#include <fsfw/objectmanager/frameworkObjects.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Produces system objects.
|
|
||||||
* @details
|
|
||||||
* Build tasks by using SystemObject Interface (Interface).
|
|
||||||
* Header files of all tasks must be included
|
|
||||||
* Please note that an object has to implement the system object interface
|
|
||||||
* if the interface validity is checked or retrieved later by using the
|
|
||||||
* get<TargetInterface>(object_id) function from the ObjectManagerIF.
|
|
||||||
*
|
|
||||||
* Framework objects are created first.
|
|
||||||
*
|
|
||||||
* @ingroup init
|
|
||||||
*/
|
|
||||||
void Factory::produce(void) {
|
|
||||||
setStaticFrameworkObjectIds();
|
|
||||||
new EventManager(objects::EVENT_MANAGER);
|
|
||||||
new HealthTable(objects::HEALTH_TABLE);
|
|
||||||
new InternalErrorReporter(objects::INTERNAL_ERROR_REPORTER);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void Factory::setStaticFrameworkObjectIds() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -3,6 +3,7 @@ CXXSRC += $(wildcard $(CURRENTPATH)/ipc/*.cpp)
|
|||||||
CXXSRC += $(wildcard $(CURRENTPATH)/objects/*.cpp)
|
CXXSRC += $(wildcard $(CURRENTPATH)/objects/*.cpp)
|
||||||
CXXSRC += $(wildcard $(CURRENTPATH)/pollingsequence/*.cpp)
|
CXXSRC += $(wildcard $(CURRENTPATH)/pollingsequence/*.cpp)
|
||||||
CXXSRC += $(wildcard $(CURRENTPATH)/events/*.cpp)
|
CXXSRC += $(wildcard $(CURRENTPATH)/events/*.cpp)
|
||||||
|
CXXSRC += $(wildcard $(CURRENTPATH)/*.cpp)
|
||||||
|
|
||||||
INCLUDES += $(CURRENTPATH)
|
INCLUDES += $(CURRENTPATH)
|
||||||
INCLUDES += $(CURRENTPATH)/objects
|
INCLUDES += $(CURRENTPATH)/objects
|
||||||
|
@ -1,106 +1,107 @@
|
|||||||
//#include "TestActionHelper.h"
|
#include "TestActionHelper.h"
|
||||||
//#include <fsfw/action/ActionHelper.h>
|
#include <fsfw/action/ActionHelper.h>
|
||||||
//#include <fsfw/ipc/CommandMessage.h>
|
#include <fsfw/ipc/CommandMessage.h>
|
||||||
//#include <catch2/catch.hpp>
|
#include <catch2/catch.hpp>
|
||||||
//#include "../../core/CatchDefinitions.h"
|
#include "../../core/CatchDefinitions.h"
|
||||||
//
|
|
||||||
//
|
|
||||||
//TEST_CASE( "Action Helper" , "[ActionHelper]") {
|
TEST_CASE( "Action Helper" , "[ActionHelper]") {
|
||||||
// ActionHelperOwnerMockBase testDhMock;
|
ActionHelperOwnerMockBase testDhMock;
|
||||||
// MessageQueueMockBase testMqMock;
|
MessageQueueMockBase testMqMock;
|
||||||
// ActionHelper actionHelper = ActionHelper(
|
ActionHelper actionHelper = ActionHelper(
|
||||||
// &testDhMock, dynamic_cast<MessageQueueIF*>(&testMqMock));
|
&testDhMock, dynamic_cast<MessageQueueIF*>(&testMqMock));
|
||||||
// CommandMessage actionMessage;
|
CommandMessage actionMessage;
|
||||||
// ActionId_t testActionId = 777;
|
ActionId_t testActionId = 777;
|
||||||
// std::array <uint8_t, 3> testParams {1, 2, 3};
|
std::array <uint8_t, 3> testParams {1, 2, 3};
|
||||||
// store_address_t paramAddress;
|
store_address_t paramAddress;
|
||||||
// StorageManagerIF *ipcStore = tglob::getIpcStoreHandle();
|
StorageManagerIF *ipcStore = tglob::getIpcStoreHandle();
|
||||||
// ipcStore->addData(¶mAddress, testParams.data(), 3);
|
REQUIRE(ipcStore != nullptr);
|
||||||
// REQUIRE(actionHelper.initialize() == retval::CATCH_OK);
|
ipcStore->addData(¶mAddress, testParams.data(), 3);
|
||||||
//
|
REQUIRE(actionHelper.initialize() == retval::CATCH_OK);
|
||||||
// SECTION ("Simple tests") {
|
|
||||||
// ActionMessage::setCommand(&actionMessage, testActionId, paramAddress);
|
SECTION ("Simple tests") {
|
||||||
// CHECK(not testDhMock.executeActionCalled);
|
ActionMessage::setCommand(&actionMessage, testActionId, paramAddress);
|
||||||
// REQUIRE(actionHelper.handleActionMessage(&actionMessage) == retval::CATCH_OK);
|
CHECK(not testDhMock.executeActionCalled);
|
||||||
// CHECK(testDhMock.executeActionCalled);
|
REQUIRE(actionHelper.handleActionMessage(&actionMessage) == retval::CATCH_OK);
|
||||||
// // No message is sent if everything is alright.
|
CHECK(testDhMock.executeActionCalled);
|
||||||
// CHECK(not testMqMock.wasMessageSent());
|
// No message is sent if everything is alright.
|
||||||
// store_address_t invalidAddress;
|
CHECK(not testMqMock.wasMessageSent());
|
||||||
// ActionMessage::setCommand(&actionMessage, testActionId, invalidAddress);
|
store_address_t invalidAddress;
|
||||||
// actionHelper.handleActionMessage(&actionMessage);
|
ActionMessage::setCommand(&actionMessage, testActionId, invalidAddress);
|
||||||
// CHECK(testMqMock.wasMessageSent());
|
actionHelper.handleActionMessage(&actionMessage);
|
||||||
// const uint8_t* ptr = nullptr;
|
CHECK(testMqMock.wasMessageSent());
|
||||||
// size_t size = 0;
|
const uint8_t* ptr = nullptr;
|
||||||
// REQUIRE(ipcStore->getData(paramAddress, &ptr, &size) == static_cast<uint32_t>(StorageManagerIF::DATA_DOES_NOT_EXIST));
|
size_t size = 0;
|
||||||
// REQUIRE(ptr == nullptr);
|
REQUIRE(ipcStore->getData(paramAddress, &ptr, &size) == static_cast<uint32_t>(StorageManagerIF::DATA_DOES_NOT_EXIST));
|
||||||
// REQUIRE(size == 0);
|
REQUIRE(ptr == nullptr);
|
||||||
// testDhMock.getBuffer(&ptr, &size);
|
REQUIRE(size == 0);
|
||||||
// REQUIRE(size == 3);
|
testDhMock.getBuffer(&ptr, &size);
|
||||||
// for(uint8_t i = 0; i<3;i++){
|
REQUIRE(size == 3);
|
||||||
// REQUIRE(ptr[i] == (i+1));
|
for(uint8_t i = 0; i<3;i++){
|
||||||
// }
|
REQUIRE(ptr[i] == (i+1));
|
||||||
// testDhMock.clearBuffer();
|
}
|
||||||
// }
|
testDhMock.clearBuffer();
|
||||||
//
|
}
|
||||||
// SECTION("Handle failures"){
|
|
||||||
// actionMessage.setCommand(1234);
|
SECTION("Handle failures"){
|
||||||
// REQUIRE(actionHelper.handleActionMessage(&actionMessage) == static_cast<uint32_t>(CommandMessage::UNKNOWN_COMMAND));
|
actionMessage.setCommand(1234);
|
||||||
// CHECK(not testMqMock.wasMessageSent());
|
REQUIRE(actionHelper.handleActionMessage(&actionMessage) == static_cast<uint32_t>(CommandMessage::UNKNOWN_COMMAND));
|
||||||
// uint16_t step = 5;
|
CHECK(not testMqMock.wasMessageSent());
|
||||||
// ReturnValue_t status = 0x1234;
|
uint16_t step = 5;
|
||||||
// actionHelper.step(step, testMqMock.getId(), testActionId, status);
|
ReturnValue_t status = 0x1234;
|
||||||
// step += 1;
|
actionHelper.step(step, testMqMock.getId(), testActionId, status);
|
||||||
// CHECK(testMqMock.wasMessageSent());
|
step += 1;
|
||||||
// CommandMessage testMessage;
|
CHECK(testMqMock.wasMessageSent());
|
||||||
// REQUIRE(testMqMock.receiveMessage(&testMessage) == static_cast<uint32_t>(HasReturnvaluesIF::RETURN_OK));
|
CommandMessage testMessage;
|
||||||
// REQUIRE(testMessage.getCommand() == static_cast<uint32_t>(ActionMessage::STEP_FAILED));
|
REQUIRE(testMqMock.receiveMessage(&testMessage) == static_cast<uint32_t>(HasReturnvaluesIF::RETURN_OK));
|
||||||
// REQUIRE(testMessage.getParameter() == static_cast<uint32_t>(testActionId));
|
REQUIRE(testMessage.getCommand() == static_cast<uint32_t>(ActionMessage::STEP_FAILED));
|
||||||
// uint32_t parameter2 = ((uint32_t)step << 16) | (uint32_t)status;
|
REQUIRE(testMessage.getParameter() == static_cast<uint32_t>(testActionId));
|
||||||
// REQUIRE(testMessage.getParameter2() == parameter2);
|
uint32_t parameter2 = ((uint32_t)step << 16) | (uint32_t)status;
|
||||||
// REQUIRE(ActionMessage::getStep(&testMessage) == step);
|
REQUIRE(testMessage.getParameter2() == parameter2);
|
||||||
// }
|
REQUIRE(ActionMessage::getStep(&testMessage) == step);
|
||||||
//
|
}
|
||||||
// SECTION("Handle finish"){
|
|
||||||
// CHECK(not testMqMock.wasMessageSent());
|
SECTION("Handle finish"){
|
||||||
// ReturnValue_t status = 0x9876;
|
CHECK(not testMqMock.wasMessageSent());
|
||||||
// actionHelper.finish(testMqMock.getId(), testActionId, status);
|
ReturnValue_t status = 0x9876;
|
||||||
// CHECK(testMqMock.wasMessageSent());
|
actionHelper.finish(testMqMock.getId(), testActionId, status);
|
||||||
// CommandMessage testMessage;
|
CHECK(testMqMock.wasMessageSent());
|
||||||
// REQUIRE(testMqMock.receiveMessage(&testMessage) == static_cast<uint32_t>(HasReturnvaluesIF::RETURN_OK));
|
CommandMessage testMessage;
|
||||||
// REQUIRE(testMessage.getCommand() == static_cast<uint32_t>(ActionMessage::COMPLETION_FAILED));
|
REQUIRE(testMqMock.receiveMessage(&testMessage) == static_cast<uint32_t>(HasReturnvaluesIF::RETURN_OK));
|
||||||
// REQUIRE(ActionMessage::getActionId(&testMessage) == testActionId);
|
REQUIRE(testMessage.getCommand() == static_cast<uint32_t>(ActionMessage::COMPLETION_FAILED));
|
||||||
// REQUIRE(ActionMessage::getReturnCode(&testMessage) == static_cast<uint32_t>(status));
|
REQUIRE(ActionMessage::getActionId(&testMessage) == testActionId);
|
||||||
// }
|
REQUIRE(ActionMessage::getReturnCode(&testMessage) == static_cast<uint32_t>(status));
|
||||||
//
|
}
|
||||||
// SECTION("Handle failed"){
|
|
||||||
// store_address_t toLongParamAddress = StorageManagerIF::INVALID_ADDRESS;
|
SECTION("Handle failed"){
|
||||||
// std::array<uint8_t, 5> toLongData = {5, 4, 3, 2, 1};
|
store_address_t toLongParamAddress = StorageManagerIF::INVALID_ADDRESS;
|
||||||
// REQUIRE(ipcStore->addData(&toLongParamAddress, toLongData.data(), 5) == retval::CATCH_OK);
|
std::array<uint8_t, 5> toLongData = {5, 4, 3, 2, 1};
|
||||||
// ActionMessage::setCommand(&actionMessage, testActionId, toLongParamAddress);
|
REQUIRE(ipcStore->addData(&toLongParamAddress, toLongData.data(), 5) == retval::CATCH_OK);
|
||||||
// CHECK(not testDhMock.executeActionCalled);
|
ActionMessage::setCommand(&actionMessage, testActionId, toLongParamAddress);
|
||||||
// REQUIRE(actionHelper.handleActionMessage(&actionMessage) == retval::CATCH_OK);
|
CHECK(not testDhMock.executeActionCalled);
|
||||||
// REQUIRE(ipcStore->getData(toLongParamAddress).first == static_cast<uint32_t>(StorageManagerIF::DATA_DOES_NOT_EXIST));
|
REQUIRE(actionHelper.handleActionMessage(&actionMessage) == retval::CATCH_OK);
|
||||||
// CommandMessage testMessage;
|
REQUIRE(ipcStore->getData(toLongParamAddress).first == static_cast<uint32_t>(StorageManagerIF::DATA_DOES_NOT_EXIST));
|
||||||
// REQUIRE(testMqMock.receiveMessage(&testMessage) == static_cast<uint32_t>(HasReturnvaluesIF::RETURN_OK));
|
CommandMessage testMessage;
|
||||||
// REQUIRE(testMessage.getCommand() == static_cast<uint32_t>(ActionMessage::STEP_FAILED));
|
REQUIRE(testMqMock.receiveMessage(&testMessage) == static_cast<uint32_t>(HasReturnvaluesIF::RETURN_OK));
|
||||||
// REQUIRE(ActionMessage::getReturnCode(&testMessage) == 0xAFFE);
|
REQUIRE(testMessage.getCommand() == static_cast<uint32_t>(ActionMessage::STEP_FAILED));
|
||||||
// REQUIRE(ActionMessage::getStep(&testMessage) == 0);
|
REQUIRE(ActionMessage::getReturnCode(&testMessage) == 0xAFFE);
|
||||||
// REQUIRE(ActionMessage::getActionId(&testMessage) == testActionId);
|
REQUIRE(ActionMessage::getStep(&testMessage) == 0);
|
||||||
// }
|
REQUIRE(ActionMessage::getActionId(&testMessage) == testActionId);
|
||||||
//
|
}
|
||||||
// SECTION("Missing IPC Data"){
|
|
||||||
// ActionMessage::setCommand(&actionMessage, testActionId, StorageManagerIF::INVALID_ADDRESS);
|
SECTION("Missing IPC Data"){
|
||||||
// CHECK(not testDhMock.executeActionCalled);
|
ActionMessage::setCommand(&actionMessage, testActionId, StorageManagerIF::INVALID_ADDRESS);
|
||||||
// REQUIRE(actionHelper.handleActionMessage(&actionMessage) == retval::CATCH_OK);
|
CHECK(not testDhMock.executeActionCalled);
|
||||||
// CommandMessage testMessage;
|
REQUIRE(actionHelper.handleActionMessage(&actionMessage) == retval::CATCH_OK);
|
||||||
// REQUIRE(testMqMock.receiveMessage(&testMessage) == static_cast<uint32_t>(HasReturnvaluesIF::RETURN_OK));
|
CommandMessage testMessage;
|
||||||
// REQUIRE(testMessage.getCommand() == static_cast<uint32_t>(ActionMessage::STEP_FAILED));
|
REQUIRE(testMqMock.receiveMessage(&testMessage) == static_cast<uint32_t>(HasReturnvaluesIF::RETURN_OK));
|
||||||
// REQUIRE(ActionMessage::getReturnCode(&testMessage) == static_cast<uint32_t>(StorageManagerIF::ILLEGAL_STORAGE_ID));
|
REQUIRE(testMessage.getCommand() == static_cast<uint32_t>(ActionMessage::STEP_FAILED));
|
||||||
// REQUIRE(ActionMessage::getStep(&testMessage) == 0);
|
REQUIRE(ActionMessage::getReturnCode(&testMessage) == static_cast<uint32_t>(StorageManagerIF::ILLEGAL_STORAGE_ID));
|
||||||
// }
|
REQUIRE(ActionMessage::getStep(&testMessage) == 0);
|
||||||
//
|
}
|
||||||
//
|
|
||||||
// SECTION("Data Reply"){
|
|
||||||
//
|
SECTION("Data Reply"){
|
||||||
// }
|
|
||||||
//}
|
}
|
||||||
|
}
|
||||||
|
@ -1,131 +1,132 @@
|
|||||||
//#ifndef UNITTEST_HOSTED_TESTACTIONHELPER_H_
|
#ifndef UNITTEST_HOSTED_TESTACTIONHELPER_H_
|
||||||
//#define UNITTEST_HOSTED_TESTACTIONHELPER_H_
|
#define UNITTEST_HOSTED_TESTACTIONHELPER_H_
|
||||||
//
|
|
||||||
//#include <fsfw/action/HasActionsIF.h>
|
#include <fsfw/action/HasActionsIF.h>
|
||||||
//#include <fsfw/ipc/MessageQueueIF.h>
|
#include <fsfw/ipc/MessageQueueIF.h>
|
||||||
//#include <fsfw/unittest/core/CatchDefinitions.h>
|
#include <fsfw/unittest/core/CatchDefinitions.h>
|
||||||
//#include <cstring>
|
#include <cstring>
|
||||||
//
|
|
||||||
//
|
|
||||||
//class ActionHelperOwnerMockBase: public HasActionsIF {
|
class ActionHelperOwnerMockBase: public HasActionsIF {
|
||||||
//public:
|
public:
|
||||||
// bool getCommandQueueCalled = false;
|
bool getCommandQueueCalled = false;
|
||||||
// bool executeActionCalled = false;
|
bool executeActionCalled = false;
|
||||||
// static const size_t MAX_SIZE = 3;
|
static const size_t MAX_SIZE = 3;
|
||||||
// uint8_t buffer[MAX_SIZE] = {0, 0, 0};
|
uint8_t buffer[MAX_SIZE] = {0, 0, 0};
|
||||||
// size_t size = 0;
|
size_t size = 0;
|
||||||
//
|
|
||||||
// MessageQueueId_t getCommandQueue() const override {
|
MessageQueueId_t getCommandQueue() const override {
|
||||||
// return tconst::testQueueId;
|
return tconst::testQueueId;
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// ReturnValue_t executeAction(ActionId_t actionId, MessageQueueId_t commandedBy,
|
ReturnValue_t executeAction(ActionId_t actionId, MessageQueueId_t commandedBy,
|
||||||
// const uint8_t* data, size_t size) override {
|
const uint8_t* data, size_t size) override {
|
||||||
// executeActionCalled = true;
|
executeActionCalled = true;
|
||||||
// if(size > MAX_SIZE){
|
if(size > MAX_SIZE){
|
||||||
// return 0xAFFE;
|
return 0xAFFE;
|
||||||
// }
|
}
|
||||||
// this->size = size;
|
this->size = size;
|
||||||
// memcpy(buffer, data, size);
|
memcpy(buffer, data, size);
|
||||||
// return HasReturnvaluesIF::RETURN_OK;
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// void clearBuffer(){
|
void clearBuffer(){
|
||||||
// this->size = 0;
|
this->size = 0;
|
||||||
// for(size_t i = 0; i<MAX_SIZE; i++){
|
for(size_t i = 0; i<MAX_SIZE; i++){
|
||||||
// buffer[i] = 0;
|
buffer[i] = 0;
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// void getBuffer(const uint8_t** ptr, size_t* size){
|
void getBuffer(const uint8_t** ptr, size_t* size){
|
||||||
// if(size != nullptr){
|
if(size != nullptr){
|
||||||
// *size = this->size;
|
*size = this->size;
|
||||||
// }
|
}
|
||||||
// if(ptr != nullptr){
|
if(ptr != nullptr){
|
||||||
// *ptr = buffer;
|
*ptr = buffer;
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
//};
|
};
|
||||||
//
|
|
||||||
//
|
|
||||||
//class MessageQueueMockBase: public MessageQueueIF {
|
class MessageQueueMockBase: public MessageQueueIF {
|
||||||
//public:
|
public:
|
||||||
// MessageQueueId_t myQueueId = 0;
|
MessageQueueId_t myQueueId = 0;
|
||||||
// bool defaultDestSet = false;
|
bool defaultDestSet = false;
|
||||||
// bool messageSent = false;
|
bool messageSent = false;
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// bool wasMessageSent() {
|
bool wasMessageSent() {
|
||||||
// bool tempMessageSent = messageSent;
|
bool tempMessageSent = messageSent;
|
||||||
// messageSent = false;
|
messageSent = false;
|
||||||
// return tempMessageSent;
|
return tempMessageSent;
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// virtual ReturnValue_t reply( MessageQueueMessage* message ) {
|
virtual ReturnValue_t reply( MessageQueueMessageIF* message ) {
|
||||||
// messageSent = true;
|
messageSent = true;
|
||||||
// lastMessage = (*message);
|
lastMessage = *(dynamic_cast<MessageQueueMessage*>(message));
|
||||||
// return HasReturnvaluesIF::RETURN_OK;
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
// };
|
};
|
||||||
// virtual ReturnValue_t receiveMessage(MessageQueueMessage* message,
|
virtual ReturnValue_t receiveMessage(MessageQueueMessageIF* message,
|
||||||
// MessageQueueId_t *receivedFrom) {
|
MessageQueueId_t *receivedFrom) {
|
||||||
// (*message) = lastMessage;
|
(*message) = lastMessage;
|
||||||
// lastMessage.clear();
|
lastMessage.clear();
|
||||||
// return HasReturnvaluesIF::RETURN_OK;
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
// }
|
}
|
||||||
// virtual ReturnValue_t receiveMessage(MessageQueueMessage* message) {
|
virtual ReturnValue_t receiveMessage(MessageQueueMessageIF* message) {
|
||||||
// (*message) = lastMessage;
|
memcpy(message->getBuffer(), lastMessage.getBuffer(),
|
||||||
// lastMessage.clear();
|
message->getMessageSize());
|
||||||
// return HasReturnvaluesIF::RETURN_OK;
|
lastMessage.clear();
|
||||||
// }
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
// virtual ReturnValue_t flush(uint32_t* count) {
|
}
|
||||||
// return HasReturnvaluesIF::RETURN_OK;
|
virtual ReturnValue_t flush(uint32_t* count) {
|
||||||
// }
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
// virtual MessageQueueId_t getLastPartner() const {
|
}
|
||||||
// return tconst::testQueueId;
|
virtual MessageQueueId_t getLastPartner() const {
|
||||||
// }
|
return tconst::testQueueId;
|
||||||
// virtual MessageQueueId_t getId() const {
|
}
|
||||||
// return tconst::testQueueId;
|
virtual MessageQueueId_t getId() const {
|
||||||
// }
|
return tconst::testQueueId;
|
||||||
// virtual ReturnValue_t sendMessageFrom( MessageQueueId_t sendTo,
|
}
|
||||||
// MessageQueueMessage* message, MessageQueueId_t sentFrom,
|
virtual ReturnValue_t sendMessageFrom( MessageQueueId_t sendTo,
|
||||||
// bool ignoreFault = false ) {
|
MessageQueueMessageIF* message, MessageQueueId_t sentFrom,
|
||||||
// messageSent = true;
|
bool ignoreFault = false ) {
|
||||||
// lastMessage = (*message);
|
messageSent = true;
|
||||||
// return HasReturnvaluesIF::RETURN_OK;
|
lastMessage = *(dynamic_cast<MessageQueueMessage*>(message));
|
||||||
// }
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
// virtual ReturnValue_t sendMessage( MessageQueueId_t sendTo,
|
}
|
||||||
// MessageQueueMessage* message, bool ignoreFault = false ) override {
|
virtual ReturnValue_t sendMessage( MessageQueueId_t sendTo,
|
||||||
// messageSent = true;
|
MessageQueueMessageIF* message, bool ignoreFault = false ) override {
|
||||||
// lastMessage = (*message);
|
messageSent = true;
|
||||||
// return HasReturnvaluesIF::RETURN_OK;
|
lastMessage = *(dynamic_cast<MessageQueueMessage*>(message));
|
||||||
// }
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
// virtual ReturnValue_t sendToDefaultFrom( MessageQueueMessage* message,
|
}
|
||||||
// MessageQueueId_t sentFrom, bool ignoreFault = false ) {
|
virtual ReturnValue_t sendToDefaultFrom( MessageQueueMessageIF* message,
|
||||||
// messageSent = true;
|
MessageQueueId_t sentFrom, bool ignoreFault = false ) {
|
||||||
// lastMessage = (*message);
|
messageSent = true;
|
||||||
// return HasReturnvaluesIF::RETURN_OK;
|
lastMessage = *(dynamic_cast<MessageQueueMessage*>(message));
|
||||||
// }
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
// virtual ReturnValue_t sendToDefault( MessageQueueMessage* message ) {
|
}
|
||||||
// messageSent = true;
|
virtual ReturnValue_t sendToDefault( MessageQueueMessageIF* message ) {
|
||||||
// lastMessage = (*message);
|
messageSent = true;
|
||||||
// return HasReturnvaluesIF::RETURN_OK;
|
lastMessage = *(dynamic_cast<MessageQueueMessage*>(message));
|
||||||
// }
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
// virtual void setDefaultDestination(MessageQueueId_t defaultDestination) {
|
}
|
||||||
// myQueueId = defaultDestination;
|
virtual void setDefaultDestination(MessageQueueId_t defaultDestination) {
|
||||||
// defaultDestSet = true;
|
myQueueId = defaultDestination;
|
||||||
// }
|
defaultDestSet = true;
|
||||||
//
|
}
|
||||||
// virtual MessageQueueId_t getDefaultDestination() const {
|
|
||||||
// return myQueueId;
|
virtual MessageQueueId_t getDefaultDestination() const {
|
||||||
// }
|
return myQueueId;
|
||||||
// virtual bool isDefaultDestinationSet() const {
|
}
|
||||||
// return defaultDestSet;
|
virtual bool isDefaultDestinationSet() const {
|
||||||
// }
|
return defaultDestSet;
|
||||||
//private:
|
}
|
||||||
// MessageQueueMessage lastMessage;
|
private:
|
||||||
//
|
MessageQueueMessage lastMessage;
|
||||||
//};
|
|
||||||
//
|
};
|
||||||
//
|
|
||||||
//#endif /* UNITTEST_TESTFW_NEWTESTS_TESTACTIONHELPER_H_ */
|
|
||||||
|
#endif /* UNITTEST_TESTFW_NEWTESTS_TESTACTIONHELPER_H_ */
|
||||||
|
Loading…
Reference in New Issue
Block a user