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 @@
-
+
@@ -505,54 +505,342 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ 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