Compare commits

..

65 Commits

Author SHA1 Message Date
muellerr 7382d0b38a that should do the job
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-10-04 13:24:41 +02:00
muellerr fd46784d0d Merge branch 'mueller/small-helper-script-fix' into mueller/obj-man-remove-weird-proc-func
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-10-04 10:57:14 +02:00
muellerr 448d20f3bd small fix for helper
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-10-04 10:55:46 +02:00
muellerr 1c6efe2abb Merge branch 'mueller/missing-retval-conversion' into mueller/obj-man-remove-weird-proc-func
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-10-04 10:52:53 +02:00
muellerr 5a9d37f5d8 remove check
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-10-04 10:51:22 +02:00
muellerr cdbf20bae7 remove weird prod callback
fsfw/fsfw/pipeline/head There was a failure building this commit
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-10-04 10:47:27 +02:00
muellerr 6f562e5f3e missing retval conv
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-10-04 10:25:58 +02:00
mohr 176f243194 Merge pull request 'Switch to new documentation server' (#694) from mohr/documentation_ci into development
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #694
2022-09-30 15:05:16 +02:00
mohr d964fa2107 Merge branch 'development' into mohr/documentation_ci
fsfw/fsfw/pipeline/pr-development This commit looks good
fsfw/fsfw/pipeline/head This commit looks good
2022-09-30 14:50:20 +02:00
mohr 7b5ae6a445 done?
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-30 14:40:59 +02:00
mohr 8e362a000c Revert "one last check"
fsfw/fsfw/pipeline/head This commit looks good
This reverts commit 7877776e24.
2022-09-30 14:36:25 +02:00
mohr 7877776e24 one last check
fsfw/fsfw/pipeline/head Something is wrong with the build of this commit
2022-09-30 14:34:25 +02:00
gaisser 62f638a3d2 Merge pull request 'doc corrections' (#687) from mueller/doc-corrections into development
fsfw/fsfw/pipeline/head There was a failure building this commit
Reviewed-on: #687
2022-09-26 14:38:39 +02:00
gaisser e6a877f048 Merge branch 'development' into mueller/doc-corrections
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-26 14:26:48 +02:00
gaisser ea8c557ee8 Merge pull request 'better error printout' (#686) from eive/fsfw:mueller/local-pool-obj-base-better-warning into development
fsfw/fsfw/pipeline/head There was a failure building this commit
Reviewed-on: #686
2022-09-26 14:26:20 +02:00
gaisser 0bdd780f82 Merge branch 'development' into mueller/doc-corrections
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-26 14:17:24 +02:00
gaisser 9ec397c8b7 Merge branch 'development' into mueller/local-pool-obj-base-better-warning
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-26 14:17:19 +02:00
gaisser 30c03c110c Merge pull request 'include correction' (#683) from mueller/service-interface-include-correction into development
fsfw/fsfw/pipeline/head There was a failure building this commit
Reviewed-on: #683
2022-09-26 14:14:57 +02:00
gaisser 69f1be263a Merge branch 'development' into mueller/local-pool-obj-base-better-warning
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-26 14:10:21 +02:00
muellerr c7b5309dcb Merge branch 'development' into mueller/service-interface-include-correction
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-26 14:08:38 +02:00
mohr 775d5632de update to ssh connection to doc server
fsfw/fsfw/pipeline/head This commit looks good
2022-09-23 20:26:45 +02:00
mohr 4f3361eb2b another ci check
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-09-23 18:33:47 +02:00
mohr 9e6c1d60e5 another ci check
fsfw/fsfw/pipeline/pr-development This commit looks good
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-09-23 17:54:41 +02:00
mohr 12d0c23c13 Revert "testing deployment of documentation"
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
This reverts commit 5488ee715f.
2022-09-23 17:31:17 +02:00
mohr 5c3bb13834 Revert "testing deployment of both development and master doc"
This reverts commit c0000a8635.
2022-09-23 17:31:07 +02:00
mohr 292fe3e5e4 forgot epilog file
fsfw/fsfw/pipeline/head This commit looks good
2022-09-23 17:11:57 +02:00
mohr 33530f2819 adding Impressum and Datenschutz to lcov output
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-09-23 17:04:35 +02:00
mohr c0000a8635 testing deployment of both development and master doc
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-09-23 14:14:10 +02:00
mohr 5488ee715f testing deployment of documentation
fsfw/fsfw/pipeline/head Something is wrong with the build of this commit
2022-09-23 14:07:12 +02:00
mohr 0fea22d031 switching to rsync and deploying to web documentation 2022-09-23 14:06:28 +02:00
mohr 3b8ca09299 prepared docker for documentation rsync
fsfw/fsfw/pipeline/head This commit looks good
2022-09-23 13:46:03 +02:00
mohr 9a2146fa2d added impressum and datenschutz in sphinx documentation
fsfw/fsfw/pipeline/head This commit looks good
2022-09-23 11:36:29 +02:00
muellerr bcbbc9763a markdown update not required, will be removed
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-15 14:00:01 +02:00
muellerr 8dea13742f update rst file
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-15 13:57:39 +02:00
muellerr 0f027d29d2 doc corrections
fsfw/fsfw/pipeline/head Build queued...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-15 13:53:42 +02:00
muellerr 131e3ff1e3 Revert "doc corrections"
fsfw/fsfw/pipeline/head This commit looks good
This reverts commit 423a9540ed.
2022-09-15 13:52:28 +02:00
muellerr 423a9540ed doc corrections
fsfw/fsfw/pipeline/head This commit looks good
2022-09-15 13:51:59 +02:00
muellerr ce7146e468 printout tweak
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-15 13:40:12 +02:00
muellerr a681a4a797 better error printout
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-15 13:38:38 +02:00
muellerr 4002b74ea2 Merge branch 'development' into mueller/service-interface-include-correction
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-15 11:01:06 +02:00
muellerr 1a833e2d45 another missing changelog entry
fsfw/fsfw/pipeline/head This commit looks good
2022-09-15 10:59:10 +02:00
muellerr 8df6d934d7 another missing changelog entry
fsfw/fsfw/pipeline/head This commit looks good
2022-09-15 10:56:52 +02:00
muellerr 5363868120 added another missing changelog entry
fsfw/fsfw/pipeline/head This commit looks good
2022-09-15 10:54:45 +02:00
muellerr 6eea711d9f Merge branch 'development' into mueller/service-interface-include-correction
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-15 10:48:28 +02:00
muellerr 9a181aa6a8 another missing changelog entry
fsfw/fsfw/pipeline/head This commit looks good
2022-09-15 10:47:50 +02:00
muellerr 655c944c0e another missing changelog entry
fsfw/fsfw/pipeline/head This commit looks good
2022-09-15 10:45:35 +02:00
muellerr 2e310fca8d add another missing changelog entry
fsfw/fsfw/pipeline/head This commit looks good
2022-09-15 10:43:45 +02:00
muellerr 37390dfc74 add missing changelog entry
fsfw/fsfw/pipeline/head This commit looks good
2022-09-15 10:42:35 +02:00
muellerr 9d626e0a5d include correction
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-14 19:59:02 +02:00
muellerr 0ce568ad26 Merge pull request 'publish documentation for development and master branch' (#681) from mohr/documentation_ci into development
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #681
2022-09-14 11:22:35 +02:00
mohr 6970068d56 small fix in README
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-13 18:19:35 +02:00
mohr af282c7d3e reverting to only publish development
fsfw/fsfw/pipeline/head This commit looks good
2022-09-13 18:17:56 +02:00
mohr 21a9d89fb3 pushing code coverage report to documentation server
fsfw/fsfw/pipeline/head This commit looks good
2022-09-13 18:14:26 +02:00
mohr 3257935150 fixing scp yet again again
fsfw/fsfw/pipeline/head This commit looks good
2022-09-13 18:06:16 +02:00
mohr f34cf9095d fixing scp yet again
fsfw/fsfw/pipeline/head This commit looks good
2022-09-13 18:02:38 +02:00
mohr 24ecf125a3 fixing scp command again
fsfw/fsfw/pipeline/head This commit looks good
2022-09-13 17:55:12 +02:00
mohr 6451a16888 fixing scp command
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-09-13 17:51:01 +02:00
mohr fa5605c959 testing Jenkinsfile
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-09-13 14:50:37 +02:00
mohr 8e835be55f testing Jenkinsfile
fsfw/fsfw/pipeline/head Something is wrong with the build of this commit
2022-09-13 14:46:12 +02:00
mohr 9bd600c488 testing Jenkinsfile
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-09-13 14:32:10 +02:00
mohr 9c7248e78e typo in Dockerfile
fsfw/fsfw/pipeline/head This commit looks good
2022-09-13 14:20:30 +02:00
mohr ecf51b2913 testing Jenkinsfile
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-09-13 14:09:08 +02:00
mohr 8bbde05413 add jenkins user in docker so that ssh will work
fsfw/fsfw/pipeline/head Something is wrong with the build of this commit
2022-09-13 14:08:04 +02:00
mohr d79b5348d8 testing Jenkinsfile
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-09-13 14:00:36 +02:00
mohr 92e3ab04f3 testing Jenkinsfile
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-09-13 13:54:23 +02:00
15 changed files with 105 additions and 42 deletions
+26
View File
@@ -10,6 +10,15 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
# [v6.0.0]
## Fixes
- Bugfix for Serial Buffer Stream: Setting `doActive` to false now
actually fully disables printing.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/680
- `TcpTmTcServer.cpp`: The server was actually not able to handle
CCSDS packets which were clumped together. This has been fixed now.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/673
## Added
- Add new `UnsignedByteField` class
@@ -24,6 +33,23 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
for other modules
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/655
which also includes a migration guide
- Bump Catch2 dependency to regular version `v3.1.0`
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/678
- `SerialBufferAdapter`: Rename `setBuffer` to `setConstBuffer` and update
API to expect `const uint8_t*` accordingly.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/677
- Remove the following user includes from `fsfw/events/Event.h` and
`fsfw/returnvalues/returnvalue.h`:
- `#include "events/subsystemIdRanges.h"`
- `#include "returnvalues/classIds.h"`
The user has to include those themselves now
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/675
- `DeviceHandlerBase`: Set command sender before calling `buildCommandFromCommand`.
This allows finishing action commands immediately inside the function.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/672
- `DeviceHandlerBase`: New signature of `handleDeviceTm` which expects
a `const SerializeIF&` and additional helper variant which expects `const uint8_t*`
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/671
# [v5.0.0] 25.07.2022
+4 -2
View File
@@ -326,7 +326,8 @@ if(FSFW_BUILD_TESTS)
"/usr/local/include/*"
"*/fsfw_tests/*"
"*/catch2-src/*"
"*/fsfw_hal/*")
"*/fsfw_hal/*"
"unittests/*")
endif()
target_link_options(${FSFW_TEST_TGT} PRIVATE -fprofile-arcs
@@ -345,7 +346,8 @@ if(FSFW_BUILD_TESTS)
else()
setup_target_for_coverage_lcov(
NAME ${FSFW_TEST_TGT}_coverage EXECUTABLE ${FSFW_TEST_TGT}
DEPENDENCIES ${FSFW_TEST_TGT})
DEPENDENCIES ${FSFW_TEST_TGT}
GENHTML_ARGS --html-epilog ${CMAKE_SOURCE_DIR}/unittests/lcov_epilog.html)
endif()
endif()
endif()
+1 -1
View File
@@ -175,7 +175,7 @@ cmake -DFSFW_BUILD_DOCS=ON -DFSFW_OSAL=host ..
Then you can generate the documentation using
```sh
cmake --build . -j
cmake --build . -- Sphinx -j
```
You can find the generated documentation inside the `docs/sphinx` folder inside the build
+9 -2
View File
@@ -5,7 +5,7 @@ RUN apt-get --yes upgrade
#tzdata is a dependency, won't install otherwise
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get --yes install gcc g++ cmake make lcov git valgrind nano iputils-ping python3 pip doxygen graphviz
RUN apt-get --yes install gcc g++ cmake make lcov git valgrind nano iputils-ping python3 pip doxygen graphviz rsync
RUN python3 -m pip install sphinx breathe
@@ -19,4 +19,11 @@ RUN git clone https://github.com/ETLCPP/etl.git && \
cd etl && \
git checkout 20.28.0 && \
cmake -B build . && \
cmake --install build/
cmake --install build/
#ssh needs a valid user to work
RUN adduser --uid 114 jenkins
#add documentation server to known hosts
RUN echo "|1|/LzCV4BuTmTb2wKnD146l9fTKgQ=|NJJtVjvWbtRt8OYqFgcYRnMQyVw= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNL8ssTonYtgiR/6RRlSIK9WU1ywOcJmxFTLcEblAwH7oifZzmYq3XRfwXrgfMpylEfMFYfCU8JRqtmi19xc21A=" >> /etc/ssh/ssh_known_hosts
RUN echo "|1|CcBvBc3EG03G+XM5rqRHs6gK/Gg=|oGeJQ+1I8NGI2THIkJsW92DpTzs= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNL8ssTonYtgiR/6RRlSIK9WU1ywOcJmxFTLcEblAwH7oifZzmYq3XRfwXrgfMpylEfMFYfCU8JRqtmi19xc21A=" >> /etc/ssh/ssh_known_hosts
+43 -1
View File
@@ -1,9 +1,13 @@
pipeline {
environment {
BUILDDIR = 'cmake-build-tests'
DOCDDIR = 'cmake-build-documentation'
}
agent {
docker { image 'fsfw-ci:d3'}
docker {
image 'fsfw-ci:d6'
args '--network host'
}
}
stages {
stage('Clean') {
@@ -39,5 +43,43 @@ pipeline {
}
}
}
stage('Documentation') {
when {
branch 'development'
}
steps {
dir(DOCDDIR) {
sh 'cmake -DFSFW_BUILD_DOCS=ON -DFSFW_OSAL=host ..'
sh 'make Sphinx'
sshagent(credentials: ['documentation-buildfix']) {
sh 'rsync -r --delete docs/sphinx/* buildfix@documentation.irs.uni-stuttgart.de:/fsfw/development'
}
}
dir(BUILDDIR) {
sshagent(credentials: ['documentation-buildfix']) {
sh 'rsync -r --delete fsfw-tests_coverage/* buildfix@documentation.irs.uni-stuttgart.de:/fsfw/coverage/development'
}
}
}
}
stage('Master Documentation') {
when {
branch 'master'
}
steps {
dir(DOCDDIR) {
sh 'cmake -DFSFW_BUILD_DOCS=ON -DFSFW_OSAL=host ..'
sh 'make Sphinx'
sshagent(credentials: ['documentation-buildfix']) {
sh 'rsync -r --delete docs/sphinx/* buildfix@documentation.irs.uni-stuttgart.de:/fsfw/master'
}
}
dir(BUILDDIR) {
sshagent(credentials: ['documentation-buildfix']) {
sh 'rsync -r --delete fsfw-tests_coverage/* buildfix@documentation.irs.uni-stuttgart.de:/fsfw/coverage/master'
}
}
}
}
}
}
+5
View File
@@ -50,6 +50,11 @@ exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
#
html_theme = 'alabaster'
html_theme_options = {
"extra_nav_links": {"Impressum" : "https://www.uni-stuttgart.de/impressum", "Datenschutz": "https://info.irs.uni-stuttgart.de/datenschutz/datenschutzWebmit.html"}
}
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
+8 -7
View File
@@ -6,13 +6,14 @@ High-level overview
Structure
----------
The general structure is driven by the usage of interfaces provided by objects.
The FSFW uses C++11 as baseline. The intention behind this is that this C++ Standard should be
widely available, even with older compilers.
The FSFW uses dynamic allocation during the initialization but provides static containers during runtime.
This simplifies the instantiation of objects and allows the usage of some standard containers.
Dynamic Allocation after initialization is discouraged and different solutions are provided in the
FSFW to achieve that. The fsfw uses run-time type information but exceptions are not allowed.
The general structure is driven by the usage of interfaces provided by objects.
The FSFW uses C++17 as baseline. Most modern compilers like GCC should have support for this
standard, even for micocontrollers.
The FSFW might use dynamic allocation during program initialization but not during runtime.
It offers pool objects, static containers and it also exposes the
`Embedded Template Library <https://www.etlcpp.com/>`_ to allow writing code which does not perform
allocation during runtime. The fsfw uses run-time type information but will not throw exceptions.
Failure Handling
-----------------
+1 -1
View File
@@ -199,7 +199,7 @@ def check_for_cmake_build_dir(build_dir_list: list) -> list:
def perform_lcov_operation(directory: str, chdir: bool):
if chdir:
os.chdir(directory)
cmd_runner("cmake --build . -- fsfw-tests_coverage -j")
cmd_runner("cmake --build -j . -- fsfw-tests_coverage")
def determine_build_dir(build_dir_list: List[str]):
@@ -48,12 +48,12 @@ LocalPoolObjectBase::LocalPoolObjectBase(object_id_t poolOwner, lp_id_t poolId,
if (hkOwner == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "LocalPoolVariable: The supplied pool owner 0x" << std::hex << poolOwner
<< std::dec << " did not implement the correct interface "
<< std::dec << " does not exist or does not implement the correct interface "
<< "HasLocalDataPoolIF" << std::endl;
#else
sif::printError(
"LocalPoolVariable: The supplied pool owner 0x%08x did not implement the correct "
"interface HasLocalDataPoolIF\n",
"LocalPoolVariable: The supplied pool owner 0x%08x does not exist or does not implement "
"the correct interface HasLocalDataPoolIF\n",
poolOwner);
#endif
return;
-16
View File
@@ -16,11 +16,6 @@ ObjectManager* ObjectManager::instance() {
return objManagerInstance;
}
void ObjectManager::setObjectFactoryFunction(produce_function_t objFactoryFunc, void* factoryArgs) {
this->objectFactoryFunction = objFactoryFunc;
this->factoryArgs = factoryArgs;
}
ObjectManager::ObjectManager() = default;
ObjectManager::~ObjectManager() {
@@ -79,17 +74,6 @@ SystemObjectIF* ObjectManager::getSystemObject(object_id_t id) {
}
void ObjectManager::initialize() {
if (objectFactoryFunction == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "ObjectManager::initialize: Passed produceObjects "
"functions is nullptr!"
<< std::endl;
#else
sif::printError("ObjectManager::initialize: Passed produceObjects functions is nullptr!\n");
#endif
return;
}
objectFactoryFunction(factoryArgs);
ReturnValue_t result = returnvalue::FAILED;
uint32_t errorCount = 0;
for (auto const& it : objectList) {
-5
View File
@@ -21,7 +21,6 @@
*/
class ObjectManager : public ObjectManagerIF {
public:
using produce_function_t = void (*)(void* args);
/**
* Returns the single instance of TaskFactory.
@@ -30,8 +29,6 @@ class ObjectManager : public ObjectManagerIF {
*/
static ObjectManager* instance();
void setObjectFactoryFunction(produce_function_t prodFunc, void* args);
template <typename T>
T* get(object_id_t id);
@@ -54,8 +51,6 @@ class ObjectManager : public ObjectManagerIF {
* @param The id of the object to be created.
* @return Returns a pointer to the newly created object or NULL.
*/
produce_function_t objectFactoryFunction = nullptr;
void* factoryArgs = nullptr;
private:
ObjectManager();
@@ -1,9 +1,8 @@
#ifndef FRAMEWORK_SERVICEINTERFACE_SERVICEINTERFACESTREAM_H_
#define FRAMEWORK_SERVICEINTERFACE_SERVICEINTERFACESTREAM_H_
#include <FSFWConfig.h>
#include "ServiceInterfaceBuffer.h"
#include "fsfw/FSFW.h"
#if FSFW_CPP_OSTREAM_ENABLED == 1
@@ -646,7 +646,7 @@ ReturnValue_t TestDevice::initializeLocalDataPool(localpool::DataPool& localData
/* Subscribe for periodic HK packets but do not enable reporting for now.
Non-diangostic with a period of one second */
poolManager.subscribeForRegularPeriodicPacket({sid, false, 1.0});
return HasReturnvaluesIF::RETURN_OK;
return returnvalue::OK;
}
ReturnValue_t TestDevice::getParameter(uint8_t domainId, uint8_t uniqueId,
+1 -1
View File
@@ -25,7 +25,7 @@ ServiceInterfaceStream warning("WARNING");
int customSetup() {
// global setup
ObjectManager* objMan = ObjectManager::instance();
objMan->setObjectFactoryFunction(Factory::produceFrameworkObjects, nullptr);
Factory::produceFrameworkObjects(nullptr);
objMan->initialize();
return 0;
}
+2
View File
@@ -0,0 +1,2 @@
<center><a href='https://www.uni-stuttgart.de/impressum'>Impressum</a> <a href='https://info.irs.uni-stuttgart.de/datenschutz/datenschutzWebmit.html'>Datenschutz</a></center>
</body>