Compare commits

..

19 Commits

Author SHA1 Message Date
Robin Müller d71da9b1b6
logging fixes
fsfw/fsfw example hosted/pipeline/head There was a failure building this commit Details
2022-06-21 11:15:38 +02:00
Robin Müller 45fec3f529
Merge remote-tracking branch 'origin/master' into mueller/fmt-tests 2022-06-21 11:03:52 +02:00
Robin Müller 38a77a6233
small update 2022-06-21 11:01:14 +02:00
Robin Müller da78c18117
bump deps
fsfw/fsfw example hosted/pipeline/head There was a failure building this commit Details
2022-06-21 10:53:06 +02:00
Robin Müller e8eac1f605
update .gitignorr 2022-06-21 10:51:28 +02:00
Robin Müller 72f0efb784
repoint fsfw
fsfw/fsfw example hosted/pipeline/head There was a failure building this commit Details
2022-05-17 19:05:03 +02:00
Robin Müller 8a44bba8a8
update clion files
fsfw/fsfw example hosted/pipeline/head There was a failure building this commit Details
2022-05-17 19:01:18 +02:00
Robin Müller 466b088dce
some updates
fsfw/fsfw example hosted/pipeline/head There was a failure building this commit Details
2022-05-17 18:26:42 +02:00
Robin Müller f42b3e52d1
bump fsfw
fsfw/fsfw example hosted/pipeline/head There was a failure building this commit Details
2022-05-12 19:01:18 +02:00
Robin Müller 6f4b7bfbf2
repoint fsfw 2022-05-12 17:52:13 +02:00
Robin Müller 7a859fbbd6
bump fsfw and .idea/cmake file
fsfw/fsfw example hosted/pipeline/head There was a failure building this commit Details
2022-05-10 10:15:19 +02:00
Robin Müller 9b68a282a7
update fsfw
fsfw/fsfw example hosted/pipeline/head There was a failure building this commit Details
2022-05-09 11:16:46 +02:00
Robin Müller bd3164bacd
enable lto 2022-05-09 02:03:17 +02:00
Robin Müller 1fe6fd9ead
update submodules, run config 2022-05-09 01:28:47 +02:00
Robin Müller 857548fe79
complete iostream replacement 2022-05-09 01:15:11 +02:00
Robin Müller aea14e10c3
compiling fmt replacement 2022-05-09 00:10:01 +02:00
Robin Müller 100910d13c
this works
fsfw/fsfw example hosted/pipeline/head There was a failure building this commit Details
2022-05-08 02:12:08 +02:00
Robin Müller e66c02a86a
disable clang profile 2022-05-08 00:12:23 +02:00
Robin Müller f26c9d2794
bump C++ version
fsfw/fsfw example hosted/pipeline/head This commit looks good Details
2022-05-05 21:00:33 +02:00
63 changed files with 376 additions and 807 deletions

6
.gitmodules vendored
View File

@ -7,6 +7,12 @@
[submodule "fsfw"]
path = fsfw
url = https://egit.irs.uni-stuttgart.de/fsfw/fsfw.git
[submodule "tmtc/tmtccmd"]
path = tmtc/tmtccmd
url = https://github.com/robamu-org/tmtccmd.git
[submodule "tmtc/common_tmtc"]
path = tmtc/common_tmtc
url = https://egit.irs.uni-stuttgart.de/fsfw/fsfw-example-tmtc-common.git
[submodule "tmtc/spacepackets"]
path = tmtc/spacepackets
url = https://github.com/robamu-org/py-spacepackets.git

View File

@ -2,9 +2,10 @@
<project version="4">
<component name="CMakeSharedSettings">
<configurations>
<configuration PROFILE_NAME="Debug" ENABLED="true" CONFIG_NAME="Debug" NO_GENERATOR="true" />
<configuration PROFILE_NAME="Debug Linux" ENABLED="true" GENERATION_DIR="cmake-build-debug-linux" CONFIG_NAME="Debug" GENERATION_OPTIONS="-DFSFW_OSAL=linux" NO_GENERATOR="true" />
<configuration PROFILE_NAME="Release" ENABLED="true" CONFIG_NAME="Release" NO_GENERATOR="true" />
<configuration PROFILE_NAME="MinSizeRel" ENABLED="true" CONFIG_NAME="MinSizeRel" />
<configuration PROFILE_NAME="Debug" ENABLED="true" CONFIG_NAME="Debug" />
<configuration PROFILE_NAME="Debug Linux" ENABLED="true" GENERATION_DIR="cmake-build-debug-linux" CONFIG_NAME="Debug" GENERATION_OPTIONS="-DFSFW_OSAL=linux" />
<configuration PROFILE_NAME="Release" ENABLED="true" CONFIG_NAME="Release" />
<configuration PROFILE_NAME="Debug Clang" ENABLED="false" CONFIG_NAME="Debug" GENERATION_OPTIONS="-DCMAKE_TOOLCHAIN_FILE=cmake/ClangToolchain.cmake" />
</configurations>
</component>

View File

@ -1,7 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="example" type="CMakeRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="fsfw-example-hosted" TARGET_NAME="fsfw-example-hosted" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="fsfw-example-hosted" RUN_TARGET_NAME="fsfw-example-hosted">
<method v="2">
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
</method>
</configuration>
</component>

View File

@ -0,0 +1,7 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="fsfw-example-hosted" type="CMakeRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="fsfw-example-hosted" TARGET_NAME="fsfw-example-hosted" CONFIG_NAME="MinSizeRel" RUN_TARGET_PROJECT_NAME="fsfw-example-hosted" RUN_TARGET_NAME="fsfw-example-hosted">
<method v="2">
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
</method>
</configuration>
</component>

View File

