diff --git a/CMakeLists.txt b/CMakeLists.txt index e0b00d30..05ca6671 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,8 +19,6 @@ if(NOT OS_FSFW) set(OS_FSFW host CACHE STRING "OS for the FSFW.") endif() -set_property(CACHE OS_FSFW PROPERTY STRINGS host linux) - # Perform steps like loading toolchain files where applicable. include(${CMAKE_SCRIPT_PATH}/PreProjectConfig.cmake) pre_project_config() @@ -46,7 +44,7 @@ set(FSFW_PATH fsfw) set(MISSION_PATH mission) set(CSPLIB_PATH libcsp) -set(WARNING_SHADOW_LOCAL FALSE) +set(FSFW_WARNING_SHADOW_LOCAL_GCC OFF) # Analyse different OS and architecture/target options, determine BSP_PATH, # display information about compiler etc. @@ -91,6 +89,8 @@ add_subdirectory(${MISSION_PATH}) # Post-Sources preparation ################################################################################ +set_property(CACHE OS_FSFW PROPERTY STRINGS host linux) + # Add libraries for all sources. target_link_libraries(${TARGET_NAME} PRIVATE ${LIB_FSFW_NAME} @@ -165,11 +165,13 @@ endif() add_custom_command( TARGET ${TARGET_NAME} POST_BUILD - COMMAND echo "Build directory: ${CMAKE_BINARY_DIR}" - COMMAND echo "Target OSAL: ${OS_FSFW}" - COMMAND echo "Target Build Type: ${CMAKE_BUILD_TYPE}" - COMMAND echo "${TARGET_STRING}" + #COMMAND echo "Build directory: ${CMAKE_BINARY_DIR}" + #COMMAND echo "Target OSAL: ${OS_FSFW}" + #COMMAND echo "Target Build Type: ${CMAKE_BUILD_TYPE}" + #COMMAND echo "${TARGET_STRING}" COMMAND ${CMAKE_SIZE} ${TARGET_NAME}${FILE_SUFFIX} + COMMENT "Build directory: ${CMAKE_BINARY_DIR}\nTarget OSAL: ${OS_FSFW}\n" + "Target Build Type: ${CMAKE_BUILD_TYPE}\n${TARGET_STRING}" ) include (${CMAKE_SCRIPT_PATH}/BuildType.cmake) diff --git a/README.md b/README.md index 0dd496c5..0ddf459c 100644 --- a/README.md +++ b/README.md @@ -16,55 +16,149 @@ Target systems: * 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 + be run on a host system. All host code is contained in the `bsp_hosted` folder * Tested for Linux (Ubuntu 20.04) and Windows 10 * Raspberry Pi * EIVE OBC can be built for Raspberry Pi as well (either directly on Raspberry Pi or by installing a cross compiler) The steps in the primary README are related to the main OBC target Q7S. +The CMake build system can be used to generate build systems as well (see helper scripts in `cmake/scripts`: + +- Linux (Raspberry Pi): Using the `bsp_rpi` BSP folder, and a very similar cross-compiler. + For running the software on a Raspberry Pi, it is recommended to follow the steps specified in + [the fsfw example](https://egit.irs.uni-stuttgart.de/fsfw/fsfw_example/src/branch/mueller/master/doc/README-rpi.md#top) and + using the TCF agent to have a similar set-up process also required for the Q7S. +- Linux Host: Uses the `bsp_hosted` BSP folder and the CMake Unix Makefiles generator. +- Windows Host: Uses the `bsp_hosted` BSP folder, the CMake MinGW Makefiles generator and MSYS2. ## Setting up development environment +### Installing Vivado the the Xilinx development tools + +It's also possible to perform debugging with a normal Eclipse installation by installing +the TCF plugin. Still, it is necessary to install Vivado to get the toolchain for generating +C++ applications. Alternatively you can download the toolchain +[from the cloud](https://eive-cloud.irs.uni-stuttgart.de/index.php/apps/files/?dir=/EIVE_IRS/Arbeitsdaten/08_Used%20Components/Q7S/Toolchain&fileid=422486). + * 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 the Vivado Design Suite - HLx Editions - 2018.2 Full Product Installation instead of the updates. It is recommended to use the installer. + * 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 -* Install make (only on windows, SDK on Linux can use the make installed with the SDK) +* Add path of linux cross-compiler to permanent environment variables (`.profile` file in Linux): + `\SDK\2018.2\gnu\aarch32\nt\gcc-arm-linux-gnueabi\bin` + or set up path each time before debugging. -### Installing make on Windows -1. Install NodeJS LTS -2. Install xpm - -```sh -npm install --global xpm -``` +### Installing CMake and MSYS2 on Windows -3. Install Windows build tools (after installation also linux commands like mkdir can be used from windows) +1. Install [MSYS2](https://www.msys2.org/) and [CMake](https://cmake.org/download/) first. -```sh -xpm install --global @xpack-dev-tools/windows-build-tools@latest -``` +2. Open the MinGW64 console. It is recommended to set up aliases in `.bashrc` to navigate to the + software repository quickly + +3. Run the following commands in MinGW64 -## Building the software + ```sh + pacman -Syuuu + ``` + + It is recommended to install the full base development toolchain + + ```sh + pacman -S base-devel + ``` + + It is also possible to only install required packages + + ```sh + pacman -S mingw-w64-x86_64-cmake mingw-w64-x86_64-make mingw-w64-x86_64-gcc mingw-w64-x86_64-gdb python3 + ``` + +### Installing CMake on Linux + +1. Run the following command + + ```sh + sudo apt-get install cmake + ```` + +## Building the software with CMake + +When using Windows, run theses steps in MSYS2. 1. Clone the repository with -```sh -git clone https://egit.irs.uni-stuttgart.de/eive/eive_obsw.git -``` + + ```sh + git clone https://egit.irs.uni-stuttgart.de/eive/eive_obsw.git + ``` 2. Update all the submodules -```sh -git submodule init -git submodule sync -git submodule update -``` -3. Open Xilinx SDK 2018.2 -4. Import project + ```sh + git submodule init + git submodule sync + git submodule update + ``` + +3. Ensure that the cross-compiler is working with `arm-linux-gnueabihf-gcc --version`. + It is recommended to run the shell script `win_path_helper_xilinx_tools.sh` in `cmake/scripts/Q7S` + or to set up the [PATH and the CROSS_COMPILE variable permanently](https://unix.stackexchange.com/questions/26047/how-to-correctly-add-a-path-to-path) + in the `.profile` file. + +4. Run the CMake configuration to create the build system in a `Debug` folder. + Navigate into the `eive_obsw` folder first. + + ```sh + cd cmake/scripts/Q7S + ./create_cmake_debug.sh + cd ../../.. + ``` + + This will invoke a Python script which in turn invokes CMake with the correct + arguments to configure CMake for Q7S cross-compilation. + +5. Build the software with + ```sh + cd Debug + cmake --build . -j + ``` + +## Setting up default Eclipse for Q7S projects - TCF agent + +The [TCF agent](https://wiki.eclipse.org/TCF) can be used to perform remote debugging on the Q7S. + +1. Install the TCF agent plugin in Eclipse from the [releases](https://www.eclipse.org/tcf/downloads.php). Go to Help → Install New Software and use the download page, for example https://download.eclipse.org/tools/tcf/releases/1.6/1.6.2/ to search for the plugin and install it. + +2. Go to Window → Perspective → Open Perspective and open the **Target Explorer Perspective**. + Here, the Q7S should show up if the local port forwarding was set up as explained previously. + +3. A launch configuration was provided, but it might be necessary to adapt it for your own needs. Alternatively: + + - Create a new **TCF Remote Application** by pressing the cogs button at the top or going to Run → Debug Configurations → Remote Application and creating a new one there. + + - Set up the correct image in the main tab (it might be necessary to send the image to the Q7S manually once) and file transfer properties + + - It is also recommended to link the correct Eclipse project. + +After that, comfortable remote debugging should be possible with the Debug button. + +A build configuration and a shell helper script has been provided to set up the path variables and build the Q7S binary +on Windows, but a launch configuration needs to be newly created because the IP address and path settings differ +from machine to machine. + +## Building in Xilinx SDK 2018.2 + +1. Open Xilinx SDK 2018.2 +2. Import project * File → Import → C/C++ → Existing Code as Makefile Project -5. Set build command. Replace \ with either debug or release. +3. 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 * The target is used to either compile the debug or the optimized release build. @@ -73,79 +167,53 @@ git submodule update * 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 by double clicking the created target or by right clicking + * As build command type: `cmake --build .` + * In the Behaviour tab, you can enable build acceleration +4. 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 - * Open serial console of Q7S (Accessible via the micro-USB of the PIM, see also Q7S user maunal chapter 10.3) - * Baudrate 115200 - * Login to Q7S: - * user: root - * pw: root - * Set IP address and netmask with - - ```sh +## TCF-Agent + +1. On reboot, some steps have to be taken on the Q7S. Set static IP address and netmask + + ```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 - ``` +2. `tcfagent` application should run automatically but this can be checked with + ```sh + systemctl status tcfagent + ``` - * 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 -8. Click New -9. Give connection a name -10. Set Host to static IP address of Q7S. e.g. 192.168.133.10 -11. Test connection (This ensures the TCF Agent is running on the Q7S) -12. Select Application tab - * Project Name: eive_obsw - * Local File Path: Path to eiveobsw-linux.elf (in _bin\linux\devel) - * Remote File Path: /tmp/eive_obsw.elf +3. If the agent is not running, check whether `agent` is located inside `usr/bin`. + You can run it manually there. To perform auto-start on boot, have a look at the start-up + application section. ## Debugging the software via Flatsat PC + Open SSH connection to flatsat PC: ```sh ssh eive@2001:7c0:2018:1099:babe:0:e1fe:f1a5 ``` +or + +```sh +ssh eive@192.168.199.227 +``` + To access the console of the Q7S run the following: ```sh picocom -b 115200 /dev/ttyUSB0 ``` +If the serial port is blocked for some reason, you can kill +the process using it with `q7s_kill`. + +You can use `AltGr` + `X` to exit the picocom session. + To debug an application, first make sure a static IP address is assigned to the Q7S. Run ifconfig on the Q7S serial console. ```sh @@ -159,19 +227,38 @@ ifconfig eth0 192.168.133.10 ifconfig eth0 netmask 255.255.255.0 ``` -To launch application from Xilinx SDK setup port fowarding on the localhost. +To launch application from Xilinx SDK setup port fowarding on the development machine +(not on the flatsat!) ```sh ssh -L 1534:192.168.133.10:1534 eive@2001:7c0:2018:1099:babe:0:e1fe:f1a5 ``` This forwards any requests to localhost:1534 to the port 1534 of the Q7S with the IP address 192.168.133.10. +This needs to be done every time, so it is recommended to create an alias to do this quickly. Note: When now setting up a debug session in the Xilinx SDK, the host must be set to localhost instead of the IP address of the Q7S. -## Launching an application after boot +## Transfering files via SCP + +To transfer files from the local machine to the Q7S, use port forwarding + +```sh +ssh -L 1535:192.168.133.10:22 eive@2001:7c0:2018:1099:babe:0:e1fe:f1a5 +``` + +Then you can copy an `example` file like this + +```sh +scp -P 1535 example root@localhost:/tmp +``` + +## Launching an application at start-up + 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. +Note: It is not possible to modify the currently loaded root partition, e.g. creating directories. To do this, +the parition needs to be mounted. + 1. Disable write protection of the desired root partition ```sh @@ -183,7 +270,10 @@ Note: It is not possible to modify the current loaded root partition. ```sh xsc_mount_copy 0 0 # Mounts the nominal image from nor-flash 0 ``` -3. Copy the executable to /bin/usr + The mounted partition will be located inside the `/tmp` folder + +3. Copy the executable to `/usr/bin` + 4. Make sure the permissions to execute the application are set ```sh chmod +x application @@ -208,29 +298,33 @@ Note: It is not possible to modify the current loaded root partition. ``` 6. Enable the service. This is normally done with systemctl enable. However, this is not possible when the service is created for a mounted root partition. Therefore create a symlink as follows. -```` -ln -s '/tmp/the-mounted-xdi-image/lib/systemd/system/example.service' '/tmp/the-mounted-xdi-image/etc/systemd/system/multi-user.target.wants/example.service' -```` + ```sh + ln -s '/tmp/the-mounted-xdi-image/lib/systemd/system/example.service' '/tmp/the-mounted-xdi-image/etc/systemd/system/multi-user.target.wants/example.service' + ``` + 7. The modified root partition is written back when the partion is locked again. -```` -writeprotect 0 0 1 -```` + ```sh + writeprotect 0 0 1 + ``` 8. Now verify the application start by booting from the modified image -```` -xsc_boot_copy 0 0 -```` + ```sh + xsc_boot_copy 0 0 + ```` + 9. After booting verify if the service is running -```` -systemctl status example -```` + ```sh + systemctl status example + ``` More detailed information about the used q7s commands can be found in the Q7S user manual. ### Bringing up CAN -```` -ip link set can0 down -ip link set can0 type can loopback off -ip link set can0 up type can bitrate 1000000 -```` + + ```sh + ip link set can0 down + ip link set can0 type can loopback off + ip link set can0 up type can bitrate 1000000 + ``` + Following command sends 8 bytes to device with id 99 (for petalinux) ```` cansend can0 -i99 99 88 77 11 33 11 22 99 @@ -307,17 +401,6 @@ 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). -## Building and running the software on a host system - -The host build can be built with following command - -```sh -make -f Makefile-Hosted 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. @@ -339,6 +422,7 @@ Alternatively, changes from other upstreams (forks) and branches can be merged l the same way. ## PCDU + Connect to serial console of P60 Dock ```` picocom -b 500000 /dev/ttyUSBx @@ -362,3 +446,57 @@ p60-dock # param get out_en[0] GET out_en[0] = 1 ```` +## 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 + * Login to Q7S: + * user: root + * pw: root + +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 +8. Click New +9. Give connection a name +10. Set Host to static IP address of Q7S. e.g. 192.168.133.10 +11. Test connection (This ensures the TCF Agent is running on the Q7S) +12. Select Application tab + * Project Name: eive_obsw + * Local File Path: Path to eiveobsw-linux.elf (in _bin\linux\devel) + * Remote File Path: /tmp/eive_obsw.elf + diff --git a/bsp_hosted/fsfwconfig/FSFWConfig.h b/bsp_hosted/fsfwconfig/FSFWConfig.h index 66fd276e..e3def8fe 100644 --- a/bsp_hosted/fsfwconfig/FSFWConfig.h +++ b/bsp_hosted/fsfwconfig/FSFWConfig.h @@ -4,16 +4,24 @@ #include #include -//! Used to determine whether C++ ostreams are used -//! Those can lead to code bloat. -#define FSFW_CPP_OSTREAM_ENABLED 1 +//! Used to determine whether C++ ostreams are used which can increase +//! the binary size significantly. If this is disabled, +//! the C stdio functions can be used alternatively +#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 +//! More FSFW related printouts depending on level. Useful for development. +#define FSFW_VERBOSE_LEVEL 1 -//! Can be used to enable debugging printouts for developing the FSFW -#define FSFW_DEBUGGING 0 +//! Can be used to completely disable printouts, even the C stdio ones. +#if FSFW_CPP_OSTREAM_ENABLED == 0 && FSFW_VERBOSE_LEVEL == 0 + #define FSFW_DISABLE_PRINTOUT 0 +#endif + +//! Can be used to disable the ANSI color sequences for C stdio. +#define FSFW_COLORED_OUTPUT 1 + +//! Can be used to disable the ANSI color sequences for C stdio. +#define FSFW_COLORED_OUTPUT 1 //! If FSFW_OBJ_EVENT_TRANSLATION is set to one, //! additional output which requires the translation files translateObjects @@ -21,18 +29,19 @@ #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 +#include "objects/translateObjects.h" +#include "events/translateEvents.h" #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 + +//! Specify whether a special mode store is used for Subsystem components. +#define FSFW_USE_MODESTORE 0 namespace fsfwconfig { //! Default timestamp size. The default timestamp will be an eight byte CDC @@ -49,6 +58,8 @@ static constexpr size_t FSFW_EVENTMGMR_RANGEMATCHERS = 120; //! simulataneously. This will increase the required RAM for //! each CSB service ! static constexpr uint8_t FSFW_CSB_FIFO_DEPTH = 6; + +static constexpr size_t FSFW_PRINT_BUFFER_SIZE = 124; } #endif /* CONFIG_FSFWCONFIG_H_ */ diff --git a/bsp_q7s/InitMission.cpp b/bsp_q7s/InitMission.cpp index 94892adf..d6df7fbf 100644 --- a/bsp_q7s/InitMission.cpp +++ b/bsp_q7s/InitMission.cpp @@ -43,7 +43,7 @@ void InitMission::initTasks(){ /* TMTC Distribution */ PeriodicTaskIF* TmTcDistributor = TaskFactory::instance()-> createPeriodicTask("DIST", 40, PeriodicTaskIF::MINIMUM_STACK_SIZE, - 0.100, nullptr); + 0.2, nullptr); ReturnValue_t result = TmTcDistributor->addComponent( objects::CCSDS_PACKET_DISTRIBUTOR); if(result!=HasReturnvaluesIF::RETURN_OK){ @@ -169,6 +169,7 @@ void InitMission::initTasks(){ PusMedPrio->startTask(); PusLowPrio->startTask(); + // P60DockTask->startTask(); #if OBSW_ADD_TEST_CODE == 1 diff --git a/bsp_rpi/CMakeLists.txt b/bsp_rpi/CMakeLists.txt index 7885ca28..281994bf 100644 --- a/bsp_rpi/CMakeLists.txt +++ b/bsp_rpi/CMakeLists.txt @@ -7,6 +7,11 @@ target_sources(${TARGET_NAME} PUBLIC add_subdirectory(boardconfig) add_subdirectory(boardtest) +# wiringPi is deprecated unfortunately.. +#target_link_libraries(${TARGET_NAME} PRIVATE +# wiringPi +#) + diff --git a/bsp_rpi/InitMission.cpp b/bsp_rpi/InitMission.cpp index 76918716..197abcc6 100644 --- a/bsp_rpi/InitMission.cpp +++ b/bsp_rpi/InitMission.cpp @@ -14,18 +14,10 @@ #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 +ServiceInterfaceStream sif::error("ERROR"); ObjectManagerIF *objectManager = nullptr; @@ -47,11 +39,11 @@ void InitMission::initTasks(){ 0.100, nullptr); ReturnValue_t result = TmTcDistributor->addComponent( objects::CCSDS_PACKET_DISTRIBUTOR); - if(result!=HasReturnvaluesIF::RETURN_OK){ + 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){ + if(result != HasReturnvaluesIF::RETURN_OK){ sif::error << "Object add component failed" << std::endl; } result = TmTcDistributor->addComponent(objects::TM_FUNNEL); @@ -97,11 +89,11 @@ void InitMission::initTasks(){ PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.200, nullptr); result = PusHighPrio->addComponent(objects::PUS_SERVICE_2_DEVICE_ACCESS); - if(result!=HasReturnvaluesIF::RETURN_OK){ + 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){ + if(result != HasReturnvaluesIF::RETURN_OK){ sif::error << "Object add component failed" << std::endl; } @@ -110,11 +102,11 @@ void InitMission::initTasks(){ PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.8, nullptr); result = PusMedPrio->addComponent(objects::PUS_SERVICE_8_FUNCTION_MGMT); - if(result!=HasReturnvaluesIF::RETURN_OK){ + 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){ + if(result != HasReturnvaluesIF::RETURN_OK){ sif::error << "Object add component failed" << std::endl; } @@ -122,7 +114,7 @@ void InitMission::initTasks(){ createPeriodicTask("PUSB", 30, PeriodicTaskIF::MINIMUM_STACK_SIZE, 1.6, nullptr); result = PusLowPrio->addComponent(objects::PUS_SERVICE_17_TEST); - if(result!=HasReturnvaluesIF::RETURN_OK){ + if(result != HasReturnvaluesIF::RETURN_OK){ sif::error << "Object add component failed" << std::endl; } @@ -139,6 +131,14 @@ void InitMission::initTasks(){ #endif + PeriodicTaskIF* SpiTestTask = TaskFactory::instance()-> + createPeriodicTask("SPI_TEST", 40, PeriodicTaskIF::MINIMUM_STACK_SIZE, + 2.0, nullptr); + result = SpiTestTask->addComponent(objects::SPI_TEST); + if(result != HasReturnvaluesIF::RETURN_OK){ + sif::error << "Object add SPI test failed" << std::endl; + } + //Main thread sleep sif::info << "Starting tasks.." << std::endl; TmTcDistributor->startTask(); @@ -151,6 +151,8 @@ void InitMission::initTasks(){ PusMedPrio->startTask(); PusLowPrio->startTask(); + SpiTestTask->startTask(); + #if OBSW_ADD_TEST_CODE == 1 TestTimeslotTask->startTask(); #endif diff --git a/bsp_rpi/ObjectFactory.cpp b/bsp_rpi/ObjectFactory.cpp index 4300fbeb..c90db492 100644 --- a/bsp_rpi/ObjectFactory.cpp +++ b/bsp_rpi/ObjectFactory.cpp @@ -1,5 +1,6 @@ -#include #include "ObjectFactory.h" +#include +#include #include #include @@ -42,4 +43,6 @@ void ObjectFactory::produce(){ objects::CCSDS_PACKET_DISTRIBUTOR, objects::TM_STORE, objects::TC_STORE); new TcUnixUdpPollingTask(objects::UDP_POLLING_TASK, objects::UDP_BRIDGE); + + new SpiTest(objects::SPI_TEST); } diff --git a/bsp_rpi/boardtest/CMakeLists.txt b/bsp_rpi/boardtest/CMakeLists.txt index 768fc52f..1e373efb 100644 --- a/bsp_rpi/boardtest/CMakeLists.txt +++ b/bsp_rpi/boardtest/CMakeLists.txt @@ -1,5 +1,6 @@ target_sources(${TARGET_NAME} PRIVATE SpiTest.cpp + RPiGPIO.cpp ) diff --git a/bsp_rpi/boardtest/RPiGPIO.cpp b/bsp_rpi/boardtest/RPiGPIO.cpp new file mode 100644 index 00000000..7ffb024c --- /dev/null +++ b/bsp_rpi/boardtest/RPiGPIO.cpp @@ -0,0 +1,123 @@ +#include "RPiGPIO.h" + +#include +#include +#include +#include +#include + + +int RPiGPIO::enablePin(int pin) { + char buffer[BUFFER_MAX]; + ssize_t bytes_written; + int fd; + + fd = open("/sys/class/gpio/export", O_WRONLY); + if (fd == -1) { + sif::error << "Failed to open export of pin " << pin << " for writing!" << std::endl; + return -1; + } + + bytes_written = snprintf(buffer, BUFFER_MAX, "%d", pin); + write(fd, buffer, bytes_written); + close(fd); + return 0; +} + +int RPiGPIO::disablePin(int pin) { + char buffer[BUFFER_MAX]; + ssize_t bytes_written; + int fd; + + fd = open("/sys/class/gpio/unexport", O_WRONLY); + if (fd == -1) { + sif::error << "Failed to open unexport of pin " << pin << " for writing!" << std::endl; + return -1; + } + + bytes_written = snprintf(buffer, BUFFER_MAX, "%d", pin); + write(fd, buffer, bytes_written); + close(fd); + return(0); +} + +int RPiGPIO::pinDirection(int pin, Directions dir) { + + char path[DIRECTION_MAX]; + + snprintf(path, DIRECTION_MAX, "/sys/class/gpio/gpio%d/direction", pin); + int fd = open(path, O_WRONLY); + if (fd == -1) { + sif::error << "Failed to open gpio " << pin << " direction for writing!" << std::endl; + return -1; + } + + int result = 0; + if(dir == Directions::IN) { + result = write(fd, "in", IN_WRITE_SIZE); + } + else { + result = write(fd, "out", OUT_WRITE_SIZE); + } + + if (result != 0) { + sif::error << "Failed to set direction!" << std::endl; + return -2; + } + + close(fd); + return 0; +} + +int RPiGPIO::readPin(int pin) { + char path[VALUE_MAX]; + char value_str[3]; + + snprintf(path, VALUE_MAX, "/sys/class/gpio/gpio%d/value", pin); + int fd = open(path, O_RDONLY); + if (fd == -1) { + sif::error << "RPiGPIO::readPin: Failed to open GPIO pin " << pin << "!" << std::endl; + return -1; + } + + if (read(fd, value_str, 3) == -1) { + sif::error << "Failed to read value!" << std::endl; + return -1; + } + + close(fd); + char* endPtr = nullptr; + + return strtol(value_str, &endPtr, 10); +} + +int RPiGPIO::writePin(int pin, States state) { + + char path[VALUE_MAX]; + int fd; + + snprintf(path, VALUE_MAX, "/sys/class/gpio/gpio%d/value", pin); + fd = open(path, O_WRONLY); + if (fd == -1) { + sif::error << "RPiGPIO::writePin: Failed to open GPIO pin " << pin << "!" << std::endl; + return -1; + } + + int result = 0; + if(state == States::LOW) { + result = write(fd, "0", 1); + } + else { + result = write(fd, "1", 1); + } + + + if (result != 0) { + sif::error << "Failed to write pin " << pin << " value to " << static_cast(state) + << "!" << std::endl; + return -1; + } + + close(fd); + return 0; +} diff --git a/bsp_rpi/boardtest/RPiGPIO.h b/bsp_rpi/boardtest/RPiGPIO.h new file mode 100644 index 00000000..400a37d8 --- /dev/null +++ b/bsp_rpi/boardtest/RPiGPIO.h @@ -0,0 +1,41 @@ +#ifndef BSP_RPI_BOARDTEST_RPIGPIO_H_ +#define BSP_RPI_BOARDTEST_RPIGPIO_H_ + +#include + +/** + * @brief Really simple C++ GPIO wrapper for the Raspberry Pi, using the sysfs interface. + * Use BCM pins notation (https://pinout.xyz/#) + * + */ +class RPiGPIO { +public: + enum Directions { + IN = 0, + OUT = 1 + }; + + enum States { + LOW = 0, + HIGH = 1 + }; + + static int enablePin(int pin); + static int disablePin(int pin); + static int pinDirection(int pin, Directions dir); + static int readPin(int pin); + static int writePin(int pin, States state); + +private: + + + static constexpr uint8_t BUFFER_MAX = 3; + static constexpr uint8_t DIRECTION_MAX = 35; + static constexpr uint8_t VALUE_MAX = 30; + + static constexpr uint8_t IN_WRITE_SIZE = 3; + static constexpr uint8_t OUT_WRITE_SIZE = 4; +}; + + +#endif /* BSP_RPI_BOARDTEST_RPIGPIO_H_ */ diff --git a/bsp_rpi/boardtest/SpiTest.cpp b/bsp_rpi/boardtest/SpiTest.cpp index 91939714..a78d0171 100644 --- a/bsp_rpi/boardtest/SpiTest.cpp +++ b/bsp_rpi/boardtest/SpiTest.cpp @@ -1,13 +1,31 @@ #include "SpiTest.h" -#include +#include #include #include -#include + + SpiTest::SpiTest(object_id_t objectId): SystemObject(objectId) { - wiringPiSetupGpio(); + sif::info << "Setting up Raspberry Pi WiringPi library." << std::endl; +// wiringPiSetupGpio(); + +// pinMode(SS_MGM_0_LIS3, OUTPUT); +// pinMode(SS_MGM_1_RM, OUTPUT); +// pinMode(SS_GYRO_0_ADIS, OUTPUT); +// pinMode(SS_GYRO_1_L3G, OUTPUT); +// pinMode(SS_GYRO_2_L3G, OUTPUT); +// pinMode(SS_MGM_2_LIS3, OUTPUT); +// pinMode(SS_MGM_3_RM, OUTPUT); +// +// digitalWrite(SS_MGM_0_LIS3, HIGH); +// digitalWrite(SS_MGM_1_RM, HIGH); +// digitalWrite(SS_GYRO_0_ADIS, HIGH); +// digitalWrite(SS_GYRO_1_L3G, HIGH); +// digitalWrite(SS_GYRO_2_L3G, HIGH); +// digitalWrite(SS_MGM_2_LIS3, HIGH); +// digitalWrite(SS_MGM_3_RM, HIGH); int spiFd = open(spiDeviceName.c_str(), O_RDWR); if (spiFd < 0){ @@ -40,4 +58,4 @@ ReturnValue_t SpiTest::initialize() { //transferHandle.speed_hz = 976000; //transferHandle.len = 2; return HasReturnvaluesIF::RETURN_OK; -} \ No newline at end of file +} diff --git a/bsp_rpi/boardtest/SpiTest.h b/bsp_rpi/boardtest/SpiTest.h index 9bdb8f25..b4f37fe2 100644 --- a/bsp_rpi/boardtest/SpiTest.h +++ b/bsp_rpi/boardtest/SpiTest.h @@ -6,13 +6,27 @@ #include #include -class SpiTest: public ExecutableObjectIF, SystemObject { +class SpiTest: + public SystemObject, + public ExecutableObjectIF { public: SpiTest(object_id_t objectId); ReturnValue_t performOperation(uint8_t opCode) override; ReturnValue_t initialize() override; private: + // These chip selects (BCM number) will be pulled high if not used + // ACS board specific. + enum SpiChipSelects { + SS_MGM_0_LIS3 = 0, //!< MGM 0, LIS3MDLTR, U6, A side + SS_MGM_1_RM = 1, //!< MGM 1, RM3100, U7, A side + SS_GYRO_0_ADIS = 2, //!< Gyro 0, ADIS16485, U3, A side + SS_GYRO_1_L3G = 3, //!< Gyro 1, L3GD20H, U4, A side + SS_GYRO_2_L3G = 4, //!< Gyro 2, L3GD20h, U5, B side + SS_MGM_2_LIS3 = 17, //!< MGM 2, LIS3MDLTR, U8, B side + SS_MGM_3_RM = 27, //!< MGM 3, RM3100, U9, B side + }; + const std::string spiDeviceName = "/dev/spidev0.0"; int spiFd = 0; diff --git a/cmake/HardwareOsPostConfig.cmake b/cmake/HardwareOsPostConfig.cmake index c3dc3f93..73a8d8b1 100644 --- a/cmake/HardwareOsPostConfig.cmake +++ b/cmake/HardwareOsPostConfig.cmake @@ -55,8 +55,8 @@ target_compile_options(${TARGET_NAME} PRIVATE add_custom_command( TARGET ${TARGET_NAME} POST_BUILD - COMMAND echo Generating binary file ${CMAKE_PROJECT_NAME}.bin.. COMMAND ${CMAKE_OBJCOPY} -O binary ${TARGET_NAME} ${TARGET_NAME}.bin + COMMENT "Generating binary file ${CMAKE_PROJECT_NAME}.bin.." ) endfunction() \ No newline at end of file diff --git a/cmake/PreProjectConfig.cmake b/cmake/PreProjectConfig.cmake index ce18d89d..f54da048 100644 --- a/cmake/PreProjectConfig.cmake +++ b/cmake/PreProjectConfig.cmake @@ -19,15 +19,15 @@ if(${OS_FSFW} STREQUAL linux AND TGT_BSP) ) elseif (${TGT_BSP} MATCHES "arm/raspberrypi") if(NOT DEFINED ENV{RASPBIAN_ROOTFS}) - if(NOT RASPBIAN_ROOTFS) + if(NOT DEFINED RASPBIAN_ROOTFS) + message(WARNING "No RASPBIAN_ROOTFS environmental or CMake variable set!") set(ENV{RASPBIAN_ROOTFS} "$ENV{HOME}/raspberrypi/rootfs") else() set(ENV{RASPBIAN_ROOTFS} "${RASPBIAN_ROOTFS}") endif() else() message(STATUS - "RASPBIAN_ROOTFS from environmental variables used: " - "$ENV{RASPBIAN_ROOTFS}" + "RASPBIAN_ROOTFS from environmental variables used: $ENV{RASPBIAN_ROOTFS}" ) endif() @@ -36,12 +36,8 @@ if(${OS_FSFW} STREQUAL linux AND TGT_BSP) message(STATUS "No RASPBERRY_VERSION specified, setting to 4") set(RASPBERRY_VERSION "4" CACHE STRING "Raspberry Pi version") else() - message(STATUS - "Setting RASPBERRY_VERSION to ${RASPBERRY_VERSION}" - ) - set(RASPBERRY_VERSION - ${RASPBERRY_VERSION} CACHE STRING "Raspberry Pi version" - ) + message(STATUS "Setting RASPBERRY_VERSION to ${RASPBERRY_VERSION}") + set(RASPBERRY_VERSION ${RASPBERRY_VERSION} CACHE STRING "Raspberry Pi version") set(ENV{RASPBERRY_VERSION} ${RASPBERRY_VERSION}) endif() else() diff --git a/cmake/Q7SCrossCompileConfig.cmake b/cmake/Q7SCrossCompileConfig.cmake index 665869f9..2fb8134b 100644 --- a/cmake/Q7SCrossCompileConfig.cmake +++ b/cmake/Q7SCrossCompileConfig.cmake @@ -1,13 +1,13 @@ # CROSS_COMPILE also needs to be set accordingly or passed to the CMake command -#if(NOT DEFINED ENV{Q7S_ROOTFS}) +if(NOT DEFINED ENV{Q7S_SYSROOT}) # message(FATAL_ERROR # "Define the Q7S_ROOTFS variable to " # "point to the raspbian rootfs." # ) -#else() -# set(SYSROOT_PATH "$ENV{Q7S_ROOTFS}") -#endif() +else() + set(SYSROOT_PATH "$ENV{Q7S_SYSROOT}") +endif() if(NOT DEFINED ENV{CROSS_COMPILE}) set(CROSS_COMPILE "arm-linux-gnueabihf") diff --git a/cmake/scripts/Q7S/win_path_helper_xilinx_tools.sh b/cmake/scripts/Q7S/win_path_helper_xilinx_tools.sh new file mode 100644 index 00000000..ac2411b7 --- /dev/null +++ b/cmake/scripts/Q7S/win_path_helper_xilinx_tools.sh @@ -0,0 +1,4 @@ +export PATH=$PATH:"/c/Xilinx/SDK/2018.2/gnu/aarch32/nt/gcc-arm-linux-gnueabi/bin" +export CROSS_COMPILE="arm-linux-gnueabihf" + +export Q7S_SYSROOT="/c/Xilinx/SDK/2018.2/gnu/aarch32/nt/gcc-arm-linux-gnueabi/arm-linux-gnueabihf/libc" diff --git a/doc/Q7S-user-manual.pdf b/doc/Q7S-user-manual.pdf new file mode 100644 index 00000000..70ab7bb4 Binary files /dev/null and b/doc/Q7S-user-manual.pdf differ diff --git a/doc/img/vivado-edition.png b/doc/img/vivado-edition.png new file mode 100644 index 00000000..c34051f3 Binary files /dev/null and b/doc/img/vivado-edition.png differ diff --git a/doc/img/vivado-hl-design.png b/doc/img/vivado-hl-design.png new file mode 100644 index 00000000..3603f8cb Binary files /dev/null and b/doc/img/vivado-hl-design.png differ diff --git a/fsfw b/fsfw index 1ac2479b..50733e22 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 1ac2479b28c1114b0876123e0db4155abfbf06fe +Subproject commit 50733e223adaf9fc95d9728c62a026ea6efac1d2 diff --git a/fsfwconfig/FSFWConfig.h b/fsfwconfig/FSFWConfig.h index fdfa889a..e3def8fe 100644 --- a/fsfwconfig/FSFWConfig.h +++ b/fsfwconfig/FSFWConfig.h @@ -1,19 +1,27 @@ -#ifndef FSFWCONFIG_FSFWCONFIG_H_ -#define FSFWCONFIG_FSFWCONFIG_H_ +#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 +//! Used to determine whether C++ ostreams are used which can increase +//! the binary size significantly. If this is disabled, +//! the C stdio functions can be used alternatively +#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 +//! More FSFW related printouts depending on level. Useful for development. +#define FSFW_VERBOSE_LEVEL 1 -//! Can be used to enable debugging printouts for developing the FSFW -#define FSFW_DEBUGGING 0 +//! Can be used to completely disable printouts, even the C stdio ones. +#if FSFW_CPP_OSTREAM_ENABLED == 0 && FSFW_VERBOSE_LEVEL == 0 + #define FSFW_DISABLE_PRINTOUT 0 +#endif + +//! Can be used to disable the ANSI color sequences for C stdio. +#define FSFW_COLORED_OUTPUT 1 + +//! Can be used to disable the ANSI color sequences for C stdio. +#define FSFW_COLORED_OUTPUT 1 //! If FSFW_OBJ_EVENT_TRANSLATION is set to one, //! additional output which requires the translation files translateObjects @@ -21,18 +29,19 @@ #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 +#include "objects/translateObjects.h" +#include "events/translateEvents.h" #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 + +//! Specify whether a special mode store is used for Subsystem components. +#define FSFW_USE_MODESTORE 0 namespace fsfwconfig { //! Default timestamp size. The default timestamp will be an eight byte CDC @@ -49,6 +58,8 @@ static constexpr size_t FSFW_EVENTMGMR_RANGEMATCHERS = 120; //! simulataneously. This will increase the required RAM for //! each CSB service ! static constexpr uint8_t FSFW_CSB_FIFO_DEPTH = 6; + +static constexpr size_t FSFW_PRINT_BUFFER_SIZE = 124; } -#endif /* FSFWCONFIG_FSFWCONFIG_H_ */ +#endif /* CONFIG_FSFWCONFIG_H_ */ diff --git a/fsfwconfig/objects/systemObjectList.h b/fsfwconfig/objects/systemObjectList.h index a5863380..d2fb5490 100644 --- a/fsfwconfig/objects/systemObjectList.h +++ b/fsfwconfig/objects/systemObjectList.h @@ -2,10 +2,15 @@ #define HOSTED_CONFIG_OBJECTS_SYSTEMOBJECTLIST_H_ #include +#include // The objects will be instantiated in the ID order namespace objects { enum sourceObjects: uint32_t { + /* 0x53 reserved for FSFW */ + FW_ADDRESS_START = PUS_SERVICE_1_VERIFICATION, + FW_ADDRESS_END = TIME_STAMPER, + /* First Byte 0x50-0x52 reserved for PUS Services **/ CCSDS_PACKET_DISTRIBUTOR = 0x50000100, PUS_PACKET_DISTRIBUTOR = 0x50000200, @@ -21,13 +26,6 @@ namespace objects { TM_FUNNEL = 0x52000002, - /* Test Task */ - - TEST_TASK = 0x42694269, - DUMMY_INTERFACE = 0xCAFECAFE, - DUMMY_HANDLER = 0x4400AFFE, - P60DOCK_TEST_TASK = 0x00005060, - /* 0x49 ('I') for Communication Interfaces **/ ARDUINO_COM_IF = 0x49000001, CSP_COM_IF = 0x49000002, @@ -36,7 +34,14 @@ namespace objects { P60DOCK_HANDLER = 0x44000001, PDU1_HANDLER = 0x44000002, PDU2_HANDLER = 0x44000003, - ACU_HANDLER = 0x44000004 + ACU_HANDLER = 0x44000004, + + /* 0x54 ('T') for test handlers */ + TEST_TASK = 0x54694269, + SPI_TEST = 0x54000010, + DUMMY_INTERFACE = 0x5400CAFE, + DUMMY_HANDLER = 0x5400AFFE, + P60DOCK_TEST_TASK = 0x00005060, }; } diff --git a/libcsp/src/drivers/can/can_socketcan.c b/libcsp/src/drivers/can/can_socketcan.c index 7d12f184..94c6bdde 100644 --- a/libcsp/src/drivers/can/can_socketcan.c +++ b/libcsp/src/drivers/can/can_socketcan.c @@ -142,7 +142,7 @@ csp_iface_t * csp_can_socketcan_init(const char * ifc, int bitrate, int promisc) struct sockaddr_can addr; pthread_t rx_thread; - printf("Init can interface %s\n", ifc); + printf("-I-: Initiating CAN interface %s\n", ifc); #ifdef CSP_HAVE_LIBSOCKETCAN /* Set interface up */ diff --git a/misc/eclipse/.cproject b/misc/eclipse/.cproject index 80fd68eb..7d08be5e 100644 --- a/misc/eclipse/.cproject +++ b/misc/eclipse/.cproject @@ -15,11 +15,11 @@ - + - + @@ -230,7 +230,7 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + make + -j16 + clean + true + true + true + + + make + -j16 + hardclean + true + true + true + + + + + + + + + + + + \ No newline at end of file diff --git a/misc/eclipse/Host/eive-mingw-debug-cmake.launch b/misc/eclipse/Host/eive-mingw-debug-cmake.launch index e69de29b..3552a26b 100644 --- a/misc/eclipse/Host/eive-mingw-debug-cmake.launch +++ b/misc/eclipse/Host/eive-mingw-debug-cmake.launch @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mission/devices/GPSHandler.cpp b/mission/devices/GPSHandler.cpp index fb549eb7..e53ce347 100644 --- a/mission/devices/GPSHandler.cpp +++ b/mission/devices/GPSHandler.cpp @@ -44,7 +44,7 @@ uint32_t GPSHandler::getTransitionDelayMs(Mode_t from, Mode_t to) { } ReturnValue_t GPSHandler::initializeLocalDataPool( - LocalDataPool &localDataPoolMap, LocalDataPoolManager &poolManager) { + localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) { return HasReturnvaluesIF::RETURN_OK; } diff --git a/mission/devices/GPSHandler.h b/mission/devices/GPSHandler.h index 52ac25be..01a13591 100644 --- a/mission/devices/GPSHandler.h +++ b/mission/devices/GPSHandler.h @@ -29,7 +29,7 @@ protected: void fillCommandAndReplyMap() override; void modeChanged() override; uint32_t getTransitionDelayMs(Mode_t from, Mode_t to) override; - ReturnValue_t initializeLocalDataPool(LocalDataPool &localDataPoolMap, + ReturnValue_t initializeLocalDataPool(localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) override; private: diff --git a/mission/devices/GyroL3GD20Handler.cpp b/mission/devices/GyroL3GD20Handler.cpp index 11a053c8..28cbdbed 100644 --- a/mission/devices/GyroL3GD20Handler.cpp +++ b/mission/devices/GyroL3GD20Handler.cpp @@ -1,4 +1,5 @@ #include +#include GyroHandler::GyroHandler(object_id_t objectId, object_id_t deviceCommunication, CookieIF *comCookie): @@ -171,14 +172,13 @@ ReturnValue_t GyroHandler::interpretDeviceReply(DeviceCommandId_t id, int8_t temperaturOffset = (-1) * packet[L3GD20H::TEMPERATURE_IDX]; float temperature = 25.0 + temperaturOffset; - result = dataset.read(20); - if(result == HasReturnvaluesIF::RETURN_OK) { + PoolReadHelper readSet(&dataset); + if(readSet.getReadResult() == HasReturnvaluesIF::RETURN_OK) { dataset.angVelocX = angVelocX; dataset.angVelocY = angVelocY; dataset.angVelocZ = angVelocZ; dataset.temperature = temperature; dataset.setValidity(true, true); - result = dataset.commit(20); } break; } @@ -194,7 +194,7 @@ uint32_t GyroHandler::getTransitionDelayMs(Mode_t from, Mode_t to) { } ReturnValue_t GyroHandler::initializeLocalDataPool( - LocalDataPool &localDataPoolMap, LocalDataPoolManager &poolManager) { + localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) { localDataPoolMap.emplace(L3GD20H::ANG_VELOC_X, new PoolEntry({0.0})); localDataPoolMap.emplace(L3GD20H::ANG_VELOC_Y, diff --git a/mission/devices/GyroL3GD20Handler.h b/mission/devices/GyroL3GD20Handler.h index 5905b26a..20396315 100644 --- a/mission/devices/GyroL3GD20Handler.h +++ b/mission/devices/GyroL3GD20Handler.h @@ -37,7 +37,7 @@ protected: void fillCommandAndReplyMap() override; void modeChanged() override; uint32_t getTransitionDelayMs(Mode_t from, Mode_t to) override; - ReturnValue_t initializeLocalDataPool(LocalDataPool &localDataPoolMap, + ReturnValue_t initializeLocalDataPool(localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) override; private: diff --git a/mission/devices/MGMHandlerLIS3MDL.cpp b/mission/devices/MGMHandlerLIS3MDL.cpp index 64b6d855..2445620d 100644 --- a/mission/devices/MGMHandlerLIS3MDL.cpp +++ b/mission/devices/MGMHandlerLIS3MDL.cpp @@ -257,13 +257,13 @@ ReturnValue_t MGMHandlerLIS3MDL::interpretDeviceReply(DeviceCommandId_t id, sif::info << "Z: " << mgmZ << " \xC2\xB5T" << std::endl; } #endif - ReturnValue_t result = dataset.read(20); + ReturnValue_t result = dataset.read(); if(result == HasReturnvaluesIF::RETURN_OK) { dataset.fieldStrengthX = mgmX; dataset.fieldStrengthY = mgmY; dataset.fieldStrengthZ = mgmZ; dataset.setValidity(true, true); - dataset.commit(20); + dataset.commit(); } break; } @@ -278,10 +278,10 @@ ReturnValue_t MGMHandlerLIS3MDL::interpretDeviceReply(DeviceCommandId_t id, << std::endl; } #endif - ReturnValue_t result = dataset.read(20); + ReturnValue_t result = dataset.read(); if(result == HasReturnvaluesIF::RETURN_OK) { dataset.temperature = tempValue; - dataset.commit(20); + dataset.commit(); } break; } @@ -423,7 +423,7 @@ void MGMHandlerLIS3MDL::modeChanged(void) { } ReturnValue_t MGMHandlerLIS3MDL::initializeLocalDataPool( - LocalDataPool &localDataPoolMap, LocalDataPoolManager &poolManager) { + localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) { localDataPoolMap.emplace(MGMLIS3MDL::FIELD_STRENGTH_X, new PoolEntry({0.0})); localDataPoolMap.emplace(MGMLIS3MDL::FIELD_STRENGTH_Y, diff --git a/mission/devices/MGMHandlerLIS3MDL.h b/mission/devices/MGMHandlerLIS3MDL.h index 414731db..4a62ba31 100644 --- a/mission/devices/MGMHandlerLIS3MDL.h +++ b/mission/devices/MGMHandlerLIS3MDL.h @@ -52,7 +52,7 @@ protected: const uint8_t *packet) override; void fillCommandAndReplyMap() override; void modeChanged(void) override; - ReturnValue_t initializeLocalDataPool(LocalDataPool &localDataPoolMap, + ReturnValue_t initializeLocalDataPool(localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) override; private: diff --git a/mission/devices/MGMHandlerRM3100.cpp b/mission/devices/MGMHandlerRM3100.cpp index eebbac39..62db06a7 100644 --- a/mission/devices/MGMHandlerRM3100.cpp +++ b/mission/devices/MGMHandlerRM3100.cpp @@ -304,7 +304,7 @@ void MGMHandlerRM3100::modeChanged(void) { } ReturnValue_t MGMHandlerRM3100::initializeLocalDataPool( - LocalDataPool &localDataPoolMap, LocalDataPoolManager &poolManager) { + localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) { localDataPoolMap.emplace(RM3100::FIELD_STRENGTH_X, new PoolEntry({0.0})); localDataPoolMap.emplace(RM3100::FIELD_STRENGTH_Y, @@ -339,13 +339,13 @@ ReturnValue_t MGMHandlerRM3100::handleDataReadout(const uint8_t *packet) { } #endif - ReturnValue_t result = primaryDataset.read(20); + ReturnValue_t result = primaryDataset.read(); if(result == HasReturnvaluesIF::RETURN_OK) { primaryDataset.fieldStrengthX = fieldStrengthX; primaryDataset.fieldStrengthY = fieldStrengthY; primaryDataset.fieldStrengthZ = fieldStrengthZ; primaryDataset.setValidity(true, true); - result = primaryDataset.commit(20); + result = primaryDataset.commit(); } return result; } diff --git a/mission/devices/MGMHandlerRM3100.h b/mission/devices/MGMHandlerRM3100.h index d735ca45..4af6b627 100644 --- a/mission/devices/MGMHandlerRM3100.h +++ b/mission/devices/MGMHandlerRM3100.h @@ -55,7 +55,7 @@ protected: void fillCommandAndReplyMap() override; void modeChanged(void) override; uint32_t getTransitionDelayMs(Mode_t from, Mode_t to) override; - ReturnValue_t initializeLocalDataPool(LocalDataPool &localDataPoolMap, + ReturnValue_t initializeLocalDataPool(localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) override; private: diff --git a/tmtc b/tmtc index b1dc449c..7e64595d 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit b1dc449ccfd7de558a87ebc7aae77b1eaf32c934 +Subproject commit 7e64595d1a34732ed5d178cbbae634104634763f