Merge pull request 'simplified test controller and added docs gitignore' (#530) from mueller/controller-update into development

Reviewed-on: fsfw/fsfw#530
This commit is contained in:
Steffen Gaisser 2021-12-20 14:15:37 +01:00
commit bd64a43819
3 changed files with 10 additions and 189 deletions

1
docs/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/_build

View File

@ -1,15 +1,12 @@
#include "TestController.h" #include "TestController.h"
#include "OBSWConfig.h"
#include <fsfw/datapool/PoolReadGuard.h> #include <fsfw/datapool/PoolReadGuard.h>
#include <fsfw/objectmanager/ObjectManager.h> #include <fsfw/objectmanager/ObjectManager.h>
#include <fsfw/serviceinterface/ServiceInterface.h> #include <fsfw/serviceinterface/ServiceInterface.h>
TestController::TestController(object_id_t objectId, object_id_t device0, object_id_t device1, TestController::TestController(object_id_t objectId, object_id_t parentId,
size_t commandQueueDepth): size_t commandQueueDepth):
ExtendedControllerBase(objectId, objects::NO_OBJECT, commandQueueDepth), ExtendedControllerBase(objectId, parentId, commandQueueDepth) {
deviceDataset0(device0),
deviceDataset1(device1) {
} }
TestController::~TestController() { TestController::~TestController() {
@ -20,136 +17,15 @@ ReturnValue_t TestController::handleCommandMessage(CommandMessage *message) {
} }
void TestController::performControlOperation() { void TestController::performControlOperation() {
/* We will trace vaiables if we received an update notification or snapshots */
#if OBSW_CONTROLLER_PRINTOUT == 1
if(not traceVariable) {
return;
}
switch(currentTraceType) {
case(NONE): {
break;
}
case(TRACE_DEV_0_UINT8): {
if(traceCounter == 0) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::info << "Tracing finished" << std::endl;
#else
sif::printInfo("Tracing finished\n");
#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */
traceVariable = false;
traceCounter = traceCycles;
currentTraceType = TraceTypes::NONE;
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;
}
}
#endif /* OBSW_CONTROLLER_PRINTOUT == 1 */
} }
void TestController::handleChangedDataset(sid_t sid, store_address_t storeId, bool* clearMessage) { void TestController::handleChangedDataset(sid_t sid, store_address_t storeId, bool* clearMessage) {
using namespace std;
#if OBSW_CONTROLLER_PRINTOUT == 1
char const* printout = nullptr;
if(storeId == storeId::INVALID_STORE_ADDRESS) {
printout = "Notification";
}
else {
printout = "Snapshot";
}
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::info << "TestController::handleChangedDataset: " << printout << " update from object "
"ID " << setw(8) << setfill('0') << hex << sid.objectId <<
" and set ID " << sid.ownerSetId << dec << setfill(' ') << endl;
#else
sif::printInfo("TestController::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(sid.objectId == objects::TEST_DEVICE_HANDLER_0) {
PoolReadGuard readHelper(&deviceDataset0.testFloat3Vec);
float floatVec[3];
floatVec[0] = deviceDataset0.testFloat3Vec.value[0];
floatVec[1] = deviceDataset0.testFloat3Vec.value[1];
floatVec[2] = deviceDataset0.testFloat3Vec.value[2];
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::info << "Current float vector (3) values: [" << floatVec[0] << ", " <<
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 */
}
}
#endif /* OBSW_CONTROLLER_PRINTOUT == 1 */
/* We will trace the variables for snapshots and update notifications */
if(not traceVariable) {
traceVariable = true;
traceCounter = traceCycles;
currentTraceType = TraceTypes::TRACE_DEV_0_VECTOR;
}
} }
void TestController::handleChangedPoolVariable(gp_id_t globPoolId, store_address_t storeId, void TestController::handleChangedPoolVariable(gp_id_t globPoolId, store_address_t storeId,
bool* clearMessage) { bool* clearMessage) {
using namespace std;
#if OBSW_CONTROLLER_PRINTOUT == 1
char const* printout = nullptr;
if (storeId == storeId::INVALID_STORE_ADDRESS) {
printout = "Notification";
}
else {
printout = "Snapshot";
}
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::info << "TestController::handleChangedPoolVariable: " << printout << " update from object "
"ID 0x" << 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(globPoolId.objectId == objects::TEST_DEVICE_HANDLER_0) {
PoolReadGuard readHelper(&deviceDataset0.testUint8Var);
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::info << "Current test variable 0 (UINT8) 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 */
}
}
#endif /* OBSW_CONTROLLER_PRINTOUT == 1 */
/* We will trace the variables for snapshots and update notifications */
if(not traceVariable) {
traceVariable = true;
traceCounter = traceCycles;
currentTraceType = TraceTypes::TRACE_DEV_0_UINT8;
}
} }
LocalPoolDataSetBase* TestController::getDataSetHandle(sid_t sid) { LocalPoolDataSetBase* TestController::getDataSetHandle(sid_t sid) {
@ -162,50 +38,7 @@ ReturnValue_t TestController::initializeLocalDataPool(localpool::DataPool &local
} }
ReturnValue_t TestController::initializeAfterTaskCreation() { ReturnValue_t TestController::initializeAfterTaskCreation() {
namespace td = testdevice; return ExtendedControllerBase::initializeAfterTaskCreation();
HasLocalDataPoolIF* device0 = ObjectManager::instance()->get<HasLocalDataPoolIF>(
deviceDataset0.getCreatorObjectId());
if(device0 == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
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;
}
ProvidesDataPoolSubscriptionIF* subscriptionIF = device0->getSubscriptionInterface();
if(subscriptionIF != nullptr) {
/* For DEVICE_0, we only subscribe for notifications */
subscriptionIF->subscribeForSetUpdateMessage(td::TEST_SET_ID, getObjectId(),
getCommandQueue(), false);
subscriptionIF->subscribeForVariableUpdateMessage(td::PoolIds::TEST_UINT8_ID,
getObjectId(), getCommandQueue(), false);
}
HasLocalDataPoolIF* device1 = ObjectManager::instance()->get<HasLocalDataPoolIF>(
deviceDataset0.getCreatorObjectId());
if(device1 == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
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();
if(subscriptionIF != nullptr) {
/* For DEVICE_1, we will subscribe for snapshots */
subscriptionIF->subscribeForSetUpdateMessage(td::TEST_SET_ID, getObjectId(),
getCommandQueue(), true);
subscriptionIF->subscribeForVariableUpdateMessage(td::PoolIds::TEST_UINT8_ID,
getObjectId(), getCommandQueue(), true);
}
return HasReturnvaluesIF::RETURN_OK;
} }
ReturnValue_t TestController::checkModeCommand(Mode_t mode, Submode_t submode, ReturnValue_t TestController::checkModeCommand(Mode_t mode, Submode_t submode,

View File

@ -8,20 +8,18 @@
class TestController: class TestController:
public ExtendedControllerBase { public ExtendedControllerBase {
public: public:
TestController(object_id_t objectId, object_id_t device0, object_id_t device1, TestController(object_id_t objectId, object_id_t parentId, size_t commandQueueDepth = 10);
size_t commandQueueDepth = 10);
virtual~ TestController(); virtual~ TestController();
protected: protected:
testdevice::TestDataSet deviceDataset0;
testdevice::TestDataSet deviceDataset1;
/* Extended Controller Base overrides */ // Extended Controller Base overrides
ReturnValue_t handleCommandMessage(CommandMessage *message) override; ReturnValue_t handleCommandMessage(CommandMessage *message) override;
void performControlOperation() override; void performControlOperation() override;
/* HasLocalDatapoolIF callbacks */ // HasLocalDatapoolIF callbacks
void handleChangedDataset(sid_t sid, store_address_t storeId, bool* clearMessage) override; virtual void handleChangedDataset(sid_t sid, store_address_t storeId,
void handleChangedPoolVariable(gp_id_t globPoolId, store_address_t storeId, bool* clearMessage) override;
virtual void handleChangedPoolVariable(gp_id_t globPoolId, store_address_t storeId,
bool* clearMessage) override; bool* clearMessage) override;
LocalPoolDataSetBase* getDataSetHandle(sid_t sid) override; LocalPoolDataSetBase* getDataSetHandle(sid_t sid) override;
@ -34,17 +32,6 @@ protected:
ReturnValue_t initializeAfterTaskCreation() override; ReturnValue_t initializeAfterTaskCreation() override;
private: private:
bool traceVariable = false;
uint8_t traceCycles = 5;
uint8_t traceCounter = traceCycles;
enum TraceTypes {
NONE,
TRACE_DEV_0_UINT8,
TRACE_DEV_0_VECTOR
};
TraceTypes currentTraceType = TraceTypes::NONE;
}; };