From 9d73304c42ddc34e554032da2f8194e0e59ddc4c Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 30 Oct 2020 13:30:33 +0100 Subject: [PATCH 01/31] more config fixes --- config/returnvalues/classIds.h | 9 ++------- hosted/config/FSFWConfig.h | 2 +- hosted/config/returnvalues/classIds.h | 19 +++++++++++++++++++ 3 files changed, 22 insertions(+), 8 deletions(-) create mode 100644 hosted/config/returnvalues/classIds.h diff --git a/config/returnvalues/classIds.h b/config/returnvalues/classIds.h index 3fe99a7d..f6427a1f 100644 --- a/config/returnvalues/classIds.h +++ b/config/returnvalues/classIds.h @@ -1,13 +1,8 @@ -/* - * classIds.h - * - * Created on: 16.07.2018 - * Author: mohr - */ - #ifndef CONFIG_RETURNVALUES_CLASSIDS_H_ #define CONFIG_RETURNVALUES_CLASSIDS_H_ +#include + /** * Source IDs starts at 73 for now * Framework IDs for ReturnValues run from 0 to 56 diff --git a/hosted/config/FSFWConfig.h b/hosted/config/FSFWConfig.h index df4075bd..e7c1175c 100644 --- a/hosted/config/FSFWConfig.h +++ b/hosted/config/FSFWConfig.h @@ -3,7 +3,7 @@ //! When using the newlib nano library, C99 support for stdio facilities //! will not be provided. This define should be set to 1 if this is the case. -#define FSFW_NO_C99_IO 0 +#define FSFW_NO_C99_IO 1 #endif /* CONFIG_FSFWCONFIG_H_ */ diff --git a/hosted/config/returnvalues/classIds.h b/hosted/config/returnvalues/classIds.h new file mode 100644 index 00000000..f6427a1f --- /dev/null +++ b/hosted/config/returnvalues/classIds.h @@ -0,0 +1,19 @@ +#ifndef CONFIG_RETURNVALUES_CLASSIDS_H_ +#define CONFIG_RETURNVALUES_CLASSIDS_H_ + +#include + +/** + * Source IDs starts at 73 for now + * Framework IDs for ReturnValues run from 0 to 56 + * and are located inside + */ +namespace CLASS_ID { +enum { + MISSION_CLASS_ID_START = FW_CLASS_ID_COUNT, + MGM_LIS3MDL +}; +} + + +#endif /* CONFIG_RETURNVALUES_CLASSIDS_H_ */ From 6c943fb9398d17298f8b5070d583d6e445ac436e Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 2 Nov 2020 17:22:27 +0100 Subject: [PATCH 02/31] fsfw update --- fsfw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fsfw b/fsfw index 7d83767c..edecb788 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 7d83767c2b408a05c95424f818457d0e57060eeb +Subproject commit edecb7882b1d2bc444da17dec94a1a03501f1164 From 437e9143f193dc1a68a3769f39cf32ca07b1f74f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 2 Nov 2020 17:31:55 +0100 Subject: [PATCH 03/31] fsfw update --- fsfw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fsfw b/fsfw index edecb788..3cd0f8f5 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit edecb7882b1d2bc444da17dec94a1a03501f1164 +Subproject commit 3cd0f8f5f026e44477038397a0c9ecac2ce7bacc From 58e65c47cc4729470880fcd0ebd12e3556e15e32 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 2 Nov 2020 18:00:07 +0100 Subject: [PATCH 04/31] object factory improvements --- mission/core/ObjectFactory.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mission/core/ObjectFactory.cpp b/mission/core/ObjectFactory.cpp index 3561a4b7..058b02d6 100644 --- a/mission/core/ObjectFactory.cpp +++ b/mission/core/ObjectFactory.cpp @@ -22,8 +22,8 @@ #include #include #include -#include "../../fsfw/devicehandlers/CookieIF.h" -#include "../../hosted/comIF/ArduinoComIF.h" +#include +#include #ifdef LINUX #include #include From 5522e2923ec74ac56e81350ab188528c7343288a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 7 Nov 2020 14:32:47 +0100 Subject: [PATCH 05/31] hosted b uild fix --- fsfw | 2 +- hosted/config/FSFWConfig.h | 47 +++++++++++++++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/fsfw b/fsfw index 3cd0f8f5..7ffce219 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 3cd0f8f5f026e44477038397a0c9ecac2ce7bacc +Subproject commit 7ffce219d5f86df29fe3348cdeb703419ba32acd diff --git a/hosted/config/FSFWConfig.h b/hosted/config/FSFWConfig.h index e7c1175c..ea86152c 100644 --- a/hosted/config/FSFWConfig.h +++ b/hosted/config/FSFWConfig.h @@ -1,9 +1,54 @@ #ifndef CONFIG_FSFWCONFIG_H_ #define CONFIG_FSFWCONFIG_H_ +#include +#include + +//! Used to determine whether C++ ostreams are used +//! Those can lead to code bloat. +#define FSFW_CPP_OSTREAM_ENABLED 1 + +//! Reduced printout to further decrese code size +//! Be careful, this also turns off most diagnostic prinouts! +#define FSFW_REDUCED_PRINTOUT 0 + +//! Can be used to enable debugging printouts for developing the FSFW +#define FSFW_DEBUGGING 0 + +//! Defines the FIFO depth of each commanding service base which +//! also determines how many commands a CSB service can handle in one cycle +//! simulataneously. This will increase the required RAM for +//! each CSB service ! +#define FSFW_CSB_FIFO_DEPTH 6 + +//! If FSFW_OBJ_EVENT_TRANSLATION is set to one, +//! additional output which requires the translation files translateObjects +//! and translateEvents (and their compiled source files) +#define FSFW_OBJ_EVENT_TRANSLATION 0 + +#if FSFW_OBJ_EVENT_TRANSLATION == 1 +#define FSFW_DEBUG_OUTPUT 1 +//! Specify whether info events are printed too. +#define FSFW_DEBUG_INFO 1 +#include +#include +#else +#define FSFW_DEBUG_OUTPUT 0 +#endif + //! When using the newlib nano library, C99 support for stdio facilities //! will not be provided. This define should be set to 1 if this is the case. -#define FSFW_NO_C99_IO 1 +#define FSFW_NO_C99_IO 1 +namespace fsfwconfig { +//! Default timestamp size. The default timestamp will be an eight byte CDC +//! short timestamp. +static constexpr uint8_t FSFW_MISSION_TIMESTAMP_SIZE = 8; + +//! Configure the allocated pool sizes for the event manager. +static constexpr size_t FSFW_EVENTMGMR_MATCHTREE_NODES = 240; +static constexpr size_t FSFW_EVENTMGMT_EVENTIDMATCHERS = 120; +static constexpr size_t FSFW_EVENTMGMR_RANGEMATCHERS = 120; +} #endif /* CONFIG_FSFWCONFIG_H_ */ From 3494fcc59ba11f0da5345fee7293c0db2417a440 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 20 Nov 2020 17:25:02 +0100 Subject: [PATCH 06/31] tmtc update --- tmtc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmtc b/tmtc index 480b0a16..2f1c3d5e 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 480b0a16456ff09dfdfdd85b945926a73d19c09c +Subproject commit 2f1c3d5eb9c3858d99c4516f4f132425ea1a97b7 From ae4305e22e53f915a09bc7b23259ec05bd993394 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 20 Nov 2020 18:10:39 +0100 Subject: [PATCH 07/31] restructured.. a bit --- Makefile | 6 +- Makefile-Hosted | 2 +- {mission/core => bsp_linux}/InitMission.cpp | 9 +- bsp_linux/InitMission.h | 9 + {mission/core => bsp_linux}/ObjectFactory.cpp | 29 +--- {mission/core => bsp_linux}/ObjectFactory.h | 6 +- bsp_linux/main.cpp | 7 +- config/tmtc/tmTcSize.h | 10 -- config/version.h | 9 - {hosted/config => fsfwconfig}/FSFWConfig.h | 6 +- {config => fsfwconfig}/OBSWConfig.h | 8 +- fsfwconfig/OBSWVersion.h | 12 ++ .../cdatapool/dataPoolInit.cpp | 2 +- .../cdatapool/dataPoolInit.h | 6 +- .../devices/logicalAddresses.cpp | 2 +- .../devices/logicalAddresses.h | 8 +- .../devices/powerSwitcherList.cpp | 2 +- .../devices/powerSwitcherList.h | 6 +- .../events/subsystemIdRanges.h | 6 +- .../events/translateEvents.cpp | 2 +- .../events/translateEvents.h | 6 +- config/config.mk => fsfwconfig/fsfwconfig.mk | 0 .../ipc/MissionMessageTypes.cpp | 2 +- .../ipc/MissionMessageTypes.h | 6 +- .../objects/systemObjectList.h | 0 .../objects/translateObjects.cpp | 2 +- .../objects/translateObjects.h | 6 +- .../PollingSequenceFactory.cpp | 5 +- .../pollingsequence/PollingSequenceFactory.h | 0 .../returnvalues/classIds.h | 6 +- {config => fsfwconfig}/tmtc/apid.h | 6 +- {config => fsfwconfig}/tmtc/pusIds.h | 0 fsfwconfig/tmtc/tmTcSize.h | 10 ++ hosted/InitMission.cpp | 159 ++++++++++++++++++ hosted/InitMission.h | 9 + hosted/ObjectFactory.cpp | 61 +++++++ hosted/ObjectFactory.h | 17 ++ hosted/config/version.h | 9 - {config => hosted/fsfwconfig}/FSFWConfig.h | 0 hosted/{config => fsfwconfig}/OBSWConfig.h | 0 hosted/fsfwconfig/OBSWVersion.h | 12 ++ .../events/subsystemIdRanges.h | 0 .../config.mk => fsfwconfig/fsfwconfig.mk} | 0 .../ipc/MissionMessageTypes.cpp | 2 +- .../fsfwconfig}/ipc/MissionMessageTypes.h | 0 .../fsfwconfig}/returnvalues/classIds.h | 0 hosted/main.cpp | 8 +- mission/core/GenericFactory.cpp | 83 +++++++++ mission/core/GenericFactory.h | 12 ++ mission/core/InitMission.h | 9 - 50 files changed, 455 insertions(+), 122 deletions(-) rename {mission/core => bsp_linux}/InitMission.cpp (97%) create mode 100644 bsp_linux/InitMission.h rename {mission/core => bsp_linux}/ObjectFactory.cpp (85%) rename {mission/core => bsp_linux}/ObjectFactory.h (56%) delete mode 100644 config/tmtc/tmTcSize.h delete mode 100644 config/version.h rename {hosted/config => fsfwconfig}/FSFWConfig.h (94%) rename {config => fsfwconfig}/OBSWConfig.h (67%) create mode 100644 fsfwconfig/OBSWVersion.h rename {config => fsfwconfig}/cdatapool/dataPoolInit.cpp (62%) rename {config => fsfwconfig}/cdatapool/dataPoolInit.h (55%) rename {config => fsfwconfig}/devices/logicalAddresses.cpp (52%) rename {config => fsfwconfig}/devices/logicalAddresses.h (60%) rename {config => fsfwconfig}/devices/powerSwitcherList.cpp (50%) rename {config => fsfwconfig}/devices/powerSwitcherList.h (54%) rename {config => fsfwconfig}/events/subsystemIdRanges.h (73%) rename {config => fsfwconfig}/events/translateEvents.cpp (99%) rename {config => fsfwconfig}/events/translateEvents.h (53%) rename config/config.mk => fsfwconfig/fsfwconfig.mk (100%) rename {config => fsfwconfig}/ipc/MissionMessageTypes.cpp (78%) rename {hosted/config => fsfwconfig}/ipc/MissionMessageTypes.h (73%) rename {config => fsfwconfig}/objects/systemObjectList.h (100%) rename {config => fsfwconfig}/objects/translateObjects.cpp (96%) rename {config => fsfwconfig}/objects/translateObjects.h (55%) rename {config => fsfwconfig}/pollingsequence/PollingSequenceFactory.cpp (90%) rename {config => fsfwconfig}/pollingsequence/PollingSequenceFactory.h (100%) rename {hosted/config => fsfwconfig}/returnvalues/classIds.h (67%) rename {config => fsfwconfig}/tmtc/apid.h (77%) rename {config => fsfwconfig}/tmtc/pusIds.h (100%) create mode 100644 fsfwconfig/tmtc/tmTcSize.h create mode 100644 hosted/InitMission.cpp create mode 100644 hosted/InitMission.h create mode 100644 hosted/ObjectFactory.cpp create mode 100644 hosted/ObjectFactory.h delete mode 100644 hosted/config/version.h rename {config => hosted/fsfwconfig}/FSFWConfig.h (100%) rename hosted/{config => fsfwconfig}/OBSWConfig.h (100%) create mode 100644 hosted/fsfwconfig/OBSWVersion.h rename hosted/{config => fsfwconfig}/events/subsystemIdRanges.h (100%) rename hosted/{config/config.mk => fsfwconfig/fsfwconfig.mk} (100%) rename hosted/{config => fsfwconfig}/ipc/MissionMessageTypes.cpp (75%) rename {config => hosted/fsfwconfig}/ipc/MissionMessageTypes.h (100%) rename {config => hosted/fsfwconfig}/returnvalues/classIds.h (100%) create mode 100644 mission/core/GenericFactory.cpp create mode 100644 mission/core/GenericFactory.h delete mode 100644 mission/core/InitMission.h diff --git a/Makefile b/Makefile index df94de6f..c02a9067 100644 --- a/Makefile +++ b/Makefile @@ -22,7 +22,7 @@ CUSTOM_DEFINES += -DLINUX # General folder paths FRAMEWORK_PATH = fsfw MISSION_PATH = mission -CONFIG_PATH = config +CONFIG_PATH = fsfwconfig TEST_PATH = test UNITTEST_PATH = unittest @@ -70,7 +70,11 @@ CLEANBIN2 = $(BUILDPATH)/$(OUTPUT_FOLDER)/devel #------------------------------------------------------------------------------- # Tool suffix when cross-compiling +ifdef HOST_LINUX +CROSS_COMPILE = +else CROSS_COMPILE = arm-linux-gnueabihf- +endif ifdef WINDOWS # C Compiler diff --git a/Makefile-Hosted b/Makefile-Hosted index 50953643..bb56fec5 100644 --- a/Makefile-Hosted +++ b/Makefile-Hosted @@ -58,7 +58,7 @@ endif # General folder paths FRAMEWORK_PATH = fsfw MISSION_PATH = mission -CONFIG_PATH = $(BOARD_FILE_ROOT)/config +CONFIG_PATH = $(BOARD_FILE_ROOT)/fsfwconfig TEST_PATH = test UNITTEST_PATH = unittest diff --git a/mission/core/InitMission.cpp b/bsp_linux/InitMission.cpp similarity index 97% rename from mission/core/InitMission.cpp rename to bsp_linux/InitMission.cpp index be16750d..cf84ab0d 100644 --- a/mission/core/InitMission.cpp +++ b/bsp_linux/InitMission.cpp @@ -1,8 +1,5 @@ -#include "InitMission.h" - -#include -#include -#include +#include +#include #include #include @@ -12,6 +9,8 @@ #include #include #include +#include +#include #include diff --git a/bsp_linux/InitMission.h b/bsp_linux/InitMission.h new file mode 100644 index 00000000..5ecf9e41 --- /dev/null +++ b/bsp_linux/InitMission.h @@ -0,0 +1,9 @@ +#ifndef BSP_LINUX_INITMISSION_H_ +#define BSP_LINUX_INITMISSION_H_ + +namespace InitMission { +void initMission(); +void initTasks(); +}; + +#endif /* BSP_LINUX_INITMISSION_H_ */ diff --git a/mission/core/ObjectFactory.cpp b/bsp_linux/ObjectFactory.cpp similarity index 85% rename from mission/core/ObjectFactory.cpp rename to bsp_linux/ObjectFactory.cpp index 78b4de6f..d08912bb 100644 --- a/mission/core/ObjectFactory.cpp +++ b/bsp_linux/ObjectFactory.cpp @@ -1,9 +1,8 @@ #include "ObjectFactory.h" - -#include -#include -#include -#include +#include +#include +#include +#include #include @@ -23,22 +22,13 @@ #include #include #include -#include -#ifdef LINUX #include #include -#elif WIN32 -#include -#include -#endif #include -#if ADD_TEST_CODE == 1 -//#include -//#include +#if OBSW_ADD_TEST_CODE == 1 #include -//#include #endif void Factory::setStaticFrameworkObjectIds(){ @@ -99,11 +89,9 @@ void ObjectFactory::produce(){ /* TMTC Reception via UDP socket */ new TmFunnel(objects::TM_FUNNEL); - new TmTcUnixUdpBridge(objects::UDP_BRIDGE, objects::CCSDS_PACKET_DISTRIBUTOR, objects::TM_STORE, objects::TC_STORE); - new TcUnixUdpPollingTask(objects::UDP_POLLING_TASK, objects::UDP_BRIDGE); /* PUS stack */ @@ -123,12 +111,7 @@ void ObjectFactory::produce(){ apid::EIVE_OBSW, pus::PUS_SERVICE_200); /* Test Device Handler */ -#if ADD_TEST_CODE == 1 +#if OBSW_ADD_TEST_CODE == 1 new TestTask(objects::TEST_TASK); -// CookieIF* testCookie = new TestCookie(0); -// new TestEchoComIF(objects::TEST_ECHO_COM_IF); -// new TestDevice(objects::TEST_DEVICE_HANDLER, objects::TEST_ECHO_COM_IF, -// testCookie, true); - new ArduinoComIF(objects::ARDUINO_COM_IF, true, nullptr); #endif } diff --git a/mission/core/ObjectFactory.h b/bsp_linux/ObjectFactory.h similarity index 56% rename from mission/core/ObjectFactory.h rename to bsp_linux/ObjectFactory.h index 9bf0d688..f7fa81ac 100644 --- a/mission/core/ObjectFactory.h +++ b/bsp_linux/ObjectFactory.h @@ -5,8 +5,8 @@ * Author: steffen */ -#ifndef MISSION_CORE_OBJECTFACTORY_H_ -#define MISSION_CORE_OBJECTFACTORY_H_ +#ifndef BSP_LINUX_OBJECTFACTORY_H_ +#define BSP_LINUX_OBJECTFACTORY_H_ namespace ObjectFactory { @@ -14,4 +14,4 @@ namespace ObjectFactory { void produce(); }; -#endif /* MISSION_CORE_OBJECTFACTORY_H_ */ +#endif /* BSP_LINUX_OBJECTFACTORY_H_ */ diff --git a/bsp_linux/main.cpp b/bsp_linux/main.cpp index a2bd4fbf..a8e34769 100644 --- a/bsp_linux/main.cpp +++ b/bsp_linux/main.cpp @@ -1,12 +1,13 @@ + #if defined(GCOV) #include #endif -#include +#include #include #include -#include +#include #include /** @@ -19,7 +20,7 @@ int main(void) std::cout << "-- EIVE OBSW --" << std::endl; std::cout << "-- Compiled for Linux " << " --" << std::endl; std::cout << "-- Software version v" << SW_VERSION << "." << SW_SUBVERSION - << " -- " << std::endl; + << "." << SW_SUBSUBVERSION << " -- " << std::endl; std::cout << "-- " << __DATE__ << " " << __TIME__ << " --" << std::endl; InitMission::initMission(); diff --git a/config/tmtc/tmTcSize.h b/config/tmtc/tmTcSize.h deleted file mode 100644 index de7f4adc..00000000 --- a/config/tmtc/tmTcSize.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef CONFIG_TMTC_TMTCSIZE_H_ -#define CONFIG_TMTC_TMTCSIZE_H_ - -#include - -namespace tmtcsize { -static const uint32_t MAX_TM_PACKET = 50; -} - -#endif /* CONFIG_TMTC_TMTCSIZE_H_ */ diff --git a/config/version.h b/config/version.h deleted file mode 100644 index 386cbc09..00000000 --- a/config/version.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef CONFIG_VERSION_H_ -#define CONFIG_VERSION_H_ - -#define SW_VERSION 0 -#define SW_SUBVERSION 1 - - - -#endif /* CONFIG_VERSION_H_ */ diff --git a/hosted/config/FSFWConfig.h b/fsfwconfig/FSFWConfig.h similarity index 94% rename from hosted/config/FSFWConfig.h rename to fsfwconfig/FSFWConfig.h index ea86152c..fe97ee6e 100644 --- a/hosted/config/FSFWConfig.h +++ b/fsfwconfig/FSFWConfig.h @@ -1,5 +1,5 @@ -#ifndef CONFIG_FSFWCONFIG_H_ -#define CONFIG_FSFWCONFIG_H_ +#ifndef FSFWCONFIG_FSFWCONFIG_H_ +#define FSFWCONFIG_FSFWCONFIG_H_ #include #include @@ -51,4 +51,4 @@ static constexpr size_t FSFW_EVENTMGMT_EVENTIDMATCHERS = 120; static constexpr size_t FSFW_EVENTMGMR_RANGEMATCHERS = 120; } -#endif /* CONFIG_FSFWCONFIG_H_ */ +#endif /* FSFWCONFIG_FSFWCONFIG_H_ */ diff --git a/config/OBSWConfig.h b/fsfwconfig/OBSWConfig.h similarity index 67% rename from config/OBSWConfig.h rename to fsfwconfig/OBSWConfig.h index 7a569b87..6d181093 100644 --- a/config/OBSWConfig.h +++ b/fsfwconfig/OBSWConfig.h @@ -3,12 +3,12 @@ * code inclusion exclusion or various other project constants and * properties in one place. */ -#ifndef CONFIG_OBSWCONFIG_H_ -#define CONFIG_OBSWCONFIG_H_ +#ifndef FSFWCONFIG_OBSWCONFIG_H_ +#define FSFWCONFIG_OBSWCONFIG_H_ -#define OBSW_ADD_TEST_CODE 1 +#define OBSW_ADD_TEST_CODE 0 // Define not used yet, PUS stack and TMTC tasks are always started #define ADD_PUS_STACK 1 -#endif /* CONFIG_OBSWCONFIG_H_ */ +#endif /* FSFWCONFIG_OBSWCONFIG_H_ */ diff --git a/fsfwconfig/OBSWVersion.h b/fsfwconfig/OBSWVersion.h new file mode 100644 index 00000000..e1afa204 --- /dev/null +++ b/fsfwconfig/OBSWVersion.h @@ -0,0 +1,12 @@ +#ifndef FSFWCONFIG_OBSWVERSION_H_ +#define FSFWCONFIG_OBSWVERSION_H_ + +const char* const SW_NAME = "eive"; + +#define SW_VERSION 0 +#define SW_SUBVERSION 2 +#define SW_SUBSUBVERSION 0 + + + +#endif /* FSFWCONFIG_OBSWVERSION_H_ */ diff --git a/config/cdatapool/dataPoolInit.cpp b/fsfwconfig/cdatapool/dataPoolInit.cpp similarity index 62% rename from config/cdatapool/dataPoolInit.cpp rename to fsfwconfig/cdatapool/dataPoolInit.cpp index 80840724..fd536af5 100644 --- a/config/cdatapool/dataPoolInit.cpp +++ b/fsfwconfig/cdatapool/dataPoolInit.cpp @@ -1,4 +1,4 @@ -#include "dataPoolInit.h" +#include void datapool::dataPoolInit(std::map* poolMap) { diff --git a/config/cdatapool/dataPoolInit.h b/fsfwconfig/cdatapool/dataPoolInit.h similarity index 55% rename from config/cdatapool/dataPoolInit.h rename to fsfwconfig/cdatapool/dataPoolInit.h index 915bd11f..f97fe7a3 100644 --- a/config/cdatapool/dataPoolInit.h +++ b/fsfwconfig/cdatapool/dataPoolInit.h @@ -1,5 +1,5 @@ -#ifndef CONFIG_CDATAPOOL_DATAPOOLINIT_H_ -#define CONFIG_CDATAPOOL_DATAPOOLINIT_H_ +#ifndef FSFWCONFIG_CDATAPOOL_DATAPOOLINIT_H_ +#define FSFWCONFIG_CDATAPOOL_DATAPOOLINIT_H_ #include @@ -10,4 +10,4 @@ namespace datapool{ NO_PARAMETER = 0, }; } -#endif /* CONFIG_CDATAPOOL_DATAPOOLINIT_H_ */ +#endif /* FSFWCONFIG_CDATAPOOL_DATAPOOLINIT_H_ */ diff --git a/config/devices/logicalAddresses.cpp b/fsfwconfig/devices/logicalAddresses.cpp similarity index 52% rename from config/devices/logicalAddresses.cpp rename to fsfwconfig/devices/logicalAddresses.cpp index 20cabdb1..a6f0aa15 100644 --- a/config/devices/logicalAddresses.cpp +++ b/fsfwconfig/devices/logicalAddresses.cpp @@ -4,7 +4,7 @@ * \date 06.11.2019 */ -#include "logicalAddresses.h" +#include diff --git a/config/devices/logicalAddresses.h b/fsfwconfig/devices/logicalAddresses.h similarity index 60% rename from config/devices/logicalAddresses.h rename to fsfwconfig/devices/logicalAddresses.h index 58683bee..922c9ce1 100644 --- a/config/devices/logicalAddresses.h +++ b/fsfwconfig/devices/logicalAddresses.h @@ -4,11 +4,11 @@ * \date 07.11.2019 */ -#ifndef CONFIG_DEVICES_LOGICALADDRESSES_H_ -#define CONFIG_DEVICES_LOGICALADDRESSES_H_ +#ifndef FSFWCONFIG_DEVICES_LOGICALADDRESSES_H_ +#define FSFWCONFIG_DEVICES_LOGICALADDRESSES_H_ #include -#include #include +#include namespace addresses { /* Logical addresses have uint32_t datatype */ @@ -23,4 +23,4 @@ namespace addresses { } -#endif /* CONFIG_DEVICES_LOGICALADDRESSES_H_ */ +#endif /* FSFWCONFIG_DEVICES_LOGICALADDRESSES_H_ */ diff --git a/config/devices/powerSwitcherList.cpp b/fsfwconfig/devices/powerSwitcherList.cpp similarity index 50% rename from config/devices/powerSwitcherList.cpp rename to fsfwconfig/devices/powerSwitcherList.cpp index 24679907..a7603185 100644 --- a/config/devices/powerSwitcherList.cpp +++ b/fsfwconfig/devices/powerSwitcherList.cpp @@ -4,7 +4,7 @@ * @date 28.11.2019 */ -#include "powerSwitcherList.h" +#include diff --git a/config/devices/powerSwitcherList.h b/fsfwconfig/devices/powerSwitcherList.h similarity index 54% rename from config/devices/powerSwitcherList.h rename to fsfwconfig/devices/powerSwitcherList.h index 2d10ae8d..98f7af8d 100644 --- a/config/devices/powerSwitcherList.h +++ b/fsfwconfig/devices/powerSwitcherList.h @@ -4,8 +4,8 @@ * @date 28.11.2019 */ -#ifndef CONFIG_DEVICES_POWERSWITCHERLIST_H_ -#define CONFIG_DEVICES_POWERSWITCHERLIST_H_ +#ifndef FSFWCONFIG_DEVICES_POWERSWITCHERLIST_H_ +#define FSFWCONFIG_DEVICES_POWERSWITCHERLIST_H_ namespace switches { /* Switches are uint8_t datatype and go from 0 to 255 */ @@ -19,4 +19,4 @@ namespace switches { } -#endif /* CONFIG_DEVICES_POWERSWITCHERLIST_H_ */ +#endif /* FSFWCONFIG_DEVICES_POWERSWITCHERLIST_H_ */ diff --git a/config/events/subsystemIdRanges.h b/fsfwconfig/events/subsystemIdRanges.h similarity index 73% rename from config/events/subsystemIdRanges.h rename to fsfwconfig/events/subsystemIdRanges.h index 2c3ff90d..ece990b2 100644 --- a/config/events/subsystemIdRanges.h +++ b/fsfwconfig/events/subsystemIdRanges.h @@ -1,5 +1,5 @@ -#ifndef CONFIG_EVENTS_SUBSYSTEMIDRANGES_H_ -#define CONFIG_EVENTS_SUBSYSTEMIDRANGES_H_ +#ifndef FSFWCONFIG_EVENTS_SUBSYSTEMIDRANGES_H_ +#define FSFWCONFIG_EVENTS_SUBSYSTEMIDRANGES_H_ #include #include @@ -21,4 +21,4 @@ enum: uint8_t { }; } -#endif /* CONFIG_EVENTS_SUBSYSTEMIDRANGES_H_ */ +#endif /* FSFWCONFIG_EVENTS_SUBSYSTEMIDRANGES_H_ */ diff --git a/config/events/translateEvents.cpp b/fsfwconfig/events/translateEvents.cpp similarity index 99% rename from config/events/translateEvents.cpp rename to fsfwconfig/events/translateEvents.cpp index f955a56f..49e1223a 100644 --- a/config/events/translateEvents.cpp +++ b/fsfwconfig/events/translateEvents.cpp @@ -2,7 +2,7 @@ * @brief Auto-generated event translation file. Contains 80 translations. * Generated on: 2020-05-02 20:13:41 */ -#include "translateEvents.h" +#include const char *GPS_STARTUP_FAILED_STRING = "GPS_STARTUP_FAILED"; const char *GPS_FIX_STRING = "GPS_FIX"; diff --git a/config/events/translateEvents.h b/fsfwconfig/events/translateEvents.h similarity index 53% rename from config/events/translateEvents.h rename to fsfwconfig/events/translateEvents.h index 0e40ef8b..e7a88326 100644 --- a/config/events/translateEvents.h +++ b/fsfwconfig/events/translateEvents.h @@ -5,12 +5,12 @@ * Author: Robin */ -#ifndef CONFIG_EVENTS_TRANSLATEEVENTS_H_ -#define CONFIG_EVENTS_TRANSLATEEVENTS_H_ +#ifndef FSFWCONFIG_EVENTS_TRANSLATEEVENTS_H_ +#define FSFWCONFIG_EVENTS_TRANSLATEEVENTS_H_ #include const char * translateEvents(Event event); -#endif /* CONFIG_EVENTS_TRANSLATEEVENTS_H_ */ +#endif /* FSFWCONFIG_EVENTS_TRANSLATEEVENTS_H_ */ diff --git a/config/config.mk b/fsfwconfig/fsfwconfig.mk similarity index 100% rename from config/config.mk rename to fsfwconfig/fsfwconfig.mk diff --git a/config/ipc/MissionMessageTypes.cpp b/fsfwconfig/ipc/MissionMessageTypes.cpp similarity index 78% rename from config/ipc/MissionMessageTypes.cpp rename to fsfwconfig/ipc/MissionMessageTypes.cpp index 3eef97fc..8536245f 100644 --- a/config/ipc/MissionMessageTypes.cpp +++ b/fsfwconfig/ipc/MissionMessageTypes.cpp @@ -1,5 +1,5 @@ -#include "MissionMessageTypes.h" #include +#include void messagetypes::clearMissionMessage(CommandMessage* message) { // switch(message->getMessageType()) { diff --git a/hosted/config/ipc/MissionMessageTypes.h b/fsfwconfig/ipc/MissionMessageTypes.h similarity index 73% rename from hosted/config/ipc/MissionMessageTypes.h rename to fsfwconfig/ipc/MissionMessageTypes.h index 832d8e58..ab2a84b5 100644 --- a/hosted/config/ipc/MissionMessageTypes.h +++ b/fsfwconfig/ipc/MissionMessageTypes.h @@ -1,5 +1,5 @@ -#ifndef CONFIG_IPC_MISSIONMESSAGETYPES_H_ -#define CONFIG_IPC_MISSIONMESSAGETYPES_H_ +#ifndef FSFWCONFIG_IPC_MISSIONMESSAGETYPES_H_ +#define FSFWCONFIG_IPC_MISSIONMESSAGETYPES_H_ #include @@ -19,4 +19,4 @@ enum MESSAGE_TYPE { void clearMissionMessage(CommandMessage* message); } -#endif /* CONFIG_IPC_MISSIONMESSAGETYPES_H_ */ +#endif /* FSFWCONFIG_IPC_MISSIONMESSAGETYPES_H_ */ diff --git a/config/objects/systemObjectList.h b/fsfwconfig/objects/systemObjectList.h similarity index 100% rename from config/objects/systemObjectList.h rename to fsfwconfig/objects/systemObjectList.h diff --git a/config/objects/translateObjects.cpp b/fsfwconfig/objects/translateObjects.cpp similarity index 96% rename from config/objects/translateObjects.cpp rename to fsfwconfig/objects/translateObjects.cpp index 84e4011c..bfb8fb85 100644 --- a/config/objects/translateObjects.cpp +++ b/fsfwconfig/objects/translateObjects.cpp @@ -1,5 +1,5 @@ /* Auto-generated event translation file. Contains 77 translations. */ -#include +#include const char *AT91_UART2_TEST_TASK_STRING = "AT91_UART2_TEST_TASK"; const char *ARDUINO_0_STRING = "ARDUINO_0"; diff --git a/config/objects/translateObjects.h b/fsfwconfig/objects/translateObjects.h similarity index 55% rename from config/objects/translateObjects.h rename to fsfwconfig/objects/translateObjects.h index 18c237eb..2e5a8c40 100644 --- a/config/objects/translateObjects.h +++ b/fsfwconfig/objects/translateObjects.h @@ -5,12 +5,12 @@ * Author: Robin */ -#ifndef CONFIG_OBJECTS_TRANSLATEOBJECTS_H_ -#define CONFIG_OBJECTS_TRANSLATEOBJECTS_H_ +#ifndef FSFWCONFIG_OBJECTS_TRANSLATEOBJECTS_H_ +#define FSFWCONFIG_OBJECTS_TRANSLATEOBJECTS_H_ #include const char* translateObject(object_id_t object); -#endif /* CONFIG_OBJECTS_TRANSLATEOBJECTS_H_ */ +#endif /* FSFWCONFIG_OBJECTS_TRANSLATEOBJECTS_H_ */ diff --git a/config/pollingsequence/PollingSequenceFactory.cpp b/fsfwconfig/pollingsequence/PollingSequenceFactory.cpp similarity index 90% rename from config/pollingsequence/PollingSequenceFactory.cpp rename to fsfwconfig/pollingsequence/PollingSequenceFactory.cpp index dbe13add..22c00034 100644 --- a/config/pollingsequence/PollingSequenceFactory.cpp +++ b/fsfwconfig/pollingsequence/PollingSequenceFactory.cpp @@ -1,10 +1,9 @@ -#include -#include - #include #include #include #include +#include +#include ReturnValue_t pst::pollingSequenceInitDefault(FixedTimeslotTaskIF *thisSequence) { diff --git a/config/pollingsequence/PollingSequenceFactory.h b/fsfwconfig/pollingsequence/PollingSequenceFactory.h similarity index 100% rename from config/pollingsequence/PollingSequenceFactory.h rename to fsfwconfig/pollingsequence/PollingSequenceFactory.h diff --git a/hosted/config/returnvalues/classIds.h b/fsfwconfig/returnvalues/classIds.h similarity index 67% rename from hosted/config/returnvalues/classIds.h rename to fsfwconfig/returnvalues/classIds.h index f6427a1f..b5835c84 100644 --- a/hosted/config/returnvalues/classIds.h +++ b/fsfwconfig/returnvalues/classIds.h @@ -1,5 +1,5 @@ -#ifndef CONFIG_RETURNVALUES_CLASSIDS_H_ -#define CONFIG_RETURNVALUES_CLASSIDS_H_ +#ifndef FSFWCONFIG_RETURNVALUES_CLASSIDS_H_ +#define FSFWCONFIG_RETURNVALUES_CLASSIDS_H_ #include @@ -16,4 +16,4 @@ enum { } -#endif /* CONFIG_RETURNVALUES_CLASSIDS_H_ */ +#endif /* FSFWCONFIG_RETURNVALUES_CLASSIDS_H_ */ diff --git a/config/tmtc/apid.h b/fsfwconfig/tmtc/apid.h similarity index 77% rename from config/tmtc/apid.h rename to fsfwconfig/tmtc/apid.h index 64d3763c..ee2fc7c4 100644 --- a/config/tmtc/apid.h +++ b/fsfwconfig/tmtc/apid.h @@ -1,5 +1,5 @@ -#ifndef CONFIG_TMTC_APID_H_ -#define CONFIG_TMTC_APID_H_ +#ifndef FSFWCONFIG_TMTC_APID_H_ +#define FSFWCONFIG_TMTC_APID_H_ #include @@ -16,4 +16,4 @@ namespace apid { } -#endif /* CONFIG_TMTC_APID_H_ */ +#endif /* FSFWCONFIG_TMTC_APID_H_ */ diff --git a/config/tmtc/pusIds.h b/fsfwconfig/tmtc/pusIds.h similarity index 100% rename from config/tmtc/pusIds.h rename to fsfwconfig/tmtc/pusIds.h diff --git a/fsfwconfig/tmtc/tmTcSize.h b/fsfwconfig/tmtc/tmTcSize.h new file mode 100644 index 00000000..c3c83d31 --- /dev/null +++ b/fsfwconfig/tmtc/tmTcSize.h @@ -0,0 +1,10 @@ +#ifndef FSFWCONFIG_TMTC_TMTCSIZE_H_ +#define FSFWCONFIG_TMTC_TMTCSIZE_H_ + +#include + +namespace tmtcsize { +static const uint32_t MAX_TM_PACKET = 50; +} + +#endif /* FSFWCONFIG_TMTC_TMTCSIZE_H_ */ diff --git a/hosted/InitMission.cpp b/hosted/InitMission.cpp new file mode 100644 index 00000000..8bee1b2e --- /dev/null +++ b/hosted/InitMission.cpp @@ -0,0 +1,159 @@ +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +// This is configured for linux without \cr +#ifdef LINUX +ServiceInterfaceStream sif::debug("DEBUG"); +ServiceInterfaceStream sif::info("INFO"); +ServiceInterfaceStream sif::warning("WARNING"); +ServiceInterfaceStream sif::error("ERROR", false, false, true); +#else +ServiceInterfaceStream sif::debug("DEBUG", true); +ServiceInterfaceStream sif::info("INFO", true); +ServiceInterfaceStream sif::warning("WARNING", true); +ServiceInterfaceStream sif::error("ERROR", true, false, true); +#endif + +ObjectManagerIF *objectManager = nullptr; + +//Initialize Data Pool +DataPool dataPool(nullptr); + +void InitMission::initMission() { + sif::info << "Building global objects.." << std::endl; + /* Instantiate global object manager and also create all objects */ + objectManager = new ObjectManager(ObjectFactory::produce); + sif::info << "Initializing all objects.." << std::endl; + objectManager->initialize(); + + /* This function creates and starts all tasks */ + initTasks(); +} + +void InitMission::initTasks(){ + /* TMTC Distribution */ + PeriodicTaskIF* TmTcDistributor = TaskFactory::instance()-> + createPeriodicTask("DIST", 40, PeriodicTaskIF::MINIMUM_STACK_SIZE, + 0.100, nullptr); + ReturnValue_t result = TmTcDistributor->addComponent( + objects::CCSDS_PACKET_DISTRIBUTOR); + if(result!=HasReturnvaluesIF::RETURN_OK){ + sif::error << "Object add component failed" << std::endl; + } + result = TmTcDistributor->addComponent(objects::PUS_PACKET_DISTRIBUTOR); + if(result!=HasReturnvaluesIF::RETURN_OK){ + sif::error << "Object add component failed" << std::endl; + } + result = TmTcDistributor->addComponent(objects::TM_FUNNEL); + if(result != HasReturnvaluesIF::RETURN_OK) { + sif::error << "Object add component failed" << std::endl; + } + + /* UDP bridge */ + PeriodicTaskIF* UdpBridgeTask = TaskFactory::instance()->createPeriodicTask( + "UDP_UNIX_BRIDGE", 50, PeriodicTaskIF::MINIMUM_STACK_SIZE, + 0.2, nullptr); + result = UdpBridgeTask->addComponent(objects::UDP_BRIDGE); + if(result != HasReturnvaluesIF::RETURN_OK) { + sif::error << "Add component UDP Unix Bridge failed" << std::endl; + } + PeriodicTaskIF* UdpPollingTask = TaskFactory::instance()-> + createPeriodicTask("UDP_POLLING", 80, + PeriodicTaskIF::MINIMUM_STACK_SIZE, 2.0, nullptr); + result = UdpPollingTask->addComponent(objects::UDP_POLLING_TASK); + if(result != HasReturnvaluesIF::RETURN_OK) { + sif::error << "Add component UDP Polling failed" << std::endl; + } + + /* PUS Services */ + PeriodicTaskIF* PusVerification = TaskFactory::instance()-> + createPeriodicTask("PUS_VERIF_1", 40, + PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.200, nullptr); + result = PusVerification->addComponent(objects::PUS_SERVICE_1_VERIFICATION); + if(result != HasReturnvaluesIF::RETURN_OK){ + sif::error << "Object add component failed" << std::endl; + } + + PeriodicTaskIF* PusEvents = TaskFactory::instance()-> + createPeriodicTask("PUS_VERIF_1", 60, + PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.200, nullptr); + result = PusVerification->addComponent(objects::PUS_SERVICE_5_EVENT_REPORTING); + if(result != HasReturnvaluesIF::RETURN_OK){ + sif::error << "Object add component failed" << std::endl; + } + + PeriodicTaskIF* PusHighPrio = TaskFactory::instance()-> + createPeriodicTask("PUS_HIGH_PRIO", 50, + PeriodicTaskIF::MINIMUM_STACK_SIZE, + 0.200, nullptr); + result = PusHighPrio->addComponent(objects::PUS_SERVICE_2_DEVICE_ACCESS); + if(result!=HasReturnvaluesIF::RETURN_OK){ + sif::error << "Object add component failed" << std::endl; + } + result = PusHighPrio->addComponent(objects::PUS_SERVICE_9_TIME_MGMT); + if(result!=HasReturnvaluesIF::RETURN_OK){ + sif::error << "Object add component failed" << std::endl; + } + + PeriodicTaskIF* PusMedPrio = TaskFactory::instance()-> + createPeriodicTask("PUS_HIGH_PRIO", 40, + PeriodicTaskIF::MINIMUM_STACK_SIZE, + 0.8, nullptr); + result = PusMedPrio->addComponent(objects::PUS_SERVICE_8_FUNCTION_MGMT); + if(result!=HasReturnvaluesIF::RETURN_OK){ + sif::error << "Object add component failed" << std::endl; + } + result = PusMedPrio->addComponent(objects::PUS_SERVICE_200_MODE_MGMT); + if(result!=HasReturnvaluesIF::RETURN_OK){ + sif::error << "Object add component failed" << std::endl; + } + + PeriodicTaskIF* PusLowPrio = TaskFactory::instance()-> + createPeriodicTask("PUSB", 30, PeriodicTaskIF::MINIMUM_STACK_SIZE, + 1.6, nullptr); + result = PusLowPrio->addComponent(objects::PUS_SERVICE_17_TEST); + if(result!=HasReturnvaluesIF::RETURN_OK){ + sif::error << "Object add component failed" << std::endl; + } + + +#if OBSW_ADD_TEST_CODE == 1 + FixedTimeslotTaskIF* TestTimeslotTask = TaskFactory::instance()-> + createFixedTimeslotTask("PST_TEST_TASK", 10, + PeriodicTaskIF::MINIMUM_STACK_SIZE, 1.0, nullptr); + result = pst::pollingSequenceTestFunction(TestTimeslotTask); + if(result != HasReturnvaluesIF::RETURN_OK) { + sif::error << "InitMission::createTasks: Test PST initialization " + << "failed!" << std::endl; + } +#endif + + //Main thread sleep + sif::info << "Starting tasks.." << std::endl; + TmTcDistributor->startTask(); + UdpBridgeTask->startTask(); + UdpPollingTask->startTask(); + + PusVerification->startTask(); + PusEvents->startTask(); + PusHighPrio->startTask(); + PusMedPrio->startTask(); + PusLowPrio->startTask(); +#if OBSW_ADD_TEST_CODE == 1 + TestTimeslotTask->startTask(); +#endif + sif::info << "Tasks started.." << std::endl; +} diff --git a/hosted/InitMission.h b/hosted/InitMission.h new file mode 100644 index 00000000..5ecf9e41 --- /dev/null +++ b/hosted/InitMission.h @@ -0,0 +1,9 @@ +#ifndef BSP_LINUX_INITMISSION_H_ +#define BSP_LINUX_INITMISSION_H_ + +namespace InitMission { +void initMission(); +void initTasks(); +}; + +#endif /* BSP_LINUX_INITMISSION_H_ */ diff --git a/hosted/ObjectFactory.cpp b/hosted/ObjectFactory.cpp new file mode 100644 index 00000000..dbdb42fa --- /dev/null +++ b/hosted/ObjectFactory.cpp @@ -0,0 +1,61 @@ +#include "ObjectFactory.h" + +#include +#include +#include +#include + +#include +#include + +#include +#include + +#ifdef LINUX +#include +#include +#elif WIN32 +#include +#include +#endif + +#include + + +#if OBSW_ADD_TEST_CODE == 1 +#include +#endif + +void Factory::setStaticFrameworkObjectIds(){ + PusServiceBase::packetSource = objects::PUS_PACKET_DISTRIBUTOR; + PusServiceBase::packetDestination = objects::TM_FUNNEL; + + CommandingServiceBase::defaultPacketSource = objects::PUS_PACKET_DISTRIBUTOR; + CommandingServiceBase::defaultPacketDestination = objects::TM_FUNNEL; + + TmFunnel::downlinkDestination = objects::UDP_BRIDGE; + // No storage object for now. + TmFunnel::storageDestination = objects::NO_OBJECT; + + VerificationReporter::messageReceiver = objects::PUS_SERVICE_1_VERIFICATION; + TmPacketStored::timeStamperId = objects::TIME_STAMPER; +} + +void ObjectFactory::produce(){ + Factory::setStaticFrameworkObjectIds(); + ObjectFactory::produceGenericObjects(); + +#ifdef LINUX + new TmTcUnixUdpBridge(objects::UDP_BRIDGE, + objects::CCSDS_PACKET_DISTRIBUTOR, + objects::TM_STORE, objects::TC_STORE); + new TcUnixUdpPollingTask(objects::UDP_POLLING_TASK, objects::UDP_BRIDGE); +#elif WIN32 + new TmTcWinUdpBridge(objects::UDP_BRIDGE, + objects::CCSDS_PACKET_DISTRIBUTOR, objects::TM_STORE, + objects::TC_STORE); + new TcWinUdpPollingTask(objects::UDP_POLLING_TASK, + objects::UDP_BRIDGE); +#endif + +} diff --git a/hosted/ObjectFactory.h b/hosted/ObjectFactory.h new file mode 100644 index 00000000..f7fa81ac --- /dev/null +++ b/hosted/ObjectFactory.h @@ -0,0 +1,17 @@ +/* + * ObjectFactory.h + * + * Created on: Sep 22, 2020 + * Author: steffen + */ + +#ifndef BSP_LINUX_OBJECTFACTORY_H_ +#define BSP_LINUX_OBJECTFACTORY_H_ + + +namespace ObjectFactory { + void setStatics(); + void produce(); +}; + +#endif /* BSP_LINUX_OBJECTFACTORY_H_ */ diff --git a/hosted/config/version.h b/hosted/config/version.h deleted file mode 100644 index 386cbc09..00000000 --- a/hosted/config/version.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef CONFIG_VERSION_H_ -#define CONFIG_VERSION_H_ - -#define SW_VERSION 0 -#define SW_SUBVERSION 1 - - - -#endif /* CONFIG_VERSION_H_ */ diff --git a/config/FSFWConfig.h b/hosted/fsfwconfig/FSFWConfig.h similarity index 100% rename from config/FSFWConfig.h rename to hosted/fsfwconfig/FSFWConfig.h diff --git a/hosted/config/OBSWConfig.h b/hosted/fsfwconfig/OBSWConfig.h similarity index 100% rename from hosted/config/OBSWConfig.h rename to hosted/fsfwconfig/OBSWConfig.h diff --git a/hosted/fsfwconfig/OBSWVersion.h b/hosted/fsfwconfig/OBSWVersion.h new file mode 100644 index 00000000..e1afa204 --- /dev/null +++ b/hosted/fsfwconfig/OBSWVersion.h @@ -0,0 +1,12 @@ +#ifndef FSFWCONFIG_OBSWVERSION_H_ +#define FSFWCONFIG_OBSWVERSION_H_ + +const char* const SW_NAME = "eive"; + +#define SW_VERSION 0 +#define SW_SUBVERSION 2 +#define SW_SUBSUBVERSION 0 + + + +#endif /* FSFWCONFIG_OBSWVERSION_H_ */ diff --git a/hosted/config/events/subsystemIdRanges.h b/hosted/fsfwconfig/events/subsystemIdRanges.h similarity index 100% rename from hosted/config/events/subsystemIdRanges.h rename to hosted/fsfwconfig/events/subsystemIdRanges.h diff --git a/hosted/config/config.mk b/hosted/fsfwconfig/fsfwconfig.mk similarity index 100% rename from hosted/config/config.mk rename to hosted/fsfwconfig/fsfwconfig.mk diff --git a/hosted/config/ipc/MissionMessageTypes.cpp b/hosted/fsfwconfig/ipc/MissionMessageTypes.cpp similarity index 75% rename from hosted/config/ipc/MissionMessageTypes.cpp rename to hosted/fsfwconfig/ipc/MissionMessageTypes.cpp index 36ef1b73..b91abcd3 100644 --- a/hosted/config/ipc/MissionMessageTypes.cpp +++ b/hosted/fsfwconfig/ipc/MissionMessageTypes.cpp @@ -1,5 +1,5 @@ -#include "MissionMessageTypes.h" #include +#include void messagetypes::clearMissionMessage(CommandMessage* message) { switch(message->getMessageType()) { diff --git a/config/ipc/MissionMessageTypes.h b/hosted/fsfwconfig/ipc/MissionMessageTypes.h similarity index 100% rename from config/ipc/MissionMessageTypes.h rename to hosted/fsfwconfig/ipc/MissionMessageTypes.h diff --git a/config/returnvalues/classIds.h b/hosted/fsfwconfig/returnvalues/classIds.h similarity index 100% rename from config/returnvalues/classIds.h rename to hosted/fsfwconfig/returnvalues/classIds.h diff --git a/hosted/main.cpp b/hosted/main.cpp index 77c5145e..e5ca6d02 100644 --- a/hosted/main.cpp +++ b/hosted/main.cpp @@ -1,8 +1,8 @@ -#include +#include #include +#include #include -#include #ifdef WIN32 static const char* COMPILE_PRINTOUT = "Windows"; @@ -20,8 +20,8 @@ int main(void) { std::cout << "-- EIVE OBSW --" << std::endl; std::cout << "-- Compiled for " << COMPILE_PRINTOUT << " --" << std::endl; - std::cout << "-- Software version v" << SW_VERSION << "." << SW_SUBVERSION - << " -- " << std::endl; + std::cout << "-- Software version " << SW_NAME << " v" << SW_VERSION << "." + << SW_SUBVERSION << "." << SW_SUBSUBVERSION << " -- " << std::endl; std::cout << "-- " << __DATE__ << " " << __TIME__ << " --" << std::endl; InitMission::initMission(); diff --git a/mission/core/GenericFactory.cpp b/mission/core/GenericFactory.cpp new file mode 100644 index 00000000..5305dc82 --- /dev/null +++ b/mission/core/GenericFactory.cpp @@ -0,0 +1,83 @@ +#include "GenericFactory.h" +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +void ObjectFactory::produceGenericObjects() { + /* Framework objects */ + new EventManager(objects::EVENT_MANAGER); + new HealthTable(objects::HEALTH_TABLE); + new InternalErrorReporter(objects::INTERNAL_ERROR_REPORTER, 0, 0, 0); + new TimeStamper(objects::TIME_STAMPER); + + { + static constexpr uint8_t NUMBER_OF_POOLS = 5; + const uint16_t element_sizes[NUMBER_OF_POOLS] = {16, 32, 64, 128, 1024}; + const uint16_t n_elements[NUMBER_OF_POOLS] = {100, 50, 25, 15, 5}; + new PoolManager(objects::TC_STORE, element_sizes, + n_elements); + } + + { + static constexpr uint8_t NUMBER_OF_POOLS = 5; + const uint16_t element_sizes[NUMBER_OF_POOLS] = {16, 32, 64, 128, 1024}; + const uint16_t n_elements[NUMBER_OF_POOLS] = {100, 50, 25, 15, 5}; + new PoolManager(objects::TM_STORE, element_sizes, + n_elements); + } + + { + static constexpr uint8_t NUMBER_OF_POOLS = 6; + const uint16_t element_sizes[NUMBER_OF_POOLS] = {32, 64, 512, + 1024, 2048, 4096}; + const uint16_t n_elements[NUMBER_OF_POOLS] = {200, 100, 50, 25, 15, 5}; + new PoolManager(objects::IPC_STORE, element_sizes, + n_elements); + } + + new CCSDSDistributor(apid::EIVE_OBSW, objects::CCSDS_PACKET_DISTRIBUTOR); + new PUSDistributor(apid::EIVE_OBSW, objects::PUS_PACKET_DISTRIBUTOR, + objects::CCSDS_PACKET_DISTRIBUTOR); + + + /* TMTC Reception via UDP socket */ + new TmFunnel(objects::TM_FUNNEL); + + /* PUS stack */ + new Service1TelecommandVerification(objects::PUS_SERVICE_1_VERIFICATION, + apid::EIVE_OBSW, pus::PUS_SERVICE_1, objects::TM_FUNNEL); + new Service2DeviceAccess(objects::PUS_SERVICE_2_DEVICE_ACCESS, + apid::EIVE_OBSW, pus::PUS_SERVICE_2, 3, 10); + new Service5EventReporting(objects::PUS_SERVICE_5_EVENT_REPORTING, + apid::EIVE_OBSW, pus::PUS_SERVICE_5, 50); + new Service8FunctionManagement(objects::PUS_SERVICE_8_FUNCTION_MGMT, + apid::EIVE_OBSW, pus::PUS_SERVICE_8, 3, 10); + new Service9TimeManagement(objects::PUS_SERVICE_9_TIME_MGMT, + apid::EIVE_OBSW, pus::PUS_SERVICE_9); + new Service17Test(objects::PUS_SERVICE_17_TEST, apid::EIVE_OBSW, + pus::PUS_SERVICE_17); + new CService200ModeCommanding(objects::PUS_SERVICE_200_MODE_MGMT, + apid::EIVE_OBSW, pus::PUS_SERVICE_200); + + /* Test Device Handler */ +#if OBSW_ADD_TEST_CODE == 1 + new TestTask(objects::TEST_TASK); +#endif +} diff --git a/mission/core/GenericFactory.h b/mission/core/GenericFactory.h new file mode 100644 index 00000000..c96c7818 --- /dev/null +++ b/mission/core/GenericFactory.h @@ -0,0 +1,12 @@ +#ifndef MISSION_CORE_GENERICFACTORY_H_ +#define MISSION_CORE_GENERICFACTORY_H_ + +namespace ObjectFactory { + +void produceGenericObjects(); + + +} + + +#endif /* MISSION_CORE_GENERICFACTORY_H_ */ diff --git a/mission/core/InitMission.h b/mission/core/InitMission.h deleted file mode 100644 index 8e4471ce..00000000 --- a/mission/core/InitMission.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef MISSION_CORE_INITMISSION_H_ -#define MISSION_CORE_INITMISSION_H_ - -namespace InitMission { -void initMission(); -void initTasks(); -}; - -#endif /* MISSION_CORE_INITMISSION_H_ */ From 40c259d9bf7f565f8472aa3a4cc9a7b4e6b98e4c Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 20 Nov 2020 18:27:07 +0100 Subject: [PATCH 08/31] repaired other build --- bsp_linux/ObjectFactory.cpp | 97 +++++-------------------------------- bsp_linux/main.cpp | 4 +- hosted/ObjectFactory.cpp | 8 +-- 3 files changed, 17 insertions(+), 92 deletions(-) diff --git a/bsp_linux/ObjectFactory.cpp b/bsp_linux/ObjectFactory.cpp index d08912bb..a0f82887 100644 --- a/bsp_linux/ObjectFactory.cpp +++ b/bsp_linux/ObjectFactory.cpp @@ -1,37 +1,20 @@ #include "ObjectFactory.h" -#include -#include -#include -#include -#include +#include +#include +#include +#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include #include #include +#include +#include +#include -#if OBSW_ADD_TEST_CODE == 1 -#include -#endif - -void Factory::setStaticFrameworkObjectIds(){ +void Factory::setStaticFrameworkObjectIds() { PusServiceBase::packetSource = objects::PUS_PACKET_DISTRIBUTOR; PusServiceBase::packetDestination = objects::TM_FUNNEL; @@ -50,68 +33,10 @@ void Factory::setStaticFrameworkObjectIds(){ void ObjectFactory::produce(){ Factory::setStaticFrameworkObjectIds(); + ObjectFactory::produceGenericObjects(); - /* Framework objects */ - new EventManager(objects::EVENT_MANAGER); - new HealthTable(objects::HEALTH_TABLE); - new InternalErrorReporter(objects::INTERNAL_ERROR_REPORTER, 0, 0, 0); - new TimeStamper(objects::TIME_STAMPER); - - { - static constexpr uint8_t NUMBER_OF_POOLS = 5; - const uint16_t element_sizes[NUMBER_OF_POOLS] = {16, 32, 64, 128, 1024}; - const uint16_t n_elements[NUMBER_OF_POOLS] = {100, 50, 25, 15, 5}; - new PoolManager(objects::TC_STORE, element_sizes, - n_elements); - } - - { - static constexpr uint8_t NUMBER_OF_POOLS = 5; - const uint16_t element_sizes[NUMBER_OF_POOLS] = {16, 32, 64, 128, 1024}; - const uint16_t n_elements[NUMBER_OF_POOLS] = {100, 50, 25, 15, 5}; - new PoolManager(objects::TM_STORE, element_sizes, - n_elements); - } - - { - static constexpr uint8_t NUMBER_OF_POOLS = 6; - const uint16_t element_sizes[NUMBER_OF_POOLS] = {32, 64, 512, - 1024, 2048, 4096}; - const uint16_t n_elements[NUMBER_OF_POOLS] = {200, 100, 50, 25, 15, 5}; - new PoolManager(objects::IPC_STORE, element_sizes, - n_elements); - } - - new CCSDSDistributor(apid::EIVE_OBSW, objects::CCSDS_PACKET_DISTRIBUTOR); - new PUSDistributor(apid::EIVE_OBSW, objects::PUS_PACKET_DISTRIBUTOR, - objects::CCSDS_PACKET_DISTRIBUTOR); - - - /* TMTC Reception via UDP socket */ - new TmFunnel(objects::TM_FUNNEL); new TmTcUnixUdpBridge(objects::UDP_BRIDGE, objects::CCSDS_PACKET_DISTRIBUTOR, objects::TM_STORE, objects::TC_STORE); new TcUnixUdpPollingTask(objects::UDP_POLLING_TASK, objects::UDP_BRIDGE); - - /* PUS stack */ - new Service1TelecommandVerification(objects::PUS_SERVICE_1_VERIFICATION, - apid::EIVE_OBSW, pus::PUS_SERVICE_1, objects::TM_FUNNEL); - new Service2DeviceAccess(objects::PUS_SERVICE_2_DEVICE_ACCESS, - apid::EIVE_OBSW, pus::PUS_SERVICE_2, 3, 10); - new Service5EventReporting(objects::PUS_SERVICE_5_EVENT_REPORTING, - apid::EIVE_OBSW, pus::PUS_SERVICE_5, 50); - new Service8FunctionManagement(objects::PUS_SERVICE_8_FUNCTION_MGMT, - apid::EIVE_OBSW, pus::PUS_SERVICE_8, 3, 10); - new Service9TimeManagement(objects::PUS_SERVICE_9_TIME_MGMT, - apid::EIVE_OBSW, pus::PUS_SERVICE_9); - new Service17Test(objects::PUS_SERVICE_17_TEST, apid::EIVE_OBSW, - pus::PUS_SERVICE_17); - new CService200ModeCommanding(objects::PUS_SERVICE_200_MODE_MGMT, - apid::EIVE_OBSW, pus::PUS_SERVICE_200); - - /* Test Device Handler */ -#if OBSW_ADD_TEST_CODE == 1 - new TestTask(objects::TEST_TASK); -#endif } diff --git a/bsp_linux/main.cpp b/bsp_linux/main.cpp index a8e34769..cd8a0bc6 100644 --- a/bsp_linux/main.cpp +++ b/bsp_linux/main.cpp @@ -19,8 +19,8 @@ int main(void) { std::cout << "-- EIVE OBSW --" << std::endl; std::cout << "-- Compiled for Linux " << " --" << std::endl; - std::cout << "-- Software version v" << SW_VERSION << "." << SW_SUBVERSION - << "." << SW_SUBSUBVERSION << " -- " << std::endl; + std::cout << "-- Software version " << SW_NAME << " v" << SW_VERSION << "." + << SW_SUBVERSION << "." << SW_SUBSUBVERSION << " -- " << std::endl; std::cout << "-- " << __DATE__ << " " << __TIME__ << " --" << std::endl; InitMission::initMission(); diff --git a/hosted/ObjectFactory.cpp b/hosted/ObjectFactory.cpp index dbdb42fa..09c69082 100644 --- a/hosted/ObjectFactory.cpp +++ b/hosted/ObjectFactory.cpp @@ -1,9 +1,9 @@ #include "ObjectFactory.h" -#include -#include -#include -#include +#include +#include +#include +#include #include #include From 8fa8e0d8c54380e48293fc1768224c7111eafe29 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 20 Nov 2020 18:30:15 +0100 Subject: [PATCH 09/31] main tqeaks --- bsp_linux/main.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/bsp_linux/main.cpp b/bsp_linux/main.cpp index cd8a0bc6..5f6be8db 100644 --- a/bsp_linux/main.cpp +++ b/bsp_linux/main.cpp @@ -1,18 +1,14 @@ +#include "InitMission.h" -#if defined(GCOV) -#include -#endif - -#include +#include #include #include -#include + #include /** - * @brief This is the main program for the hosted build. It can be run for - * Linux and Windows. + * @brief This is the main program for the target hardware. * @return */ int main(void) From e85ed4eadb25f25d86fac47efe6728406908c854 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 20 Nov 2020 18:32:06 +0100 Subject: [PATCH 10/31] todo added --- fsfwconfig/OBSWVersion.h | 1 + 1 file changed, 1 insertion(+) diff --git a/fsfwconfig/OBSWVersion.h b/fsfwconfig/OBSWVersion.h index e1afa204..d76b65c9 100644 --- a/fsfwconfig/OBSWVersion.h +++ b/fsfwconfig/OBSWVersion.h @@ -1,6 +1,7 @@ #ifndef FSFWCONFIG_OBSWVERSION_H_ #define FSFWCONFIG_OBSWVERSION_H_ +//! TODO: Think of a cool name for the software releases. const char* const SW_NAME = "eive"; #define SW_VERSION 0 From 8f81faa3a7a703e92e43f75f11f217e79baedfe0 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 20 Nov 2020 18:35:42 +0100 Subject: [PATCH 11/31] readme update --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index f4e6f2e9..4796eab1 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,9 @@ # EIVE On-Board Software ## General information + +Target systems: + * OBC * Xiphos Q7S * Based on Zynq-7020 SoC (xc7z020clg484-2) @@ -12,6 +15,10 @@ * Linux OS * Built with Yocto 2.5 * Linux Kernel https://github.com/XiphosSystemsCorp/linux-xlnx.git +* Host System + * Generic software components which are not dependant on hardware can also + be run. All host code is contained in the hosted folder + * Tested for Linux (Ubuntu 20.04) and Windows 10 ## Setting up development environment From 733d5cac2ce517af5b17a960d8d3b8ae36cb10ae Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 20 Nov 2020 18:37:32 +0100 Subject: [PATCH 12/31] small readme fix --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4796eab1..28b0fec7 100644 --- a/README.md +++ b/README.md @@ -28,11 +28,12 @@ Target systems: * Install make (only on windows, SDK on Linux can use the make installed with the SDK) 1. Install NodeJS LTS 2. Install xpm - ```` + ```sh npm install --global xpm - ```` + ``` + 3. Install Windows build tools (after installation also linux commands like mkdir can be used from windows) - ```` + ```sh xpm install --global @xpack-dev-tools/windows-build-tools@latest ```` From eb9be6fd4c2f749ad5dcf256f1bc1eecef61c2a8 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 20 Nov 2020 18:38:02 +0100 Subject: [PATCH 13/31] another try --- README.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 28b0fec7..cefecee5 100644 --- a/README.md +++ b/README.md @@ -28,14 +28,13 @@ Target systems: * Install make (only on windows, SDK on Linux can use the make installed with the SDK) 1. Install NodeJS LTS 2. Install xpm - ```sh - npm install --global xpm - ``` - + ```sh + npm install --global xpm + ``` 3. Install Windows build tools (after installation also linux commands like mkdir can be used from windows) - ```sh - xpm install --global @xpack-dev-tools/windows-build-tools@latest - ```` + ```sh + xpm install --global @xpack-dev-tools/windows-build-tools@latest + ``` ### Building the software From f66ef8caaa8760dd239532d13a2e59251fa1fae8 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 20 Nov 2020 18:38:46 +0100 Subject: [PATCH 14/31] test --- README.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index cefecee5..b49f230f 100644 --- a/README.md +++ b/README.md @@ -28,13 +28,16 @@ Target systems: * Install make (only on windows, SDK on Linux can use the make installed with the SDK) 1. Install NodeJS LTS 2. Install xpm - ```sh - npm install --global xpm - ``` + + ```sh + npm install --global xpm + ``` + 3. Install Windows build tools (after installation also linux commands like mkdir can be used from windows) - ```sh - xpm install --global @xpack-dev-tools/windows-build-tools@latest - ``` + + ```sh + xpm install --global @xpack-dev-tools/windows-build-tools@latest + ``` ### Building the software From 1aa763615161de4db6dd3eabdca3901008ab71c6 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 20 Nov 2020 18:39:38 +0100 Subject: [PATCH 15/31] test2 --- README.md | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index b49f230f..b5d47947 100644 --- a/README.md +++ b/README.md @@ -26,18 +26,20 @@ Target systems: * For supported OS refer to https://www.xilinx.com/support/documentation/sw_manuals/xilinx2018_2/ug973-vivado-release-notes-install-license.pdf * Add path of linux cross-compiler to environment variables SDK\2018.2\gnu\aarch32\nt\gcc-arm-linux-gnueabi\bin * Install make (only on windows, SDK on Linux can use the make installed with the SDK) - 1. Install NodeJS LTS - 2. Install xpm + +### Installing make on Windows +1. Install NodeJS LTS +2. Install xpm - ```sh - npm install --global xpm - ``` - - 3. Install Windows build tools (after installation also linux commands like mkdir can be used from windows) - - ```sh - xpm install --global @xpack-dev-tools/windows-build-tools@latest - ``` +```sh +npm install --global xpm +``` + +3. Install Windows build tools (after installation also linux commands like mkdir can be used from windows) + +```sh +xpm install --global @xpack-dev-tools/windows-build-tools@latest +``` ### Building the software From 16e8e9829a6b0a008d0504bd834830953d939a96 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 20 Nov 2020 18:41:49 +0100 Subject: [PATCH 16/31] host build note --- README.md | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index b5d47947..cd1b7c14 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ npm install --global xpm xpm install --global @xpack-dev-tools/windows-build-tools@latest ``` -### Building the software +## Building the software 1. Clone the repository with ```sh @@ -69,7 +69,7 @@ git submodule update * As build command type: \make -j all WINDOWS=1 7. Run build command (double click the generated target) -### Debugging the software (when workstation is directly conncected to Q7S) +## Debugging the software (when workstation is directly conncected to Q7S) 1. Assign static IP address to Q7S * Open serial console of Q7S (Accessible via the micro-USB of the PIM, see also Q7S user maunal chapter 10.3) * Baudrate 115200 @@ -118,7 +118,7 @@ git submodule update * Local File Path: Path to eiveobsw-linux.elf (in _bin\linux\devel) * Remote File Path: /tmp/eive_obsw.elf -### Debugging the software via Flatsat PC +## Debugging the software via Flatsat PC Open SSH connection to flatsat PC: ```` ssh eive@2001:7c0:2018:1099:babe:0:e1fe:f1a5 @@ -146,7 +146,7 @@ Note: When now setting up a debug session in the Xilinx SDK, the host must be se of the Q7S. -### Launching an application after boot +## Launching an application after boot Load the root partiton from the flash memory (there are to nor-flash memories and each flash holds two xdi images). Note: It is not possible to modify the current loaded root partition. 1. Disable write protection of the desired root partition @@ -205,7 +205,7 @@ More detailed information about the used q7s commands can be found in the Q7S us writeprotect 0 0 0 # qspi0 nom unlock (see also Q7S user manual) ```` -### Setting up UNIX environment for real-time functionalities +## Setting up UNIX environment for real-time functionalities Please note that on most UNIX environments (e.g. Ubuntu), the real time functionalities used by the UNIX pthread module are restricted, which will lead to permission errors when creating these tasks and configuring real-time properites like scheduling priorities. @@ -264,7 +264,18 @@ a permanent solution). If running the script before executing the binary does not help or an warning is issue that the soft real time value is invalid, the hard real-time limit of the system might not be high enough (see step 1). -### Flight Software Framework (FSFW) +## Building and running the software on a host system + +The host build can be built with following command + +```sh +make all -j +``` + +If compiling on Windows, it is recommended to supply `WINDOWS=1` . +A release build can be built by using the `mission` target. + +## Flight Software Framework (FSFW) An EIVE fork of the FSFW is submodules into this repository. To add the master upstream branch and merge changes and updates from it From c4533521f326edd83bc1e26686c80fa709754ee7 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 20 Nov 2020 18:43:55 +0100 Subject: [PATCH 17/31] readme update --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index cd1b7c14..14eeba9e 100644 --- a/README.md +++ b/README.md @@ -55,10 +55,10 @@ git submodule sync git submodule update ``` -4. Open Xilinx SDK 2018.2 -5. Import project +3. Open Xilinx SDK 2018.2 +4. Import project * File → Import → C/C++ → Existing Code as Makefile Project -6. Set build command +5. Set build command * When on Linux right click project → Properties → C/C++ Build → Set build command to make -j * -j causes the compiler to use all available cores * On windows create a make target (Windows → Show View → Make Target) @@ -66,8 +66,8 @@ git submodule update * Target name: all * Uncheck "Same as the target name" * Uncheck "Use builder settings" - * As build command type: \make -j all WINDOWS=1 -7. Run build command (double click the generated target) + * As build command type: `make -j all WINDOWS=1` +6. Run build command (double click the generated target) ## Debugging the software (when workstation is directly conncected to Q7S) 1. Assign static IP address to Q7S From 11c38d5f903078e910e1ec541c5d998d5b44d483 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 20 Nov 2020 18:45:10 +0100 Subject: [PATCH 18/31] test3 --- README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 14eeba9e..66d693c5 100644 --- a/README.md +++ b/README.md @@ -77,35 +77,35 @@ git submodule update * user: root * pw: root * Set IP address and netmask with - ```` + ```sh ifconfig eth0 192.168.133.10 ifconfig eth0 netmask 255.255.255.0 - ```` + ``` 2. Connect Q7S to workstation via ethernet 3. Make sure the netmask of the ehternet interface of the workstation matches the netmask of the Q7S * When IP address is set to 192.168.133.10 and the netmask is 255.255.255.0, an example IP address for the workstation is 192.168.133.2 4. Run tcf-agent on Q7S * Tcf-agent is not yet integrated in the rootfs of the Q7S. Therefore build tcf-agent manually - ```` + ```sh git clone git://git.eclipse.org/gitroot/tcf/org.eclipse.tcf.agent.git cd org.eclipse.tcf.agent/agent make CC=arm-linux-gnueabihf-gcc LD=arm-linux-gnueabihf-ld MACHINE=arm NO_SSL=1 NO_UUID=1 - ```` + ``` * Transfer executable agent from org.eclipse.tcf.agent/agent/obj/GNU/Linux/arm/Debug to /tmp of Q7S - ```` + ```sh cd obj/GNU/Linux/arm/Debug scp agent root@192.168.133.10:/tmp - ```` + ``` * On Q7S - ```` + ```sh cd /tmp chmod +x agent - ```` + ``` * Run agent - ```` + ```sh ./agent - ```` + ``` 5. In Xilinx SDK 2018.2 right click on project → Debug As → Debug Configurations 6. Right click Xilinx C/C++ applicaton (System Debugger) → New → 7. Set Debug Type to Linux Application Debug and Connectin to Linux Agent From 4a80b477c41a57ce14050e213b06619530889824 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 20 Nov 2020 18:46:06 +0100 Subject: [PATCH 19/31] test5 --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 66d693c5..c85479f3 100644 --- a/README.md +++ b/README.md @@ -77,10 +77,12 @@ git submodule update * user: root * pw: root * Set IP address and netmask with - ```sh + + `sh ifconfig eth0 192.168.133.10 ifconfig eth0 netmask 255.255.255.0 - ``` + ` + 2. Connect Q7S to workstation via ethernet 3. Make sure the netmask of the ehternet interface of the workstation matches the netmask of the Q7S * When IP address is set to 192.168.133.10 and the netmask is 255.255.255.0, an example IP address for the workstation From 770b74124c727ba1b5e773af18b32005a6e1f28b Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 20 Nov 2020 18:46:47 +0100 Subject: [PATCH 20/31] reamde update --- README.md | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index c85479f3..da6e5c07 100644 --- a/README.md +++ b/README.md @@ -78,10 +78,10 @@ git submodule update * pw: root * Set IP address and netmask with - `sh - ifconfig eth0 192.168.133.10 - ifconfig eth0 netmask 255.255.255.0 - ` +```sh +ifconfig eth0 192.168.133.10 +ifconfig eth0 netmask 255.255.255.0 +``` 2. Connect Q7S to workstation via ethernet 3. Make sure the netmask of the ehternet interface of the workstation matches the netmask of the Q7S @@ -89,11 +89,12 @@ git submodule update is 192.168.133.2 4. Run tcf-agent on Q7S * Tcf-agent is not yet integrated in the rootfs of the Q7S. Therefore build tcf-agent manually - ```sh - git clone git://git.eclipse.org/gitroot/tcf/org.eclipse.tcf.agent.git - cd org.eclipse.tcf.agent/agent - make CC=arm-linux-gnueabihf-gcc LD=arm-linux-gnueabihf-ld MACHINE=arm NO_SSL=1 NO_UUID=1 - ``` + +```sh +git clone git://git.eclipse.org/gitroot/tcf/org.eclipse.tcf.agent.git +cd org.eclipse.tcf.agent/agent +make CC=arm-linux-gnueabihf-gcc LD=arm-linux-gnueabihf-ld MACHINE=arm NO_SSL=1 NO_UUID=1 +``` * Transfer executable agent from org.eclipse.tcf.agent/agent/obj/GNU/Linux/arm/Debug to /tmp of Q7S ```sh cd obj/GNU/Linux/arm/Debug From bbf660bd1293746cba0e2555460974ba775c89a1 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 20 Nov 2020 18:48:04 +0100 Subject: [PATCH 21/31] more tests --- README.md | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index da6e5c07..ed6b6a5a 100644 --- a/README.md +++ b/README.md @@ -95,20 +95,25 @@ git clone git://git.eclipse.org/gitroot/tcf/org.eclipse.tcf.agent.git cd org.eclipse.tcf.agent/agent make CC=arm-linux-gnueabihf-gcc LD=arm-linux-gnueabihf-ld MACHINE=arm NO_SSL=1 NO_UUID=1 ``` + * Transfer executable agent from org.eclipse.tcf.agent/agent/obj/GNU/Linux/arm/Debug to /tmp of Q7S - ```sh - cd obj/GNU/Linux/arm/Debug - scp agent root@192.168.133.10:/tmp - ``` + +```sh +cd obj/GNU/Linux/arm/Debug +scp agent root@192.168.133.10:/tmp +``` + * On Q7S - ```sh - cd /tmp - chmod +x agent - ``` +```sh +cd /tmp +chmod +x agent +``` + * Run agent - ```sh - ./agent - ``` +```sh +./agent +``` + 5. In Xilinx SDK 2018.2 right click on project → Debug As → Debug Configurations 6. Right click Xilinx C/C++ applicaton (System Debugger) → New → 7. Set Debug Type to Linux Application Debug and Connectin to Linux Agent From c4449517c7de60c0435befc4b9d4bd84e5c247c6 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 20 Nov 2020 18:50:09 +0100 Subject: [PATCH 22/31] test230 --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index ed6b6a5a..5a9bd64f 100644 --- a/README.md +++ b/README.md @@ -78,10 +78,10 @@ git submodule update * pw: root * Set IP address and netmask with -```sh -ifconfig eth0 192.168.133.10 -ifconfig eth0 netmask 255.255.255.0 -``` + ```sh + ifconfig eth0 192.168.133.10 + ifconfig eth0 netmask 255.255.255.0 + ``` 2. Connect Q7S to workstation via ethernet 3. Make sure the netmask of the ehternet interface of the workstation matches the netmask of the Q7S @@ -90,11 +90,11 @@ ifconfig eth0 netmask 255.255.255.0 4. Run tcf-agent on Q7S * Tcf-agent is not yet integrated in the rootfs of the Q7S. Therefore build tcf-agent manually -```sh -git clone git://git.eclipse.org/gitroot/tcf/org.eclipse.tcf.agent.git -cd org.eclipse.tcf.agent/agent -make CC=arm-linux-gnueabihf-gcc LD=arm-linux-gnueabihf-ld MACHINE=arm NO_SSL=1 NO_UUID=1 -``` + ```sh + git clone git://git.eclipse.org/gitroot/tcf/org.eclipse.tcf.agent.git + cd org.eclipse.tcf.agent/agent + make CC=arm-linux-gnueabihf-gcc LD=arm-linux-gnueabihf-ld MACHINE=arm NO_SSL=1 NO_UUID=1 + ``` * Transfer executable agent from org.eclipse.tcf.agent/agent/obj/GNU/Linux/arm/Debug to /tmp of Q7S From 2192b02dcbfa4dcc3b0dfa46e87624aa1e46b970 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 20 Nov 2020 18:51:28 +0100 Subject: [PATCH 23/31] hopefully fixed now --- README.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 5a9bd64f..2d907fc8 100644 --- a/README.md +++ b/README.md @@ -90,29 +90,29 @@ git submodule update 4. Run tcf-agent on Q7S * Tcf-agent is not yet integrated in the rootfs of the Q7S. Therefore build tcf-agent manually - ```sh - git clone git://git.eclipse.org/gitroot/tcf/org.eclipse.tcf.agent.git - cd org.eclipse.tcf.agent/agent - make CC=arm-linux-gnueabihf-gcc LD=arm-linux-gnueabihf-ld MACHINE=arm NO_SSL=1 NO_UUID=1 - ``` + ```sh + git clone git://git.eclipse.org/gitroot/tcf/org.eclipse.tcf.agent.git + cd org.eclipse.tcf.agent/agent + make CC=arm-linux-gnueabihf-gcc LD=arm-linux-gnueabihf-ld MACHINE=arm NO_SSL=1 NO_UUID=1 + ``` * Transfer executable agent from org.eclipse.tcf.agent/agent/obj/GNU/Linux/arm/Debug to /tmp of Q7S -```sh -cd obj/GNU/Linux/arm/Debug -scp agent root@192.168.133.10:/tmp -``` + ```sh + cd obj/GNU/Linux/arm/Debug + scp agent root@192.168.133.10:/tmp + ``` * On Q7S -```sh -cd /tmp -chmod +x agent -``` + ```sh + cd /tmp + chmod +x agent + ``` * Run agent -```sh -./agent -``` + ```sh + ./agent + ``` 5. In Xilinx SDK 2018.2 right click on project → Debug As → Debug Configurations 6. Right click Xilinx C/C++ applicaton (System Debugger) → New → From b557462391cb1476a12cc9fdf02f1570322c2ba5 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 25 Nov 2020 12:47:46 +0100 Subject: [PATCH 24/31] updated readme --- README.md | 5 ++++- doc/img/xilinx-install.PNG | Bin 0 -> 46795 bytes 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 doc/img/xilinx-install.PNG diff --git a/README.md b/README.md index 2d907fc8..45ae935e 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,10 @@ Target systems: ## Setting up development environment -* Install Vivado 2018.2 and Xilinx SDK from https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/vivado-design-tools/archive.html +* Install Vivado 2018.2 and Xilinx SDK from https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/vivado-design-tools/archive.html. + Install the Vivado Design Suite - HLx Editions - 2018.2 Full Product Installation instead of the updates. It is recommended to use the installer +* Install settings:
+
* For supported OS refer to https://www.xilinx.com/support/documentation/sw_manuals/xilinx2018_2/ug973-vivado-release-notes-install-license.pdf * Add path of linux cross-compiler to environment variables SDK\2018.2\gnu\aarch32\nt\gcc-arm-linux-gnueabi\bin * Install make (only on windows, SDK on Linux can use the make installed with the SDK) diff --git a/doc/img/xilinx-install.PNG b/doc/img/xilinx-install.PNG new file mode 100644 index 0000000000000000000000000000000000000000..eff68ac4de711fb5f349aed9d6d9e10f03250831 GIT binary patch literal 46795 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 literal 0 HcmV?d00001 From 828e2808d2600a3910f7721c549e8a534ce53ec6 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 25 Nov 2020 12:48:26 +0100 Subject: [PATCH 25/31] readme fix --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 45ae935e..aa831de6 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Target systems: * Install Vivado 2018.2 and Xilinx SDK from https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/vivado-design-tools/archive.html. Install the Vivado Design Suite - HLx Editions - 2018.2 Full Product Installation instead of the updates. It is recommended to use the installer * Install settings:
-
+
* For supported OS refer to https://www.xilinx.com/support/documentation/sw_manuals/xilinx2018_2/ug973-vivado-release-notes-install-license.pdf * Add path of linux cross-compiler to environment variables SDK\2018.2\gnu\aarch32\nt\gcc-arm-linux-gnueabi\bin * Install make (only on windows, SDK on Linux can use the make installed with the SDK) From 14efc1bf8f04e5127f0dbf67aa028ab8361ef17f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 25 Nov 2020 12:48:56 +0100 Subject: [PATCH 26/31] sudo removed --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index aa831de6..27f454d2 100644 --- a/README.md +++ b/README.md @@ -135,9 +135,9 @@ Open SSH connection to flatsat PC: ssh eive@2001:7c0:2018:1099:babe:0:e1fe:f1a5 ```` To access the console of the Q7S run the following: -```` -sudo picocom -b 115200 /dev/ttyUSB0 -```` +```sh +picocom -b 115200 /dev/ttyUSB0 +``` To debug an application, first make sure a static IP address is assigned to the Q7S. Run ifconfig on the Q7S serial console. ```` ifconfig From 27a5f6748c1eb9acd37b9d208111314938a6fec5 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 25 Nov 2020 12:50:32 +0100 Subject: [PATCH 27/31] additional note --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 27f454d2..0f944551 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Target systems: ## Setting up development environment * Install Vivado 2018.2 and Xilinx SDK from https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/vivado-design-tools/archive.html. Install the Vivado Design Suite - HLx Editions - 2018.2 Full Product Installation instead of the updates. It is recommended to use the installer -* Install settings:
+* Install settings. In the Devices selection, it is sufficient to pick SoC → Zynq-7000:

* For supported OS refer to https://www.xilinx.com/support/documentation/sw_manuals/xilinx2018_2/ug973-vivado-release-notes-install-license.pdf * Add path of linux cross-compiler to environment variables SDK\2018.2\gnu\aarch32\nt\gcc-arm-linux-gnueabi\bin From f38ea407ca34d46dbb40c365fa3a48cf1359bf6c Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 25 Nov 2020 12:52:31 +0100 Subject: [PATCH 28/31] host build command correction --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0f944551..f9df0403 100644 --- a/README.md +++ b/README.md @@ -280,7 +280,7 @@ the hard real-time limit of the system might not be high enough (see step 1). The host build can be built with following command ```sh -make all -j +make -f Makefile-Hosted all -j ``` If compiling on Windows, it is recommended to supply `WINDOWS=1` . From afd43542d6a41d96e074ca0cda6dea1e604cdf78 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 25 Nov 2020 12:55:35 +0100 Subject: [PATCH 29/31] minor improvements --- Makefile | 2 +- README.md | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index c02a9067..04a263ef 100644 --- a/Makefile +++ b/Makefile @@ -50,7 +50,7 @@ endif BUILDPATH = _bin DEPENDPATH = _dep OBJECTPATH = _obj -ifeq ($(MAKECMDGOALS),release) +ifeq ($(MAKECMDGOALS), release) BUILD_FOLDER = mission else BUILD_FOLDER = devel diff --git a/README.md b/README.md index f9df0403..980862db 100644 --- a/README.md +++ b/README.md @@ -61,15 +61,15 @@ git submodule update 3. Open Xilinx SDK 2018.2 4. Import project * File → Import → C/C++ → Existing Code as Makefile Project -5. Set build command - * When on Linux right click project → Properties → C/C++ Build → Set build command to make -j +5. Set build command. Replace with either debug or release. + * When on Linux right click project → Properties → C/C++ Build → Set build command to make -j * -j causes the compiler to use all available cores * On windows create a make target (Windows → Show View → Make Target) * Right click eive_obsw → New * Target name: all * Uncheck "Same as the target name" * Uncheck "Use builder settings" - * As build command type: `make -j all WINDOWS=1` + * As build command type: `make -j WINDOWS=1` 6. Run build command (double click the generated target) ## Debugging the software (when workstation is directly conncected to Q7S) From 7905970808f9e9961c19cc478bc639af074ad1a0 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 25 Nov 2020 12:56:18 +0100 Subject: [PATCH 30/31] another try --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 980862db..58e7d62e 100644 --- a/README.md +++ b/README.md @@ -61,15 +61,15 @@ git submodule update 3. Open Xilinx SDK 2018.2 4. Import project * File → Import → C/C++ → Existing Code as Makefile Project -5. Set build command. Replace with either debug or release. - * When on Linux right click project → Properties → C/C++ Build → Set build command to make -j +5. Set build command. Replace \ with either debug or release. + * When on Linux right click project → Properties → C/C++ Build → Set build command to make \ -j * -j causes the compiler to use all available cores * On windows create a make target (Windows → Show View → Make Target) * Right click eive_obsw → New * Target name: all * Uncheck "Same as the target name" * Uncheck "Use builder settings" - * As build command type: `make -j WINDOWS=1` + * As build command type: `make -j \ WINDOWS=1` 6. Run build command (double click the generated target) ## Debugging the software (when workstation is directly conncected to Q7S) From f610d6f050118f2fa8a09bcd9fcc44031d841fe8 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 25 Nov 2020 12:58:34 +0100 Subject: [PATCH 31/31] readme update --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 58e7d62e..f2f43b26 100644 --- a/README.md +++ b/README.md @@ -62,15 +62,17 @@ git submodule update 4. Import project * File → Import → C/C++ → Existing Code as Makefile Project 5. Set build command. Replace \ with either debug or release. - * When on Linux right click project → Properties → C/C++ Build → Set build command to make \ -j + * When on Linux right click project → Properties → C/C++ Build → Set build command to `make -j` * -j causes the compiler to use all available cores - * On windows create a make target (Windows → Show View → Make Target) + * The target is used to either compile the debug or the optimized release build. + * On windows create a make target additionally (Windows → Show View → Make Target) * Right click eive_obsw → New * Target name: all * Uncheck "Same as the target name" * Uncheck "Use builder settings" - * As build command type: `make -j \ WINDOWS=1` -6. Run build command (double click the generated target) + * As build command type: `make -j WINDOWS=1` +6. Run build command by double clicking the created target or by right clicking + the project folder and selecting Build Project. ## Debugging the software (when workstation is directly conncected to Q7S) 1. Assign static IP address to Q7S