@ -13,6 +13,9 @@ cmake_minimum_required(VERSION 3.13)
# set(CMAKE_VERBOSE TRUE)
# Project Name
project(fsfw-example-hosted C CXX)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
set(OBSW_MAX_SCHEDULED_TCS 200)
@ -23,8 +26,12 @@ if(NOT FSFW_OSAL)
CACHE STRING "OS for the FSFW.")
endif()
# Project Name
project(fsfw-example-hosted C CXX)
option(OBSW_ADD_FMT_TESTS "Add {fmt} library tests" OFF)
option(OBSW_ENABLE_IPO "Enable IPO/LTO optimization" ON)
if(OBSW_ENABLE_IPO)
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
endif()
option(OBSW_ENABLE_IPO "Enable IPO/LTO optimization" ON)
@ -106,7 +113,10 @@ add_subdirectory(${COMMON_PATH})
# ##############################################################################
# Add libraries for all sources.
target_link_libraries(${TARGET_NAME} PRIVATE ${LIB_FSFW_NAME} ${LIB_OS_NAME})
target_link_libraries(${TARGET_NAME} PRIVATE
${LIB_FSFW_NAME}
${LIB_OS_NAME}
)
# Add include paths for all sources.
target_include_directories(

View File

@ -1,4 +1,4 @@
<img align="center" src="https://egit.irs.uni-stuttgart.de/fsfw/fsfw/raw/branch/master/misc/logo/FSFW_Logo_V3_bw.png" width="50%">
<img align="center" src="https://egit.irs.uni-stuttgart.de/fsfw/fsfw-example-common/raw/branch/master/doc/images/FSFW_Logo_V3_bw.png" width="50%">
# <a id="top"></a> <a name="linux"></a> FSFW Example Application
@ -52,11 +52,6 @@ the host abstraction layer of the FSFW.
This demo provides the opportunity to to test functionality of the
FSFW on a host computer without the need of setting up external embedded hardware.
After cloning, make sure to clone and initialize the submodules
```sh
git submodule update --init
```
## Prerequisites
@ -77,19 +72,16 @@ When the software is running, it opens a TCP oder UDP server, depending on the c
on port 7301. You can send PUS telecommands to that port to interactively command the
software.
The following steps set up a virtual environment, install all the dependencies, and then use
the `tmtcc.py` utility to send a ping telecommand to the running OBSW
For a quick test, install the `tmtccmd` Python package first and use `py` instead
of `python3` on Windows:
```sh
cd tmtc
python3 -m venv venv
cd deps/tmtccmd
pip install .[gui]
cd tmtccmd
python3 -m pip install -r requirements.txt
```
Now you can command the software using the `tmtcc.py` command for the CLI mode and `tmtcc.py -g`
for the GUI mode inside the virtual environment. For example, you can use `tmtcc.py -s 17 -o 0`
to send a ping command.
Now you can command the software using the `tmtccli.py` and `tmtcgui.py` command.
For example, you can use `tmtccli.py -s 17 -o 0` to send a ping command.
## <a id="prereqsetup"></a> Setting up Prerequisites

View File

@ -1,17 +1,28 @@
pipeline {
agent any
environment {
BUILDDIR = 'cmake-build-debug'
}
agent {
docker { image 'fsfw-ci:d3'}
BUILDDIR = 'build-Debug'
}
stages {
stage('Clean') {
stage('Create Docker') {
agent {
dockerfile {
dir 'automation'
additionalBuildArgs '--no-cache'
reuseNode true
}
}
steps {
sh 'rm -rf $BUILDDIR'
}
}
stage('Configure') {
agent {
dockerfile {
dir 'automation'
reuseNode true
}
}
steps {
dir(BUILDDIR) {
sh 'cmake -DFSFW_OSAL=host ..'
@ -19,9 +30,15 @@ pipeline {
}
}
stage('Build') {
agent {
dockerfile {
dir 'automation'
reuseNode true
}
}
steps {
dir(BUILDDIR) {
sh 'cmake --build . -j4'
sh 'cmake --build . -j'
}
}
}

View File

@ -3,8 +3,8 @@
#include <bsp_hosted/fsfwconfig/objects/systemObjectList.h>
#include <bsp_hosted/fsfwconfig/pollingsequence/pollingSequenceFactory.h>
#include <fsfw/modes/HasModesIF.h>
#include <fsfw/retval.h>
#include <fsfw/serviceinterface/ServiceInterface.h>
#include <fsfw/returnvalues/HasReturnvaluesIF.h>
#include <fsfw/serviceinterface.h>
#include <fsfw/tasks/FixedTimeslotTaskIF.h>
#include <fsfw/tasks/PeriodicTaskIF.h>
#include <fsfw/tasks/TaskFactory.h>
@ -41,34 +41,18 @@ void InitMission::createTasks() {
PeriodicTaskIF* distributerTask = taskFactory->createPeriodicTask(
"DIST", currPrio, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.1, deadlineMissedFunc);
ReturnValue_t result = distributerTask->addComponent(objects::CCSDS_DISTRIBUTOR);
if (result != returnvalue::OK) {
if (result != HasReturnvaluesIF::RETURN_OK) {
task::printInitError("CCSDS distributor", objects::CCSDS_DISTRIBUTOR);
}
result = distributerTask->addComponent(objects::PUS_DISTRIBUTOR);
if (result != returnvalue::OK) {
if (result != HasReturnvaluesIF::RETURN_OK) {
task::printInitError("PUS distributor", objects::PUS_DISTRIBUTOR);
}
result = distributerTask->addComponent(objects::CFDP_DISTRIBUTOR);
if (result != returnvalue::OK) {
task::printInitError("CFDP distributor", objects::CFDP_DISTRIBUTOR);
}
result = distributerTask->addComponent(objects::TM_FUNNEL);
if (result != returnvalue::OK) {
if (result != HasReturnvaluesIF::RETURN_OK) {
task::printInitError("TM funnel", objects::TM_FUNNEL);
}
#if OBSW_ADD_CFDP_COMPONENTS == 1
#ifdef __unix__
currPrio = 50;
#endif
PeriodicTaskIF* cfdpTask = taskFactory->createPeriodicTask(
"CFDP Handler", currPrio, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.4, deadlineMissedFunc);
result = cfdpTask->addComponent(objects::CFDP_HANDLER);
if (result != returnvalue::OK) {
task::printInitError("CFDP Handler", objects::CFDP_HANDLER);
}
#endif
#ifdef __unix__
currPrio = 50;
#endif
@ -76,7 +60,7 @@ void InitMission::createTasks() {
PeriodicTaskIF* udpBridgeTask = taskFactory->createPeriodicTask(
"TCPIP_TMTC_BRIDGE", currPrio, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.2, deadlineMissedFunc);
result = udpBridgeTask->addComponent(objects::TCPIP_TMTC_BRIDGE);
if (result != returnvalue::OK) {
if (result != HasReturnvaluesIF::RETURN_OK) {
task::printInitError("TMTC bridge", objects::TCPIP_TMTC_BRIDGE);
}
@ -86,7 +70,7 @@ void InitMission::createTasks() {
PeriodicTaskIF* udpPollingTask = taskFactory->createPeriodicTask(
"TMTC_POLLING", currPrio, PeriodicTaskIF::MINIMUM_STACK_SIZE, 2.0, deadlineMissedFunc);
result = udpPollingTask->addComponent(objects::TCPIP_TMTC_POLLING_TASK);
if (result != returnvalue::OK) {
if (result != HasReturnvaluesIF::RETURN_OK) {
task::printInitError("TMTC polling", objects::TCPIP_TMTC_POLLING_TASK);
}
@ -96,7 +80,7 @@ void InitMission::createTasks() {
PeriodicTaskIF* eventTask = taskFactory->createPeriodicTask(
"EVENT", currPrio, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.100, deadlineMissedFunc);
result = eventTask->addComponent(objects::EVENT_MANAGER);
if (result != returnvalue::OK) {
if (result != HasReturnvaluesIF::RETURN_OK) {
task::printInitError("Event Manager", objects::EVENT_MANAGER);
}
#endif /* OBSW_ADD_CORE_COMPONENTS == 1 */
@ -109,13 +93,8 @@ void InitMission::createTasks() {
FixedTimeslotTaskIF* timeslotDemoTask = taskFactory->createFixedTimeslotTask(
"PST_TASK", currPrio, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.5, deadlineMissedFunc);
result = pst::pollingSequenceExamples(timeslotDemoTask);
if (result != returnvalue::OK) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "InitMission::createTasks: Timeslot demo task initialization failed!"
<< std::endl;
#else
sif::printError("InitMission::createTasks: Timeslot demo task initialization failed!\n");
#endif
if (result != HasReturnvaluesIF::RETURN_OK) {
FSFW_LOGE("InitMission::createTasks: Timeslot demo task initialization failed\n");
}
#ifdef __unix__
@ -124,7 +103,7 @@ void InitMission::createTasks() {
PeriodicTaskIF* readerTask = taskFactory->createPeriodicTask(
"READER_TASK", currPrio, PeriodicTaskIF::MINIMUM_STACK_SIZE, 1.0, deadlineMissedFunc);
result = readerTask->addComponent(objects::TEST_DUMMY_4);
if (result != returnvalue::OK) {
if (result != HasReturnvaluesIF::RETURN_OK) {
task::printInitError("Dummy 4", objects::TEST_DUMMY_4);
}
#endif /* OBSW_ADD_TASK_EXAMPLE == 1 */
@ -137,7 +116,7 @@ void InitMission::createTasks() {
PeriodicTaskIF* pusVerification = taskFactory->createPeriodicTask(
"PUS_VERIF_1", currPrio, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.200, deadlineMissedFunc);
result = pusVerification->addComponent(objects::PUS_SERVICE_1_VERIFICATION);
if (result != returnvalue::OK) {
if (result != HasReturnvaluesIF::RETURN_OK) {
task::printInitError("PUS 1", objects::PUS_SERVICE_1_VERIFICATION);
}
@ -147,15 +126,15 @@ void InitMission::createTasks() {
PeriodicTaskIF* pusHighPrio = taskFactory->createPeriodicTask(
"PUS_HIGH_PRIO", currPrio, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.2, deadlineMissedFunc);
result = pusHighPrio->addComponent(objects::PUS_SERVICE_2_DEVICE_ACCESS);
if (result != returnvalue::OK) {
if (result != HasReturnvaluesIF::RETURN_OK) {
task::printInitError("PUS 2", objects::PUS_SERVICE_2_DEVICE_ACCESS);
}
result = pusHighPrio->addComponent(objects::PUS_SERVICE_5_EVENT_REPORTING);
if (result != returnvalue::OK) {
if (result != HasReturnvaluesIF::RETURN_OK) {
task::printInitError("PUS 5", objects::PUS_SERVICE_5_EVENT_REPORTING);
}
result = pusHighPrio->addComponent(objects::PUS_SERVICE_9_TIME_MGMT);
if (result != returnvalue::OK) {
if (result != HasReturnvaluesIF::RETURN_OK) {
task::printInitError("PUS 9", objects::PUS_SERVICE_9_TIME_MGMT);
}
@ -165,23 +144,23 @@ void InitMission::createTasks() {
PeriodicTaskIF* pusMedPrio = taskFactory->createPeriodicTask(
"PUS_MED_PRIO", currPrio, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.6, deadlineMissedFunc);
result = pusMedPrio->addComponent(objects::PUS_SERVICE_3_HOUSEKEEPING);
if (result != returnvalue::OK) {
if (result != HasReturnvaluesIF::RETURN_OK) {
task::printInitError("PUS 3", objects::PUS_SERVICE_3_HOUSEKEEPING);
}
result = pusMedPrio->addComponent(objects::PUS_SERVICE_8_FUNCTION_MGMT);
if (result != returnvalue::OK) {
if (result != HasReturnvaluesIF::RETURN_OK) {
task::printInitError("PUS 8", objects::PUS_SERVICE_8_FUNCTION_MGMT);
}
result = pusMedPrio->addComponent(objects::PUS_SERVICE_20_PARAMETERS);
if (result != returnvalue::OK) {
if (result != HasReturnvaluesIF::RETURN_OK) {
task::printInitError("PUS 20", objects::PUS_SERVICE_20_PARAMETERS);
}
result = pusMedPrio->addComponent(objects::PUS_SERVICE_200_MODE_MGMT);
if (result != returnvalue::OK) {
if (result != HasReturnvaluesIF::RETURN_OK) {
task::printInitError("PUS 200", objects::PUS_SERVICE_200_MODE_MGMT);
}
result = pusMedPrio->addComponent(objects::PUS_SERVICE_11_TC_SCHEDULER);
if (result != returnvalue::OK) {
if (result != HasReturnvaluesIF::RETURN_OK) {
task::printInitError("PUS 11", objects::PUS_SERVICE_11_TC_SCHEDULER);
}
@ -191,7 +170,7 @@ void InitMission::createTasks() {
PeriodicTaskIF* pusLowPrio = taskFactory->createPeriodicTask(
"PUS_LOW_PRIO", currPrio, PeriodicTaskIF::MINIMUM_STACK_SIZE, 1.2, deadlineMissedFunc);
result = pusLowPrio->addComponent(objects::PUS_SERVICE_17_TEST);
if (result != returnvalue::OK) {
if (result != HasReturnvaluesIF::RETURN_OK) {
task::printInitError("PUS 17", objects::PUS_SERVICE_17_TEST);
}
#endif /* OBSW_ADD_PUS_STACK == 1 */
@ -206,12 +185,8 @@ void InitMission::createTasks() {
FixedTimeslotTaskIF* testDevicesTimeslotTask = taskFactory->createFixedTimeslotTask(
"PST_TEST_TASK", currPrio, PeriodicTaskIF::MINIMUM_STACK_SIZE, 2.0, deadlineMissedFunc);
result = pst::pollingSequenceDevices(testDevicesTimeslotTask);
if (result != returnvalue::OK) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "InitMission::createTasks: Test PST initialization failed!" << std::endl;
#else
sif::printError("InitMission::createTasks: Test PST initialization failed!\n");
#endif
if (result != HasReturnvaluesIF::RETURN_OK) {
FSFW_LOGE("InitMission::createTasks: Test PST initialization failed\n");
}
#if _WIN32
@ -224,7 +199,7 @@ void InitMission::createTasks() {
task::printInitError("ASS_TASK", objects::TEST_ASSEMBLY);
}
result = assemblyTask->addComponent(objects::TEST_ASSEMBLY);
if (result != returnvalue::OK) {
if (result != HasReturnvaluesIF::RETURN_OK) {
task::printInitError("ASS_TASK", objects::TEST_ASSEMBLY);
}
#endif /* OBSW_ADD_DEVICE_HANDLER_DEMO == 1 */
@ -236,7 +211,7 @@ void InitMission::createTasks() {
PeriodicTaskIF* controllerTask = taskFactory->createPeriodicTask(
"TEST_CTRL", currPrio, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.8, deadlineMissedFunc);
result = controllerTask->addComponent(objects::TEST_CONTROLLER);
if (result != returnvalue::OK) {
if (result != HasReturnvaluesIF::RETURN_OK) {
task::printInitError("Controller Task", objects::TEST_CONTROLLER);
}
#endif /* OBSW_ADD_CONTROLLER_DEMO == 1 */
@ -246,15 +221,11 @@ void InitMission::createTasks() {
PeriodicTaskIF* testTask = TaskFactory::instance()->createPeriodicTask(
"TEST_TASK", currPrio, PeriodicTaskIF::MINIMUM_STACK_SIZE, 1.0, deadlineMissedFunc);
result = testTask->addComponent(objects::TEST_TASK);
if (result != returnvalue::OK) {
if (result != HasReturnvaluesIF::RETURN_OK) {
task::printInitError("Test Task", objects::TEST_TASK);
}
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::info << "Starting tasks.." << std::endl;
#else
sif::printInfo("Starting tasks..\n");
#endif
FSFW_LOGI("Starting tasks..\n");
#if OBSW_ADD_CORE_COMPONENTS == 1
distributerTask->startTask();
@ -263,10 +234,6 @@ void InitMission::createTasks() {
eventTask->startTask();
#endif /* OBSW_ADD_CORE_COMPONENTS == 1 */
#if OBSW_ADD_CFDP_COMPONENTS == 1
cfdpTask->startTask();
#endif
#if OBSW_ADD_PUS_STACK == 1
pusVerification->startTask();
pusHighPrio->startTask();
@ -290,11 +257,7 @@ void InitMission::createTasks() {
testTask->startTask();
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::info << "Tasks started.." << std::endl;
#else
sif::printInfo("Tasks started..\n");
#endif
FSFW_LOGI("Tasks started\n");
#if OBSW_ADD_DEVICE_HANDLER_DEMO
auto* assembly = ObjectManager::instance()->get<HasModesIF>(objects::TEST_ASSEMBLY);

View File

@ -2,14 +2,14 @@
#include "OBSWConfig.h"
#include "bsp_hosted/fsfwconfig/objects/systemObjectList.h"
#include "bsp_hosted/fsfwconfig/tmtc/apid.h"
#include "fsfw/serviceinterface.h"
#include "commonConfig.h"
#include "example/core/GenericFactory.h"
#include "example/test/FsfwTestTask.h"
#include "example/utility/TmFunnel.h"
#include "fsfw/storagemanager/PoolManager.h"
#include "fsfw/tcdistribution/CcsdsDistributor.h"
#include "fsfw/tmtcservices/CommandingServiceBase.h"
#include "fsfw_hal/host/HostFilesystem.h"
#if OBSW_USE_TCP_SERVER == 0
#include <fsfw/osal/common/UdpTcPollingTask.h>
@ -19,55 +19,40 @@
#include "fsfw/osal/common/TcpTmTcServer.h"
#endif
#if OBSW_ADD_CFDP_COMPONENTS == 1
// These CFDP containers are user supplied because their size might differ depending on
// which system the example is run on
namespace cfdp {
PacketInfoList<128> PACKET_INFO;
PacketInfoListBase* PACKET_LIST_PTR = &PACKET_INFO;
LostSegmentsList<128> LOST_SEGMENTS;
LostSegmentsListBase* LOST_SEGMENTS_PTR = &LOST_SEGMENTS;
} // namespace cfdp
#endif
void ObjectFactory::produce(void* args) {
Factory::setStaticFrameworkObjectIds();
StorageManagerIF* tcStore;
StorageManagerIF* tmStore;
#if OBSW_ADD_CORE_COMPONENTS == 1
{
LocalPool::LocalPoolConfig poolCfg = {{100, 16}, {50, 32}, {40, 64},
{30, 128}, {20, 1024}, {10, 2048}};
tcStore = new PoolManager(objects::TC_STORE, poolCfg);
LocalPool::LocalPoolConfig poolCfg = {{16, 100}, {32, 50}, {64, 40},
{128, 30}, {1024, 20}, {2048, 10}};
new PoolManager(objects::TC_STORE, poolCfg);
}
{
LocalPool::LocalPoolConfig poolCfg = {{100, 16}, {50, 32}, {40, 64},
{30, 128}, {20, 1024}, {10, 2048}};
tmStore = new PoolManager(objects::TM_STORE, poolCfg);
LocalPool::LocalPoolConfig poolCfg = {{16, 100}, {32, 50}, {64, 40},
{128, 30}, {1024, 20}, {2048, 10}};
new PoolManager(objects::TM_STORE, poolCfg);
}
{
LocalPool::LocalPoolConfig poolCfg = {{100, 16}, {50, 32}, {40, 64},
{30, 128}, {20, 1024}, {10, 2048}};
LocalPool::LocalPoolConfig poolCfg = {{16, 100}, {32, 50}, {64, 40},
{128, 30}, {1024, 20}, {2048, 10}};
new PoolManager(objects::IPC_STORE, poolCfg);
}
PusTmFunnel* funnel;
CcsdsDistributor* ccsdsDistrib;
ObjectFactory::produceGenericObjects();
// TMTC Reception via TCP/IP socket
#if OBSW_USE_TCP_SERVER == 0
auto tmtcBridge = new UdpTmTcBridge(objects::TCPIP_TMTC_BRIDGE, objects::CCSDS_DISTRIBUTOR);
tmtcBridge->setMaxNumberOfPacketsStored(50);
sif::info << "Opening UDP TMTC server on port " << tmtcBridge->getUdpPort() << std::endl;
FSFW_LOGI("Opening UDP TMTC server on port {}\n", tmtcBridge->getUdpPort());
new UdpTcPollingTask(objects::TCPIP_TMTC_POLLING_TASK, objects::TCPIP_TMTC_BRIDGE);
#else
auto tmtcBridge = new TcpTmTcBridge(objects::TCPIP_TMTC_BRIDGE, objects::CCSDS_DISTRIBUTOR);
tmtcBridge->setMaxNumberOfPacketsStored(50);
auto tmtcServer = new TcpTmTcServer(objects::TCPIP_TMTC_POLLING_TASK, objects::TCPIP_TMTC_BRIDGE);
sif::info << "Opening TCP TMTC server on port " << tmtcServer->getTcpPort() << std::endl;
// TODO: Set the set of valid space packet IDs. Otherwise, parsing might fail
FSFW_LOGI("Opening TCP TMTC server on port {}\n", tmtcServer->getTcpPort());
#endif
ObjectFactory::produceGenericObjects(&funnel, *tmtcBridge, &ccsdsDistrib, *tcStore, *tmStore);
#endif /* OBSW_ADD_CORE_COMPONENTS == 1 */

View File

@ -10,7 +10,7 @@
#define OBSW_TASK_PERIODIC_EVENT 0
// Use a TCP server instead of a UDP server for TMTC reception
#define OBSW_USE_TCP_SERVER 0
#define OBSW_USE_TCP_SERVER 1
#ifdef __cplusplus

View File

@ -1,10 +0,0 @@
#ifndef FSFW_EXAMPLE_HOSTED_DEFINITIONS_H
#define FSFW_EXAMPLE_HOSTED_DEFINITIONS_H
#include <cstdint>
namespace cfg {
static constexpr uint32_t OBSW_MAX_SCHEDULED_TCS = 200;
}
#endif // FSFW_EXAMPLE_HOSTED_DEFINITIONS_H

View File

@ -1,7 +1,7 @@
/**
* @brief Auto-generated event translation file. Contains 79 translations.
* @brief Auto-generated event translation file. Contains 78 translations.
* @details
* Generated on: 2022-07-27 19:41:37
* Generated on: 2022-05-20 09:11:07
*/
#include "translateEvents.h"
@ -81,7 +81,6 @@ const char *BIT_LOCK_LOST_STRING = "BIT_LOCK_LOST";
const char *FRAME_PROCESSING_FAILED_STRING = "FRAME_PROCESSING_FAILED";
const char *CLOCK_SET_STRING = "CLOCK_SET";
const char *CLOCK_SET_FAILURE_STRING = "CLOCK_SET_FAILURE";
const char *TC_DELETION_FAILED_STRING = "TC_DELETION_FAILED";
const char *TEST_STRING = "TEST";
const char *CHANGE_OF_SETUP_PARAMETER_STRING = "CHANGE_OF_SETUP_PARAMETER";
@ -239,8 +238,6 @@ const char *translateEvents(Event event) {
return CLOCK_SET_STRING;
case (8901):
return CLOCK_SET_FAILURE_STRING;
case (9100):
return TC_DELETION_FAILED_STRING;
case (9700):
return TEST_STRING;
case (10600):

View File

@ -1,8 +1,8 @@
/**
* @brief Auto-generated object translation file.
* @details
* Contains 40 translations.
* Generated on: 2022-07-27 19:41:37
* Contains 39 translations.
* Generated on: 2022-05-20 09:16:37
*/
#include "translateObjects.h"
@ -32,7 +32,6 @@ const char *TC_STORE_STRING = "TC_STORE";
const char *TM_STORE_STRING = "TM_STORE";
const char *IPC_STORE_STRING = "IPC_STORE";
const char *TIME_STAMPER_STRING = "TIME_STAMPER";
const char *TC_VERIFICATOR_STRING = "TC_VERIFICATOR";
const char *FSFW_OBJECTS_END_STRING = "FSFW_OBJECTS_END";
const char *TCPIP_TMTC_BRIDGE_STRING = "TCPIP_TMTC_BRIDGE";
const char *TCPIP_TMTC_POLLING_TASK_STRING = "TCPIP_TMTC_POLLING_TASK";
@ -101,8 +100,6 @@ const char *translateObject(object_id_t object) {
return IPC_STORE_STRING;
case 0x53500010:
return TIME_STAMPER_STRING;
case 0x53500020:
return TC_VERIFICATOR_STRING;
case 0x53ffffff:
return FSFW_OBJECTS_END_STRING;
case 0x62000300:

View File

@ -1,7 +1,7 @@
#ifndef POLLINGSEQUENCE_POLLINGSEQUENCFACTORY_H_
#define POLLINGSEQUENCE_POLLINGSEQUENCFACTORY_H_
#include <fsfw/retval.h>
#include <fsfw/returnvalues/HasReturnvaluesIF.h>
#include "OBSWConfig.h"

View File

@ -0,0 +1,12 @@
#ifndef FSFWCONFIG_TMTC_APID_H_
#define FSFWCONFIG_TMTC_APID_H_
#include <commonConfig.h>
#include <cstdint>
namespace apid {
static const uint16_t APID = COMMON_APID;
};
#endif /* FSFWCONFIG_TMTC_APID_H_ */

View File

@ -2,11 +2,9 @@
#include <bsp_hosted/core/ObjectFactory.h>
#include <fsfw/objectmanager/ObjectManager.h>
#include <fsfw/platform.h>
#include <fsfw/serviceinterface/ServiceInterface.h>
#include <fsfw/serviceinterface.h>
#include <fsfw/tasks/TaskFactory.h>
#include <chrono>
#include "example/test/MutexExample.h"
#include "example/utility/utility.h"
@ -19,38 +17,25 @@ static const char* COMPILE_PRINTOUT = "unknown OS";
#endif
#if FSFW_CPP_OSTREAM_ENABLED == 1
ServiceInterfaceStream sif::debug("DEBUG", false);
ServiceInterfaceStream sif::info("INFO", false);
ServiceInterfaceStream sif::warning("WARNING", false);
ServiceInterfaceStream sif::error("ERROR", false, true, true);
// ServiceInterfaceStream sif::debug("DEBUG", false);
// ServiceInterfaceStream sif::info("INFO", false);
// ServiceInterfaceStream sif::warning("WARNING", false);
// ServiceInterfaceStream sif::error("ERROR", false, true, true);
#endif
int main() {
utility::commonInitPrint("Hosted", COMPILE_PRINTOUT);
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::info << "Producing system objects.." << std::endl;
#else
sif::printInfo("Producing system objects..\n");
#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */
FSFW_LOGI("Producing system objects\n");
ObjectManager* objManager = ObjectManager::instance();
objManager->setObjectFactoryFunction(ObjectFactory::produce, nullptr);
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::info << "Objects created successfully.." << std::endl;
sif::info << "Initializing objects.." << std::endl;
#else
sif::printInfo("Objects created successfully..\n");
#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */
FSFW_LOGI("Objects created successfully, initializing objects\n");
objManager->initialize();
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::info << "Creating tasks.." << std::endl;
#else
sif::printInfo("Creating tasks..\n");
#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */
FSFW_LOGI("Creating tasks\n");
InitMission::createTasks();

View File

@ -20,40 +20,27 @@ def main():
print("-- Python CMake build configurator utility --")
print("Parsing command line arguments..")
parser = argparse.ArgumentParser(
description="Processing arguments for CMake build configuration."
parser = argparse.ArgumentParser(description="Processing arguments for CMake build configuration.")
parser.add_argument(
"-o", "--osal", type=str, choices=["freertos", "linux", "rtems", "host"],
help="FSFW OSAL. Valid arguments: host, linux, rtems, freertos"
)
parser.add_argument(
"-o",
"--osal",
type=str,
choices=["freertos", "linux", "rtems", "host"],
help="FSFW OSAL. Valid arguments: host, linux, rtems, freertos",
)
parser.add_argument(
"-b",
"--buildtype",
type=str,
choices=["debug", "release", "size", "reldeb"],
help="CMake build type. Valid arguments: debug, release, size, reldeb (Release with Debug Information)",
default="debug",
"-b", "--buildtype", type=str, choices=["debug", "release", "size", "reldeb"],
help="CMake build type. Valid arguments: debug, release, size, reldeb (Release with Debug Information)",
default="debug"
)
parser.add_argument("-l", "--builddir", type=str, help="Specify build directory.")
parser.add_argument(
"-g", "--generator", type=str, help="CMake Generator", choices=["make", "ninja"]
)
parser.add_argument(
"-t",
"--target-bsp",
type=str,
help="Target BSP, combination of architecture and machine",
"-t", "--target-bsp", type=str, help="Target BSP, combination of architecture and machine"
)
parser.add_argument(
"-d",
"--defines",
"-d", "--defines",
help="Additional custom defines passed to CMake (supply without -D prefix!)",
nargs="*",
type=str,
nargs="*", type=str
)
args = parser.parse_args()
@ -66,15 +53,15 @@ def main():
if args.generator is None:
generator = determine_build_generator()
generator_cmake_arg = f'-G "{generator}"'
generator_cmake_arg = f"-G \"{generator}\""
else:
if args.generator == "make":
if os.name == "nt":
if os.name == 'nt':
generator_cmake_arg = '-G "MinGW Makefiles"'
else:
generator_cmake_arg = '-G "Unix Makefiles"'
elif args.generator == "ninja":
generator_cmake_arg = "-G Ninja"
elif args.generator == 'ninja':
generator_cmake_arg = '-G Ninja'
else:
generator_cmake_arg = args.generator
@ -86,14 +73,14 @@ def main():
cmake_build_type = determine_build_type(args.buildtype)
cmake_target_cfg_cmd = ""
cmake_target_cfg_cmd = ''
define_string = ""
if args.defines is not None:
define_list = args.defines[0].split()
for define in define_list:
define_string += f"-D{define} "
if args.builddir is None:
cmake_build_folder = determine_build_folder(cmake_build_type)
else:
@ -101,10 +88,8 @@ def main():
build_path = source_location + os.path.sep + cmake_build_folder
if os.path.isdir(build_path):
remove_old_dir = input(
f"{cmake_build_folder} folder already exists. "
f"Remove old directory? [y/n]: "
)
remove_old_dir = input(f"{cmake_build_folder} folder already exists. "
f"Remove old directory? [y/n]: ")
if str(remove_old_dir).lower() in ["yes", "y", 1]:
remove_old_dir = True
else:
@ -123,13 +108,11 @@ def main():
print(f"Navigating into build directory: {build_path}")
os.chdir(cmake_build_folder)
cmake_command = (
f'cmake {generator_cmake_arg} -DFSFW_OSAL="{cmake_fsfw_osal}" '
f'-DCMAKE_BUILD_TYPE="{cmake_build_type}" {cmake_target_cfg_cmd} '
f"{define_string} {source_location}"
)
cmake_command = f"cmake {generator_cmake_arg} -DFSFW_OSAL=\"{cmake_fsfw_osal}\" " \
f"-DCMAKE_BUILD_TYPE=\"{cmake_build_type}\" {cmake_target_cfg_cmd} " \
f"{define_string} {source_location}"
# Remove redundant spaces
cmake_command = " ".join(cmake_command.split())
cmake_command = ' '.join(cmake_command.split())
print("Running CMake command (without +): ")
print(f"+ {cmake_command}")
os.system(cmake_command)
@ -138,10 +121,8 @@ def main():
def determine_build_generator() -> str:
print("No generator specified. ")
print(
"Please select from the following list of build types or type "
"in desired system directly [h for help]: "
)
print("Please select from the following list of build types or type "
"in desired system directly [h for help]: ")
while True:
user_input = input("Enter your selection: ")
if user_input == "h":
@ -155,15 +136,11 @@ def determine_build_generator() -> str:
def determine_build_folder(cmake_build_type: str) -> str:
confirm = input(
f"No build folder specified. Set to build type name {cmake_build_type}? [y/n]: "
)
confirm = input(f"No build folder specified. Set to build type name {cmake_build_type}? [y/n]: ")
if confirm in ["yes", "y", 1]:
return cmake_build_type
else:
new_folder_name = input(
"Please enter folder name, will be created in source folder: "
)
new_folder_name = input("Please enter folder name, will be created in source folder: ")
return new_folder_name
@ -173,18 +150,19 @@ def determine_source_location() -> str:
index += 1
os.chdir("..")
if index >= 5:
print(
"Error: Could not find source directory (determined by looking for fsfw folder!)"
)
print("Error: Could not find source directory (determined by looking for fsfw folder!)")
sys.exit(1)
return os.getcwd()
def determine_fsfw_osal() -> str:
select_dict = dict({1: "host", 2: "linux", 3: "freertos", 4: "rtems"})
print(
"No build type specified. Please select from the following list of build types: "
)
select_dict = dict({
1: "host",
2: "linux",
3: "freertos",
4: "rtems"
})
print("No build type specified. Please select from the following list of build types: ")
for key, item in select_dict.items():
print(f"{key}: {item}")
select = input("Enter your selection: ")
@ -201,12 +179,13 @@ def determine_fsfw_osal() -> str:
def determine_build_type(build_type_arg) -> str:
if build_type_arg is None:
select_dict = dict(
{1: "Debug", 2: "Release", 3: "Release with Debug Information", 4: "Size"}
)
print(
"No build type specified. Please select from the following list of build types"
)
select_dict = dict({
1: "Debug",
2: "Release",
3: "Release with Debug Information",
4: "Size"
})
print("No build type specified. Please select from the following list of build types")
for key, item in select_dict.items():
print(f"{key}: {item}")
select = input("Enter your selection: ")
@ -250,10 +229,11 @@ def determine_tgt_bsp(osal: str) -> str:
print("Target BSP set to arm/stm32h743zi-nucleo")
osal = "arm/stm32h743zi-nucleo"
elif osal == "linux":
print(
"No target BSP specified. Please select from the following list of build types."
)
select_dict = dict({1: "arm/raspberrypi", 2: "none/hosted"})
print("No target BSP specified. Please select from the following list of build types.")
select_dict = dict({
1: "arm/raspberrypi",
2: "none/hosted"
})
for key, item in select_dict.items():
print(f"{key}: {item}")
select = input("Enter your selection: ")

@ -1 +1 @@
Subproject commit 5b2af728fdabdd8be6b802e022806f03f3d2a959
Subproject commit 54160e540c95ad81f9345b4572e2044fa852300b

2
fsfw

@ -1 +1 @@
Subproject commit bf311757a2fefd66955c9450a4377934b57be411
Subproject commit 42a1e784c09c554d20cb30e3c9965f4722fb4ef2

View File

@ -11,20 +11,11 @@ from fsfwgen.parserbase.parser import FileParser
from fsfwgen.utility.csv_writer import CsvWriter
from fsfwgen.utility.printer import Printer
PACKET_CONTENT_DEFINITION_DESTINATION = [
"../../mission/pus/servicepackets/",
"../../fsfw/pus/servicepackets/",
]
PACKET_CONTENT_DEFINITION_DESTINATION = ["../../mission/pus/servicepackets/",
"../../fsfw/pus/servicepackets/"]
PACKET_CONTENT_CSV_NAME = "mib_packet_data_content.csv"
PACKET_CONTENT_HEADER_COLUMN = [
"Service",
"Subservice",
"Packet Name",
"Datatype",
"Name",
"Size [Bytes]",
"Comment",
]
PACKET_CONTENT_HEADER_COLUMN = ["Service", "Subservice", "Packet Name", "Datatype", "Name",
"Size [Bytes]", "Comment"]
SQL_DELETE_PACKET_DATA_CONTENT_CMD = """
DROP TABLE IF EXISTS PacketContent;
@ -52,17 +43,12 @@ VALUES(?,?,?,?,?,?,?)
def main():
print("PacketContentParser: Parsing for header files.")
header_file_parser = FileListParser(PACKET_CONTENT_DEFINITION_DESTINATION)
header_file_list = header_file_parser.parse_header_files(
False, "Parsing packet data files: "
)
header_file_list = header_file_parser.parse_header_files(False, "Parsing packet data files: ")
packet_content_parser = PacketContentParser(header_file_list)
subservice_table = packet_content_parser.parse_files(True)
Printer.print_content(
subservice_table, "PacketContentParser: Printing packet data table:"
)
subservice_writer = CsvWriter(
PACKET_CONTENT_CSV_NAME, subservice_table, PACKET_CONTENT_HEADER_COLUMN
)
Printer.print_content(subservice_table, "PacketContentParser: Printing packet data table:")
subservice_writer = CsvWriter(PACKET_CONTENT_CSV_NAME,
subservice_table, PACKET_CONTENT_HEADER_COLUMN)
subservice_writer.write_to_csv()
subservice_writer.move_csv("..")
@ -81,7 +67,7 @@ class PacketContentParser(FileParser):
self.commentColumn = 6
self.lastEntryColumn = 7
self.columnListLength = 8
self.dictEntryList = list(range(self.columnListLength - 1))
self.dictEntryList = list(range(self.columnListLength-1))
self.datatypeMatch = False
self.ignoreFlag = False
@ -92,9 +78,7 @@ class PacketContentParser(FileParser):
self_print_parsing_info = args[0]
# Read service from file name
self.dictEntryList[self.serviceColumn] = re.search(
"[0-9]{1,3}", file_name
).group(0)
self.dictEntryList[self.serviceColumn] = re.search('[0-9]{1,3}', file_name).group(0)
self.dictEntryList[self.subserviceColumn] = " "
file = open(file_name, "r")
if self_print_parsing_info:
@ -112,19 +96,15 @@ class PacketContentParser(FileParser):
self.update_packet_content_sizes()
def scan_for_class_and_struct_match_and_handle_it(self, line):
class_or_struct_match = re.search(
"[\s]*class[\s]*([\w]*)[\s]*.*[\s]*{[\s]*([^\n]*)", line
)
class_or_struct_match = re.search('[\s]*class[\s]*([\w]*)[\s]*.*[\s]*{[\s]*([^\n]*)', line)
if not class_or_struct_match:
class_or_struct_match = re.search(
"[\s]*struct[\s]*([\w]*)[\s]*.*[\s]*{[\s]*([^\n]*)", line
)
'[\s]*struct[\s]*([\w]*)[\s]*.*[\s]*{[\s]*([^\n]*)', line)
if class_or_struct_match:
self.dictEntryList[self.classNameColumn] = class_or_struct_match.group(1)
if class_or_struct_match.group(2):
self.dictEntryList[
self.subserviceColumn
] = self.check_for_subservice_string(class_or_struct_match.group(2))
self.dictEntryList[self.subserviceColumn] = \
self.check_for_subservice_string(class_or_struct_match.group(2))
def scan_for_variable_match_and_handle_it(self, line):
# Look for datatype definitions
@ -137,37 +117,26 @@ class PacketContentParser(FileParser):
# First step: Search for possible parameter definitions
# Generic serialize element or datatypes
var_match = re.search(
r"[\w]*(?:<)?[\s]*(uint32_t|uint8_t|uint16_t|ReturnValue_t|Mode_t|Submode_t|"
r"object_id_t|float|double|bool|ActionId_t|EventId_t|sid_t|ParameterId_t)"
r"(?:>)?[\s]*([\w]*)[\s]*(?:[= 0-9]*)?[;](?:[\/!< ]*([^\n]*))?",
line,
)
r'[\w]*(?:<)?[\s]*(uint32_t|uint8_t|uint16_t|ReturnValue_t|Mode_t|Submode_t|'
r'object_id_t|float|double|bool|ActionId_t|EventId_t|sid_t|ParameterId_t)'
r'(?:>)?[\s]*([\w]*)[\s]*(?:[= 0-9]*)?[;](?:[\/!< ]*([^\n]*))?', line)
if var_match:
# Debug printout
# print(var_match.group(0))
self.handle_generic_variable_match(var_match)
# Serial Fixed Array List with Size Header
else:
var_match = re.search(
r"[ \w]*<SerialFixedArrayListAdapter<([\w_, ()]*)>>"
r"[\s]*([\w]*)[\s]*[;](?:[/!< ]*([^\n]*))?",
line,
)
var_match = re.search(r'[ \w]*<SerialFixedArrayListAdapter<([\w_, ()]*)>>'
r'[\s]*([\w]*)[\s]*[;](?:[/!< ]*([^\n]*))?', line)
if var_match:
self.handle_serial_fixed_array_match(var_match)
# Serial Buffer, No length field
if not var_match:
var_match = re.search(
r"[ \w]*<SerialBufferAdapter<([\w_,]*)>>"
r"[\s]*([\w]*)[\s]*[;](?:[/!< ]*([^\n]*))?",
line,
)
var_match = re.search(r'[ \w]*<SerialBufferAdapter<([\w_,]*)>>'
r'[\s]*([\w]*)[\s]*[;](?:[/!< ]*([^\n]*))?', line)
if not var_match:
var_match = re.search(
r"[\w ]*(?:<)?(uint32_t|uint8_t|uint16_t)[\s]*\*"
r"(?:>)?[\s]*([\w]*)[\s]*[;](?:[/!< ]*([^\n]*))?",
line,
)
var_match = re.search(r'[\w ]*(?:<)?(uint32_t|uint8_t|uint16_t)[\s]*\*'
r'(?:>)?[\s]*([\w]*)[\s]*[;](?:[/!< ]*([^\n]*))?', line)
if var_match:
self.handle_serial_buffer_match(var_match)
# exclude size definition in serialize adapter or any definitions which are not parameter initializations
@ -178,7 +147,7 @@ class PacketContentParser(FileParser):
def update_packet_content_table(self):
self.index = self.index + 1
dict_entry_tuple = tuple(self.dictEntryList[: self.columnListLength])
dict_entry_tuple = tuple(self.dictEntryList[:self.columnListLength])
if not self.ignoreFlag:
self.mib_table.update({self.index: dict_entry_tuple})
else:
@ -193,20 +162,16 @@ class PacketContentParser(FileParser):
pass
else:
fixed_array_properties = re.search(
"([\w_]*)[\s]*,[\s]*([\w_()]*)[\s]*,[\s]*([\w_()]*)[\s]*",
var_match.group(1),
)
'([\w_]*)[\s]*,[\s]*([\w_()]*)[\s]*,[\s]*([\w_()]*)[\s]*', var_match.group(1))
if fixed_array_properties:
type_of_next_buffer_size = fixed_array_properties.group(3)
self.index = self.index + 1
self.dictEntryList[self.datatypeColumn] = type_of_next_buffer_size
self.dictEntryList[self.nameColumn] = "Size of following buffer"
dict_entry_tuple = tuple(self.dictEntryList[: self.columnListLength])
dict_entry_tuple = tuple(self.dictEntryList[:self.columnListLength])
self.mib_table.update({self.index: dict_entry_tuple})
self.handle_var_match(var_match)
self.dictEntryList[self.datatypeColumn] = (
fixed_array_properties.group(1) + " *"
)
self.dictEntryList[self.datatypeColumn] = fixed_array_properties.group(1) + " *"
self.handle_exporter_string(var_match.group(3))
def handle_serial_buffer_match(self, var_match):
@ -237,9 +202,7 @@ class PacketContentParser(FileParser):
self.mib_table.update({key: content})
def attempt_uint_match(self, content):
self.datatypeMatch = re.search(
"uint([\d]{1,2})_t", content[self.datatypeColumn]
)
self.datatypeMatch = re.search('uint([\d]{1,2})_t', content[self.datatypeColumn])
if self.datatypeMatch:
content = list(content)
content[self.sizeColumn] = round(int(self.datatypeMatch.group(1)) / 8)
@ -248,9 +211,8 @@ class PacketContentParser(FileParser):
def attempt_four_byte_match(self, content):
self.datatypeMatch = re.search(
r"object_id_t|ActionId_t|Mode_t|float|sid_t|ParameterId_t",
content[self.datatypeColumn],
)
r'object_id_t|ActionId_t|Mode_t|float|sid_t|ParameterId_t',
content[self.datatypeColumn])
if self.datatypeMatch:
content = list(content)
content[self.sizeColumn] = 4
@ -258,7 +220,7 @@ class PacketContentParser(FileParser):
return content
def attempt_eight_byte_match(self, content):
self.datatypeMatch = re.search("double", content[self.datatypeColumn])
self.datatypeMatch = re.search('double', content[self.datatypeColumn])
if self.datatypeMatch:
content = list(content)
content[self.sizeColumn] = 8
@ -266,9 +228,7 @@ class PacketContentParser(FileParser):
return content
def attempt_two_byte_match(self, content):
self.datatypeMatch = re.search(
"ReturnValue_t|EventId_t", content[self.datatypeColumn]
)
self.datatypeMatch = re.search('ReturnValue_t|EventId_t', content[self.datatypeColumn])
if self.datatypeMatch:
content = list(content)
content[self.sizeColumn] = 2
@ -276,7 +236,7 @@ class PacketContentParser(FileParser):
return content
def attempt_one_byte_match(self, content):
self.datatypeMatch = re.search("Submode_t|bool", content[self.datatypeColumn])
self.datatypeMatch = re.search('Submode_t|bool', content[self.datatypeColumn])
if self.datatypeMatch:
content = list(content)
content[self.sizeColumn] = 1
@ -284,7 +244,7 @@ class PacketContentParser(FileParser):
return content
def handle_uint_buffer_type(self, content):
if re.search("\*", content[self.datatypeColumn]):
if re.search('\*', content[self.datatypeColumn]):
content = list(content)
content[self.sizeColumn] = "deduced"
content = tuple(content)
@ -292,22 +252,14 @@ class PacketContentParser(FileParser):
# Used to scan exporter string for ignore flag or store any comments
def handle_exporter_string(self, match):
exporter_string = re.search("[ /!<]*\[EXPORT[\w]*\][\s]*:[\s]*([^\n]*)", match)
exporter_string = re.search('[ /!<]*\[EXPORT[\w]*\][\s]*:[\s]*([^\n]*)', match)
if exporter_string:
type_string = re.search(
"\[TYPE|BUFFERTYPE\][\s]*([\w]*)[^\n|\[]*",
exporter_string.group(0),
re.IGNORECASE,
)
type_string = re.search("\[TYPE|BUFFERTYPE\][\s]*([\w]*)[^\n|\[]*", exporter_string.group(0),
re.IGNORECASE)
if type_string:
self.dictEntryList[self.datatypeColumn] = (
str(type_string.group(1)) + " *"
)
comment_string = re.search(
"\[COMMENT\][\s]*([\w]*)[^\n|\[]*",
exporter_string.group(0),
re.IGNORECASE,
)
self.dictEntryList[self.datatypeColumn] = str(type_string.group(1)) + " *"
comment_string = re.search("\[COMMENT\][\s]*([\w]*)[^\n|\[]*", exporter_string.group(0),
re.IGNORECASE)
if comment_string:
self.dictEntryList[self.commentColumn] = comment_string.group(1)
self.check_for_ignore_string(exporter_string.group(0))
@ -317,15 +269,13 @@ class PacketContentParser(FileParser):
# Used to transform comma separated subservice numbers into specific subservice numbers
def check_for_subservice_string(self, full_description):
subservice_info = re.search(
r"^.*//[\s]*[!<]*[\s]*\[EXPORT[\w]*\][\s]*:[\s]*\[SUBSERVICE\][\s]*([^\n]*)",
full_description,
re.IGNORECASE,
)
description = " "
r'^.*//[\s]*[!<]*[\s]*\[EXPORT[\w]*\][\s]*:[\s]*\[SUBSERVICE\][\s]*([^\n]*)',
full_description, re.IGNORECASE)
description = ' '
if subservice_info:
description = self.handle_subservice_string(subservice_info)
if full_description == "":
description = " "
if full_description == '':
description = ' '
return description
def check_for_ignore_string(self, string):
@ -336,8 +286,8 @@ class PacketContentParser(FileParser):
@staticmethod
def handle_subservice_string(subservice_info):
description = " "
subservice_list = [int(x) for x in subservice_info.group(1).split(",")]
description = ' '
subservice_list = [int(x) for x in subservice_info.group(1).split(',')]
subservice_number = len(subservice_list)
for i in range(subservice_number):
description = description + str(subservice_list[i])
@ -350,3 +300,6 @@ class PacketContentParser(FileParser):
if __name__ == "__main__":
main()

View File

@ -74,6 +74,5 @@
7905;0x1ee1;FRAME_PROCESSING_FAILED;LOW;The CCSDS Board could not interpret a TC;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
8900;0x22c4;CLOCK_SET;INFO;;fsfw/src/fsfw/pus/Service9TimeManagement.h
8901;0x22c5;CLOCK_SET_FAILURE;LOW;;fsfw/src/fsfw/pus/Service9TimeManagement.h
9100;0x238c;TC_DELETION_FAILED;MEDIUM;Deletion of a TC from the map failed. P1: First 32 bit of request ID, P2. Last 32 bit of Request ID;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
9700;0x25e4;TEST;INFO;;fsfw/src/fsfw/pus/Service17Test.h
10600;0x2968;CHANGE_OF_SETUP_PARAMETER;LOW;;fsfw/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h
10600;0x2968;CHANGE_OF_SETUP_PARAMETER;LOW;;fsfw/hal/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h

1 2200 0x0898 STORE_SEND_WRITE_FAILED LOW fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
74 7905 0x1ee1 FRAME_PROCESSING_FAILED LOW The CCSDS Board could not interpret a TC fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
75 8900 0x22c4 CLOCK_SET INFO fsfw/src/fsfw/pus/Service9TimeManagement.h
76 8901 0x22c5 CLOCK_SET_FAILURE LOW fsfw/src/fsfw/pus/Service9TimeManagement.h
9100 0x238c TC_DELETION_FAILED MEDIUM Deletion of a TC from the map failed. P1: First 32 bit of request ID, P2. Last 32 bit of Request ID fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
77 9700 0x25e4 TEST INFO fsfw/src/fsfw/pus/Service17Test.h
78 10600 0x2968 CHANGE_OF_SETUP_PARAMETER LOW fsfw/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h fsfw/hal/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h

View File

@ -24,7 +24,6 @@
0x534f0200;TM_STORE
0x534f0300;IPC_STORE
0x53500010;TIME_STAMPER
0x53500020;TC_VERIFICATOR
0x53ffffff;FSFW_OBJECTS_END
0x62000300;TCPIP_TMTC_BRIDGE
0x62000400;TCPIP_TMTC_POLLING_TASK

1 0x4100CAFE TEST_ASSEMBLY
24 0x534f0200 TM_STORE
25 0x534f0300 IPC_STORE
26 0x53500010 TIME_STAMPER
0x53500020 TC_VERIFICATOR
27 0x53ffffff FSFW_OBJECTS_END
28 0x62000300 TCPIP_TMTC_BRIDGE
29 0x62000400 TCPIP_TMTC_POLLING_TASK

View File

@ -21,16 +21,8 @@ DH_COMMAND_PACKET_DEFINITION_DESTINATION = "../../mission/devices/devicepackets/
DH_DEFINITION_DESTINATION = "../../mission/devices/"
DH_COMMANDS_CSV_NAME = "mib_device_commands.csv"
DH_COMMAND_HEADER_COLUMNS = [
"Device Handler",
"Command Name",
"Action ID",
"Command Field Name",
"Command Field Position",
"Command Field Type",
"Command Field Option Name",
"Command Field Option Value",
"Comment",
]
"Device Handler", "Command Name", "Action ID", "Command Field Name", "Command Field Position",
"Command Field Type", "Command Field Option Name", "Command Field Option Value", "Comment"]
SQL_DELETE_CMDTABLE_CMD = """
DROP TABLE IF EXISTS DeviceHandlerCommand;
@ -63,7 +55,6 @@ class DeviceCommandColumns(Enum):
"""
Specifies order of MIB columns
"""
DH_NAME = 0
NAME = 1
ACTION_ID = 2
@ -84,27 +75,19 @@ def main():
:return:
"""
info_header_file_parser = FileListParser(DH_DEFINITION_DESTINATION)
info_header_file_list = info_header_file_parser.parse_header_files(
False, "Parsing device handler informations:"
)
info_header_file_list = info_header_file_parser.\
parse_header_files(False, "Parsing device handler informations:")
dh_information_parser = DeviceHandlerInformationParser(info_header_file_list)
dh_information_table = dh_information_parser.parse_files()
Printer.print_content(
dh_information_table, "Priting device handler command information table: "
)
Printer.print_content(dh_information_table, "Priting device handler command information table: ")
header_file_parser = FileListParser(DH_COMMAND_PACKET_DEFINITION_DESTINATION)
header_file_list = header_file_parser.parse_header_files(
False, "Parsing device handler command files:"
)
packet_subservice_parser = DeviceHandlerCommandParser(
header_file_list, dh_information_table
)
header_file_list = \
header_file_parser.parse_header_files(False, "Parsing device handler command files:")
packet_subservice_parser = DeviceHandlerCommandParser(header_file_list, dh_information_table)
dh_command_table = packet_subservice_parser.parse_files()
Printer.print_content(dh_command_table, "Printing device handler command table:")
dh_command_writer = CsvWriter(
DH_COMMANDS_CSV_NAME, dh_command_table, DH_COMMAND_HEADER_COLUMNS
)
dh_command_writer = CsvWriter(DH_COMMANDS_CSV_NAME, dh_command_table, DH_COMMAND_HEADER_COLUMNS)
dh_command_writer.write_to_csv()
dh_command_writer.copy_csv()
dh_command_writer.move_csv("..")
@ -137,7 +120,7 @@ class DeviceHandlerInformationParser(FileParser):
self_print_parsing_info = args[0]
# Read device name from file name
handler_match = re.search(r"([\w]*).h", file_name)
handler_match = re.search(r'([\w]*).h', file_name)
if not handler_match:
print("Device Command Parser: Configuration error, no handler name match !")
handler_name = handler_match.group(1)
@ -162,12 +145,8 @@ class DeviceHandlerInformationParser(FileParser):
:return:
"""
# Case insensitive matching of device command enums
enum_match = re.search(
r"[\s]*enum[\s]*([\w]*)[\s]*{[\s][/!<>]*[\s]*"
r"\[EXPORT[\w]*\][\s]*:[\s]*\[ENUM\]([^\n]*)",
line,
re.IGNORECASE,
)
enum_match = re.search(r'[\s]*enum[\s]*([\w]*)[\s]*{[\s][/!<>]*[\s]*'
r'\[EXPORT[\w]*\][\s]*:[\s]*\[ENUM\]([^\n]*)', line, re.IGNORECASE)
if enum_match:
self.command_enum_name = enum_match.group(1)
self.command_scanning_pending = True
@ -179,11 +158,9 @@ class DeviceHandlerInformationParser(FileParser):
self.__handle_command_enum_scanning(line)
def __handle_command_definition_scanning(self, line):
command_match = re.search(
r"[\s]*static[\s]*const[\s]*DeviceCommandId_t[\s]*([\w]*)[\s]*=[\s]*"
r"([\w]*)[\s]*;[\s]*[/!<>]*[\s]*\[EXPORT\][\s]*:[\s]*\[COMMAND\]",
line,
)
command_match = \
re.search(r'[\s]*static[\s]*const[\s]*DeviceCommandId_t[\s]*([\w]*)[\s]*=[\s]*'
r'([\w]*)[\s]*;[\s]*[/!<>]*[\s]*\[EXPORT\][\s]*:[\s]*\[COMMAND\]', line)
if command_match:
command_name = command_match.group(1)
command_id = command_match.group(2)
@ -194,11 +171,8 @@ class DeviceHandlerInformationParser(FileParser):
if not self.command_scanning_pending:
# scanning enum finished
# stores current command into command dictionary with command name as unique key
command_tuple = (
self.command_value_name_list,
self.command_value_list,
self.command_comment_list,
)
command_tuple = self.command_value_name_list, self.command_value_list, \
self.command_comment_list
self.command_enum_dict.update({self.command_enum_name: command_tuple})
self.command_enum_name = ""
self.command_value_name_list = []
@ -206,14 +180,13 @@ class DeviceHandlerInformationParser(FileParser):
self.command_comment_list = []
def __scan_command_entries(self, line):
command_match = re.search(
r"[\s]*([\w]*)[\s]*=[\s]*([0-9]{1,3})[^/][\s]*[/!<>]*[\s]*([^\n]*)", line
)
command_match = \
re.search(r'[\s]*([\w]*)[\s]*=[\s]*([0-9]{1,3})[^/][\s]*[/!<>]*[\s]*([^\n]*)', line)
if command_match:
self.command_value_name_list.append(command_match.group(1))
self.command_value_list.append(command_match.group(2))
self.command_comment_list.append(command_match.group(3))
elif re.search(r"}[\s]*;", line):
elif re.search(r'}[\s]*;', line):
self.command_scanning_pending = False
def _post_parsing_operation(self):
@ -224,7 +197,6 @@ class PendingScanType(Enum):
"""
Specifies which scan type is performed in the device command parser.
"""
NO_SCANNING = 0
STRUCT_SCAN = 1
CLASS_SCAN = 2
@ -237,7 +209,6 @@ class DeviceHandlerCommandParser(FileParser):
packet definitions. A device handler info table must be passed which can be acquired
by running the DH information parser.
"""
def __init__(self, file_list, dh_information_table):
super().__init__(file_list)
# this table includes the current new table entry,
@ -287,12 +258,9 @@ class DeviceHandlerCommandParser(FileParser):
self.__scan_command(line)
def __scan_for_structs(self, line):
struct_match = re.search(
r"[\s]*struct[\s]*([\w]*)[\s]*{[\s]*[/!<>]*[\s]*"
r"\[EXPORT\][ :]*\[COMMAND\]"
r"[\s]*([\w]*)[ :]*([\w]*)",
line,
)
struct_match = re.search(r'[\s]*struct[\s]*([\w]*)[\s]*{[\s]*[/!<>]*[\s]*'
r'\[EXPORT\][ :]*\[COMMAND\]'
r'[\s]*([\w]*)[ :]*([\w]*)', line)
if struct_match:
# Scan a found command struct
self.__start_class_or_struct_scanning(struct_match)
@ -301,11 +269,8 @@ class DeviceHandlerCommandParser(FileParser):
def __scan_for_class(self, line):
# search for class command definition
class_match = re.search(
r"[\s]*class[\s]*([\w]*)[\s]*[^{]*{[ /!<>]*\[EXPORT\][ :]*"
r"\[COMMAND\][\s]*([\w]*)[ :]*([\w]*)",
line,
)
class_match = re.search(r'[\s]*class[\s]*([\w]*)[\s]*[^{]*{[ /!<>]*\[EXPORT\][ :]*'
r'\[COMMAND\][\s]*([\w]*)[ :]*([\w]*)', line)
if class_match:
self.__start_class_or_struct_scanning(class_match)
self.scanning_pending = PendingScanType.CLASS_SCAN.value
@ -323,27 +288,21 @@ class DeviceHandlerCommandParser(FileParser):
if handler_name in self.dh_information_table:
(command_id_dict, self.enum_dict) = self.dh_information_table[handler_name]
if command_name in command_id_dict:
self.dict_entry_list[Clmns.ACTION_ID.value] = command_id_dict[
command_name
]
self.dict_entry_list[Clmns.ACTION_ID.value] = command_id_dict[command_name]
def __scan_command(self, line):
datatype_match = False
if self.scanning_pending is PendingScanType.STRUCT_SCAN.value:
datatype_match = re.search(
r"[\s]*(uint[0-9]{1,2}_t|float|double|bool|int|char)[\s]*([\w]*);"
r"(?:[\s]*[/!<>]*[\s]*\[EXPORT\][: ]*(.*))?",
line,
)
datatype_match = \
re.search(r'[\s]*(uint[0-9]{1,2}_t|float|double|bool|int|char)[\s]*([\w]*);'
r'(?:[\s]*[/!<>]*[\s]*\[EXPORT\][: ]*(.*))?', line)
elif self.scanning_pending is PendingScanType.CLASS_SCAN.value:
datatype_match = re.search(
r"[\s]*SerializeElement[\s]*<(uint[0-9]{1,2}_t|float|double|bool|int|char)[ >]*"
r"([\w]*);(?:[ /!<>]*\[EXPORT\][: ]*(.*))?",
line,
)
r'[\s]*SerializeElement[\s]*<(uint[0-9]{1,2}_t|float|double|bool|int|char)[ >]*'
r'([\w]*);(?:[ /!<>]*\[EXPORT\][: ]*(.*))?', line)
if datatype_match:
self.__handle_datatype_match(datatype_match)
elif re.search(r"}[\s]*;", line):
elif re.search(r'}[\s]*;', line):
self.scanning_pending = PendingScanType.NO_SCANNING.value
self.command_index = 0
@ -359,15 +318,11 @@ class DeviceHandlerCommandParser(FileParser):
def __analyse_exporter_sequence(self, exporter_sequence):
# This matches the exporter sequence pairs e.g. [ENUM] BLA [COMMENT] BLABLA [...] ...
export_string_matches = re.search(
r"(?:\[([\w]*)\][\s]*([^\[]*))?", exporter_sequence
)
export_string_matches = re.search(r'(?:\[([\w]*)\][\s]*([^\[]*))?', exporter_sequence)
if export_string_matches:
if len(export_string_matches.groups()) % 2 != 0:
print(
"Device Command Parser: Error when analysing exporter sequence,"
" check exporter string format"
)
print("Device Command Parser: Error when analysing exporter sequence,"
" check exporter string format")
else:
count = 0
while count < len(export_string_matches.groups()):
@ -393,7 +348,8 @@ class DeviceHandlerCommandParser(FileParser):
enum_tuple = self.enum_dict[self.current_enum_name]
for count in range(0, size_of_enum):
self.__update_table_with_command_options(count, enum_tuple)
self.command_index = self.command_index + 1
self.command_index = \
self.command_index + 1
else:
self.__update_table_with_no_command_options()
self.index = self.index + 1
@ -401,16 +357,12 @@ class DeviceHandlerCommandParser(FileParser):
def __update_table_with_command_options(self, count, enum_tuple):
enum_value_name_list, enum_value_list, enum_comment_list = enum_tuple
self.dict_entry_list[
Clmns.COMMAND_FIELD_OPTION_NAME.value
] = enum_value_name_list[count]
self.dict_entry_list[Clmns.COMMAND_FIELD_OPTION_VALUE.value] = enum_value_list[
count
]
self.dict_entry_list[Clmns.COMMAND_FIELD_COMMENT.value] = enum_comment_list[
count
]
self.dict_entry_list[Clmns.COMMAND_INDEX.value] = self.command_index
self.dict_entry_list[Clmns.COMMAND_FIELD_OPTION_NAME.value] = \
enum_value_name_list[count]
self.dict_entry_list[Clmns.COMMAND_FIELD_OPTION_VALUE.value] = enum_value_list[count]
self.dict_entry_list[Clmns.COMMAND_FIELD_COMMENT.value] = enum_comment_list[count]
self.dict_entry_list[Clmns.COMMAND_INDEX.value] = \
self.command_index
dh_command_tuple = tuple(self.dict_entry_list)
self.index += 1
self.mib_table.update({self.index: dh_command_tuple})
@ -419,7 +371,8 @@ class DeviceHandlerCommandParser(FileParser):
self.dict_entry_list[Clmns.COMMAND_FIELD_OPTION_NAME.value] = ""
self.dict_entry_list[Clmns.COMMAND_FIELD_OPTION_VALUE.value] = ""
self.dict_entry_list[Clmns.COMMAND_FIELD_COMMENT.value] = self.command_comment
self.dict_entry_list[Clmns.COMMAND_INDEX.value] = self.command_index
self.dict_entry_list[Clmns.COMMAND_INDEX.value] = \
self.command_index
dh_command_tuple = tuple(self.dict_entry_list)
self.mib_table.update({self.index: dh_command_tuple})
self.command_index += 1

Binary file not shown.

View File

@ -49,7 +49,7 @@ SUBSYSTEM_DEFINITION_DESTINATIONS = [
HEADER_DEFINITION_DESTINATIONS = [
f"{OBSW_ROOT_DIR}/bsp_hosted",
f"{OBSW_ROOT_DIR}/fsfw/",
f"{FSFW_CONFIG_ROOT}",
f"{FSFW_CONFIG_ROOT}"
]
@ -83,9 +83,7 @@ def parse_events(
header_file_name=CPP_H_FILENAME,
)
if COPY_CPP_FILE:
LOGGER.info(
f"EventParser: Copying CPP translation file to {CPP_COPY_DESTINATION}"
)
LOGGER.info(f"EventParser: Copying CPP translation file to {CPP_COPY_DESTINATION}")
copy_file(CPP_FILENAME, CPP_COPY_DESTINATION)
copy_file(CPP_H_FILENAME, CPP_COPY_DESTINATION)

View File

@ -1,7 +1,7 @@
/**
* @brief Auto-generated event translation file. Contains 79 translations.
* @brief Auto-generated event translation file. Contains 78 translations.
* @details
* Generated on: 2022-07-27 19:41:37
* Generated on: 2022-05-20 09:11:07
*/
#include "translateEvents.h"
@ -81,7 +81,6 @@ const char *BIT_LOCK_LOST_STRING = "BIT_LOCK_LOST";
const char *FRAME_PROCESSING_FAILED_STRING = "FRAME_PROCESSING_FAILED";
const char *CLOCK_SET_STRING = "CLOCK_SET";
const char *CLOCK_SET_FAILURE_STRING = "CLOCK_SET_FAILURE";
const char *TC_DELETION_FAILED_STRING = "TC_DELETION_FAILED";
const char *TEST_STRING = "TEST";
const char *CHANGE_OF_SETUP_PARAMETER_STRING = "CHANGE_OF_SETUP_PARAMETER";
@ -239,8 +238,6 @@ const char *translateEvents(Event event) {
return CLOCK_SET_STRING;
case (8901):
return CLOCK_SET_FAILURE_STRING;
case (9100):
return TC_DELETION_FAILED_STRING;
case (9700):
return TEST_STRING;
case (10600):

@ -1 +1 @@
Subproject commit b1e5a2d40a5f41b9020f2beb0b976035f91c6343
Subproject commit 6d423f7106e49f93743fb69e9436e1e652f9e001

View File

@ -47,7 +47,7 @@ from packetcontent.packet_content_parser import (
PACKET_CONTENT_HEADER_COLUMN,
SQL_CREATE_PACKET_DATA_CONTENT_CMD,
SQL_INSERT_PACKET_DATA_CMD,
SQL_DELETE_PACKET_DATA_CONTENT_CMD,
SQL_DELETE_PACKET_DATA_CONTENT_CMD
)
from subservice.subservice_parser import (
SubserviceParser,
@ -67,7 +67,7 @@ from devicecommands.device_command_parser import (
DH_COMMAND_HEADER_COLUMNS,
SQL_CREATE_CMDTABLE_CMD,
SQL_INSERT_INTO_CMDTABLE_CMD,
SQL_DELETE_CMDTABLE_CMD,
SQL_DELETE_CMDTABLE_CMD
)
from returnvalues.returnvalues_parser import (
InterfaceParser,
@ -75,16 +75,15 @@ from returnvalues.returnvalues_parser import (
INTERFACE_DEFINITION_FILES,
RETURNVALUE_DESTINATIONS,
sql_retval_exporter,
CSV_RETVAL_FILENAME,
CSV_RETVAL_FILENAME
)
from objects.objects import (
ObjectDefinitionParser,
OBJECTS_DEFINITIONS,
export_object_file,
CSV_OBJECT_FILENAME,
sql_object_exporter,
sql_object_exporter
)
DO_EXPORT_MIB = True
PRINT_TABLES_TO_CONSOLE = False
EXPORT_TO_CSV = True
@ -147,7 +146,7 @@ def handle_subservices_generation():
def generate_subservice_table():
"""Generate the subservice table."""
""" Generate the subservice table. """
subservice_header_parser = FileListParser(
destination_corrected(SUBSERVICE_DEFINITION_DESTINATION)
)
@ -162,11 +161,7 @@ def generate_subservice_table():
def handle_packet_content_generation():
print("MIB Exporter: Parsing packing content")
packet_content_table = generate_packet_content_table()
print(
"MIB Exporter: Found "
+ str(len(packet_content_table))
+ " packet content entries."
)
print("MIB Exporter: Found " + str(len(packet_content_table)) + " packet content entries.")
if PRINT_TABLES_TO_CONSOLE:
print("MIB Exporter: Print packet content table: ")
Printer.print_content(packet_content_table)
@ -184,12 +179,12 @@ def handle_packet_content_generation():
SQL_CREATE_PACKET_DATA_CONTENT_CMD,
SQL_INSERT_PACKET_DATA_CMD,
packet_content_table,
SQL_DELETE_PACKET_DATA_CONTENT_CMD,
SQL_DELETE_PACKET_DATA_CONTENT_CMD
)
def generate_packet_content_table():
"""Generate packet content table"""
""" Generate packet content table """
packet_data_header_parser = FileListParser(
destination_corrected(PACKET_CONTENT_DEFINITION_DESTINATION)
)
@ -204,11 +199,7 @@ def generate_packet_content_table():
def handle_device_handler_command_generation():
print("MIB Exporter: Parsing device handler commands.")
dh_command_table = generate_device_command_table()
print(
"MIB Exporter: Found "
+ str(len(dh_command_table))
+ " device handler command entries"
)
print("MIB Exporter: Found " + str(len(dh_command_table)) + " device handler command entries")
if PRINT_TABLES_TO_CONSOLE:
print("MIB Exporter: Printing device handler command table: ")
Printer.print_content(dh_command_table)
@ -216,23 +207,19 @@ def handle_device_handler_command_generation():
device_command_writer = CsvWriter(
DH_COMMANDS_CSV_NAME, dh_command_table, DH_COMMAND_HEADER_COLUMNS
)
print(
"MIB Exporter: Exporting device handler commands to " + DH_COMMANDS_CSV_NAME
)
print("MIB Exporter: Exporting device handler commands to " + DH_COMMANDS_CSV_NAME)
device_command_writer.write_to_csv()
if EXPORT_TO_SQL:
print("MIB Exporter: Exporting device handler commands to SQL")
sql_writer = SqlWriter()
sql_writer.sql_writing_helper(
SQL_CREATE_CMDTABLE_CMD,
SQL_INSERT_INTO_CMDTABLE_CMD,
dh_command_table,
SQL_DELETE_CMDTABLE_CMD,
SQL_CREATE_CMDTABLE_CMD, SQL_INSERT_INTO_CMDTABLE_CMD, dh_command_table,
SQL_DELETE_CMDTABLE_CMD
)
def generate_device_command_table(print_info_table: bool = False):
"""Generate device command table"""
""" Generate device command table """
info_header_file_parser = FileListParser(
destination_corrected(DH_DEFINITION_DESTINATION)
)
@ -241,15 +228,11 @@ def generate_device_command_table(print_info_table: bool = False):
)
dh_information_parser = DeviceHandlerInformationParser(info_header_file_list)
dh_information_table = dh_information_parser.parse_files()
print(
"MIB Exporter: Found "
+ str(len(dh_information_table))
+ " device handler information entries."
)
print("MIB Exporter: Found " + str(len(dh_information_table)) +
" device handler information entries.")
if print_info_table:
Printer.print_content(
dh_information_table,
"MIB Exporter: Priting device handler command information table: ",
dh_information_table, "MIB Exporter: Priting device handler command information table: "
)
header_file_parser = FileListParser(
@ -287,9 +270,7 @@ def generate_returnvalue_table():
interfaces = interface_parser.parse_files()
print("MIB Exporter: Found interfaces : " + str(len(interfaces)))
header_parser = FileListParser(destination_corrected(RETURNVALUE_DESTINATIONS))
header_list = header_parser.parse_header_files(
True, "MIB Exporter: Parsing header file list: "
)
header_list = header_parser.parse_header_files(True, "MIB Exporter: Parsing header file list: ")
returnvalue_parser = ReturnValueParser(interfaces, header_list, False)
returnvalue_table = returnvalue_parser.parse_files(False)
if PRINT_TABLES_TO_CONSOLE:
@ -342,7 +323,7 @@ def handle_external_file_running():
def update_globals():
"""Updates the global variables"""
""" Updates the global variables """
g.PP = pprint.PrettyPrinter(indent=0, width=250)
g.doExportMIB = DO_EXPORT_MIB
g.executeSQLcommands = False

View File

@ -15,13 +15,7 @@ from fsfwgen.objects.objects import (
from fsfwgen.utility.printer import PrettyPrinter
from fsfwgen.utility.file_management import copy_file
from definitions import (
BSP_HOSTED,
DATABASE_NAME,
OBSW_ROOT_DIR,
ROOT_DIR,
EXAMPLE_COMMON_DIR,
)
from definitions import BSP_HOSTED, DATABASE_NAME, OBSW_ROOT_DIR, ROOT_DIR, EXAMPLE_COMMON_DIR
LOGGER = get_console_logger()
DATE_TODAY = datetime.datetime.now()

View File

@ -1,8 +1,8 @@
/**
* @brief Auto-generated object translation file.
* @details
* Contains 40 translations.
* Generated on: 2022-07-27 19:41:37
* Contains 39 translations.
* Generated on: 2022-05-20 09:16:37
*/
#include "translateObjects.h"
@ -32,7 +32,6 @@ const char *TC_STORE_STRING = "TC_STORE";
const char *TM_STORE_STRING = "TM_STORE";
const char *IPC_STORE_STRING = "IPC_STORE";
const char *TIME_STAMPER_STRING = "TIME_STAMPER";
const char *TC_VERIFICATOR_STRING = "TC_VERIFICATOR";
const char *FSFW_OBJECTS_END_STRING = "FSFW_OBJECTS_END";
const char *TCPIP_TMTC_BRIDGE_STRING = "TCPIP_TMTC_BRIDGE";
const char *TCPIP_TMTC_POLLING_TASK_STRING = "TCPIP_TMTC_POLLING_TASK";
@ -101,8 +100,6 @@ const char *translateObject(object_id_t object) {
return IPC_STORE_STRING;
case 0x53500010:
return TIME_STAMPER_STRING;
case 0x53500020:
return TC_VERIFICATOR_STRING;
case 0x53ffffff:
return FSFW_OBJECTS_END_STRING;
case 0x62000300:

View File

@ -9,13 +9,7 @@ from fsfwgen.returnvalues.returnvalues_parser import InterfaceParser, ReturnValu
from fsfwgen.utility.sql_writer import SqlWriter
from fsfwgen.utility.printer import PrettyPrinter
from definitions import (
BSP_HOSTED,
DATABASE_NAME,
ROOT_DIR,
OBSW_ROOT_DIR,
EXAMPLE_COMMON_DIR,
)
from definitions import BSP_HOSTED, DATABASE_NAME, ROOT_DIR, OBSW_ROOT_DIR, EXAMPLE_COMMON_DIR
LOGGER = get_console_logger()
EXPORT_TO_FILE = True

View File

@ -28,13 +28,7 @@ from fsfwgen.utility.printer import Printer
SUBSERVICE_DEFINITION_DESTINATION = ["../../mission/", "../../fsfw/pus/"]
SUBSERVICE_CSV_NAME = "mib_subservices.csv"
SUBSERVICE_COLUMN_HEADER = [
"Service",
"Subservice Name",
"Subservice Number",
"Type",
"Comment",
]
SUBSERVICE_COLUMN_HEADER = ["Service", "Subservice Name", "Subservice Number", "Type", "Comment"]
SQL_DELETE_SUBSVC_CMD = """
DROP TABLE IF EXISTS Subservice;
@ -61,7 +55,6 @@ class SubserviceColumns(Enum):
"""
Specifies order of MIB columns
"""
SERVICE = 0
NAME = 1
NUMBER = 2
@ -78,16 +71,12 @@ def main():
:return:
"""
header_parser = FileListParser(SUBSERVICE_DEFINITION_DESTINATION)
header_file_list = header_parser.parse_header_files(
False, "Parsing subservice header files: "
)
header_file_list = header_parser.parse_header_files(False, "Parsing subservice header files: ")
packet_subservice_parser = SubserviceParser(header_file_list)
subservice_table = packet_subservice_parser.parse_files()
Printer.print_content(subservice_table, "Printing subservice table:")
print("Found " + str(len(subservice_table)) + " subservice entries.")
subservice_writer = CsvWriter(
SUBSERVICE_CSV_NAME, subservice_table, SUBSERVICE_COLUMN_HEADER
)
subservice_writer = CsvWriter(SUBSERVICE_CSV_NAME, subservice_table, SUBSERVICE_COLUMN_HEADER)
subservice_writer.write_to_csv()
subservice_writer.move_csv("..")
@ -101,7 +90,6 @@ class SubserviceParser(FileParser):
"""
This parser class can parse the subservice definitions.
"""
def __init__(self, file_list: list):
super().__init__(file_list)
# Column System allows reshuffling of table columns in constructor
@ -123,7 +111,7 @@ class SubserviceParser(FileParser):
self_print_parsing_info = args[0]
# Read service from file name
service_match = re.search("Service[^0-9]*([0-9]{1,3})", file_name)
service_match = re.search('Service[^0-9]*([0-9]{1,3})', file_name)
if service_match:
self.dict_entry_list[Clmns.SERVICE.value] = service_match.group(1)
self.dict_entry_list[Clmns.NAME.value] = " "
@ -141,7 +129,7 @@ class SubserviceParser(FileParser):
:return:
"""
# Case insensitive matching
enum_match = re.search(r"[\s]*enum[\s]*Subservice([^\n]*)", line, re.IGNORECASE)
enum_match = re.search(r'[\s]*enum[\s]*Subservice([^\n]*)', line, re.IGNORECASE)
if enum_match:
self.subservice_enum_found = True
if self.subservice_enum_found:
@ -158,7 +146,7 @@ class SubserviceParser(FileParser):
subservice_match = self.__scan_subservices(line)
if subservice_match:
self.index = self.index + 1
dict_entry_tuple = tuple(self.dict_entry_list[: self.clmns_len])
dict_entry_tuple = tuple(self.dict_entry_list[:self.clmns_len])
self.mib_table.update({self.index: dict_entry_tuple})
self.__clear_tuple()
@ -170,9 +158,8 @@ class SubserviceParser(FileParser):
self.possible_match_on_next_lines = False
def __scan_for_export_command(self, line: str) -> bool:
command_string = re.search(
r"([^\[]*)\[export\][: ]*\[([\w]*)\][\s]*([^\n]*)", line, re.IGNORECASE
)
command_string = re.search(r"([^\[]*)\[export\][: ]*\[([\w]*)\][\s]*([^\n]*)",
line, re.IGNORECASE)
if command_string:
# Check whether there is a separated export command
# (export command is not on same line as subservice definition)
@ -192,9 +179,9 @@ class SubserviceParser(FileParser):
Strip whitespaces and comment symbols and add to comment buffer.
"""
possible_multiline_comment = line.lstrip()
possible_multiline_comment = possible_multiline_comment.lstrip("/")
possible_multiline_comment = possible_multiline_comment.lstrip("<")
possible_multiline_comment = possible_multiline_comment.lstrip("!")
possible_multiline_comment = possible_multiline_comment.lstrip('/')
possible_multiline_comment = possible_multiline_comment.lstrip('<')
possible_multiline_comment = possible_multiline_comment.lstrip('!')
possible_multiline_comment = possible_multiline_comment.rstrip()
if len(possible_multiline_comment) > 0:
self.dict_entry_list[Clmns.COMMENT.value] += possible_multiline_comment
@ -205,9 +192,8 @@ class SubserviceParser(FileParser):
:param line:
:return:
"""
subservice_match = re.search(
r"[\s]*([\w]*)[\s]*=[\s]*([0-9]{1,3})(?:,)?(?:[ /!<>]*([^\n]*))?", line
)
subservice_match = \
re.search(r"[\s]*([\w]*)[\s]*=[\s]*([0-9]{1,3})(?:,)?(?:[ /!<>]*([^\n]*))?", line)
if subservice_match:
self.dict_entry_list[Clmns.NAME.value] = subservice_match.group(1)
self.dict_entry_list[Clmns.NUMBER.value] = subservice_match.group(2)
@ -218,7 +204,7 @@ class SubserviceParser(FileParser):
return True
# Check whether exporting was commanded on last lines
return bool(self.possible_match_on_next_lines)
if re.search(r"}[\s]*;", line):
if re.search(r'}[\s]*;', line):
self.subservice_enum_found = False
return subservice_match
@ -231,19 +217,19 @@ class SubserviceParser(FileParser):
return export_command_found
def __scan_for_type(self, string) -> bool:
type_match = re.search(r"\[reply\]|\[tm\]", string, re.IGNORECASE)
type_match = re.search(r'\[reply\]|\[tm\]', string, re.IGNORECASE)
if type_match:
self.dict_entry_list[Clmns.TYPE.value] = "TM"
self.dict_entry_list[Clmns.TYPE.value] = 'TM'
return True
type_match = re.search(r"\[command\]|\[tc\]", string, re.IGNORECASE)
type_match = re.search(r'\[command\]|\[tc\]', string, re.IGNORECASE)
if type_match:
self.dict_entry_list[Clmns.TYPE.value] = "TC"
self.dict_entry_list[Clmns.TYPE.value] = 'TC'
return True
self.dict_entry_list[Clmns.TYPE.value] = "Unspecified"
self.dict_entry_list[Clmns.TYPE.value] = 'Unspecified'
return False
def __scan_for_comment(self, comment_string):
comment_match = re.search(r":[\s]*\[[\w]*\][\s]*([^\n]*)", comment_string)
comment_match = re.search(r':[\s]*\[[\w]*\][\s]*([^\n]*)', comment_string)
if comment_match:
self.dict_entry_list[Clmns.COMMENT.value] = comment_match.group(1)

View File

@ -15,4 +15,4 @@ printToConsole = True
exportToCSV = True
doCopyFile = False
copyDestination = "."
fileSeparator = ";"
fileSeparator = ';'

4
tmtc/.gitignore vendored
View File

@ -3,6 +3,4 @@
/venv
/config/tmtc_config.json
/seqcnt*.txt
/log
/log/*.log

View File

@ -1,24 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="CFDP Test NAK No Closure" type="PythonConfigurationType" factoryName="Python" folderName="CFDP">
<module name="tmtc" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtcc.py" />
<option name="PARAMETERS" value="cfdp filetest/cfdp_test.txt /tmp/hello-cpy.txt --no-closure -d 0.2" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
</component>

View File

@ -1,24 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="CFDP Test NAK With Closure" type="PythonConfigurationType" factoryName="Python" folderName="CFDP">
<module name="tmtc" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtcc.py" />
<option name="PARAMETERS" value="cfdp filetest/cfdp_test.txt /tmp/hello-cpy.txt -d 0.2" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
</component>

View File

@ -12,7 +12,7 @@
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtcc.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtccli.py" />
<option name="PARAMETERS" value="-s 200 -o asm_to_normal -t 6 -l" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />

View File

@ -12,7 +12,7 @@
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtcc.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtccli.py" />
<option name="PARAMETERS" value="-s 200 -o test -l" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />

View File

@ -12,8 +12,8 @@
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtcc.py" />
<option name="PARAMETERS" value="-s 17 -o 0 -d 5" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtccli.py" />
<option name="PARAMETERS" value="-s 17 -o 0 -l" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />

View File

@ -1,24 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="PUS Scheduler Test" type="PythonConfigurationType" factoryName="Python" folderName="PUS">
<module name="tmtc" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtcc.py" />
<option name="PARAMETERS" value="-s 11 -o test-insert -l" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
</component>

View File

@ -12,7 +12,7 @@
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtcc.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtccli.py" />
<option name="PARAMETERS" value="-s 3 -o 1 -l" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />

View File

@ -12,7 +12,7 @@
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtcc.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtccli.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="true" />

View File

@ -12,8 +12,8 @@
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtcc.py" />
<option name="PARAMETERS" value="-g" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtcgui.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />

View File

@ -1,24 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="TMTC Help" type="PythonConfigurationType" factoryName="Python">
<module name="tmtc" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtcc.py" />
<option name="PARAMETERS" value="-h" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="true" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
</component>

View File

@ -1,24 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="TMTC Listener" type="PythonConfigurationType" factoryName="Python">
<module name="tmtc" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtcc.py" />
<option name="PARAMETERS" value="-l" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="true" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
</component>

View File

@ -1,17 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="spacepackets unittests" type="tests" factoryName="Autodetect">
<module name="tmtc" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/deps/spacepackets/tests" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="_new_additionalArguments" value="&quot;&quot;" />
<option name="_new_target" value="&quot;$PROJECT_DIR$/deps/spacepackets/tests&quot;" />
<option name="_new_targetType" value="&quot;PATH&quot;" />
<method v="2" />
</configuration>
</component>

View File

@ -1,17 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="tmtccmd unittest" type="tests" factoryName="Autodetect">
<module name="tmtc" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/deps/tmtccmd" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="_new_additionalArguments" value="&quot;&quot;" />
<option name="_new_target" value="&quot;$PROJECT_DIR$/deps/tmtccmd&quot;" />
<option name="_new_targetType" value="&quot;PATH&quot;" />
<method v="2" />
</configuration>
</component>

@ -1 +1 @@
Subproject commit c9ae13c16f09cc2fa410b7cf7ee683b0b77e6b7b
Subproject commit 3cca54f66fe72f292787499e1e9bf2497a2cfdbf

View File

@ -74,6 +74,5 @@
7905;0x1ee1;FRAME_PROCESSING_FAILED;LOW;The CCSDS Board could not interpret a TC;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
8900;0x22c4;CLOCK_SET;INFO;;fsfw/src/fsfw/pus/Service9TimeManagement.h
8901;0x22c5;CLOCK_SET_FAILURE;LOW;;fsfw/src/fsfw/pus/Service9TimeManagement.h
9100;0x238c;TC_DELETION_FAILED;MEDIUM;Deletion of a TC from the map failed. P1: First 32 bit of request ID, P2. Last 32 bit of Request ID;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
9700;0x25e4;TEST;INFO;;fsfw/src/fsfw/pus/Service17Test.h
10600;0x2968;CHANGE_OF_SETUP_PARAMETER;LOW;;fsfw/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h
10600;0x2968;CHANGE_OF_SETUP_PARAMETER;LOW;;fsfw/hal/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h

1 2200 0x0898 STORE_SEND_WRITE_FAILED LOW fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
74 7905 0x1ee1 FRAME_PROCESSING_FAILED LOW The CCSDS Board could not interpret a TC fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
75 8900 0x22c4 CLOCK_SET INFO fsfw/src/fsfw/pus/Service9TimeManagement.h
76 8901 0x22c5 CLOCK_SET_FAILURE LOW fsfw/src/fsfw/pus/Service9TimeManagement.h
9100 0x238c TC_DELETION_FAILED MEDIUM Deletion of a TC from the map failed. P1: First 32 bit of request ID, P2. Last 32 bit of Request ID fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
77 9700 0x25e4 TEST INFO fsfw/src/fsfw/pus/Service17Test.h
78 10600 0x2968 CHANGE_OF_SETUP_PARAMETER LOW fsfw/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h fsfw/hal/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h

View File

@ -1,25 +1,11 @@
from typing import Optional
from common_tmtc.config.definitions import TM_SP_IDS
from common_tmtc.config.hook_implementation import CommonFsfwHookBase
from common_tmtc.pus_tc.cmd_definitions import common_fsfw_service_op_code_dict
from tmtccmd.com_if import ComInterface
from tmtccmd.config import TmtcDefinitionWrapper
from tmtccmd.tc.definitions import TcQueueT
class FsfwHookBase(CommonFsfwHookBase):
def get_tmtc_definitions(self) -> TmtcDefinitionWrapper:
return common_fsfw_service_op_code_dict()
def pack_service_queue(self, service: int, op_code: str, service_queue: TcQueueT):
from common_tmtc.pus_tc.tc_packing import common_service_queue_user
def assign_communication_interface(self, com_if_key: str) -> Optional[ComInterface]:
from tmtccmd.config.com_if import (
create_com_interface_default,
create_com_interface_cfg_default,
common_service_queue_user(
service=service, op_code=op_code, tc_queue=service_queue
)
cfg = create_com_interface_cfg_default(
com_if_key=com_if_key,
json_cfg_path=self.cfg_path,
space_packet_ids=TM_SP_IDS,
)
return create_com_interface_default(cfg)

View File

@ -24,7 +24,6 @@
0x534f0200;TM_STORE
0x534f0300;IPC_STORE
0x53500010;TIME_STAMPER
0x53500020;TC_VERIFICATOR
0x53ffffff;FSFW_OBJECTS_END
0x62000300;TCPIP_TMTC_BRIDGE
0x62000400;TCPIP_TMTC_POLLING_TASK

1 0x4100CAFE TEST_ASSEMBLY
24 0x534f0200 TM_STORE
25 0x534f0300 IPC_STORE
26 0x53500010 TIME_STAMPER
0x53500020 TC_VERIFICATOR
27 0x53ffffff FSFW_OBJECTS_END
28 0x62000300 TCPIP_TMTC_BRIDGE
29 0x62000400 TCPIP_TMTC_POLLING_TASK

View File

@ -1,4 +0,0 @@
/*
!/*.sh
!/.gitignore

View File

@ -1,3 +0,0 @@
#!/bin/bash
git clone https://github.com/us-irs/spacepackets-py.git

View File

@ -1,3 +0,0 @@
#!/bin/bash
git clone https://github.com/robamu-org/tmtccmd.git

View File

@ -1 +0,0 @@
hello world

Binary file not shown.

View File

@ -1 +1 @@
tmtccmd == 4.0.0a1
tmtccmd >= 2.2.1

1
tmtc/spacepackets Submodule

@ -0,0 +1 @@
Subproject commit 9ee7922bf7b7a678f8e5ebd5926001defac9a3d4

View File

@ -1,9 +1,6 @@
{
"com_if": "udp",
"com_if": "tcp",
"tcpip_tcp_ip_addr": "127.0.0.1",
"tcpip_tcp_port": 7301,
"tcpip_tcp_recv_max_size": 1500,
"tcpip_udp_ip_addr": "127.0.0.1",
"tcpip_udp_port": 7301,
"tcpip_udp_recv_max_size": 1500
"tcpip_tcp_recv_max_size": 1500
}

View File

@ -1,68 +0,0 @@
#!/usr/bin/env python3
"""TMTC commander for FSFW Example"""
import sys
import time
from spacepackets.ecss import PusVerificator
import tmtccmd
from common_tmtc.common import setup_params, setup_tmtc_handlers, setup_backend
from config.hook import FsfwHookBase
from tmtccmd import get_console_logger
from tmtccmd.core import BackendRequest
from tmtccmd.logging.pus import (
RegularTmtcLogWrapper,
RawTmtcTimedLogWrapper,
TimedLogWhen,
)
from tmtccmd.pus import VerificationWrapper
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
LOGGER = get_console_logger()
def main():
setup_wrapper = setup_params(FsfwHookBase())
tmtc_logger = RegularTmtcLogWrapper()
printer = FsfwTmTcPrinter(tmtc_logger.logger)
raw_logger = RawTmtcTimedLogWrapper(when=TimedLogWhen.PER_HOUR, interval=2)
pus_verificator = PusVerificator()
verif_wrapper = VerificationWrapper(
console_logger=get_console_logger(),
file_logger=printer.file_logger,
pus_verificator=pus_verificator,
)
ccsds_handler, tc_handler = setup_tmtc_handlers(
verif_wrapper=verif_wrapper, raw_logger=raw_logger, printer=printer
)
tmtccmd.setup(setup_wrapper)
backend = setup_backend(
setup_wrapper=setup_wrapper, ccsds_handler=ccsds_handler, tc_handler=tc_handler
)
try:
while True:
state = backend.periodic_op(None)
tc_handler.cfdp_in_ccsds_wrapper.handler.fsm()
if state.request == BackendRequest.TERMINATION_NO_ERROR:
sys.exit(0)
elif state.request == BackendRequest.DELAY_IDLE:
LOGGER.info("TMTC Client in IDLE mode")
time.sleep(3.0)
elif state.request == BackendRequest.DELAY_LISTENER:
if tc_handler.cfdp_done():
LOGGER.info("CFDP transaction done, closing client")
sys.exit(0)
time.sleep(0.8)
elif state.request == BackendRequest.DELAY_CUSTOM:
if state.next_delay.total_seconds() < 0.5:
time.sleep(state.next_delay.total_seconds())
else:
time.sleep(0.5)
elif state.request == BackendRequest.CALL_NEXT:
pass
except KeyboardInterrupt:
sys.exit(0)
if __name__ == "__main__":
main()

23
tmtc/tmtccli.py Normal file
View File

@ -0,0 +1,23 @@
#!/usr/bin/env python3
"""TMTC commander for FSFW Example"""
from common_tmtc.tmtcc import (
tmtcc_post_args,
tmtcc_pre_args,
create_default_args_parser,
add_default_tmtccmd_args,
parse_default_input_arguments,
)
from config.hook import FsfwHookBase
def main():
tmtcc_pre_args()
hook_obj = FsfwHookBase(json_cfg_path="tmtc_conf.json")
arg_parser = create_default_args_parser()
add_default_tmtccmd_args(arg_parser)
args = parse_default_input_arguments(arg_parser, hook_obj)
tmtcc_post_args(hook_obj=hook_obj, use_gui=False, args=args)
if __name__ == "__main__":
main()

1
tmtc/tmtccmd Submodule

@ -0,0 +1 @@
Subproject commit e24faa1500d96a8afa7f7aed32fcb020eb2e1335

12
tmtc/tmtcgui.py Normal file
View File

@ -0,0 +1,12 @@
#!/usr/bin/env python3
"""TMTC commander for the FSFW Example"""
from common_tmtc.tmtcc import tmtcc_post_args, tmtcc_pre_args
def main():
hook_obj = tmtcc_pre_args()
tmtcc_post_args(hook_obj=hook_obj, use_gui=True, args=None)
if __name__ == "__main__":
main()