diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 00000000..17d29e7b
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,26 @@
+Change Log
+=======
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](http://keepachangelog.com/)
+and this project adheres to [Semantic Versioning](http://semver.org/).
+
+The [milestone](https://egit.irs.uni-stuttgart.de/eive/eive-obsw/milestones)
+list yields a list of all related PRs for each release.
+
+# [unreleased]
+
+# [v1.11.0]
+
+## Changed
+
+- Update rootfs base of Linux, all related OBSW changes
+- Use gpsd version 3.17 now. Includes API changes
+- Add `/usr/local/bin` to PATH. All shell scripts are there now
+- Rename GPS device to `/dev/gps0`
+
+# [v1.10.0]
+
+For all releases equal or prior to v1.10.0,
+see [milestones](https://egit.irs.uni-stuttgart.de/eive/eive-obsw/milestones)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 03d51ac2..585284ac 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -20,6 +20,9 @@ option(EIVE_ADD_JSON_LIB "Add JSON library" ON)
option(EIVE_SYSROOT_MAGIC "Perform sysroot magic which might not be necessary" OFF)
option(EIVE_CREATE_UNIQUE_OBSW_BIN "Append username to generated binary name" ON)
+set(OBSW_ADD_STAR_TRACKER 0)
+set(OBSW_DEBUG_STARTRACKER 0)
+
if(NOT FSFW_OSAL)
set(FSFW_OSAL linux CACHE STRING "OS for the FSFW.")
endif()
@@ -37,8 +40,12 @@ endif()
include(${CMAKE_SCRIPT_PATH}/PreProjectConfig.cmake)
pre_project_config()
+# Check whether the user has already installed Catch2 first. This has to come before
+# the project call. We could also exlcude doing this when the Q7S primary OBSW is built..
+find_package(Catch2 3 CONFIG QUIET)
+
# Project Name
-project(eive-obsw ASM C CXX)
+project(eive-obsw)
################################################################################
# Pre-Sources preparation
@@ -67,7 +74,7 @@ set(LIB_JSON_NAME nlohmann_json::nlohmann_json)
# Set path names
set(FSFW_PATH fsfw)
-set(TEST_PATH test/testtasks)
+set(TEST_PATH test)
set(UNITTEST_PATH unittest)
set(LINUX_PATH linux)
set(COMMON_PATH common)
@@ -93,7 +100,8 @@ pre_source_hw_os_config()
if(TGT_BSP)
if(TGT_BSP MATCHES "arm/q7s" OR TGT_BSP MATCHES "arm/raspberrypi"
- OR TGT_BSP MATCHES "arm/beagleboneblack" OR TGT_BSP MATCHES "arm/egse"
+ OR TGT_BSP MATCHES "arm/beagleboneblack" OR TGT_BSP MATCHES "arm/egse"
+ OR TGT_BSP MATCHES "arm/te0720-1cfa"
)
set(FSFW_CONFIG_PATH "linux/fsfwconfig")
if(NOT BUILD_Q7S_SIMPLE_MODE)
@@ -113,6 +121,8 @@ if(TGT_BSP)
# Used by configure file
set(EGSE ON)
set(FSFW_HAL_LINUX_ADD_LIBGPIOD OFF)
+ set(OBSW_ADD_STAR_TRACKER 1)
+ set(OBSW_DEBUG_STARTRACKER 1)
endif()
if(TGT_BSP MATCHES "arm/beagleboneblack")
@@ -124,6 +134,10 @@ if(TGT_BSP)
# Used by configure file
set(XIPHOS_Q7S ON)
endif()
+
+ if(TGT_BSP MATCHES "arm/te0720-1cfa")
+ set(TE0720_1CFA ON)
+ endif()
else()
# Required by FSFW library
set(FSFW_CONFIG_PATH "${BSP_PATH}/fsfwconfig")
@@ -150,9 +164,6 @@ set(FSFW_ADDITIONAL_INC_PATHS
${CMAKE_CURRENT_BINARY_DIR}
)
-# Check whether the user has already installed Catch2 first
-find_package(Catch2 3)
-
################################################################################
# Executable and Sources
################################################################################
@@ -199,8 +210,10 @@ elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
set(COMPILER_FLAGS "/permissive-")
endif()
+if (NOT(TGT_BSP MATCHES "arm/te0720-1cfa") AND NOT(TGT_BSP MATCHES "arm/q7s"))
# Not installed, so use FetchContent to download and provide Catch2
if(NOT Catch2_FOUND)
+ message(STATUS "Did not find a valid Catch2 installation. Using FetchContent to install it")
include(FetchContent)
FetchContent_Declare(
@@ -215,7 +228,7 @@ if(NOT Catch2_FOUND)
set_target_properties(Catch2 PROPERTIES EXCLUDE_FROM_ALL "true")
set_target_properties(Catch2WithMain PROPERTIES EXCLUDE_FROM_ALL "true")
endif()
-
+endif()
add_library(${LIB_EIVE_MISSION})
diff --git a/README.md b/README.md
index 0effabb8..4d897980 100644
--- a/README.md
+++ b/README.md
@@ -385,20 +385,7 @@ more recent disitributions anymore.
## Installing toolchain without Vivado
You can download the toolchains for Windows and Linux
-[from the EIVE cloud](https://eive-cloud.irs.uni-stuttgart.de/index.php/apps/files?dir=/EIVE_IRS/Software/tools&fileid=831898).
-
-If `wget` is available (e.g. MinGW64), you can use the following command to download the
-toolchain for Windows
-
-```sh
-wget https://eive-cloud.irs.uni-stuttgart.de/index.php/s/rfoaistRd67yBbH/download/gcc-arm-linux-gnueabi-win.zip
-```
-
-or the following command for Linux (could be useful for CI/CD)
-
-```sh
-wget https://eive-cloud.irs.uni-stuttgart.de/index.php/s/MRaeA2XnMXpZ5Pp/download/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz
-```
+[from the EIVE cloud](https://eive-cloud.irs.uni-stuttgart.de/index.php/apps/files/?dir=/EIVE_IRS/Software/tools).
## Installing CMake and MSYS2 on Windows
diff --git a/archive/gpio/gpioDefinitions.h b/archive/gpio/gpioDefinitions.h
index 0db4db11..46050d12 100644
--- a/archive/gpio/gpioDefinitions.h
+++ b/archive/gpio/gpioDefinitions.h
@@ -8,13 +8,13 @@ using gpioId_t = uint16_t;
namespace gpio {
-enum Levels { LOW = 0, HIGH = 1 };
+enum class Levels : uint8_t { LOW = 0, HIGH = 1 };
-enum Direction { IN = 0, OUT = 1 };
+enum class Direction : uint8_t { IN = 0, OUT = 1 };
-enum GpioOperation { READ, WRITE };
+enum class GpioOperation { READ, WRITE };
-enum GpioTypes { NONE, GPIOD_REGULAR, CALLBACK };
+enum class GpioTypes { NONE, GPIOD_REGULAR, CALLBACK };
static constexpr gpioId_t NO_GPIO = -1;
} // namespace gpio
diff --git a/automation/Dockerfile b/automation/Dockerfile
index 9042cf13..63592c77 100644
--- a/automation/Dockerfile
+++ b/automation/Dockerfile
@@ -16,5 +16,5 @@ RUN mkdir -p /usr/tools; \
curl https://buggy.irs.uni-stuttgart.de/eive/tools/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.gz \
| tar -xz -C /usr/tools
-ENV Q7S_SYSROOT="/usr/rootfs/cortexa9hf-neon-xiphos-linux-gnueabi"
-ENV PATH=$PATH:"/usr/tools/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin"
\ No newline at end of file
+ENV ZYNQ_7020_SYSROOT="/usr/rootfs/cortexa9hf-neon-xiphos-linux-gnueabi"
+ENV PATH=$PATH:"/usr/tools/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin"
diff --git a/automation/Jenkinsfile b/automation/Jenkinsfile
index fe79dc73..ee50924a 100644
--- a/automation/Jenkinsfile
+++ b/automation/Jenkinsfile
@@ -5,7 +5,7 @@ pipeline {
}
agent {
docker {
- image 'eive-obsw-ci:d2'
+ image 'eive-obsw-ci:d3'
args '--sysctl fs.mqueue.msg_max=100'
}
}
diff --git a/bsp_egse/ObjectFactory.cpp b/bsp_egse/ObjectFactory.cpp
index 10eea471..8d5e3416 100644
--- a/bsp_egse/ObjectFactory.cpp
+++ b/bsp_egse/ObjectFactory.cpp
@@ -3,7 +3,6 @@
#include
#include
#include
-#include
#include "OBSWConfig.h"
#include "busConf.h"
diff --git a/bsp_egse/main.cpp b/bsp_egse/main.cpp
index ce7966ff..75fb4f19 100644
--- a/bsp_egse/main.cpp
+++ b/bsp_egse/main.cpp
@@ -3,8 +3,8 @@
#include "InitMission.h"
#include "OBSWConfig.h"
#include "OBSWVersion.h"
-#include "fsfw/FSFWVersion.h"
#include "fsfw/tasks/TaskFactory.h"
+#include "fsfw/version.h"
/**
* @brief This is the main program entry point for the egse (raspberry pi 4)
diff --git a/bsp_hosted/fsfwconfig/devices/powerSwitcherList.h b/bsp_hosted/fsfwconfig/devices/powerSwitcherList.h
deleted file mode 100644
index ae259374..00000000
--- a/bsp_hosted/fsfwconfig/devices/powerSwitcherList.h
+++ /dev/null
@@ -1,57 +0,0 @@
-#ifndef FSFWCONFIG_DEVICES_POWERSWITCHERLIST_H_
-#define FSFWCONFIG_DEVICES_POWERSWITCHERLIST_H_
-
-#include
-
-namespace pcduSwitches {
-/* Switches are uint8_t datatype and go from 0 to 255 */
-enum SwitcherList {
- Q7S,
- PAYLOAD_PCDU_CH1,
- RW,
- TCS_BOARD_8V_HEATER_IN,
- SUS_REDUNDANT,
- DEPLOYMENT_MECHANISM,
- PAYLOAD_PCDU_CH6,
- ACS_BOARD_SIDE_B,
- PAYLOAD_CAMERA,
- TCS_BOARD_3V3,
- SYRLINKS,
- STAR_TRACKER,
- MGT,
- SUS_NOMINAL,
- SOLAR_CELL_EXP,
- PLOC,
- ACS_BOARD_SIDE_A,
- NUMBER_OF_SWITCHES
-};
-
-static const uint8_t ON = 1;
-static const uint8_t OFF = 0;
-
-/* Output states after reboot of the PDUs */
-static const uint8_t INIT_STATE_Q7S = ON;
-static const uint8_t INIT_STATE_PAYLOAD_PCDU_CH1 = OFF;
-static const uint8_t INIT_STATE_RW = OFF;
-#if BOARD_TE0720 == 1
-/* Because the TE0720 is not connected to the PCDU, this switch is always on */
-static const uint8_t INIT_STATE_TCS_BOARD_8V_HEATER_IN = ON;
-#else
-static const uint8_t INIT_STATE_TCS_BOARD_8V_HEATER_IN = OFF;
-#endif
-static const uint8_t INIT_STATE_SUS_REDUNDANT = OFF;
-static const uint8_t INIT_STATE_DEPLOYMENT_MECHANISM = OFF;
-static const uint8_t INIT_STATE_PAYLOAD_PCDU_CH6 = OFF;
-static const uint8_t INIT_STATE_ACS_BOARD_SIDE_B = OFF;
-static const uint8_t INIT_STATE_PAYLOAD_CAMERA = OFF;
-static const uint8_t INIT_STATE_TCS_BOARD_3V3 = OFF;
-static const uint8_t INIT_STATE_SYRLINKS = OFF;
-static const uint8_t INIT_STATE_STAR_TRACKER = OFF;
-static const uint8_t INIT_STATE_MGT = OFF;
-static const uint8_t INIT_STATE_SUS_NOMINAL = OFF;
-static const uint8_t INIT_STATE_SOLAR_CELL_EXP = OFF;
-static const uint8_t INIT_STATE_PLOC = OFF;
-static const uint8_t INIT_STATE_ACS_BOARD_SIDE_A = OFF;
-} // namespace pcduSwitches
-
-#endif /* FSFWCONFIG_DEVICES_POWERSWITCHERLIST_H_ */
diff --git a/bsp_linux_board/CMakeLists.txt b/bsp_linux_board/CMakeLists.txt
index 0272f476..9884b983 100644
--- a/bsp_linux_board/CMakeLists.txt
+++ b/bsp_linux_board/CMakeLists.txt
@@ -1,6 +1,7 @@
target_sources(${OBSW_NAME} PUBLIC
InitMission.cpp
main.cpp
+ gpioInit.cpp
ObjectFactory.cpp
)
diff --git a/bsp_linux_board/InitMission.cpp b/bsp_linux_board/InitMission.cpp
index 6dfe3af1..0fa7a4f6 100644
--- a/bsp_linux_board/InitMission.cpp
+++ b/bsp_linux_board/InitMission.cpp
@@ -192,7 +192,7 @@ void initmission::createPstTasks(TaskFactory& factory,
ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
#if OBSW_ADD_SPI_TEST_CODE == 0
FixedTimeslotTaskIF* spiPst = factory.createFixedTimeslotTask(
- "SPI_PST", 70, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 3.0, missedDeadlineFunc);
+ "SPI_PST", 70, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 1.0, missedDeadlineFunc);
result = pst::pstSpi(spiPst);
if (result != HasReturnvaluesIF::RETURN_OK) {
sif::error << "InitMission::initTasks: Creating PST failed!" << std::endl;
diff --git a/bsp_linux_board/ObjectFactory.cpp b/bsp_linux_board/ObjectFactory.cpp
index 18da8896..b1ae6005 100644
--- a/bsp_linux_board/ObjectFactory.cpp
+++ b/bsp_linux_board/ObjectFactory.cpp
@@ -5,10 +5,13 @@
#include "devices/addresses.h"
#include "devices/gpioIds.h"
#include "fsfw/datapoollocal/LocalDataPoolManager.h"
+#include "fsfw/power/DummyPowerSwitcher.h"
#include "fsfw/tasks/TaskFactory.h"
#include "fsfw/tmtcpacket/pus/tm.h"
#include "fsfw/tmtcservices/CommandingServiceBase.h"
#include "fsfw/tmtcservices/PusServiceBase.h"
+#include "gpioInit.h"
+#include "linux/ObjectFactory.h"
#include "linux/boardtest/LibgpiodTest.h"
#include "linux/boardtest/SpiTestClass.h"
#include "linux/boardtest/UartTestClass.h"
@@ -64,37 +67,55 @@ void ObjectFactory::produce(void* args) {
GpioCookie* gpioCookie = nullptr;
static_cast(gpioCookie);
- new SpiComIF(objects::SPI_COM_IF, gpioIF);
+ SpiComIF* spiComIF = new SpiComIF(objects::SPI_COM_IF, gpioIF);
+ static_cast(spiComIF);
+ auto pwrSwitcher = new DummyPowerSwitcher(objects::PCDU_HANDLER, 18, 0);
+ static_cast(pwrSwitcher);
- std::string spiDev;
- SpiCookie* spiCookie = nullptr;
- static_cast(spiCookie);
+#if OBSW_ADD_ACS_BOARD == 1 && defined(RASPBERRY_PI)
+ createRpiAcsBoard(gpioIF, spiDev);
+#endif
-#if OBSW_ADD_ACS_BOARD == 1
- if (gpioCookie == nullptr) {
- gpioCookie = new GpioCookie();
- }
+#if OBSW_ADD_SUN_SENSORS == 1 || defined(OBSW_ADD_RTD_DEVICES)
+#ifdef RASPBERRY_PI
+ rpi::gpio::initSpiCsDecoder(gpioIF);
+#endif
+#endif
+
+#if OBSW_ADD_SUN_SENSORS == 1
+ createSunSensorComponents(gpioIF, spiComIF, pwrSwitcher, spi::DEV);
+#endif
+
+#if OBSW_ADD_RTD_DEVICES == 1
+ createRtdComponents(spi::DEV, gpioIF, pwrSwitcher);
+#endif
+
+#if OBSW_ADD_TEST_CODE == 1
+ createTestTasks();
+#endif /* OBSW_ADD_TEST_CODE == 1 */
+}
+
+void ObjectFactory::createRpiAcsBoard(GpioIF* gpioIF, std::string spiDev) {
+ GpioCookie* gpioCookie = new GpioCookie();
// TODO: Missing pin for Gyro 2
gpio::createRpiGpioConfig(gpioCookie, gpioIds::MGM_0_LIS3_CS, gpio::MGM_0_BCM_PIN, "MGM_0_LIS3",
- gpio::Direction::OUT, 1);
+ gpio::Direction::OUT, gpio::Levels::HIGH);
gpio::createRpiGpioConfig(gpioCookie, gpioIds::MGM_1_RM3100_CS, gpio::MGM_1_BCM_PIN,
- "MGM_1_RM3100", gpio::Direction::OUT, 1);
+ "MGM_1_RM3100", gpio::Direction::OUT, gpio::Levels::HIGH);
gpio::createRpiGpioConfig(gpioCookie, gpioIds::MGM_2_LIS3_CS, gpio::MGM_2_BCM_PIN, "MGM_2_LIS3",
- gpio::Direction::OUT, 1);
+ gpio::Direction::OUT, gpio::Levels::HIGH);
gpio::createRpiGpioConfig(gpioCookie, gpioIds::MGM_3_RM3100_CS, gpio::MGM_3_BCM_PIN,
- "MGM_3_RM3100", gpio::Direction::OUT, 1);
+ "MGM_3_RM3100", gpio::Direction::OUT, gpio::Levels::HIGH);
gpio::createRpiGpioConfig(gpioCookie, gpioIds::GYRO_0_ADIS_CS, gpio::GYRO_0_BCM_PIN,
- "GYRO_0_ADIS", gpio::Direction::OUT, 1);
+ "GYRO_0_ADIS", gpio::Direction::OUT, gpio::Levels::HIGH);
gpio::createRpiGpioConfig(gpioCookie, gpioIds::GYRO_1_L3G_CS, gpio::GYRO_1_BCM_PIN, "GYRO_1_L3G",
- gpio::Direction::OUT, 1);
+ gpio::Direction::OUT, gpio::Levels::HIGH);
gpio::createRpiGpioConfig(gpioCookie, gpioIds::GYRO_2_ADIS_CS, gpio::GYRO_2_BCM_PIN,
- "GYRO_2_ADIS", gpio::Direction::OUT, 1);
+ "GYRO_2_ADIS", gpio::Direction::OUT, gpio::Levels::HIGH);
gpio::createRpiGpioConfig(gpioCookie, gpioIds::GYRO_3_L3G_CS, gpio::GYRO_3_BCM_PIN, "GYRO_3_L3G",
- gpio::Direction::OUT, 1);
+ gpio::Direction::OUT, gpio::Levels::HIGH);
gpioIF->addGpios(gpioCookie);
-
- spiDev = "/dev/spidev0.1";
- spiCookie =
+ SpiCookie* spiCookie =
new SpiCookie(addresses::MGM_0_LIS3, gpioIds::MGM_0_LIS3_CS, spiDev,
MGMLIS3MDL::MAX_BUFFER_SIZE, spi::DEFAULT_LIS3_MODE, spi::DEFAULT_LIS3_SPEED);
auto mgmLis3Handler =
@@ -136,9 +157,9 @@ void ObjectFactory::produce(void* args) {
spiCookie =
new SpiCookie(addresses::GYRO_0_ADIS, gpioIds::GYRO_0_ADIS_CS, spiDev,
- ADIS16507::MAXIMUM_REPLY_SIZE, spi::DEFAULT_L3G_MODE, spi::DEFAULT_L3G_SPEED);
- auto adisHandler =
- new GyroADIS16507Handler(objects::GYRO_0_ADIS_HANDLER, objects::SPI_COM_IF, spiCookie);
+ ADIS1650X::MAXIMUM_REPLY_SIZE, spi::DEFAULT_L3G_MODE, spi::DEFAULT_L3G_SPEED);
+ auto adisHandler = new GyroADIS1650XHandler(objects::GYRO_0_ADIS_HANDLER, objects::SPI_COM_IF,
+ spiCookie, ADIS1650X::Type::ADIS16505);
adisHandler->setStartUpImmediately();
spiCookie =
new SpiCookie(addresses::GYRO_1_L3G, gpioIds::GYRO_1_L3G_CS, spiDev, L3GD20H::MAX_BUFFER_SIZE,
@@ -152,9 +173,9 @@ void ObjectFactory::produce(void* args) {
spiCookie =
new SpiCookie(addresses::GYRO_2_ADIS, gpioIds::GYRO_2_ADIS_CS, spiDev,
- ADIS16507::MAXIMUM_REPLY_SIZE, spi::DEFAULT_L3G_MODE, spi::DEFAULT_L3G_SPEED);
- adisHandler =
- new GyroADIS16507Handler(objects::GYRO_2_ADIS_HANDLER, objects::SPI_COM_IF, spiCookie);
+ ADIS1650X::MAXIMUM_REPLY_SIZE, spi::DEFAULT_L3G_MODE, spi::DEFAULT_L3G_SPEED);
+ adisHandler = new GyroADIS1650XHandler(objects::GYRO_2_ADIS_HANDLER, objects::SPI_COM_IF,
+ spiCookie, ADIS1650X::Type::ADIS16505);
adisHandler->setStartUpImmediately();
spiCookie =
@@ -166,12 +187,6 @@ void ObjectFactory::produce(void* args) {
#if FSFW_HAL_L3GD20_GYRO_DEBUG == 1
gyroL3gHandler->setToGoToNormalMode(true);
#endif
-
-#endif /* RPI_TEST_ACS_BOARD == 1 */
-
-#if OBSW_ADD_TEST_CODE == 1
- createTestTasks();
-#endif /* OBSW_ADD_TEST_CODE == 1 */
}
void ObjectFactory::createTestTasks() {
diff --git a/bsp_linux_board/ObjectFactory.h b/bsp_linux_board/ObjectFactory.h
index 909baf06..7365fb8f 100644
--- a/bsp_linux_board/ObjectFactory.h
+++ b/bsp_linux_board/ObjectFactory.h
@@ -1,10 +1,15 @@
#ifndef BSP_LINUX_OBJECTFACTORY_H_
#define BSP_LINUX_OBJECTFACTORY_H_
+#include
+
+class GpioIF;
+
namespace ObjectFactory {
void setStatics();
void produce(void* args);
+void createRpiAcsBoard(GpioIF* gpioIF, std::string spiDev);
void createTestTasks();
}; // namespace ObjectFactory
diff --git a/bsp_linux_board/boardconfig/rpiConfig.h.in b/bsp_linux_board/boardconfig/rpiConfig.h.in
index 7341fcca..b58a1037 100644
--- a/bsp_linux_board/boardconfig/rpiConfig.h.in
+++ b/bsp_linux_board/boardconfig/rpiConfig.h.in
@@ -17,16 +17,4 @@
#define RPI_ADD_UART_TEST 0
-/* Adapt these values accordingly */
-namespace gpio {
-static constexpr uint8_t MGM_0_BCM_PIN = 17;
-static constexpr uint8_t MGM_1_BCM_PIN = 27;
-static constexpr uint8_t MGM_2_BCM_PIN = 22;
-static constexpr uint8_t MGM_3_BCM_PIN = 23;
-static constexpr uint8_t GYRO_0_BCM_PIN = 5;
-static constexpr uint8_t GYRO_1_BCM_PIN = 6;
-static constexpr uint8_t GYRO_2_BCM_PIN = 13;
-static constexpr uint8_t GYRO_3_BCM_PIN = 19;
-}
-
#endif /* BSP_RPI_BOARDCONFIG_RPI_CONFIG_H_ */
diff --git a/bsp_linux_board/definitions.h b/bsp_linux_board/definitions.h
new file mode 100644
index 00000000..1b6814f4
--- /dev/null
+++ b/bsp_linux_board/definitions.h
@@ -0,0 +1,37 @@
+#ifndef BSP_LINUX_BOARD_DEFINITIONS_H_
+#define BSP_LINUX_BOARD_DEFINITIONS_H_
+
+#include
+
+#include "OBSWConfig.h"
+
+#ifdef RASPBERRY_PI
+
+namespace spi {
+
+static constexpr char DEV[] = "/dev/spidev0.1";
+
+}
+
+/* Adapt these values accordingly */
+namespace gpio {
+static constexpr uint8_t MGM_0_BCM_PIN = 17;
+static constexpr uint8_t MGM_1_BCM_PIN = 27;
+static constexpr uint8_t MGM_2_BCM_PIN = 22;
+static constexpr uint8_t MGM_3_BCM_PIN = 23;
+static constexpr uint8_t GYRO_0_BCM_PIN = 5;
+static constexpr uint8_t GYRO_1_BCM_PIN = 6;
+static constexpr uint8_t GYRO_2_BCM_PIN = 13;
+static constexpr uint8_t GYRO_3_BCM_PIN = 19;
+
+static constexpr uint8_t SPI_MUX_0_BCM = 17;
+static constexpr uint8_t SPI_MUX_1_BCM = 27;
+static constexpr uint8_t SPI_MUX_2_BCM = 22;
+static constexpr uint8_t SPI_MUX_3_BCM = 23;
+static constexpr uint8_t SPI_MUX_4_BCM = 5;
+static constexpr uint8_t SPI_MUX_5_BCM = 6;
+} // namespace gpio
+
+#endif
+
+#endif /* BSP_LINUX_BOARD_DEFINITIONS_H_ */
diff --git a/bsp_linux_board/gpioInit.cpp b/bsp_linux_board/gpioInit.cpp
new file mode 100644
index 00000000..f913db8a
--- /dev/null
+++ b/bsp_linux_board/gpioInit.cpp
@@ -0,0 +1,56 @@
+#include "gpioInit.h"
+
+#include
+#include
+#include
+#include
+
+#include "definitions.h"
+#include "fsfw_hal/linux/rpi/GpioRPi.h"
+
+#ifdef RASPBERRY_PI
+
+struct MuxInfo {
+ MuxInfo(gpioId_t gpioId, int bcmNum, std::string consumer)
+ : gpioId(gpioId), bcmNum(bcmNum), consumer(consumer) {}
+ gpioId_t gpioId;
+ int bcmNum;
+ std::string consumer;
+};
+
+void rpi::gpio::initSpiCsDecoder(GpioIF* gpioComIF) {
+ using namespace ::gpio;
+ ReturnValue_t result;
+
+ if (gpioComIF == nullptr) {
+ sif::debug << "initSpiCsDecoder: Invalid gpioComIF" << std::endl;
+ return;
+ }
+
+ std::array<::MuxInfo, 6> muxInfo{
+ MuxInfo(gpioIds::SPI_MUX_BIT_0, SPI_MUX_0_BCM, "SPI_MUX_0"),
+ MuxInfo(gpioIds::SPI_MUX_BIT_1, SPI_MUX_1_BCM, "SPI_MUX_1"),
+ MuxInfo(gpioIds::SPI_MUX_BIT_2, SPI_MUX_2_BCM, "SPI_MUX_2"),
+ MuxInfo(gpioIds::SPI_MUX_BIT_3, SPI_MUX_3_BCM, "SPI_MUX_3"),
+ MuxInfo(gpioIds::SPI_MUX_BIT_4, SPI_MUX_4_BCM, "SPI_MUX_4"),
+ MuxInfo(gpioIds::SPI_MUX_BIT_5, SPI_MUX_5_BCM, "SPI_MUX_5"),
+ };
+ GpioCookie* spiMuxGpios = new GpioCookie;
+
+ for (const auto& info : muxInfo) {
+ result = createRpiGpioConfig(spiMuxGpios, info.gpioId, info.bcmNum, info.consumer,
+ Direction::OUT, Levels::LOW);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ sif::error << "Creating Raspberry Pi SPI Mux GPIO failed with code " << result << std::endl;
+ return;
+ }
+ }
+
+ result = gpioComIF->addGpios(spiMuxGpios);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ sif::error << "initSpiCsDecoder: Failed to add mux bit gpios to gpioComIF" << std::endl;
+ return;
+ }
+}
+
+#endif
diff --git a/bsp_linux_board/gpioInit.h b/bsp_linux_board/gpioInit.h
new file mode 100644
index 00000000..0ca66412
--- /dev/null
+++ b/bsp_linux_board/gpioInit.h
@@ -0,0 +1,20 @@
+#pragma once
+
+#include "OBSWConfig.h"
+
+class GpioIF;
+
+#ifdef RASPBERRY_PI
+namespace rpi {
+namespace gpio {
+
+/**
+ * @brief This function initializes the GPIOs used to control the SN74LVC138APWR decoders on
+ * the TCS Board and the interface board.
+ */
+void initSpiCsDecoder(GpioIF* gpioComIF);
+
+} // namespace gpio
+} // namespace rpi
+
+#endif
diff --git a/bsp_linux_board/main.cpp b/bsp_linux_board/main.cpp
index 4e286f5d..98c4d79b 100644
--- a/bsp_linux_board/main.cpp
+++ b/bsp_linux_board/main.cpp
@@ -3,8 +3,8 @@
#include "InitMission.h"
#include "OBSWConfig.h"
#include "OBSWVersion.h"
-#include "fsfw/FSFWVersion.h"
#include "fsfw/tasks/TaskFactory.h"
+#include "fsfw/version.h"
#ifdef RASPBERRY_PI
static const char* const BOARD_NAME = "Raspberry Pi";
@@ -22,8 +22,7 @@ int main(void) {
std::cout << "-- EIVE OBSW --" << std::endl;
std::cout << "-- Compiled for Linux board " << BOARD_NAME << " --" << std::endl;
std::cout << "-- OBSW " << SW_NAME << " v" << SW_VERSION << "." << SW_SUBVERSION << "."
- << SW_REVISION << ", FSFW v" << FSFW_VERSION << "." << FSFW_SUBVERSION << FSFW_REVISION
- << "--" << std::endl;
+ << SW_REVISION << ", FSFW v" << fsfw::FSFW_VERSION << " --" << std::endl;
std::cout << "-- " << __DATE__ << " " << __TIME__ << " --" << std::endl;
initmission::initMission();
diff --git a/bsp_q7s/CMakeLists.txt b/bsp_q7s/CMakeLists.txt
index 17e4ba2d..459ead8a 100644
--- a/bsp_q7s/CMakeLists.txt
+++ b/bsp_q7s/CMakeLists.txt
@@ -22,4 +22,4 @@ add_subdirectory(comIF)
add_subdirectory(core)
add_subdirectory(memory)
add_subdirectory(callbacks)
-add_subdirectory(devices)
+add_subdirectory(xadc)
diff --git a/bsp_q7s/boardconfig/busConf.h b/bsp_q7s/boardconfig/busConf.h
index eba4fb36..bc6efd7a 100644
--- a/bsp_q7s/boardconfig/busConf.h
+++ b/bsp_q7s/boardconfig/busConf.h
@@ -84,6 +84,7 @@ static constexpr char RS485_EN_TX_DATA[] = "tx_data_enable_ltc2872";
static constexpr char RS485_EN_RX_CLOCK[] = "rx_clock_enable_ltc2872";
static constexpr char RS485_EN_RX_DATA[] = "rx_data_enable_ltc2872";
static constexpr char PDEC_RESET[] = "pdec_reset";
+static constexpr char SYRLINKS_FAULT[] = "syrlinks_fault";
static constexpr char PL_PCDU_ENABLE_VBAT0[] = "enable_plpcdu_vbat0";
static constexpr char PL_PCDU_ENABLE_VBAT1[] = "enable_plpcdu_vbat1";
@@ -94,6 +95,9 @@ static constexpr char PL_PCDU_ENABLE_HPA[] = "enable_plpcdu_hpa";
static constexpr char PL_PCDU_ENABLE_MPA[] = "enable_plpcdu_mpa";
static constexpr char PL_PCDU_ADC_CS[] = "plpcdu_adc_chip_select";
+static constexpr char ENABLE_SUPV_UART[] = "enable_supv_uart";
+static constexpr char ENABLE_MPSOC_UART[] = "enable_mpsoc_uart";
+
} // namespace gpioNames
} // namespace q7s
diff --git a/bsp_q7s/boardtest/Q7STestTask.cpp b/bsp_q7s/boardtest/Q7STestTask.cpp
index 1f14d0e1..8b96450f 100644
--- a/bsp_q7s/boardtest/Q7STestTask.cpp
+++ b/bsp_q7s/boardtest/Q7STestTask.cpp
@@ -2,6 +2,7 @@
#include
#include
+#include
#include
#include
#include
@@ -23,6 +24,7 @@ Q7STestTask::Q7STestTask(object_id_t objectId) : TestTask(objectId) {
doTestSdCard = false;
doTestScratchApi = false;
doTestGps = false;
+ doTestXadc = true;
}
ReturnValue_t Q7STestTask::performOneShotAction() {
@@ -44,6 +46,9 @@ ReturnValue_t Q7STestTask::performPeriodicAction() {
if (doTestGps) {
testGpsDaemon();
}
+ if (doTestXadc) {
+ xadcTest();
+ }
return TestTask::performPeriodicAction();
}
@@ -395,3 +400,53 @@ void Q7STestTask::testFileSystemHandlerDirect(FsOpCodes opCode) {
}
}
}
+
+void Q7STestTask::xadcTest() {
+ ReturnValue_t result = RETURN_OK;
+ float temperature = 0;
+ float vccPint = 0;
+ float vccPaux = 0;
+ float vccInt = 0;
+ float vccAux = 0;
+ float vccBram = 0;
+ float vccOddr = 0;
+ float vrefp = 0;
+ float vrefn = 0;
+ Xadc xadc;
+ result = xadc.getTemperature(temperature);
+ if (result == HasReturnvaluesIF::RETURN_OK) {
+ sif::info << "Q7STestTask::xadcTest: Chip Temperature: " << temperature << " °C" << std::endl;
+ }
+ result = xadc.getVccPint(vccPint);
+ if (result == HasReturnvaluesIF::RETURN_OK) {
+ sif::info << "Q7STestTask::xadcTest: VCC PS internal: " << vccPint << " mV" << std::endl;
+ }
+ result = xadc.getVccPaux(vccPaux);
+ if (result == HasReturnvaluesIF::RETURN_OK) {
+ sif::info << "Q7STestTask::xadcTest: VCC PS auxilliary: " << vccPaux << " mV" << std::endl;
+ }
+ result = xadc.getVccInt(vccInt);
+ if (result == HasReturnvaluesIF::RETURN_OK) {
+ sif::info << "Q7STestTask::xadcTest: VCC PL internal: " << vccInt << " mV" << std::endl;
+ }
+ result = xadc.getVccAux(vccAux);
+ if (result == HasReturnvaluesIF::RETURN_OK) {
+ sif::info << "Q7STestTask::xadcTest: VCC PL auxilliary: " << vccAux << " mV" << std::endl;
+ }
+ result = xadc.getVccBram(vccBram);
+ if (result == HasReturnvaluesIF::RETURN_OK) {
+ sif::info << "Q7STestTask::xadcTest: VCC BRAM: " << vccBram << " mV" << std::endl;
+ }
+ result = xadc.getVccOddr(vccOddr);
+ if (result == HasReturnvaluesIF::RETURN_OK) {
+ sif::info << "Q7STestTask::xadcTest: VCC PS I/O DDR : " << vccOddr << " mV" << std::endl;
+ }
+ result = xadc.getVrefp(vrefp);
+ if (result == HasReturnvaluesIF::RETURN_OK) {
+ sif::info << "Q7STestTask::xadcTest: Vrefp : " << vrefp << " mV" << std::endl;
+ }
+ result = xadc.getVrefn(vrefn);
+ if (result == HasReturnvaluesIF::RETURN_OK) {
+ sif::info << "Q7STestTask::xadcTest: Vrefn : " << vrefn << " mV" << std::endl;
+ }
+}
diff --git a/bsp_q7s/boardtest/Q7STestTask.h b/bsp_q7s/boardtest/Q7STestTask.h
index b7aa791e..ebef1fad 100644
--- a/bsp_q7s/boardtest/Q7STestTask.h
+++ b/bsp_q7s/boardtest/Q7STestTask.h
@@ -15,6 +15,7 @@ class Q7STestTask : public TestTask {
bool doTestSdCard = false;
bool doTestScratchApi = false;
bool doTestGps = false;
+ bool doTestXadc = false;
CoreController* coreController = nullptr;
ReturnValue_t performOneShotAction() override;
@@ -24,6 +25,7 @@ class Q7STestTask : public TestTask {
void testSdCard();
void fileTests();
+ void xadcTest();
void testScratchApi();
void testJsonLibDirect();
diff --git a/bsp_q7s/callbacks/CMakeLists.txt b/bsp_q7s/callbacks/CMakeLists.txt
index a4462937..584e6026 100644
--- a/bsp_q7s/callbacks/CMakeLists.txt
+++ b/bsp_q7s/callbacks/CMakeLists.txt
@@ -2,5 +2,5 @@ target_sources(${OBSW_NAME} PRIVATE
rwSpiCallback.cpp
gnssCallback.cpp
pcduSwitchCb.cpp
- gpioCallbacks.cpp
+ q7sGpioCallbacks.cpp
)
diff --git a/bsp_q7s/callbacks/gpioCallbacks.cpp b/bsp_q7s/callbacks/gpioCallbacks.cpp
deleted file mode 100644
index e5fd877a..00000000
--- a/bsp_q7s/callbacks/gpioCallbacks.cpp
+++ /dev/null
@@ -1,487 +0,0 @@
-#include "gpioCallbacks.h"
-
-#include
-#include
-#include
-#include
-
-#include "busConf.h"
-
-namespace gpioCallbacks {
-
-GpioIF* gpioComInterface;
-
-void initSpiCsDecoder(GpioIF* gpioComIF) {
- using namespace gpio;
- ReturnValue_t result;
-
- if (gpioComIF == nullptr) {
- sif::debug << "initSpiCsDecoder: Invalid gpioComIF" << std::endl;
- return;
- }
-
- gpioComInterface = gpioComIF;
-
- GpioCookie* spiMuxGpios = new GpioCookie;
-
- GpiodRegularByLineName* spiMuxBit = nullptr;
- /** Setting mux bit 1 to low will disable IC21 on the interface board */
- spiMuxBit = new GpiodRegularByLineName(q7s::gpioNames::SPI_MUX_BIT_0_PIN, "SPI Mux Bit 1",
- Direction::OUT, Levels::HIGH);
- spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_0, spiMuxBit);
- /** Setting mux bit 2 to low disables IC1 on the TCS board */
- spiMuxBit = new GpiodRegularByLineName(q7s::gpioNames::SPI_MUX_BIT_1_PIN, "SPI Mux Bit 2",
- Direction::OUT, Levels::HIGH);
- spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_1, spiMuxBit);
- /** Setting mux bit 3 to low disables IC2 on the TCS board and IC22 on the interface board */
- spiMuxBit = new GpiodRegularByLineName(q7s::gpioNames::SPI_MUX_BIT_2_PIN, "SPI Mux Bit 3",
- Direction::OUT, Levels::LOW);
- spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_2, spiMuxBit);
-
- /** The following gpios can take arbitrary initial values */
- spiMuxBit = new GpiodRegularByLineName(q7s::gpioNames::SPI_MUX_BIT_3_PIN, "SPI Mux Bit 4",
- Direction::OUT, Levels::LOW);
- spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_3, spiMuxBit);
- spiMuxBit = new GpiodRegularByLineName(q7s::gpioNames::SPI_MUX_BIT_4_PIN, "SPI Mux Bit 5",
- Direction::OUT, Levels::LOW);
- spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_4, spiMuxBit);
- spiMuxBit = new GpiodRegularByLineName(q7s::gpioNames::SPI_MUX_BIT_5_PIN, "SPI Mux Bit 6",
- Direction::OUT, Levels::LOW);
- spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_5, spiMuxBit);
- GpiodRegularByLineName* enRwDecoder = new GpiodRegularByLineName(
- q7s::gpioNames::EN_RW_CS, "EN_RW_CS", Direction::OUT, Levels::HIGH);
- spiMuxGpios->addGpio(gpioIds::EN_RW_CS, enRwDecoder);
-
- result = gpioComInterface->addGpios(spiMuxGpios);
- if (result != HasReturnvaluesIF::RETURN_OK) {
- sif::error << "initSpiCsDecoder: Failed to add mux bit gpios to gpioComIF" << std::endl;
- return;
- }
-}
-
-void spiCsDecoderCallback(gpioId_t gpioId, gpio::GpioOperation gpioOp, gpio::Levels value,
- void* args) {
- using namespace gpio;
- if (gpioComInterface == nullptr) {
- sif::debug << "spiCsDecoderCallback: No gpioComIF specified. Call initSpiCsDecoder "
- << "to specify gpioComIF" << std::endl;
- return;
- }
-
- /* Reading is not supported by the callback function */
- if (gpioOp == gpio::GpioOperation::READ) {
- return;
- }
-
- if (value == Levels::HIGH) {
- switch (gpioId) {
- case (gpioIds::RTD_IC_3): {
- disableDecoderTcsIc1();
- break;
- }
- case (gpioIds::RTD_IC_4): {
- disableDecoderTcsIc1();
- break;
- }
- case (gpioIds::RTD_IC_5): {
- disableDecoderTcsIc1();
- break;
- }
- case (gpioIds::RTD_IC_6): {
- disableDecoderTcsIc1();
- break;
- }
- case (gpioIds::RTD_IC_7): {
- disableDecoderTcsIc1();
- break;
- }
- case (gpioIds::RTD_IC_8): {
- disableDecoderTcsIc1();
- break;
- }
- case (gpioIds::RTD_IC_9): {
- disableDecoderTcsIc1();
- break;
- }
- case (gpioIds::RTD_IC_10): {
- disableDecoderTcsIc1();
- break;
- }
- case (gpioIds::RTD_IC_11): {
- disableDecoderTcsIc2();
- break;
- }
- case (gpioIds::RTD_IC_12): {
- disableDecoderTcsIc2();
- break;
- }
- case (gpioIds::RTD_IC_13): {
- disableDecoderTcsIc2();
- break;
- }
- case (gpioIds::RTD_IC_14): {
- disableDecoderTcsIc2();
- break;
- }
- case (gpioIds::RTD_IC_15): {
- disableDecoderTcsIc2();
- break;
- }
- case (gpioIds::RTD_IC_16): {
- disableDecoderTcsIc2();
- break;
- }
- case (gpioIds::RTD_IC_17): {
- disableDecoderTcsIc2();
- break;
- }
- case (gpioIds::RTD_IC_18): {
- disableDecoderTcsIc2();
- break;
- }
- case (gpioIds::CS_SUS_0): {
- disableDecoderInterfaceBoardIc1();
- break;
- }
- case (gpioIds::CS_SUS_1): {
- disableDecoderInterfaceBoardIc1();
- break;
- }
- case (gpioIds::CS_SUS_2): {
- disableDecoderInterfaceBoardIc1();
- break;
- }
- case (gpioIds::CS_SUS_3): {
- disableDecoderInterfaceBoardIc1();
- break;
- }
- case (gpioIds::CS_SUS_4): {
- disableDecoderInterfaceBoardIc1();
- break;
- }
- case (gpioIds::CS_SUS_5): {
- disableDecoderInterfaceBoardIc1();
- break;
- }
- case (gpioIds::CS_SUS_6): {
- disableDecoderInterfaceBoardIc2();
- break;
- }
- case (gpioIds::CS_SUS_7): {
- disableDecoderInterfaceBoardIc2();
- break;
- }
- case (gpioIds::CS_SUS_8): {
- disableDecoderInterfaceBoardIc2();
- break;
- }
- case (gpioIds::CS_SUS_9): {
- disableDecoderInterfaceBoardIc2();
- break;
- }
- case (gpioIds::CS_SUS_10): {
- disableDecoderInterfaceBoardIc2();
- break;
- }
- case (gpioIds::CS_SUS_11): {
- disableDecoderInterfaceBoardIc2();
- break;
- }
- case (gpioIds::CS_RW1): {
- disableRwDecoder();
- break;
- }
- case (gpioIds::CS_RW2): {
- disableRwDecoder();
- break;
- }
- case (gpioIds::CS_RW3): {
- disableRwDecoder();
- break;
- }
- case (gpioIds::CS_RW4): {
- disableRwDecoder();
- break;
- }
- default:
- sif::debug << "spiCsDecoderCallback: Invalid gpio id " << gpioId << std::endl;
- }
- } else if (value == Levels::LOW) {
- switch (gpioId) {
- case (gpioIds::RTD_IC_3): {
- selectY7();
- enableDecoderTcsIc1();
- break;
- }
- case (gpioIds::RTD_IC_4): {
- selectY6();
- enableDecoderTcsIc1();
- break;
- }
- case (gpioIds::RTD_IC_5): {
- selectY5();
- enableDecoderTcsIc1();
- break;
- }
- case (gpioIds::RTD_IC_6): {
- selectY4();
- enableDecoderTcsIc1();
- break;
- }
- case (gpioIds::RTD_IC_7): {
- selectY3();
- enableDecoderTcsIc1();
- break;
- }
- case (gpioIds::RTD_IC_8): {
- selectY2();
- enableDecoderTcsIc1();
- break;
- }
- case (gpioIds::RTD_IC_9): {
- selectY1();
- enableDecoderTcsIc1();
- break;
- }
- case (gpioIds::RTD_IC_10): {
- selectY0();
- enableDecoderTcsIc1();
- break;
- }
- case (gpioIds::RTD_IC_11): {
- selectY7();
- enableDecoderTcsIc2();
- break;
- }
- case (gpioIds::RTD_IC_12): {
- selectY6();
- enableDecoderTcsIc2();
- break;
- }
- case (gpioIds::RTD_IC_13): {
- selectY5();
- enableDecoderTcsIc2();
- break;
- }
- case (gpioIds::RTD_IC_14): {
- selectY4();
- enableDecoderTcsIc2();
- break;
- }
- case (gpioIds::RTD_IC_15): {
- selectY3();
- enableDecoderTcsIc2();
- break;
- }
- case (gpioIds::RTD_IC_16): {
- selectY2();
- enableDecoderTcsIc2();
- break;
- }
- case (gpioIds::RTD_IC_17): {
- selectY1();
- enableDecoderTcsIc2();
- break;
- }
- case (gpioIds::RTD_IC_18): {
- selectY0();
- enableDecoderTcsIc2();
- break;
- }
- case (gpioIds::CS_SUS_0): {
- selectY0();
- enableDecoderInterfaceBoardIc1();
- break;
- }
- case (gpioIds::CS_SUS_1): {
- selectY1();
- enableDecoderInterfaceBoardIc1();
- break;
- }
- case (gpioIds::CS_SUS_2): {
- selectY2();
- enableDecoderInterfaceBoardIc1();
- break;
- }
- case (gpioIds::CS_SUS_3): {
- selectY3();
- enableDecoderInterfaceBoardIc1();
- break;
- }
- case (gpioIds::CS_SUS_4): {
- selectY4();
- enableDecoderInterfaceBoardIc1();
- break;
- }
- case (gpioIds::CS_SUS_5): {
- selectY5();
- enableDecoderInterfaceBoardIc1();
- break;
- }
- case (gpioIds::CS_SUS_6): {
- selectY0();
- enableDecoderInterfaceBoardIc2();
- break;
- }
- case (gpioIds::CS_SUS_7): {
- selectY1();
- enableDecoderInterfaceBoardIc2();
- break;
- }
- case (gpioIds::CS_SUS_8): {
- selectY2();
- enableDecoderInterfaceBoardIc2();
- break;
- }
- case (gpioIds::CS_SUS_9): {
- selectY3();
- enableDecoderInterfaceBoardIc2();
- break;
- }
- case (gpioIds::CS_SUS_10): {
- selectY4();
- enableDecoderInterfaceBoardIc2();
- break;
- }
- case (gpioIds::CS_SUS_11): {
- selectY5();
- enableDecoderInterfaceBoardIc2();
- break;
- }
- case (gpioIds::CS_RW1): {
- selectY0();
- enableRwDecoder();
- break;
- }
- case (gpioIds::CS_RW2): {
- selectY1();
- enableRwDecoder();
- break;
- }
- case (gpioIds::CS_RW3): {
- selectY2();
- enableRwDecoder();
- break;
- }
- case (gpioIds::CS_RW4): {
- selectY3();
- enableRwDecoder();
- break;
- }
- default:
- sif::debug << "spiCsDecoderCallback: Invalid gpio id " << gpioId << std::endl;
- }
- } else {
- sif::debug << "spiCsDecoderCallback: Invalid value. Must be 0 or 1" << std::endl;
- }
-}
-
-void enableDecoderTcsIc1() {
- gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_0);
- gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_1);
- gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_2);
-}
-
-void enableDecoderTcsIc2() {
- gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_2);
- gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_0);
- gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_1);
-}
-
-void enableDecoderInterfaceBoardIc1() {
- gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_0);
- gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_1);
- gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_2);
-}
-
-void enableDecoderInterfaceBoardIc2() {
- gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_0);
- gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_1);
- gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_2);
-}
-
-void disableDecoderTcsIc1() {
- gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_0);
- gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_1);
- gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_2);
-}
-
-void disableDecoderTcsIc2() {
- // DO NOT CHANGE THE ORDER HERE
- gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_0);
- gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_2);
- gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_1);
-}
-
-void disableDecoderInterfaceBoardIc1() {
- gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_0);
- gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_1);
- gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_2);
-}
-
-void disableDecoderInterfaceBoardIc2() {
- gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_0);
- gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_1);
- gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_2);
-}
-
-void enableRwDecoder() { gpioComInterface->pullHigh(gpioIds::EN_RW_CS); }
-
-void disableRwDecoder() { gpioComInterface->pullLow(gpioIds::EN_RW_CS); }
-
-void selectY0() {
- gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_3);
- gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_4);
- gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_5);
-}
-
-void selectY1() {
- gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_3);
- gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_4);
- gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_5);
-}
-
-void selectY2() {
- gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_3);
- gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_4);
- gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_5);
-}
-
-void selectY3() {
- gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_3);
- gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_4);
- gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_5);
-}
-
-void selectY4() {
- gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_3);
- gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_4);
- gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_5);
-}
-
-void selectY5() {
- gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_3);
- gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_4);
- gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_5);
-}
-
-void selectY6() {
- gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_3);
- gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_4);
- gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_5);
-}
-
-void selectY7() {
- gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_3);
- gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_4);
- gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_5);
-}
-
-void disableAllDecoder() {
- gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_2);
- gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_0);
- gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_1);
- gpioComInterface->pullLow(gpioIds::EN_RW_CS);
-}
-
-} // namespace gpioCallbacks
diff --git a/bsp_q7s/callbacks/pcduSwitchCb.cpp b/bsp_q7s/callbacks/pcduSwitchCb.cpp
index ec5f4dc5..f9b6c761 100644
--- a/bsp_q7s/callbacks/pcduSwitchCb.cpp
+++ b/bsp_q7s/callbacks/pcduSwitchCb.cpp
@@ -10,8 +10,8 @@ void pcdu::switchCallback(GOMSPACE::Pdu pdu, uint8_t channel, bool state, void*
return;
}
if (pdu == GOMSPACE::Pdu::PDU1) {
- PDU1::SwitchChannels typedChannel = static_cast(channel);
- if (typedChannel == PDU1::SwitchChannels::ACS_A_SIDE) {
+ PDU1::Channels typedChannel = static_cast(channel);
+ if (typedChannel == PDU1::Channels::ACS_A_SIDE) {
if (state) {
gpioComIF->pullHigh(gpioIds::GNSS_0_NRESET);
} else {
@@ -20,8 +20,8 @@ void pcdu::switchCallback(GOMSPACE::Pdu pdu, uint8_t channel, bool state, void*
}
} else if (pdu == GOMSPACE::Pdu::PDU2) {
- PDU2::SwitchChannels typedChannel = static_cast(channel);
- if (typedChannel == PDU2::SwitchChannels::ACS_B_SIDE) {
+ PDU2::Channels typedChannel = static_cast(channel);
+ if (typedChannel == PDU2::Channels::ACS_B_SIDE) {
if (state) {
gpioComIF->pullHigh(gpioIds::GNSS_1_NRESET);
} else {
diff --git a/bsp_q7s/callbacks/q7sGpioCallbacks.cpp b/bsp_q7s/callbacks/q7sGpioCallbacks.cpp
new file mode 100644
index 00000000..6db5aed4
--- /dev/null
+++ b/bsp_q7s/callbacks/q7sGpioCallbacks.cpp
@@ -0,0 +1,54 @@
+#include "q7sGpioCallbacks.h"
+
+#include
+#include
+#include
+#include
+
+#include "busConf.h"
+
+void q7s::gpioCallbacks::initSpiCsDecoder(GpioIF* gpioComIF) {
+ using namespace gpio;
+ ReturnValue_t result;
+
+ if (gpioComIF == nullptr) {
+ sif::debug << "initSpiCsDecoder: Invalid gpioComIF" << std::endl;
+ return;
+ }
+
+ GpioCookie* spiMuxGpios = new GpioCookie;
+
+ GpiodRegularByLineName* spiMuxBit = nullptr;
+ /** Setting mux bit 1 to low will disable IC21 on the interface board */
+ spiMuxBit = new GpiodRegularByLineName(q7s::gpioNames::SPI_MUX_BIT_0_PIN, "SPI Mux Bit 1",
+ Direction::OUT, Levels::HIGH);
+ spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_0, spiMuxBit);
+ /** Setting mux bit 2 to low disables IC1 on the TCS board */
+ spiMuxBit = new GpiodRegularByLineName(q7s::gpioNames::SPI_MUX_BIT_1_PIN, "SPI Mux Bit 2",
+ Direction::OUT, Levels::HIGH);
+ spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_1, spiMuxBit);
+ /** Setting mux bit 3 to low disables IC2 on the TCS board and IC22 on the interface board */
+ spiMuxBit = new GpiodRegularByLineName(q7s::gpioNames::SPI_MUX_BIT_2_PIN, "SPI Mux Bit 3",
+ Direction::OUT, Levels::LOW);
+ spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_2, spiMuxBit);
+
+ /** The following gpios can take arbitrary initial values */
+ spiMuxBit = new GpiodRegularByLineName(q7s::gpioNames::SPI_MUX_BIT_3_PIN, "SPI Mux Bit 4",
+ Direction::OUT, Levels::LOW);
+ spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_3, spiMuxBit);
+ spiMuxBit = new GpiodRegularByLineName(q7s::gpioNames::SPI_MUX_BIT_4_PIN, "SPI Mux Bit 5",
+ Direction::OUT, Levels::LOW);
+ spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_4, spiMuxBit);
+ spiMuxBit = new GpiodRegularByLineName(q7s::gpioNames::SPI_MUX_BIT_5_PIN, "SPI Mux Bit 6",
+ Direction::OUT, Levels::LOW);
+ spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_5, spiMuxBit);
+ GpiodRegularByLineName* enRwDecoder = new GpiodRegularByLineName(
+ q7s::gpioNames::EN_RW_CS, "EN_RW_CS", Direction::OUT, Levels::HIGH);
+ spiMuxGpios->addGpio(gpioIds::EN_RW_CS, enRwDecoder);
+
+ result = gpioComIF->addGpios(spiMuxGpios);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ sif::error << "initSpiCsDecoder: Failed to add mux bit gpios to gpioComIF" << std::endl;
+ return;
+ }
+}
diff --git a/bsp_q7s/callbacks/q7sGpioCallbacks.h b/bsp_q7s/callbacks/q7sGpioCallbacks.h
new file mode 100644
index 00000000..e3306554
--- /dev/null
+++ b/bsp_q7s/callbacks/q7sGpioCallbacks.h
@@ -0,0 +1,15 @@
+#pragma once
+
+class GpioIF;
+
+namespace q7s {
+namespace gpioCallbacks {
+
+/**
+ * @brief This function initializes the GPIOs used to control the SN74LVC138APWR decoders on
+ * the TCS Board and the interface board.
+ */
+void initSpiCsDecoder(GpioIF* gpioComIF);
+
+} // namespace gpioCallbacks
+} // namespace q7s
diff --git a/bsp_q7s/core/CoreController.cpp b/bsp_q7s/core/CoreController.cpp
index b1783054..73fd49bb 100644
--- a/bsp_q7s/core/CoreController.cpp
+++ b/bsp_q7s/core/CoreController.cpp
@@ -1,32 +1,35 @@
#include "CoreController.h"
#include
+#include
#include "OBSWConfig.h"
#include "OBSWVersion.h"
-#include "fsfw/FSFWVersion.h"
#include "fsfw/serviceinterface/ServiceInterface.h"
#include "fsfw/timemanager/Stopwatch.h"
-#include "watchdogConf.h"
+#include "fsfw/version.h"
+#include "watchdog/definitions.h"
#if OBSW_USE_TMTC_TCP_BRIDGE == 0
#include "fsfw/osal/common/UdpTmTcBridge.h"
#else
#include "fsfw/osal/common/TcpTmTcServer.h"
#endif
-
#include
#include
+#include
#include
#include "bsp_q7s/memory/SdCardManager.h"
#include "bsp_q7s/memory/scratchApi.h"
+#include "bsp_q7s/xadc/Xadc.h"
+#include "linux/utility/utility.h"
xsc::Chip CoreController::CURRENT_CHIP = xsc::Chip::NO_CHIP;
xsc::Copy CoreController::CURRENT_COPY = xsc::Copy::NO_COPY;
CoreController::CoreController(object_id_t objectId)
- : ExtendedControllerBase(objectId, objects::NO_OBJECT, 5), opDivider(5) {
+ : ExtendedControllerBase(objectId, objects::NO_OBJECT, 5), opDivider(5), hkSet(this) {
ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
try {
result = initWatchdogFifo();
@@ -50,6 +53,7 @@ CoreController::CoreController(object_id_t objectId)
} catch (const std::filesystem::filesystem_error &e) {
sif::error << "CoreController::CoreController: Failed with exception " << e.what() << std::endl;
}
+ eventQueue = QueueFactory::instance()->createMessageQueue(5, EventMessage::MAX_MESSAGE_SIZE);
}
ReturnValue_t CoreController::handleCommandMessage(CommandMessage *message) {
@@ -57,21 +61,42 @@ ReturnValue_t CoreController::handleCommandMessage(CommandMessage *message) {
}
void CoreController::performControlOperation() {
+ EventMessage event;
+ for (ReturnValue_t result = eventQueue->receiveMessage(&event); result == RETURN_OK;
+ result = eventQueue->receiveMessage(&event)) {
+ switch (event.getEvent()) {
+ case (GpsHyperion::GPS_FIX_CHANGE): {
+ gpsFix = static_cast(event.getParameter2());
+ break;
+ }
+ }
+ }
performWatchdogControlOperation();
sdStateMachine();
performMountedSdCardOperations();
+ readHkData();
}
ReturnValue_t CoreController::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
LocalDataPoolManager &poolManager) {
+ localDataPoolMap.emplace(core::TEMPERATURE, new PoolEntry({0}));
+ localDataPoolMap.emplace(core::PS_VOLTAGE, new PoolEntry({0}));
+ localDataPoolMap.emplace(core::PL_VOLTAGE, new PoolEntry({0}));
return HasReturnvaluesIF::RETURN_OK;
}
-LocalPoolDataSetBase *CoreController::getDataSetHandle(sid_t sid) { return nullptr; }
+LocalPoolDataSetBase *CoreController::getDataSetHandle(sid_t sid) {
+ if (sid.ownerSetId == core::HK_SET_ID) {
+ return &hkSet;
+ }
+ return nullptr;
+}
ReturnValue_t CoreController::initialize() {
- ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
-
+ ReturnValue_t result = ExtendedControllerBase::initialize();
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ sif::warning << "CoreController::initialize: Base init failed" << std::endl;
+ }
result = scratch::writeNumber(scratch::ALLOC_FAILURE_COUNT, 0);
if (result != HasReturnvaluesIF::RETURN_OK) {
sif::warning << "CoreController::initialize: Setting up alloc failure "
@@ -82,7 +107,23 @@ ReturnValue_t CoreController::initialize() {
sdStateMachine();
triggerEvent(REBOOT_SW, CURRENT_CHIP, CURRENT_COPY);
- return ExtendedControllerBase::initialize();
+ EventManagerIF *eventManager =
+ ObjectManager::instance()->get(objects::EVENT_MANAGER);
+ if (eventManager == nullptr or eventQueue == nullptr) {
+ sif::warning << "CoreController::initialize: No valid event manager found or "
+ "queue invalid"
+ << std::endl;
+ }
+ result = eventManager->registerListener(eventQueue->getId());
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ sif::warning << "CoreController::initialize: Registering as event listener failed" << std::endl;
+ }
+ result = eventManager->subscribeToEvent(eventQueue->getId(),
+ event::getEventId(GpsHyperion::GPS_FIX_CHANGE));
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ sif::warning << "Subscribing for GPS GPS_FIX_CHANGE event failed" << std::endl;
+ }
+ return RETURN_OK;
}
ReturnValue_t CoreController::initializeAfterTaskCreation() {
@@ -104,6 +145,7 @@ ReturnValue_t CoreController::initializeAfterTaskCreation() {
setenv("PATH", updatedEnvPath.c_str(), true);
updateProtInfo();
initPrint();
+ ExtendedControllerBase::initializeAfterTaskCreation();
return result;
}
@@ -608,6 +650,7 @@ ReturnValue_t CoreController::incrementAllocationFailureCount() {
}
ReturnValue_t CoreController::initVersionFile() {
+ using namespace fsfw;
std::string unameFileName = "/tmp/uname_version.txt";
// TODO: No -v flag for now. If the kernel version is used, need to cut off first few letters
std::string unameCmd = "uname -mnrso > " + unameFileName;
@@ -624,12 +667,11 @@ ReturnValue_t CoreController::initVersionFile() {
std::string fullObswVersionString = "OBSW: v" + std::to_string(SW_VERSION) + "." +
std::to_string(SW_SUBVERSION) + "." +
std::to_string(SW_REVISION);
- std::string fullFsfwVersionString = "FSFW: v" + std::to_string(FSFW_VERSION) + "." +
- std::to_string(FSFW_SUBVERSION) + "." +
- std::to_string(FSFW_REVISION);
+ char versionString[16] = {};
+ fsfw::FSFW_VERSION.getVersion(versionString, sizeof(versionString));
+ std::string fullFsfwVersionString = "FSFW: v" + std::string(versionString);
std::string systemString = "System: " + unameLine;
- std::string mountPrefix = SdCardManager::instance()->getCurrentMountPrefix();
- std::string versionFilePath = mountPrefix + VERSION_FILE;
+ std::string versionFilePath = currMntPrefix + VERSION_FILE;
std::fstream versionFile;
if (not std::filesystem::exists(versionFilePath)) {
@@ -1187,24 +1229,27 @@ void CoreController::performWatchdogControlOperation() {
}
void CoreController::performMountedSdCardOperations() {
+ currMntPrefix = sdcMan->getCurrentMountPrefix();
if (doPerformMountedSdCardOps) {
bool sdCardMounted = false;
sdCardMounted = sdcMan->isSdCardMounted(sdInfo.pref);
if (sdCardMounted) {
- std::string path = sdcMan->getCurrentMountPrefix(sdInfo.pref) + "/" + CONF_FOLDER;
+ std::string path = currMntPrefix + "/" + CONF_FOLDER;
if (not std::filesystem::exists(path)) {
std::filesystem::create_directory(path);
}
initVersionFile();
+ initClockFromTimeFile();
performRebootFileHandling(false);
doPerformMountedSdCardOps = false;
}
}
+ timeFileHandler();
}
void CoreController::performRebootFileHandling(bool recreateFile) {
using namespace std;
- std::string path = sdcMan->getCurrentMountPrefix(sdInfo.pref) + REBOOT_FILE;
+ std::string path = currMntPrefix + REBOOT_FILE;
if (not std::filesystem::exists(path) or recreateFile) {
#if OBSW_VERBOSE_LEVEL >= 1
sif::info << "CoreController::performRebootFileHandling: Recreating reboot file" << std::endl;
@@ -1583,7 +1628,7 @@ bool CoreController::parseRebootFile(std::string path, RebootFile &rf) {
}
void CoreController::resetRebootCount(xsc::Chip tgtChip, xsc::Copy tgtCopy) {
- std::string path = sdcMan->getCurrentMountPrefix(sdInfo.pref) + REBOOT_FILE;
+ std::string path = currMntPrefix + REBOOT_FILE;
// Disable the reboot file mechanism
parseRebootFile(path, rebootFile);
if (tgtChip == xsc::ALL_CHIP and tgtCopy == xsc::ALL_COPY) {
@@ -1610,7 +1655,7 @@ void CoreController::resetRebootCount(xsc::Chip tgtChip, xsc::Copy tgtCopy) {
}
void CoreController::rewriteRebootFile(RebootFile file) {
- std::string path = sdcMan->getCurrentMountPrefix(sdInfo.pref) + REBOOT_FILE;
+ std::string path = currMntPrefix + REBOOT_FILE;
std::ofstream rebootFile(path);
if (rebootFile.is_open()) {
// Initiate reboot file first. Reboot handling will be on on initialization
@@ -1645,3 +1690,93 @@ void CoreController::setRebootMechanismLock(bool lock, xsc::Chip tgtChip, xsc::C
}
rewriteRebootFile(rebootFile);
}
+
+ReturnValue_t CoreController::timeFileHandler() {
+ if (gpsFix == GpsHyperion::FixMode::FIX_2D or gpsFix == GpsHyperion::FixMode::FIX_3D) {
+ // It is assumed that the system time is set from the GPS time
+ timeval currentTime = {};
+ ReturnValue_t result = Clock::getClock_timeval(¤tTime);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ std::ofstream timeFile(currMntPrefix + TIME_FILE);
+ timeFile << "UNIX SECONDS: " << currentTime.tv_sec << std::endl;
+ }
+ return RETURN_OK;
+}
+
+ReturnValue_t CoreController::initClockFromTimeFile() {
+ using namespace GpsHyperion;
+ using namespace std;
+ std::string fileName = currMntPrefix + TIME_FILE;
+ if (std::filesystem::exists(fileName) and
+ ((gpsFix == FixMode::UNKNOWN or gpsFix == FixMode::NOT_SEEN) or
+ not utility::timeSanityCheck())) {
+ ifstream timeFile(fileName);
+ string nextWord;
+ getline(timeFile, nextWord);
+ istringstream iss(nextWord);
+ iss >> nextWord;
+ if (iss.bad() or nextWord != "UNIX") {
+ return RETURN_FAILED;
+ }
+ iss >> nextWord;
+ if (iss.bad() or nextWord != "SECONDS:") {
+ return RETURN_FAILED;
+ }
+ iss >> nextWord;
+ timeval currentTime = {};
+ char *checkPtr;
+ currentTime.tv_sec = strtol(nextWord.c_str(), &checkPtr, 10);
+ if (iss.bad() or *checkPtr) {
+ return RETURN_FAILED;
+ }
+#if OBSW_VERBOSE_LEVEL >= 1
+ time_t timeRaw = currentTime.tv_sec;
+ std::tm *time = std::gmtime(&timeRaw);
+ sif::info << "Setting system time from time files: " << std::put_time(time, "%c %Z")
+ << std::endl;
+#endif
+ return Clock::setClock(¤tTime);
+ }
+ return RETURN_OK;
+}
+
+void CoreController::readHkData() {
+ ReturnValue_t result = RETURN_OK;
+ result = hkSet.read(TIMEOUT_TYPE, MUTEX_TIMEOUT);
+ if (result != RETURN_OK) {
+ return;
+ }
+ Xadc xadc;
+ result = xadc.getTemperature(hkSet.temperature.value);
+ if (result != RETURN_OK) {
+ hkSet.temperature.setValid(false);
+ } else {
+ hkSet.temperature.setValid(true);
+ }
+ result = xadc.getVccPint(hkSet.psVoltage.value);
+ if (result != RETURN_OK) {
+ hkSet.psVoltage.setValid(false);
+ } else {
+ hkSet.psVoltage.setValid(true);
+ }
+ result = xadc.getVccInt(hkSet.plVoltage.value);
+ if (result != RETURN_OK) {
+ hkSet.plVoltage.setValid(false);
+ } else {
+ hkSet.plVoltage.setValid(true);
+ }
+#if OBSW_PRINT_CORE_HK == 1
+ hkSet.printSet();
+#endif /* OBSW_PRINT_CORE_HK == 1 */
+ result = hkSet.commit(TIMEOUT_TYPE, MUTEX_TIMEOUT);
+ if (result != RETURN_OK) {
+ return;
+ }
+}
+
+bool CoreController::isNumber(const std::string &s) {
+ return !s.empty() && std::find_if(s.begin(), s.end(),
+ [](unsigned char c) { return !std::isdigit(c); }) == s.end();
+}
diff --git a/bsp_q7s/core/CoreController.h b/bsp_q7s/core/CoreController.h
index 48bc9b7f..b5e4e511 100644
--- a/bsp_q7s/core/CoreController.h
+++ b/bsp_q7s/core/CoreController.h
@@ -6,9 +6,11 @@
#include
+#include "CoreDefinitions.h"
#include "bsp_q7s/memory/SdCardManager.h"
#include "events/subsystemIdRanges.h"
#include "fsfw/controller/ExtendedControllerBase.h"
+#include "mission/devices/devicedefinitions/GPSDefinitions.h"
class Timer;
class SdCardManager;
@@ -52,10 +54,12 @@ class CoreController : public ExtendedControllerBase {
static constexpr char CONF_FOLDER[] = "conf";
static constexpr char VERSION_FILE_NAME[] = "version.txt";
static constexpr char REBOOT_FILE_NAME[] = "reboot.txt";
+ static constexpr char TIME_FILE_NAME[] = "time.txt";
const std::string VERSION_FILE =
"/" + std::string(CONF_FOLDER) + "/" + std::string(VERSION_FILE_NAME);
const std::string REBOOT_FILE =
"/" + std::string(CONF_FOLDER) + "/" + std::string(REBOOT_FILE_NAME);
+ const std::string TIME_FILE = "/" + std::string(CONF_FOLDER) + "/" + std::string(TIME_FILE_NAME);
static constexpr ActionId_t LIST_DIRECTORY_INTO_FILE = 0;
static constexpr ActionId_t SWITCH_REBOOT_FILE_HANDLING = 5;
@@ -120,9 +124,12 @@ class CoreController : public ExtendedControllerBase {
bool sdInitFinished() const;
private:
+ static constexpr MutexIF::TimeoutType TIMEOUT_TYPE = MutexIF::TimeoutType::WAITING;
+ static constexpr uint32_t MUTEX_TIMEOUT = 20;
// Designated value for rechecking FIFO open
static constexpr int RETRY_FIFO_OPEN = -2;
int watchdogFifoFd = 0;
+ GpsHyperion::FixMode gpsFix = GpsHyperion::FixMode::UNKNOWN;
// States for SD state machine, which is used in non-blocking mode
enum class SdStates {
@@ -148,6 +155,7 @@ class CoreController : public ExtendedControllerBase {
static constexpr bool BLOCKING_SD_INIT = false;
SdCardManager* sdcMan = nullptr;
+ MessageQueueIF* eventQueue = nullptr;
struct SdInfo {
sd::SdCard pref = sd::SdCard::NONE;
@@ -170,6 +178,7 @@ class CoreController : public ExtendedControllerBase {
sd::SdState commandedState = sd::SdState::OFF;
} sdInfo;
RebootFile rebootFile = {};
+ std::string currMntPrefix;
bool doPerformMountedSdCardOps = true;
/**
@@ -181,12 +190,17 @@ class CoreController : public ExtendedControllerBase {
std::array protArray;
PeriodicOperationDivider opDivider;
+ core::HkSet hkSet;
+
ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
LocalDataPoolManager& poolManager) override;
LocalPoolDataSetBase* getDataSetHandle(sid_t sid) override;
ReturnValue_t checkModeCommand(Mode_t mode, Submode_t submode, uint32_t* msToReachTheMode);
void performMountedSdCardOperations();
ReturnValue_t initVersionFile();
+
+ ReturnValue_t initClockFromTimeFile();
+ ReturnValue_t timeFileHandler();
ReturnValue_t initBootCopy();
ReturnValue_t initWatchdogFifo();
ReturnValue_t initSdCardBlocking();
@@ -220,6 +234,8 @@ class CoreController : public ExtendedControllerBase {
void setRebootMechanismLock(bool lock, xsc::Chip tgtChip, xsc::Copy tgtCopy);
bool parseRebootFile(std::string path, RebootFile& file);
void rewriteRebootFile(RebootFile file);
+ void readHkData();
+ bool isNumber(const std::string& s);
};
#endif /* BSP_Q7S_CORE_CORECONTROLLER_H_ */
diff --git a/bsp_q7s/core/CoreDefinitions.h b/bsp_q7s/core/CoreDefinitions.h
new file mode 100644
index 00000000..91896301
--- /dev/null
+++ b/bsp_q7s/core/CoreDefinitions.h
@@ -0,0 +1,39 @@
+#ifndef BSP_Q7S_CORE_COREDEFINITIONS_H_
+#define BSP_Q7S_CORE_COREDEFINITIONS_H_
+
+#include
+
+namespace core {
+
+static const uint8_t HK_SET_ENTRIES = 3;
+static const uint32_t HK_SET_ID = 5;
+
+enum PoolIds { TEMPERATURE, PS_VOLTAGE, PL_VOLTAGE };
+
+/**
+ * @brief Set storing OBC internal housekeeping data
+ */
+class HkSet : public StaticLocalDataSet {
+ public:
+ HkSet(HasLocalDataPoolIF* owner) : StaticLocalDataSet(owner, HK_SET_ID) {}
+
+ HkSet(object_id_t objectId) : StaticLocalDataSet(sid_t(objectId, HK_SET_ID)) {}
+
+ // On-chip temperature
+ lp_var_t temperature = lp_var_t(sid.objectId, PoolIds::TEMPERATURE, this);
+ // Processing system VCC
+ lp_var_t psVoltage = lp_var_t(sid.objectId, PoolIds::PS_VOLTAGE, this);
+ // Programmable logic VCC
+ lp_var_t plVoltage = lp_var_t(sid.objectId, PoolIds::PL_VOLTAGE, this);
+
+ void printSet() {
+ sif::info << "HkSet::printSet: On-chip temperature: " << this->temperature << " °C"
+ << std::endl;
+ sif::info << "HkSet::printSet: PS voltage: " << this->psVoltage << " mV" << std::endl;
+ sif::info << "HkSet::printSet: PL voltage: " << this->plVoltage << " mV" << std::endl;
+ }
+};
+
+} // namespace core
+
+#endif /* BSP_Q7S_CORE_COREDEFINITIONS_H_ */
diff --git a/bsp_q7s/core/InitMission.cpp b/bsp_q7s/core/InitMission.cpp
index 9d28e1d3..ced1d12a 100644
--- a/bsp_q7s/core/InitMission.cpp
+++ b/bsp_q7s/core/InitMission.cpp
@@ -55,14 +55,12 @@ void initmission::initTasks() {
void (*missedDeadlineFunc)(void) = nullptr;
#endif
-#if BOARD_TE0720 == 0
PeriodicTaskIF* coreController = factory->createPeriodicTask(
"CORE_CTRL", 60, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.4, missedDeadlineFunc);
result = coreController->addComponent(objects::CORE_CONTROLLER);
if (result != HasReturnvaluesIF::RETURN_OK) {
initmission::printAddObjectError("CORE_CTRL", objects::CORE_CONTROLLER);
}
-#endif
/* TMTC Distribution */
PeriodicTaskIF* tmTcDistributor = factory->createPeriodicTask(
@@ -116,15 +114,32 @@ void initmission::initTasks() {
#endif /* OBSW_USE_CCSDS_IP_CORE == 1 */
#if OBSW_ADD_ACS_HANDLERS == 1
- PeriodicTaskIF* acsCtrl = factory->createPeriodicTask(
- "ACS_CTRL", 40, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2, 0.4, missedDeadlineFunc);
- result = acsCtrl->addComponent(objects::GPS_CONTROLLER);
+ PeriodicTaskIF* acsTask = factory->createPeriodicTask(
+ "ACS_CTRL", 45, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2, 0.4, missedDeadlineFunc);
+ result = acsTask->addComponent(objects::GPS_CONTROLLER);
if (result != HasReturnvaluesIF::RETURN_OK) {
- initmission::printAddObjectError("ACS_CTRL", objects::GPS_CONTROLLER);
+ initmission::printAddObjectError("GPS_CTRL", objects::GPS_CONTROLLER);
}
+
#endif /* OBSW_ADD_ACS_HANDLERS */
-#if BOARD_TE0720 == 0
+ PeriodicTaskIF* sysTask = factory->createPeriodicTask(
+ "SYS_TASK", 40, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2, 0.4, missedDeadlineFunc);
+ result = sysTask->addComponent(objects::ACS_BOARD_ASS);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ initmission::printAddObjectError("ACS_BOARD_ASS", objects::ACS_BOARD_ASS);
+ }
+#if OBSW_ADD_SUS_BOARD_ASS == 1
+ result = sysTask->addComponent(objects::SUS_BOARD_ASS);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ initmission::printAddObjectError("SUS_BOARD_ASS", objects::SUS_BOARD_ASS);
+ }
+#endif
+ result = sysTask->addComponent(objects::TCS_BOARD_ASS);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ initmission::printAddObjectError("TCS_BOARD_ASS", objects::TCS_BOARD_ASS);
+ }
+
// FS task, task interval does not matter because it runs in permanent loop, priority low
// because it is a non-essential background task
PeriodicTaskIF* fsTask = factory->createPeriodicTask(
@@ -143,7 +158,14 @@ void initmission::initTasks() {
}
#endif /* OBSW_ADD_STAR_TRACKER == 1 */
-#endif /* BOARD_TE0720 */
+#if OBSW_ADD_PLOC_MPSOC == 1
+ PeriodicTaskIF* mpsocHelperTask = factory->createPeriodicTask(
+ "PLOC_MPSOC_HELPER", 20, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.2, missedDeadlineFunc);
+ result = mpsocHelperTask->addComponent(objects::PLOC_MPSOC_HELPER);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ initmission::printAddObjectError("PLOC_MPSOC_HELPER", objects::PLOC_MPSOC_HELPER);
+ }
+#endif /* OBSW_ADD_PLOC_MPSOC */
#if OBSW_TEST_CCSDS_BRIDGE == 1
PeriodicTaskIF* ptmeTestTask = factory->createPeriodicTask(
@@ -187,9 +209,7 @@ void initmission::initTasks() {
pdecHandlerTask->startTask();
#endif /* OBSW_USE_CCSDS_IP_CORE == 1 */
-#if BOARD_TE0720 == 0
coreController->startTask();
-#endif
taskStarter(pstTasks, "PST task vector");
taskStarter(pusTasks, "PUS task vector");
@@ -201,16 +221,15 @@ void initmission::initTasks() {
ptmeTestTask->startTask();
#endif
-#if BOARD_TE0720 == 0
fsTask->startTask();
#if OBSW_ADD_STAR_TRACKER == 1
- strHelperTask > startTask();
+ strHelperTask->startTask();
#endif /* OBSW_ADD_STAR_TRACKER == 1 */
-#endif
#if OBSW_ADD_ACS_HANDLERS == 1
- acsCtrl->startTask();
+ acsTask->startTask();
#endif
+ sysTask->startTask();
sif::info << "Tasks started.." << std::endl;
}
@@ -219,15 +238,16 @@ void initmission::createPstTasks(TaskFactory& factory,
TaskDeadlineMissedFunction missedDeadlineFunc,
std::vector& taskVec) {
ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
-#if BOARD_TE0720 == 0
/* Polling Sequence Table Default */
#if OBSW_ADD_SPI_TEST_CODE == 0
FixedTimeslotTaskIF* spiPst = factory.createFixedTimeslotTask(
"PST_TASK_DEFAULT", 70, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 0.5, missedDeadlineFunc);
result = pst::pstSpi(spiPst);
if (result != HasReturnvaluesIF::RETURN_OK) {
- if (result != FixedTimeslotTaskIF::SLOT_LIST_EMPTY) {
- sif::error << "InitMission::initTasks: Creating PST failed!" << std::endl;
+ if (result == FixedTimeslotTaskIF::SLOT_LIST_EMPTY) {
+ sif::warning << "InitMission::initTasks: SPI PST is empty" << std::endl;
+ } else {
+ sif::error << "InitMission::initTasks: Creating SPI PST failed!" << std::endl;
}
} else {
taskVec.push_back(spiPst);
@@ -238,43 +258,51 @@ void initmission::createPstTasks(TaskFactory& factory,
"UART_PST", 70, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 0.2, missedDeadlineFunc);
result = pst::pstUart(uartPst);
if (result != HasReturnvaluesIF::RETURN_OK) {
- sif::error << "InitMission::initTasks: Creating PST failed!" << std::endl;
+ if (result == FixedTimeslotTaskIF::SLOT_LIST_EMPTY) {
+ sif::warning << "InitMission::initTasks: UART PST is empty" << std::endl;
+ } else {
+ sif::error << "InitMission::initTasks: Creating UART PST failed!" << std::endl;
+ }
+ } else {
+ taskVec.push_back(uartPst);
}
- taskVec.push_back(uartPst);
+
FixedTimeslotTaskIF* gpioPst = factory.createFixedTimeslotTask(
"GPIO_PST", 70, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 0.2, missedDeadlineFunc);
result = pst::pstGpio(gpioPst);
if (result != HasReturnvaluesIF::RETURN_OK) {
- sif::error << "InitMission::initTasks: Creating PST failed!" << std::endl;
+ if (result == FixedTimeslotTaskIF::SLOT_LIST_EMPTY) {
+ sif::warning << "InitMission::initTasks: GPIO PST is empty" << std::endl;
+ } else {
+ sif::error << "InitMission::initTasks: Creating GPIO PST failed!" << std::endl;
+ }
+ } else {
+ taskVec.push_back(gpioPst);
}
- taskVec.push_back(gpioPst);
-
#if OBSW_ADD_I2C_TEST_CODE == 0
FixedTimeslotTaskIF* i2cPst = factory.createFixedTimeslotTask(
"I2C_PST", 70, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 0.2, missedDeadlineFunc);
result = pst::pstI2c(i2cPst);
if (result != HasReturnvaluesIF::RETURN_OK) {
- sif::error << "InitMission::initTasks: Creating PST failed!" << std::endl;
+ if (result == FixedTimeslotTaskIF::SLOT_LIST_EMPTY) {
+ sif::warning << "InitMission::initTasks: I2C PST is empty" << std::endl;
+ } else {
+ sif::error << "InitMission::initTasks: Creating I2C PST failed!" << std::endl;
+ }
+ } else {
+ taskVec.push_back(i2cPst);
}
- taskVec.push_back(i2cPst);
#endif
FixedTimeslotTaskIF* gomSpacePstTask = factory.createFixedTimeslotTask(
"GS_PST_TASK", 70, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 1.0, missedDeadlineFunc);
result = pst::pstGompaceCan(gomSpacePstTask);
if (result != HasReturnvaluesIF::RETURN_OK) {
- sif::error << "InitMission::initTasks: GomSpace PST initialization failed!" << std::endl;
+ if (result != FixedTimeslotTaskIF::SLOT_LIST_EMPTY) {
+ sif::error << "InitMission::initTasks: GomSpace PST initialization failed!" << std::endl;
+ }
}
taskVec.push_back(gomSpacePstTask);
-#else /* BOARD_TE7020 == 0 */
- FixedTimeslotTaskIF* pollingSequenceTaskTE0720 = factory.createFixedTimeslotTask(
- "PST_TASK_TE0720", 30, PeriodicTaskIF::MINIMUM_STACK_SIZE * 8, 3.0, missedDeadlineFunc);
- result = pst::pollingSequenceTE0720(pollingSequenceTaskTE0720);
- if (result != HasReturnvaluesIF::RETURN_OK) {
- sif::error << "InitMission::initTasks: Creating TE0720 PST failed!" << std::endl;
- }
- taskVec.push_back(pollingSequenceTaskTE0720);
-#endif /* BOARD_TE7020 == 1 */
}
void initmission::createPusTasks(TaskFactory& factory,
@@ -381,12 +409,6 @@ void initmission::createTestTasks(TaskFactory& factory,
}
#endif
-#if BOARD_TE0720 == 1 && OBSW_TEST_LIBGPIOD == 1
- result = testTask->addComponent(objects::LIBGPIOD_TEST);
- if (result != HasReturnvaluesIF::RETURN_OK) {
- initmission::printAddObjectError("GPIOD_TEST", objects::LIBGPIOD_TEST);
- }
-#endif /* BOARD_TE0720 == 1 && OBSW_TEST_LIBGPIOD == 1 */
taskVec.push_back(testTask);
#endif // OBSW_ADD_TEST_TASK == 1 && OBSW_ADD_TEST_CODE == 1
diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp
index 519dec8f..c9c8e0e2 100644
--- a/bsp_q7s/core/ObjectFactory.cpp
+++ b/bsp_q7s/core/ObjectFactory.cpp
@@ -1,21 +1,12 @@
#include "ObjectFactory.h"
-#include
-#include
-#include
-#include
-#include
-
#include "OBSWConfig.h"
#include "bsp_q7s/boardtest/Q7STestTask.h"
#include "bsp_q7s/callbacks/gnssCallback.h"
-#include "bsp_q7s/callbacks/gpioCallbacks.h"
#include "bsp_q7s/callbacks/pcduSwitchCb.h"
+#include "bsp_q7s/callbacks/q7sGpioCallbacks.h"
#include "bsp_q7s/callbacks/rwSpiCallback.h"
#include "bsp_q7s/core/CoreController.h"
-#include "bsp_q7s/devices/PlocMemoryDumper.h"
-#include "bsp_q7s/devices/PlocSupervisorHandler.h"
-#include "bsp_q7s/devices/PlocUpdater.h"
#include "bsp_q7s/memory/FileSystemHandler.h"
#include "busConf.h"
#include "ccsdsConfig.h"
@@ -23,15 +14,34 @@
#include "devices/addresses.h"
#include "devices/gpioIds.h"
#include "devices/powerSwitcherList.h"
+#include "fsfw/ipc/QueueFactory.h"
+#include "linux/ObjectFactory.h"
#include "linux/boardtest/I2cTestClass.h"
#include "linux/boardtest/SpiTestClass.h"
#include "linux/boardtest/UartTestClass.h"
+#include "linux/callbacks/gpioCallbacks.h"
#include "linux/csp/CspComIF.h"
#include "linux/csp/CspCookie.h"
#include "linux/devices/GPSHyperionLinuxController.h"
+#include "linux/devices/devicedefinitions/PlocMPSoCDefinitions.h"
#include "linux/devices/devicedefinitions/StarTrackerDefinitions.h"
+#include "linux/devices/ploc/PlocMPSoCHandler.h"
+#include "linux/devices/ploc/PlocMPSoCHelper.h"
+#include "linux/devices/ploc/PlocMemoryDumper.h"
+#include "linux/devices/ploc/PlocSupervisorHandler.h"
+#include "linux/devices/ploc/PlocUpdater.h"
#include "linux/devices/startracker/StarTrackerHandler.h"
#include "linux/devices/startracker/StrHelper.h"
+#include "linux/obc/AxiPtmeConfig.h"
+#include "linux/obc/PapbVcInterface.h"
+#include "linux/obc/PdecHandler.h"
+#include "linux/obc/Ptme.h"
+#include "linux/obc/PtmeConfig.h"
+#include "mission/system/AcsBoardFdir.h"
+#include "mission/system/RtdFdir.h"
+#include "mission/system/SusAssembly.h"
+#include "mission/system/SusFdir.h"
+#include "mission/system/TcsBoardAssembly.h"
#include "tmtc/apid.h"
#include "tmtc/pusIds.h"
@@ -46,6 +56,7 @@
#include "fsfw/tmtcservices/CommandingServiceBase.h"
#include "fsfw/tmtcservices/PusServiceBase.h"
#include "fsfw_hal/common/gpio/GpioCookie.h"
+#include "fsfw_hal/common/gpio/gpioDefinitions.h"
#include "fsfw_hal/devicehandlers/GyroL3GD20Handler.h"
#include "fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h"
#include "fsfw_hal/devicehandlers/MgmRM3100Handler.h"
@@ -68,7 +79,6 @@
#include "mission/devices/PDU1Handler.h"
#include "mission/devices/PDU2Handler.h"
#include "mission/devices/PayloadPcduHandler.h"
-#include "mission/devices/PlocMPSoCHandler.h"
#include "mission/devices/RadiationSensorHandler.h"
#include "mission/devices/RwHandler.h"
#include "mission/devices/SolarArrayDeploymentHandler.h"
@@ -77,12 +87,12 @@
#include "mission/devices/Tmp1075Handler.h"
#include "mission/devices/devicedefinitions/GomspaceDefinitions.h"
#include "mission/devices/devicedefinitions/Max31865Definitions.h"
-#include "mission/devices/devicedefinitions/PlocMPSoCDefinitions.h"
#include "mission/devices/devicedefinitions/RadSensorDefinitions.h"
#include "mission/devices/devicedefinitions/RwDefinitions.h"
#include "mission/devices/devicedefinitions/SusDefinitions.h"
#include "mission/devices/devicedefinitions/SyrlinksDefinitions.h"
#include "mission/devices/devicedefinitions/payloadPcduDefinitions.h"
+#include "mission/system/AcsBoardAssembly.h"
#include "mission/tmtc/CCSDSHandler.h"
#include "mission/tmtc/VirtualChannel.h"
#include "mission/utility/TmFunnel.h"
@@ -99,8 +109,8 @@ void Factory::setStaticFrameworkObjectIds() {
CommandingServiceBase::defaultPacketSource = objects::PUS_PACKET_DISTRIBUTOR;
CommandingServiceBase::defaultPacketDestination = objects::TM_FUNNEL;
- // DeviceHandlerBase::powerSwitcherId = objects::PCDU_HANDLER;
- DeviceHandlerBase::powerSwitcherId = objects::NO_OBJECT;
+ DeviceHandlerBase::powerSwitcherId = objects::PCDU_HANDLER;
+ // DeviceHandlerBase::powerSwitcherId = objects::NO_OBJECT;
#if OBSW_TM_TO_PTME == 1
TmFunnel::downlinkDestination = objects::CCSDS_HANDLER;
@@ -124,36 +134,39 @@ void ObjectFactory::produce(void* args) {
UartComIF* uartComIF = nullptr;
SpiComIF* spiComIF = nullptr;
I2cComIF* i2cComIF = nullptr;
+ PowerSwitchIF* pwrSwitcher = nullptr;
createCommunicationInterfaces(&gpioComIF, &uartComIF, &spiComIF, &i2cComIF);
createTmpComponents();
-#if BOARD_TE0720 == 0
new CoreController(objects::CORE_CONTROLLER);
- gpioCallbacks::disableAllDecoder();
- createPcduComponents(gpioComIF);
+ gpioCallbacks::disableAllDecoder(gpioComIF);
+ createPcduComponents(gpioComIF, &pwrSwitcher);
createRadSensorComponent(gpioComIF);
- createSunSensorComponents(gpioComIF, spiComIF);
+ createSunSensorComponents(gpioComIF, spiComIF, pwrSwitcher, q7s::SPI_DEFAULT_DEV);
#if OBSW_ADD_ACS_BOARD == 1
- createAcsBoardComponents(gpioComIF, uartComIF);
+ createAcsBoardComponents(gpioComIF, uartComIF, pwrSwitcher);
#endif
createHeaterComponents();
createSolarArrayDeploymentComponents();
- createPlPcduComponents(gpioComIF, spiComIF);
+ createPlPcduComponents(gpioComIF, spiComIF, pwrSwitcher);
#if OBSW_ADD_SYRLINKS == 1
createSyrlinksComponents();
#endif /* OBSW_ADD_SYRLINKS == 1 */
- createRtdComponents(gpioComIF);
+ createRtdComponents(q7s::SPI_DEFAULT_DEV, gpioComIF, pwrSwitcher);
+ createPayloadComponents(gpioComIF);
#if OBSW_ADD_MGT == 1
I2cCookie* imtqI2cCookie =
new I2cCookie(addresses::IMTQ, IMTQ::MAX_REPLY_SIZE, q7s::I2C_DEFAULT_DEV);
- auto imtqHandler = new IMTQHandler(objects::IMTQ_HANDLER, objects::I2C_COM_IF, imtqI2cCookie);
+ auto imtqHandler = new IMTQHandler(objects::IMTQ_HANDLER, objects::I2C_COM_IF, imtqI2cCookie,
+ pcdu::Switches::PDU1_CH3_MGT_5V);
+ imtqHandler->setPowerSwitcher(pwrSwitcher);
static_cast(imtqHandler);
#if OBSW_DEBUG_IMTQ == 1
- imtqHandler->setToGoToNormal(true);
imtqHandler->setStartUpImmediately();
+ imtqHandler->setToGoToNormal(true);
#else
(void)imtqHandler;
#endif
@@ -172,39 +185,21 @@ void ObjectFactory::produce(void* args) {
#endif
#endif
-#if OBSW_ADD_PLOC_MPSOC == 1
- UartCookie* plocMpsocCookie =
- new UartCookie(objects::PLOC_MPSOC_HANDLER, q7s::UART_PLOC_MPSOC_DEV,
- UartModes::NON_CANONICAL, uart::PLOC_MPSOC_BAUD, PLOC_MPSOC::MAX_REPLY_SIZE);
- new PlocMPSoCHandler(objects::PLOC_MPSOC_HANDLER, objects::UART_COM_IF, plocMpsocCookie);
-#endif /* OBSW_ADD_PLOC_MPSOC == 1 */
-
-#if OBSW_ADD_PLOC_SUPERVISOR == 1
- UartCookie* plocSupervisorCookie = new UartCookie(
- objects::PLOC_SUPERVISOR_HANDLER, q7s::UART_PLOC_SUPERVSIOR_DEV, UartModes::NON_CANONICAL,
- uart::PLOC_SUPERVISOR_BAUD, PLOC_SPV::MAX_PACKET_SIZE * 20);
- plocSupervisorCookie->setNoFixedSizeReply();
- PlocSupervisorHandler* plocSupervisor = new PlocSupervisorHandler(
- objects::PLOC_SUPERVISOR_HANDLER, objects::UART_COM_IF, plocSupervisorCookie);
- plocSupervisor->setStartUpImmediately();
-#endif /* OBSW_ADD_PLOC_SUPERVISOR == 1 */
-
new FileSystemHandler(objects::FILE_SYSTEM_HANDLER);
#if OBSW_ADD_STAR_TRACKER == 1
UartCookie* starTrackerCookie =
- new UartCookie(objects::STAR_TRACKER, q7s::UART_STAR_TRACKER_DEV, UartModes::NON_CANONICAL,
- uart::STAR_TRACKER_BAUD, StarTracker::MAX_FRAME_SIZE * 2 + 2);
+ new UartCookie(objects::STAR_TRACKER, q7s::UART_STAR_TRACKER_DEV, uart::STAR_TRACKER_BAUD,
+ startracker::MAX_FRAME_SIZE * 2 + 2, UartModes::NON_CANONICAL);
starTrackerCookie->setNoFixedSizeReply();
StrHelper* strHelper = new StrHelper(objects::STR_HELPER);
- StarTrackerHandler* starTrackerHandler = new StarTrackerHandler(
- objects::STAR_TRACKER, objects::UART_COM_IF, starTrackerCookie, strHelper);
- starTrackerHandler->setStartUpImmediately();
+ auto starTracker =
+ new StarTrackerHandler(objects::STAR_TRACKER, objects::UART_COM_IF, starTrackerCookie,
+ strHelper, pcdu::PDU1_CH2_STAR_TRACKER_5V);
+ starTracker->setPowerSwitcher(pwrSwitcher);
#endif /* OBSW_ADD_STAR_TRACKER == 1 */
-#endif /* TE7020 == 0 */
-
#if OBSW_USE_CCSDS_IP_CORE == 1
createCcsdsComponents(gpioComIF);
#endif /* OBSW_USE_CCSDS_IP_CORE == 1 */
@@ -219,17 +214,10 @@ void ObjectFactory::produce(void* args) {
}
void ObjectFactory::createTmpComponents() {
-#if BOARD_TE0720 == 1
- I2cCookie* i2cCookieTmp1075tcs1 =
- new I2cCookie(addresses::TMP1075_TCS_1, TMP1075::MAX_REPLY_LENGTH, std::string("/dev/i2c-0"));
- I2cCookie* i2cCookieTmp1075tcs2 =
- new I2cCookie(addresses::TMP1075_TCS_2, TMP1075::MAX_REPLY_LENGTH, std::string("/dev/i2c-0"));
-#else
I2cCookie* i2cCookieTmp1075tcs1 =
new I2cCookie(addresses::TMP1075_TCS_1, TMP1075::MAX_REPLY_LENGTH, q7s::I2C_DEFAULT_DEV);
I2cCookie* i2cCookieTmp1075tcs2 =
new I2cCookie(addresses::TMP1075_TCS_2, TMP1075::MAX_REPLY_LENGTH, q7s::I2C_DEFAULT_DEV);
-#endif
/* Temperature sensors */
Tmp1075Handler* tmp1075Handler_1 =
@@ -254,13 +242,11 @@ void ObjectFactory::createCommunicationInterfaces(LinuxLibgpioIF** gpioComIF, Ua
*uartComIF = new UartComIF(objects::UART_COM_IF);
*spiComIF = new SpiComIF(objects::SPI_COM_IF, *gpioComIF);
-#if BOARD_TE0720 == 0
/* Adding gpios for chip select decoding to the gpioComIf */
- gpioCallbacks::initSpiCsDecoder(*gpioComIF);
-#endif
+ q7s::gpioCallbacks::initSpiCsDecoder(*gpioComIF);
}
-void ObjectFactory::createPcduComponents(LinuxLibgpioIF* gpioComIF) {
+void ObjectFactory::createPcduComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF** pwrSwitcher) {
CspCookie* p60DockCspCookie = new CspCookie(P60Dock::MAX_REPLY_LENGTH, addresses::P60DOCK);
CspCookie* pdu1CspCookie = new CspCookie(PDU::MAX_REPLY_LENGTH, addresses::PDU1);
CspCookie* pdu2CspCookie = new CspCookie(PDU::MAX_REPLY_LENGTH, addresses::PDU2);
@@ -270,12 +256,10 @@ void ObjectFactory::createPcduComponents(LinuxLibgpioIF* gpioComIF) {
new P60DockHandler(objects::P60DOCK_HANDLER, objects::CSP_COM_IF, p60DockCspCookie);
PDU1Handler* pdu1handler =
new PDU1Handler(objects::PDU1_HANDLER, objects::CSP_COM_IF, pdu1CspCookie);
- pdu1handler->assignChannelHookFunction(&pcdu::switchCallback, gpioComIF);
PDU2Handler* pdu2handler =
new PDU2Handler(objects::PDU2_HANDLER, objects::CSP_COM_IF, pdu2CspCookie);
- pdu2handler->assignChannelHookFunction(&pcdu::switchCallback, gpioComIF);
ACUHandler* acuhandler = new ACUHandler(objects::ACU_HANDLER, objects::CSP_COM_IF, acuCspCookie);
- new PCDUHandler(objects::PCDU_HANDLER, 50);
+ auto pcduHandler = new PCDUHandler(objects::PCDU_HANDLER, 50);
/**
* Setting PCDU devices to mode normal immediately after start up because PCDU is always
@@ -285,6 +269,9 @@ void ObjectFactory::createPcduComponents(LinuxLibgpioIF* gpioComIF) {
pdu1handler->setModeNormal();
pdu2handler->setModeNormal();
acuhandler->setModeNormal();
+ if (pwrSwitcher != nullptr) {
+ *pwrSwitcher = pcduHandler;
+ }
}
void ObjectFactory::createRadSensorComponent(LinuxLibgpioIF* gpioComIF) {
@@ -306,173 +293,17 @@ void ObjectFactory::createRadSensorComponent(LinuxLibgpioIF* gpioComIF) {
auto radSensor = new RadiationSensorHandler(objects::RAD_SENSOR, objects::SPI_COM_IF,
spiCookieRadSensor, gpioComIF);
static_cast(radSensor);
-#if OBSW_TEST_RAD_SENSOR == 1
+ // The radiation sensor ADC is powered by the 5V stack connector which should always be on
radSensor->setStartUpImmediately();
+ // It's a simple sensor, so just to to normal mode immediately
radSensor->setToGoToNormalModeImmediately();
+#if OBSW_DEBUG_RAD_SENSOR == 1
+ radSensor->enablePeriodicDataPrint(true);
#endif
}
-void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF) {
- using namespace gpio;
- GpioCookie* gpioCookieSus = new GpioCookie();
- GpioCallback* susgpio = nullptr;
-
- susgpio = new GpioCallback("Chip select SUS 0", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- gpioCookieSus->addGpio(gpioIds::CS_SUS_0, susgpio);
- susgpio = new GpioCallback("Chip select SUS 1", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- gpioCookieSus->addGpio(gpioIds::CS_SUS_1, susgpio);
- susgpio = new GpioCallback("Chip select SUS 2", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- gpioCookieSus->addGpio(gpioIds::CS_SUS_2, susgpio);
- susgpio = new GpioCallback("Chip select SUS 3", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- gpioCookieSus->addGpio(gpioIds::CS_SUS_3, susgpio);
- susgpio = new GpioCallback("Chip select SUS 4", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- gpioCookieSus->addGpio(gpioIds::CS_SUS_4, susgpio);
- susgpio = new GpioCallback("Chip select SUS 5", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- gpioCookieSus->addGpio(gpioIds::CS_SUS_5, susgpio);
- susgpio = new GpioCallback("Chip select SUS 6", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- gpioCookieSus->addGpio(gpioIds::CS_SUS_6, susgpio);
- susgpio = new GpioCallback("Chip select SUS 7", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- gpioCookieSus->addGpio(gpioIds::CS_SUS_7, susgpio);
- susgpio = new GpioCallback("Chip select SUS 8", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- gpioCookieSus->addGpio(gpioIds::CS_SUS_8, susgpio);
- susgpio = new GpioCallback("Chip select SUS 9", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- gpioCookieSus->addGpio(gpioIds::CS_SUS_9, susgpio);
- susgpio = new GpioCallback("Chip select SUS 10", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- gpioCookieSus->addGpio(gpioIds::CS_SUS_10, susgpio);
- susgpio = new GpioCallback("Chip select SUS 11", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- gpioCookieSus->addGpio(gpioIds::CS_SUS_11, susgpio);
-
- gpioComIF->addGpios(gpioCookieSus);
-
-#if OBSW_ADD_SUN_SENSORS == 1
- SpiCookie* spiCookie =
- new SpiCookie(addresses::SUS_0, gpioIds::CS_SUS_0, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE,
- spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
- SusHandler* susHandler0 = new SusHandler(objects::SUS_0, 0, objects::SPI_COM_IF, spiCookie);
-
- spiCookie =
- new SpiCookie(addresses::SUS_1, gpioIds::CS_SUS_1, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE,
- spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
- SusHandler* susHandler1 = new SusHandler(objects::SUS_1, 1, objects::SPI_COM_IF, spiCookie);
-
- spiCookie =
- new SpiCookie(addresses::SUS_2, gpioIds::CS_SUS_2, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE,
- spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
- SusHandler* susHandler2 = new SusHandler(objects::SUS_2, 2, objects::SPI_COM_IF, spiCookie);
-
- spiCookie =
- new SpiCookie(addresses::SUS_3, gpioIds::CS_SUS_3, std::string(q7s::SPI_DEFAULT_DEV),
- SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
- SusHandler* susHandler3 = new SusHandler(objects::SUS_3, 3, objects::SPI_COM_IF, spiCookie);
-
- spiCookie =
- new SpiCookie(addresses::SUS_4, gpioIds::CS_SUS_4, std::string(q7s::SPI_DEFAULT_DEV),
- SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
- SusHandler* susHandler4 = new SusHandler(objects::SUS_4, 4, objects::SPI_COM_IF, spiCookie);
-
- spiCookie =
- new SpiCookie(addresses::SUS_5, gpioIds::CS_SUS_5, std::string(q7s::SPI_DEFAULT_DEV),
- SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
- SusHandler* susHandler5 = new SusHandler(objects::SUS_5, 5, objects::SPI_COM_IF, spiCookie);
-
- spiCookie =
- new SpiCookie(addresses::SUS_6, gpioIds::CS_SUS_6, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE,
- spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
- SusHandler* susHandler6 = new SusHandler(objects::SUS_6, 6, objects::SPI_COM_IF, spiCookie);
-
- spiCookie =
- new SpiCookie(addresses::SUS_7, gpioIds::CS_SUS_7, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE,
- spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
- SusHandler* susHandler7 = new SusHandler(objects::SUS_7, 7, objects::SPI_COM_IF, spiCookie);
-
- spiCookie =
- new SpiCookie(addresses::SUS_8, gpioIds::CS_SUS_8, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE,
- spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
- SusHandler* susHandler8 = new SusHandler(objects::SUS_8, 8, objects::SPI_COM_IF, spiCookie);
-
- spiCookie =
- new SpiCookie(addresses::SUS_9, gpioIds::CS_SUS_9, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE,
- spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
- SusHandler* susHandler9 = new SusHandler(objects::SUS_9, 9, objects::SPI_COM_IF, spiCookie);
-
- spiCookie =
- new SpiCookie(addresses::SUS_10, gpioIds::CS_SUS_10, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE,
- spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
- SusHandler* susHandler10 = new SusHandler(objects::SUS_10, 10, objects::SPI_COM_IF, spiCookie);
-
- spiCookie =
- new SpiCookie(addresses::SUS_11, gpioIds::CS_SUS_11, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE,
- spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
- SusHandler* susHandler11 = new SusHandler(objects::SUS_11, 11, objects::SPI_COM_IF, spiCookie);
- static_cast(susHandler0);
- static_cast(susHandler1);
- static_cast(susHandler2);
- static_cast(susHandler3);
- static_cast(susHandler4);
- static_cast(susHandler5);
- static_cast(susHandler6);
- static_cast(susHandler7);
- static_cast(susHandler8);
- static_cast(susHandler9);
- static_cast(susHandler10);
- static_cast(susHandler11);
-#if OBSW_TEST_SUS == 1
- susHandler0->setStartUpImmediately();
- susHandler1->setStartUpImmediately();
- susHandler2->setStartUpImmediately();
- susHandler3->setStartUpImmediately();
- susHandler4->setStartUpImmediately();
- susHandler5->setStartUpImmediately();
- susHandler6->setStartUpImmediately();
- susHandler7->setStartUpImmediately();
- susHandler8->setStartUpImmediately();
- susHandler9->setStartUpImmediately();
- susHandler10->setStartUpImmediately();
- susHandler11->setStartUpImmediately();
- susHandler0->setToGoToNormalMode(true);
- susHandler1->setToGoToNormalMode(true);
- susHandler2->setToGoToNormalMode(true);
- susHandler3->setToGoToNormalMode(true);
- susHandler4->setToGoToNormalMode(true);
- susHandler5->setToGoToNormalMode(true);
- susHandler6->setToGoToNormalMode(true);
- susHandler7->setToGoToNormalMode(true);
- susHandler8->setToGoToNormalMode(true);
- susHandler9->setToGoToNormalMode(true);
- susHandler10->setToGoToNormalMode(true);
- susHandler11->setToGoToNormalMode(true);
-#if OBSW_DEBUG_SUS == 1
- susHandler0->enablePeriodicPrintout(true, 3);
- susHandler1->enablePeriodicPrintout(true, 3);
- susHandler2->enablePeriodicPrintout(true, 3);
- susHandler3->enablePeriodicPrintout(true, 3);
- susHandler4->enablePeriodicPrintout(true, 3);
- susHandler5->enablePeriodicPrintout(true, 3);
- susHandler6->enablePeriodicPrintout(true, 3);
- susHandler7->enablePeriodicPrintout(true, 3);
- susHandler8->enablePeriodicPrintout(true, 3);
- susHandler9->enablePeriodicPrintout(true, 3);
- susHandler10->enablePeriodicPrintout(true, 3);
- susHandler11->enablePeriodicPrintout(true, 3);
-#endif
-#endif
-
-#endif /* OBSW_ADD_SUN_SENSORS == 1 */
-}
-
-void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComIF* uartComIF) {
+void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComIF* uartComIF,
+ PowerSwitchIF* pwrSwitcher) {
using namespace gpio;
GpioCookie* gpioCookieAcsBoard = new GpioCookie();
@@ -571,6 +402,8 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI
Levels::LOW);
gpioCookieAcsBoard->addGpio(gpioIds::GNSS_SELECT, gpio);
gpioComIF->addGpios(gpioCookieAcsBoard);
+ AcsBoardFdir* fdir = nullptr;
+ static_cast(fdir);
#if OBSW_ADD_ACS_HANDLERS == 1
std::string spiDev = q7s::SPI_DEFAULT_DEV;
@@ -579,12 +412,15 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI
MGMLIS3MDL::MAX_BUFFER_SIZE, spi::DEFAULT_LIS3_MODE, spi::DEFAULT_LIS3_SPEED);
auto mgmLis3Handler = new MgmLIS3MDLHandler(objects::MGM_0_LIS3_HANDLER, objects::SPI_COM_IF,
spiCookie, spi::LIS3_TRANSITION_DELAY);
+ fdir = new AcsBoardFdir(objects::MGM_0_LIS3_HANDLER);
+ mgmLis3Handler->setCustomFdir(fdir);
+ static_cast(mgmLis3Handler);
#if OBSW_TEST_ACS == 1
mgmLis3Handler->setStartUpImmediately();
mgmLis3Handler->setToGoToNormalMode(true);
+#endif
#if OBSW_DEBUG_ACS == 1
mgmLis3Handler->enablePeriodicPrintouts(true, 10);
-#endif
#endif
spiCookie =
@@ -592,38 +428,48 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI
RM3100::MAX_BUFFER_SIZE, spi::DEFAULT_RM3100_MODE, spi::DEFAULT_RM3100_SPEED);
auto mgmRm3100Handler = new MgmRM3100Handler(objects::MGM_1_RM3100_HANDLER, objects::SPI_COM_IF,
spiCookie, spi::RM3100_TRANSITION_DELAY);
+ fdir = new AcsBoardFdir(objects::MGM_1_RM3100_HANDLER);
+ mgmRm3100Handler->setCustomFdir(fdir);
+ mgmRm3100Handler->setParent(objects::ACS_BOARD_ASS);
+ static_cast(mgmRm3100Handler);
#if OBSW_TEST_ACS == 1
mgmRm3100Handler->setStartUpImmediately();
mgmRm3100Handler->setToGoToNormalMode(true);
+#endif
#if OBSW_DEBUG_ACS == 1
mgmRm3100Handler->enablePeriodicPrintouts(true, 10);
-#endif
#endif
spiCookie =
new SpiCookie(addresses::MGM_2_LIS3, gpioIds::MGM_2_LIS3_CS, spiDev,
MGMLIS3MDL::MAX_BUFFER_SIZE, spi::DEFAULT_LIS3_MODE, spi::DEFAULT_LIS3_SPEED);
- auto mgmLis3Handler2 = new MgmLIS3MDLHandler(objects::MGM_2_LIS3_HANDLER, objects::SPI_COM_IF,
- spiCookie, spi::LIS3_TRANSITION_DELAY);
+ mgmLis3Handler = new MgmLIS3MDLHandler(objects::MGM_2_LIS3_HANDLER, objects::SPI_COM_IF,
+ spiCookie, spi::LIS3_TRANSITION_DELAY);
+ fdir = new AcsBoardFdir(objects::MGM_2_LIS3_HANDLER);
+ mgmLis3Handler->setCustomFdir(fdir);
+ mgmLis3Handler->setParent(objects::ACS_BOARD_ASS);
+ static_cast(mgmLis3Handler);
#if OBSW_TEST_ACS == 1
- mgmLis3Handler2->setStartUpImmediately();
- mgmLis3Handler2->setToGoToNormalMode(true);
+ mgmLis3Handler->setStartUpImmediately();
+ mgmLis3Handler->setToGoToNormalMode(true);
+#endif
#if OBSW_DEBUG_ACS == 1
- mgmLis3Handler2->enablePeriodicPrintouts(true, 10);
+ mgmLis3Handler->enablePeriodicPrintouts(true, 10);
#endif
-#endif
-
spiCookie =
new SpiCookie(addresses::MGM_3_RM3100, gpioIds::MGM_3_RM3100_CS, spiDev,
RM3100::MAX_BUFFER_SIZE, spi::DEFAULT_RM3100_MODE, spi::DEFAULT_RM3100_SPEED);
mgmRm3100Handler = new MgmRM3100Handler(objects::MGM_3_RM3100_HANDLER, objects::SPI_COM_IF,
spiCookie, spi::RM3100_TRANSITION_DELAY);
+ fdir = new AcsBoardFdir(objects::MGM_3_RM3100_HANDLER);
+ mgmRm3100Handler->setCustomFdir(fdir);
+ mgmRm3100Handler->setParent(objects::ACS_BOARD_ASS);
#if OBSW_TEST_ACS == 1
mgmRm3100Handler->setStartUpImmediately();
mgmRm3100Handler->setToGoToNormalMode(true);
+#endif
#if OBSW_DEBUG_ACS == 1
mgmRm3100Handler->enablePeriodicPrintouts(true, 10);
-#endif
#endif
// Commented until ACS board V2 in in clean room again
@@ -633,12 +479,16 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI
spi::DEFAULT_ADIS16507_SPEED);
auto adisHandler = new GyroADIS1650XHandler(objects::GYRO_0_ADIS_HANDLER, objects::SPI_COM_IF,
spiCookie, ADIS1650X::Type::ADIS16505);
+ fdir = new AcsBoardFdir(objects::GYRO_0_ADIS_HANDLER);
+ adisHandler->setCustomFdir(fdir);
+ adisHandler->setParent(objects::ACS_BOARD_ASS);
+ static_cast(adisHandler);
#if OBSW_TEST_ACS == 1
adisHandler->setStartUpImmediately();
adisHandler->setToGoToNormalModeImmediately();
+#endif
#if OBSW_DEBUG_ACS == 1
adisHandler->enablePeriodicPrintouts(true, 10);
-#endif
#endif
// Gyro 1 Side A
@@ -647,19 +497,27 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI
spi::DEFAULT_L3G_MODE, spi::DEFAULT_L3G_SPEED);
auto gyroL3gHandler = new GyroHandlerL3GD20H(objects::GYRO_1_L3G_HANDLER, objects::SPI_COM_IF,
spiCookie, spi::L3G_TRANSITION_DELAY);
+ fdir = new AcsBoardFdir(objects::GYRO_1_L3G_HANDLER);
+ gyroL3gHandler->setCustomFdir(fdir);
+ gyroL3gHandler->setParent(objects::ACS_BOARD_ASS);
+ static_cast(gyroL3gHandler);
#if OBSW_TEST_ACS == 1
gyroL3gHandler->setStartUpImmediately();
gyroL3gHandler->setToGoToNormalMode(true);
+#endif
#if OBSW_DEBUG_ACS == 1
gyroL3gHandler->enablePeriodicPrintouts(true, 10);
#endif
-#endif
+
// Gyro 2 Side B
spiCookie = new SpiCookie(addresses::GYRO_2_ADIS, gpioIds::GYRO_2_ADIS_CS, spiDev,
ADIS1650X::MAXIMUM_REPLY_SIZE, spi::DEFAULT_ADIS16507_MODE,
spi::DEFAULT_ADIS16507_SPEED);
adisHandler = new GyroADIS1650XHandler(objects::GYRO_2_ADIS_HANDLER, objects::SPI_COM_IF,
spiCookie, ADIS1650X::Type::ADIS16505);
+ fdir = new AcsBoardFdir(objects::GYRO_2_ADIS_HANDLER);
+ adisHandler->setCustomFdir(fdir);
+ adisHandler->setParent(objects::ACS_BOARD_ASS);
#if OBSW_TEST_ACS == 1
adisHandler->setStartUpImmediately();
adisHandler->setToGoToNormalModeImmediately();
@@ -670,12 +528,15 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI
spi::DEFAULT_L3G_MODE, spi::DEFAULT_L3G_SPEED);
gyroL3gHandler = new GyroHandlerL3GD20H(objects::GYRO_3_L3G_HANDLER, objects::SPI_COM_IF,
spiCookie, spi::L3G_TRANSITION_DELAY);
+ fdir = new AcsBoardFdir(objects::GYRO_3_L3G_HANDLER);
+ gyroL3gHandler->setCustomFdir(fdir);
+ gyroL3gHandler->setParent(objects::ACS_BOARD_ASS);
#if OBSW_TEST_ACS == 1
gyroL3gHandler->setStartUpImmediately();
gyroL3gHandler->setToGoToNormalMode(true);
+#endif
#if OBSW_DEBUG_ACS == 1
gyroL3gHandler->enablePeriodicPrintouts(true, 10);
-#endif
#endif
bool debugGps = false;
@@ -691,6 +552,14 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI
auto gpsHandler0 =
new GPSHyperionLinuxController(objects::GPS_CONTROLLER, objects::NO_OBJECT, debugGps);
gpsHandler0->setResetPinTriggerFunction(gps::triggerGpioResetPin, &resetArgsGnss0);
+
+ AcsBoardHelper acsBoardHelper = AcsBoardHelper(
+ objects::MGM_0_LIS3_HANDLER, objects::MGM_1_RM3100_HANDLER, objects::MGM_2_LIS3_HANDLER,
+ objects::MGM_3_RM3100_HANDLER, objects::GYRO_0_ADIS_HANDLER, objects::GYRO_1_L3G_HANDLER,
+ objects::GYRO_2_ADIS_HANDLER, objects::GYRO_3_L3G_HANDLER, objects::GPS_CONTROLLER);
+ auto acsAss = new AcsBoardAssembly(objects::ACS_BOARD_ASS, objects::NO_OBJECT, pwrSwitcher,
+ acsBoardHelper, gpioComIF);
+ static_cast(acsAss);
#endif /* OBSW_ADD_ACS_HANDLERS == 1 */
}
@@ -736,7 +605,7 @@ void ObjectFactory::createHeaterComponents() {
heaterGpiosCookie->addGpio(gpioIds::HEATER_7, gpio);
new HeaterHandler(objects::HEATER_HANDLER, objects::GPIO_IF, heaterGpiosCookie,
- objects::PCDU_HANDLER, pcduSwitches::TCS_BOARD_8V_HEATER_IN);
+ objects::PCDU_HANDLER, pcdu::Switches::PDU2_CH3_TCS_BOARD_HEATER_IN_8V);
}
void ObjectFactory::createSolarArrayDeploymentComponents() {
@@ -756,210 +625,57 @@ void ObjectFactory::createSolarArrayDeploymentComponents() {
// TODO: Find out burn time. For now set to 1000 ms.
new SolarArrayDeploymentHandler(objects::SOLAR_ARRAY_DEPL_HANDLER, objects::GPIO_IF,
solarArrayDeplCookie, objects::PCDU_HANDLER,
- pcduSwitches::DEPLOYMENT_MECHANISM, gpioIds::DEPLSA1,
- gpioIds::DEPLSA2, 1000);
+ pcdu::Switches::PDU2_CH5_DEPLOYMENT_MECHANISM_8V,
+ gpioIds::DEPLSA1, gpioIds::DEPLSA2, 1000);
}
-void ObjectFactory::createSyrlinksComponents() {
+void ObjectFactory::createSyrlinksComponents(PowerSwitchIF* pwrSwitcher) {
UartCookie* syrlinksUartCookie =
- new UartCookie(objects::SYRLINKS_HK_HANDLER, q7s::UART_SYRLINKS_DEV, UartModes::NON_CANONICAL,
- uart::SYRLINKS_BAUD, SYRLINKS::MAX_REPLY_SIZE);
+ new UartCookie(objects::SYRLINKS_HK_HANDLER, q7s::UART_SYRLINKS_DEV, uart::SYRLINKS_BAUD,
+ syrlinks::MAX_REPLY_SIZE, UartModes::NON_CANONICAL);
syrlinksUartCookie->setParityEven();
- new SyrlinksHkHandler(objects::SYRLINKS_HK_HANDLER, objects::UART_COM_IF, syrlinksUartCookie);
+ auto syrlinksHandler = new SyrlinksHkHandler(objects::SYRLINKS_HK_HANDLER, objects::UART_COM_IF,
+ syrlinksUartCookie, pcdu::PDU1_CH1_SYRLINKS_12V);
+ syrlinksHandler->setPowerSwitcher(pwrSwitcher);
}
-void ObjectFactory::createRtdComponents(LinuxLibgpioIF* gpioComIF) {
+void ObjectFactory::createPayloadComponents(LinuxLibgpioIF* gpioComIF) {
using namespace gpio;
- GpioCookie* rtdGpioCookie = new GpioCookie;
+ std::stringstream consumer;
+#if OBSW_ADD_PLOC_MPSOC == 1
+ consumer << "0x" << std::hex << objects::PLOC_MPSOC_HANDLER;
+ auto gpioConfigMPSoC = new GpiodRegularByLineName(q7s::gpioNames::ENABLE_MPSOC_UART,
+ consumer.str(), Direction::OUT, Levels::HIGH);
+ auto mpsocGpioCookie = new GpioCookie;
+ mpsocGpioCookie->addGpio(gpioIds::ENABLE_MPSOC_UART, gpioConfigMPSoC);
+ gpioComIF->addGpios(mpsocGpioCookie);
+ auto mpsocCookie =
+ new UartCookie(objects::PLOC_MPSOC_HANDLER, q7s::UART_PLOC_MPSOC_DEV, uart::PLOC_MPSOC_BAUD,
+ mpsoc::MAX_REPLY_SIZE, UartModes::NON_CANONICAL);
+ mpsocCookie->setNoFixedSizeReply();
+ auto plocMpsocHelper = new PlocMPSoCHelper(objects::PLOC_MPSOC_HELPER);
+ new PlocMPSoCHandler(objects::PLOC_MPSOC_HANDLER, objects::UART_COM_IF, mpsocCookie,
+ plocMpsocHelper, Gpio(gpioIds::ENABLE_MPSOC_UART, gpioComIF),
+ objects::PLOC_SUPERVISOR_HANDLER);
+#endif /* OBSW_ADD_PLOC_MPSOC == 1 */
- GpioCallback* gpioRtdIc0 = new GpioCallback("Chip select RTD IC0", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- rtdGpioCookie->addGpio(gpioIds::RTD_IC_3, gpioRtdIc0);
- GpioCallback* gpioRtdIc1 = new GpioCallback("Chip select RTD IC1", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- rtdGpioCookie->addGpio(gpioIds::RTD_IC_4, gpioRtdIc1);
- GpioCallback* gpioRtdIc2 = new GpioCallback("Chip select RTD IC2", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- rtdGpioCookie->addGpio(gpioIds::RTD_IC_5, gpioRtdIc2);
- GpioCallback* gpioRtdIc3 = new GpioCallback("Chip select RTD IC3", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- rtdGpioCookie->addGpio(gpioIds::RTD_IC_6, gpioRtdIc3);
- GpioCallback* gpioRtdIc4 = new GpioCallback("Chip select RTD IC4", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- rtdGpioCookie->addGpio(gpioIds::RTD_IC_7, gpioRtdIc4);
- GpioCallback* gpioRtdIc5 = new GpioCallback("Chip select RTD IC5", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- rtdGpioCookie->addGpio(gpioIds::RTD_IC_8, gpioRtdIc5);
- GpioCallback* gpioRtdIc6 = new GpioCallback("Chip select RTD IC6", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- rtdGpioCookie->addGpio(gpioIds::RTD_IC_9, gpioRtdIc6);
- GpioCallback* gpioRtdIc7 = new GpioCallback("Chip select RTD IC7", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- rtdGpioCookie->addGpio(gpioIds::RTD_IC_10, gpioRtdIc7);
- GpioCallback* gpioRtdIc8 = new GpioCallback("Chip select RTD IC8", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- rtdGpioCookie->addGpio(gpioIds::RTD_IC_11, gpioRtdIc8);
- GpioCallback* gpioRtdIc9 = new GpioCallback("Chip select RTD IC9", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- rtdGpioCookie->addGpio(gpioIds::RTD_IC_12, gpioRtdIc9);
- GpioCallback* gpioRtdIc10 = new GpioCallback("Chip select RTD IC10", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- rtdGpioCookie->addGpio(gpioIds::RTD_IC_13, gpioRtdIc10);
- GpioCallback* gpioRtdIc11 = new GpioCallback("Chip select RTD IC11", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- rtdGpioCookie->addGpio(gpioIds::RTD_IC_14, gpioRtdIc11);
- GpioCallback* gpioRtdIc12 = new GpioCallback("Chip select RTD IC12", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- rtdGpioCookie->addGpio(gpioIds::RTD_IC_15, gpioRtdIc12);
- GpioCallback* gpioRtdIc13 = new GpioCallback("Chip select RTD IC13", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- rtdGpioCookie->addGpio(gpioIds::RTD_IC_16, gpioRtdIc13);
- GpioCallback* gpioRtdIc14 = new GpioCallback("Chip select RTD IC14", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- rtdGpioCookie->addGpio(gpioIds::RTD_IC_17, gpioRtdIc14);
- GpioCallback* gpioRtdIc15 = new GpioCallback("Chip select RTD IC15", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- rtdGpioCookie->addGpio(gpioIds::RTD_IC_18, gpioRtdIc15);
-
- gpioComIF->addGpios(rtdGpioCookie);
-
-#if OBSW_ADD_RTD_DEVICES == 1
- SpiCookie* spiRtdIc0 =
- new SpiCookie(addresses::RTD_IC_3, gpioIds::RTD_IC_3, q7s::SPI_DEFAULT_DEV,
- Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
- SpiCookie* spiRtdIc1 =
- new SpiCookie(addresses::RTD_IC_4, gpioIds::RTD_IC_4, q7s::SPI_DEFAULT_DEV,
- Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
- SpiCookie* spiRtdIc2 =
- new SpiCookie(addresses::RTD_IC_5, gpioIds::RTD_IC_5, q7s::SPI_DEFAULT_DEV,
- Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
- SpiCookie* spiRtdIc3 =
- new SpiCookie(addresses::RTD_IC_6, gpioIds::RTD_IC_6, q7s::SPI_DEFAULT_DEV,
- Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
- SpiCookie* spiRtdIc4 =
- new SpiCookie(addresses::RTD_IC_7, gpioIds::RTD_IC_7, q7s::SPI_DEFAULT_DEV,
- Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
- SpiCookie* spiRtdIc5 =
- new SpiCookie(addresses::RTD_IC_8, gpioIds::RTD_IC_8, q7s::SPI_DEFAULT_DEV,
- Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
- SpiCookie* spiRtdIc6 =
- new SpiCookie(addresses::RTD_IC_9, gpioIds::RTD_IC_9, q7s::SPI_DEFAULT_DEV,
- Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
- SpiCookie* spiRtdIc7 =
- new SpiCookie(addresses::RTD_IC_10, gpioIds::RTD_IC_10, q7s::SPI_DEFAULT_DEV,
- Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
- SpiCookie* spiRtdIc8 =
- new SpiCookie(addresses::RTD_IC_11, gpioIds::RTD_IC_11, q7s::SPI_DEFAULT_DEV,
- Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
- SpiCookie* spiRtdIc9 =
- new SpiCookie(addresses::RTD_IC_12, gpioIds::RTD_IC_12, q7s::SPI_DEFAULT_DEV,
- Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
- SpiCookie* spiRtdIc10 =
- new SpiCookie(addresses::RTD_IC_13, gpioIds::RTD_IC_13, q7s::SPI_DEFAULT_DEV,
- Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
- SpiCookie* spiRtdIc11 =
- new SpiCookie(addresses::RTD_IC_14, gpioIds::RTD_IC_14, q7s::SPI_DEFAULT_DEV,
- Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
- SpiCookie* spiRtdIc12 =
- new SpiCookie(addresses::RTD_IC_15, gpioIds::RTD_IC_15, q7s::SPI_DEFAULT_DEV,
- Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
- SpiCookie* spiRtdIc13 =
- new SpiCookie(addresses::RTD_IC_16, gpioIds::RTD_IC_16, std::string(q7s::SPI_DEFAULT_DEV),
- Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
- SpiCookie* spiRtdIc14 =
- new SpiCookie(addresses::RTD_IC_17, gpioIds::RTD_IC_17, q7s::SPI_DEFAULT_DEV,
- Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
- SpiCookie* spiRtdIc15 =
- new SpiCookie(addresses::RTD_IC_18, gpioIds::RTD_IC_18, q7s::SPI_DEFAULT_DEV,
- Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
-
- Max31865PT1000Handler* rtdIc0 =
- new Max31865PT1000Handler(objects::RTD_IC_3, objects::SPI_COM_IF, spiRtdIc0);
- Max31865PT1000Handler* rtdIc1 =
- new Max31865PT1000Handler(objects::RTD_IC_4, objects::SPI_COM_IF, spiRtdIc1);
- Max31865PT1000Handler* rtdIc2 =
- new Max31865PT1000Handler(objects::RTD_IC_5, objects::SPI_COM_IF, spiRtdIc2);
- Max31865PT1000Handler* rtdIc3 =
- new Max31865PT1000Handler(objects::RTD_IC_6, objects::SPI_COM_IF, spiRtdIc3);
- Max31865PT1000Handler* rtdIc4 =
- new Max31865PT1000Handler(objects::RTD_IC_7, objects::SPI_COM_IF, spiRtdIc4);
- Max31865PT1000Handler* rtdIc5 =
- new Max31865PT1000Handler(objects::RTD_IC_8, objects::SPI_COM_IF, spiRtdIc5);
- Max31865PT1000Handler* rtdIc6 =
- new Max31865PT1000Handler(objects::RTD_IC_9, objects::SPI_COM_IF, spiRtdIc6);
- Max31865PT1000Handler* rtdIc7 =
- new Max31865PT1000Handler(objects::RTD_IC_10, objects::SPI_COM_IF, spiRtdIc7);
- Max31865PT1000Handler* rtdIc8 =
- new Max31865PT1000Handler(objects::RTD_IC_11, objects::SPI_COM_IF, spiRtdIc8);
- Max31865PT1000Handler* rtdIc9 =
- new Max31865PT1000Handler(objects::RTD_IC_12, objects::SPI_COM_IF, spiRtdIc9);
- Max31865PT1000Handler* rtdIc10 =
- new Max31865PT1000Handler(objects::RTD_IC_13, objects::SPI_COM_IF, spiRtdIc10);
- Max31865PT1000Handler* rtdIc11 =
- new Max31865PT1000Handler(objects::RTD_IC_14, objects::SPI_COM_IF, spiRtdIc11);
- Max31865PT1000Handler* rtdIc12 =
- new Max31865PT1000Handler(objects::RTD_IC_15, objects::SPI_COM_IF, spiRtdIc12);
- Max31865PT1000Handler* rtdIc13 =
- new Max31865PT1000Handler(objects::RTD_IC_16, objects::SPI_COM_IF, spiRtdIc13);
- Max31865PT1000Handler* rtdIc14 =
- new Max31865PT1000Handler(objects::RTD_IC_17, objects::SPI_COM_IF, spiRtdIc14);
- Max31865PT1000Handler* rtdIc15 =
- new Max31865PT1000Handler(objects::RTD_IC_18, objects::SPI_COM_IF, spiRtdIc15);
-
-#if OBSW_TEST_RTD == 1
- rtdIc0->setStartUpImmediately();
- rtdIc1->setStartUpImmediately();
- rtdIc2->setStartUpImmediately();
- rtdIc3->setStartUpImmediately();
- rtdIc4->setStartUpImmediately();
- rtdIc5->setStartUpImmediately();
- rtdIc6->setStartUpImmediately();
- rtdIc7->setStartUpImmediately();
- rtdIc8->setStartUpImmediately();
- rtdIc9->setStartUpImmediately();
- rtdIc10->setStartUpImmediately();
- rtdIc11->setStartUpImmediately();
- rtdIc12->setStartUpImmediately();
- rtdIc13->setStartUpImmediately();
- rtdIc14->setStartUpImmediately();
- rtdIc15->setStartUpImmediately();
-
- rtdIc0->setInstantNormal(true);
- rtdIc1->setInstantNormal(true);
- rtdIc2->setInstantNormal(true);
- rtdIc3->setInstantNormal(true);
- rtdIc4->setInstantNormal(true);
- rtdIc5->setInstantNormal(true);
- rtdIc6->setInstantNormal(true);
- rtdIc7->setInstantNormal(true);
- rtdIc8->setInstantNormal(true);
- rtdIc9->setInstantNormal(true);
- rtdIc10->setInstantNormal(true);
- rtdIc11->setInstantNormal(true);
- rtdIc12->setInstantNormal(true);
- rtdIc13->setInstantNormal(true);
- rtdIc14->setInstantNormal(true);
- rtdIc15->setInstantNormal(true);
-#endif
-
- static_cast(rtdIc0);
- static_cast(rtdIc1);
- static_cast(rtdIc2);
- static_cast(rtdIc3);
- static_cast(rtdIc4);
- static_cast(rtdIc5);
- static_cast(rtdIc6);
- static_cast(rtdIc7);
- static_cast(rtdIc8);
- static_cast(rtdIc9);
- static_cast(rtdIc10);
- static_cast(rtdIc11);
- static_cast(rtdIc12);
- static_cast(rtdIc13);
- static_cast(rtdIc14);
- static_cast(rtdIc15);
-#endif
+#if OBSW_ADD_PLOC_SUPERVISOR == 1
+ consumer << "0x" << std::hex << objects::PLOC_SUPERVISOR_HANDLER;
+ auto gpioConfigSupv = new GpiodRegularByLineName(q7s::gpioNames::ENABLE_SUPV_UART, consumer.str(),
+ Direction::OUT, Levels::HIGH);
+ auto supvGpioCookie = new GpioCookie;
+ supvGpioCookie->addGpio(gpioIds::ENABLE_SUPV_UART, gpioConfigSupv);
+ gpioComIF->addGpios(supvGpioCookie);
+ auto supervisorCookie = new UartCookie(objects::PLOC_SUPERVISOR_HANDLER,
+ q7s::UART_PLOC_SUPERVSIOR_DEV, uart::PLOC_SUPERVISOR_BAUD,
+ supv::MAX_PACKET_SIZE * 20, UartModes::NON_CANONICAL);
+ supervisorCookie->setNoFixedSizeReply();
+ new PlocSupervisorHandler(objects::PLOC_SUPERVISOR_HANDLER, objects::UART_COM_IF,
+ supervisorCookie, Gpio(gpioIds::ENABLE_SUPV_UART, gpioComIF),
+ pcdu::PDU1_CH6_PLOC_12V);
+#endif /* OBSW_ADD_PLOC_SUPERVISOR == 1 */
+ static_cast(consumer);
}
void ObjectFactory::createReactionWheelComponents(LinuxLibgpioIF* gpioComIF) {
@@ -1113,9 +829,15 @@ void ObjectFactory::createCcsdsComponents(LinuxLibgpioIF* gpioComIF) {
AxiPtmeConfig* axiPtmeConfig =
new AxiPtmeConfig(objects::AXI_PTME_CONFIG, q7s::UIO_PTME, q7s::uiomapids::PTME_CONFIG);
PtmeConfig* ptmeConfig = new PtmeConfig(objects::PTME_CONFIG, axiPtmeConfig);
+#if OBSW_ENABLE_SYRLINKS_TRANSMIT_TIMEOUT == 1
+ // Set to high value when not sending via syrlinks
+ static const uint32_t TRANSMITTER_TIMEOUT = 86400000; // 1 day
+#else
+ static const uint32_t TRANSMITTER_TIMEOUT = 900000; // 15 minutes
+#endif
CCSDSHandler* ccsdsHandler = new CCSDSHandler(
objects::CCSDS_HANDLER, objects::PTME, objects::CCSDS_PACKET_DISTRIBUTOR, ptmeConfig,
- gpioComIF, gpioIds::RS485_EN_TX_CLOCK, gpioIds::RS485_EN_TX_DATA);
+ gpioComIF, gpioIds::RS485_EN_TX_CLOCK, gpioIds::RS485_EN_TX_DATA, TRANSMITTER_TIMEOUT);
VirtualChannel* vc = nullptr;
vc = new VirtualChannel(ccsds::VC0, common::VC0_QUEUE_SIZE, objects::CCSDS_HANDLER);
@@ -1140,7 +862,6 @@ void ObjectFactory::createCcsdsComponents(LinuxLibgpioIF* gpioComIF) {
new PdecHandler(objects::PDEC_HANDLER, objects::CCSDS_HANDLER, gpioComIF, gpioIds::PDEC_RESET,
q7s::UIO_PDEC_CONFIG_MEMORY, q7s::UIO_PDEC_RAM, q7s::UIO_PDEC_REGISTERS);
-#if BOARD_TE0720 == 0
GpioCookie* gpioRS485Chip = new GpioCookie;
gpio = new GpiodRegularByLineName(q7s::gpioNames::RS485_EN_TX_CLOCK, "RS485 Transceiver",
Direction::OUT, Levels::LOW);
@@ -1158,10 +879,10 @@ void ObjectFactory::createCcsdsComponents(LinuxLibgpioIF* gpioComIF) {
gpioRS485Chip->addGpio(gpioIds::RS485_EN_RX_DATA, gpio);
gpioComIF->addGpios(gpioRS485Chip);
-#endif /* BOARD_TE0720 == 0 */
}
-void ObjectFactory::createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF) {
+void ObjectFactory::createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF,
+ PowerSwitchIF* pwrSwitcher) {
using namespace gpio;
// Create all GPIO components first
GpioCookie* plPcduGpios = new GpioCookie;
@@ -1207,116 +928,24 @@ void ObjectFactory::createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF*
q7s::SPI_DEFAULT_DEV, plpcdu::MAX_ADC_REPLY_SIZE,
spi::DEFAULT_MAX_1227_MODE, spi::PL_PCDU_MAX_1227_SPEED);
// Create device handler components
- auto plPcduHandler =
- new PayloadPcduHandler(objects::PLPCDU_HANDLER, objects::SPI_COM_IF, spiCookie, gpioComIF,
- SdCardManager::instance(), false);
+ auto plPcduHandler = new PayloadPcduHandler(
+ objects::PLPCDU_HANDLER, objects::SPI_COM_IF, spiCookie, gpioComIF, SdCardManager::instance(),
+ pwrSwitcher, pcdu::Switches::PDU2_CH1_PL_PCDU_BATT_0_14V8,
+ pcdu::Switches::PDU2_CH6_PL_PCDU_BATT_1_14V8, false);
spiCookie->setCallbackMode(PayloadPcduHandler::extConvAsTwoCallback, plPcduHandler);
- static_cast(plPcduHandler);
+// plPcduHandler->enablePeriodicPrintout(true, 5);
+// static_cast(plPcduHandler);
#if OBSW_TEST_PL_PCDU == 1
plPcduHandler->setStartUpImmediately();
+#endif
#if OBSW_DEBUG_PL_PCDU == 1
plPcduHandler->setToGoToNormalModeImmediately(true);
- plPcduHandler->enablePeriodicPrintout(true, 5);
-#endif
+ plPcduHandler->enablePeriodicPrintout(true, 10);
#endif
}
void ObjectFactory::createTestComponents(LinuxLibgpioIF* gpioComIF) {
-#if BOARD_TE0720 == 0
new Q7STestTask(objects::TEST_TASK);
-#endif
-
-#if BOARD_TE0720 == 1 && OBSW_TEST_LIBGPIOD == 1
-#if OBSW_TEST_GPIO_OPEN_BYLABEL == 1
- /* Configure MIO0 as input */
- GpiodRegular* testGpio = new GpiodRegular("MIO0", Direction::OUT, 0, "/amba_pl/gpio@41200000", 0);
-#elif OBSW_TEST_GPIO_OPEN_BY_LINE_NAME
- GpiodRegularByLineName* testGpio =
- new GpiodRegularByLineName("test-name", "gpio-test", Direction::OUT, 0);
-#else
- /* Configure MIO0 as input */
- GpiodRegular* testGpio = new GpiodRegular("gpiochip0", 0, "MIO0", gpio::IN, 0);
-#endif /* OBSW_TEST_GPIO_LABEL == 1 */
- GpioCookie* gpioCookie = new GpioCookie;
- gpioCookie->addGpio(gpioIds::TEST_ID_0, testGpio);
- new LibgpiodTest(objects::LIBGPIOD_TEST, objects::GPIO_IF, gpioCookie);
-#endif
-
-#if BOARD_TE0720 == 1 && OBSW_TEST_SUS == 1
- GpioCookie* gpioCookieSus = new GpioCookie;
- GpiodRegular* chipSelectSus = new GpiodRegular(
- std::string("gpiochip1"), 9, std::string("Chip Select Sus Sensor"), Direction::OUT, 1);
- gpioCookieSus->addGpio(gpioIds::CS_SUS_0, chipSelectSus);
- gpioComIF->addGpios(gpioCookieSus);
-
- SpiCookie* spiCookieSus =
- new SpiCookie(addresses::SUS_0, std::string("/dev/spidev1.0"), SUS::MAX_CMD_SIZE,
- spi::DEFAULT_MAX_1227_MODE, spi::DEFAULT_MAX_1227_SPEED);
-
- new SusHandler(objects::SUS_0, objects::SPI_COM_IF, spiCookieSus, gpioComIF, gpioIds::CS_SUS_0);
-#endif
-
-#if BOARD_TE0720 == 1 && OBSW_TEST_CCSDS_BRIDGE == 1
- GpioCookie* gpioCookieCcsdsIp = new GpioCookie;
- GpiodRegular* papbBusyN =
- new GpiodRegular(std::string("gpiochip0"), 0, std::string("PAPBBusy_VC0"));
- gpioCookieCcsdsIp->addGpio(gpioIds::PAPB_BUSY_N, papbBusyN);
- GpiodRegular* papbEmpty =
- new GpiodRegular(std::string("gpiochip0"), 1, std::string("PAPBEmpty_VC0"));
- gpioCookieCcsdsIp->addGpio(gpioIds::PAPB_EMPTY, papbEmpty);
- gpioComIF->addGpios(gpioCookieCcsdsIp);
-
- new CCSDSIPCoreBridge(objects::CCSDS_IP_CORE_BRIDGE, objects::CCSDS_PACKET_DISTRIBUTOR,
- objects::TM_STORE, objects::TC_STORE, gpioComIF, std::string("/dev/uio0"),
- gpioIds::PAPB_BUSY_N, gpioIds::PAPB_EMPTY);
-#endif
-
-#if BOARD_TE0720 == 1 && OBSW_TEST_RAD_SENSOR == 1
- GpioCookie* gpioCookieRadSensor = new GpioCookie;
- GpiodRegular* chipSelectRadSensor = new GpiodRegular(
- std::string("gpiochip1"), 0, std::string("Chip select radiation sensor"), Direction::OUT, 1);
- gpioCookieRadSensor->addGpio(gpioIds::CS_RAD_SENSOR, chipSelectRadSensor);
- gpioComIF->addGpios(gpioCookieRadSensor);
-
- SpiCookie* spiCookieRadSensor =
- new SpiCookie(addresses::RAD_SENSOR, gpioIds::CS_RAD_SENSOR, std::string("/dev/spidev1.0"),
- SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::DEFAULT_MAX_1227_SPEED);
-
- RadiationSensorHandler* radSensor =
- new RadiationSensorHandler(objects::RAD_SENSOR, objects::SPI_COM_IF, spiCookieRadSensor);
- radSensor->setStartUpImmediately();
-#endif
-
-#if BOARD_TE0720 == 1 && OBSW_ADD_PLOC_MPSOC == 1
- UartCookie* plocUartCookie =
- new UartCookie(std::string("/dev/ttyPS1"), 115200, PLOC_MPSOC::MAX_REPLY_SIZE);
- /* Testing PlocMPSoCHandler on TE0720-03-1CFA */
- PlocMPSoCHandler* mpsocPlocHandler =
- new PlocMPSoCHandler(objects::PLOC_MPSOC_HANDLER, objects::UART_COM_IF, plocUartCookie);
- mpsocPlocHandler->setStartUpImmediately();
-#endif
-
-#if BOARD_TE0720 == 1 && OBSW_TEST_TE7020_HEATER == 1
- /* Configuration for MIO0 on TE0720-03-1CFA */
- GpiodRegular* heaterGpio =
- new GpiodRegular(std::string("gpiochip0"), 0, std::string("MIO0"), gpio::IN, 0);
- GpioCookie* gpioCookie = new GpioCookie;
- gpioCookie->addGpio(gpioIds::HEATER_0, heaterGpio);
- new HeaterHandler(objects::HEATER_HANDLER, objects::GPIO_IF, gpioCookie, objects::PCDU_HANDLER,
- pcduSwitches::TCS_BOARD_8V_HEATER_IN);
-#endif
-
-#if BOARD_TE0720 == 1 && OBSW_ADD_PLOC_SUPERVISOR == 1
- /* Configuration for MIO0 on TE0720-03-1CFA */
- UartCookie* plocSupervisorCookie =
- new UartCookie(objects::PLOC_SUPERVISOR_HANDLER, std::string("/dev/ttyPS1"),
- UartModes::NON_CANONICAL, 115200, PLOC_SPV::MAX_PACKET_SIZE * 20);
- plocSupervisorCookie->setNoFixedSizeReply();
- PlocSupervisorHandler* plocSupervisor = new PlocSupervisorHandler(
- objects::PLOC_SUPERVISOR_HANDLER, objects::UART_COM_IF, plocSupervisorCookie);
- plocSupervisor->setStartUpImmediately();
-#endif
-
#if OBSW_ADD_SPI_TEST_CODE == 1
new SpiTestClass(objects::SPI_TEST, gpioComIF);
#endif
@@ -1327,3 +956,13 @@ void ObjectFactory::createTestComponents(LinuxLibgpioIF* gpioComIF) {
new UartTestClass(objects::UART_TEST);
#endif
}
+
+void ObjectFactory::testAcsBrdAss(AcsBoardAssembly* acsAss) {
+ CommandMessage msg;
+ ModeMessage::setModeMessage(&msg, ModeMessage::CMD_MODE_COMMAND, DeviceHandlerIF::MODE_NORMAL,
+ duallane::A_SIDE);
+ ReturnValue_t result = MessageQueueSenderIF::sendMessage(acsAss->getCommandQueue(), &msg);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ sif::warning << "Sending mode command failed" << std::endl;
+ }
+}
diff --git a/bsp_q7s/core/ObjectFactory.h b/bsp_q7s/core/ObjectFactory.h
index ecc92f01..a812be35 100644
--- a/bsp_q7s/core/ObjectFactory.h
+++ b/bsp_q7s/core/ObjectFactory.h
@@ -5,6 +5,8 @@ class LinuxLibgpioIF;
class UartComIF;
class SpiComIF;
class I2cComIF;
+class PowerSwitchIF;
+class AcsBoardAssembly;
namespace ObjectFactory {
@@ -13,21 +15,23 @@ void produce(void* args);
void createCommunicationInterfaces(LinuxLibgpioIF** gpioComIF, UartComIF** uartComIF,
SpiComIF** spiComIF, I2cComIF** i2cComIF);
-
-void createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF);
+void createPcduComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF** pwrSwitcher);
+void createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF,
+ PowerSwitchIF* pwrSwitcher);
void createTmpComponents();
-void createPcduComponents(LinuxLibgpioIF* gpioComIF);
void createRadSensorComponent(LinuxLibgpioIF* gpioComIF);
-void createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF);
-void createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComIF* uartComIF);
+void createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComIF* uartComIF,
+ PowerSwitchIF* pwrSwitcher);
void createHeaterComponents();
void createSolarArrayDeploymentComponents();
-void createSyrlinksComponents();
-void createRtdComponents(LinuxLibgpioIF* gpioComIF);
+void createSyrlinksComponents(PowerSwitchIF* pwrSwitcher);
+void createPayloadComponents(LinuxLibgpioIF* gpioComIF);
void createReactionWheelComponents(LinuxLibgpioIF* gpioComIF);
void createCcsdsComponents(LinuxLibgpioIF* gpioComIF);
void createTestComponents(LinuxLibgpioIF* gpioComIF);
+void testAcsBrdAss(AcsBoardAssembly* assAss);
+
}; // namespace ObjectFactory
#endif /* BSP_Q7S_OBJECTFACTORY_H_ */
diff --git a/bsp_q7s/core/obsw.cpp b/bsp_q7s/core/obsw.cpp
index 04163a82..359d04c2 100644
--- a/bsp_q7s/core/obsw.cpp
+++ b/bsp_q7s/core/obsw.cpp
@@ -6,21 +6,18 @@
#include "InitMission.h"
#include "OBSWConfig.h"
#include "OBSWVersion.h"
-#include "fsfw/FSFWVersion.h"
#include "fsfw/tasks/TaskFactory.h"
-#include "watchdogConf.h"
+#include "fsfw/version.h"
+#include "watchdog/definitions.h"
static int OBSW_ALREADY_RUNNING = -2;
int obsw::obsw() {
+ using namespace fsfw;
std::cout << "-- EIVE OBSW --" << std::endl;
-#if BOARD_TE0720 == 0
std::cout << "-- Compiled for Linux (Xiphos Q7S) --" << std::endl;
-#else
- std::cout << "-- Compiled for Linux (TE0720) --" << std::endl;
-#endif
std::cout << "-- OBSW v" << SW_VERSION << "." << SW_SUBVERSION << "." << SW_REVISION << ", FSFW v"
- << FSFW_VERSION << "." << FSFW_SUBVERSION << "." << FSFW_REVISION << "--" << std::endl;
+ << FSFW_VERSION << "--" << std::endl;
std::cout << "-- " << __DATE__ << " " << __TIME__ << " --" << std::endl;
#if Q7S_CHECK_FOR_ALREADY_RUNNING_IMG == 1
diff --git a/bsp_q7s/memory/CMakeLists.txt b/bsp_q7s/memory/CMakeLists.txt
index 0658242a..a0d4f66f 100644
--- a/bsp_q7s/memory/CMakeLists.txt
+++ b/bsp_q7s/memory/CMakeLists.txt
@@ -2,4 +2,5 @@ target_sources(${OBSW_NAME} PRIVATE
FileSystemHandler.cpp
SdCardManager.cpp
scratchApi.cpp
+ FilesystemHelper.cpp
)
\ No newline at end of file
diff --git a/bsp_q7s/memory/FileSystemHandler.h b/bsp_q7s/memory/FileSystemHandler.h
index 6973c3c8..282cddba 100644
--- a/bsp_q7s/memory/FileSystemHandler.h
+++ b/bsp_q7s/memory/FileSystemHandler.h
@@ -6,6 +6,7 @@
#include "OBSWConfig.h"
#include "SdCardManager.h"
+#include "eive/definitions.h"
#include "fsfw/ipc/MessageQueueIF.h"
#include "fsfw/memory/HasFileSystemIF.h"
#include "fsfw/objectmanager/SystemObject.h"
diff --git a/bsp_q7s/memory/FilesystemHelper.cpp b/bsp_q7s/memory/FilesystemHelper.cpp
new file mode 100644
index 00000000..4b9140f1
--- /dev/null
+++ b/bsp_q7s/memory/FilesystemHelper.cpp
@@ -0,0 +1,40 @@
+#include "FilesystemHelper.h"
+
+#include
+#include
+
+#include "bsp_q7s/memory/SdCardManager.h"
+#include "fsfw/serviceinterface/ServiceInterfaceStream.h"
+
+FilesystemHelper::FilesystemHelper() {}
+
+FilesystemHelper::~FilesystemHelper() {}
+
+ReturnValue_t FilesystemHelper::checkPath(std::string path) {
+ SdCardManager* sdcMan = SdCardManager::instance();
+ if (sdcMan == nullptr) {
+ sif::warning << "FilesystemHelper::checkPath: Invalid SD card manager" << std::endl;
+ return RETURN_FAILED;
+ }
+ if (path.substr(0, sizeof(SdCardManager::SD_0_MOUNT_POINT)) ==
+ std::string(SdCardManager::SD_0_MOUNT_POINT)) {
+ if (!sdcMan->isSdCardMounted(sd::SLOT_0)) {
+ sif::warning << "FilesystemHelper::checkPath: SD card 0 not mounted" << std::endl;
+ return SD_NOT_MOUNTED;
+ }
+ } else if (path.substr(0, sizeof(SdCardManager::SD_1_MOUNT_POINT)) ==
+ std::string(SdCardManager::SD_1_MOUNT_POINT)) {
+ if (!sdcMan->isSdCardMounted(sd::SLOT_0)) {
+ sif::warning << "FilesystemHelper::checkPath: SD card 1 not mounted" << std::endl;
+ return SD_NOT_MOUNTED;
+ }
+ }
+ return RETURN_OK;
+}
+
+ReturnValue_t FilesystemHelper::fileExists(std::string file) {
+ if (not std::filesystem::exists(file)) {
+ return FILE_NOT_EXISTS;
+ }
+ return RETURN_OK;
+}
diff --git a/bsp_q7s/memory/FilesystemHelper.h b/bsp_q7s/memory/FilesystemHelper.h
new file mode 100644
index 00000000..cb8e27a8
--- /dev/null
+++ b/bsp_q7s/memory/FilesystemHelper.h
@@ -0,0 +1,49 @@
+#ifndef BSP_Q7S_MEMORY_FILESYSTEMHELPER_H_
+#define BSP_Q7S_MEMORY_FILESYSTEMHELPER_H_
+
+#include
+
+#include "commonClassIds.h"
+#include "fsfw/returnvalues/HasReturnvaluesIF.h"
+
+/**
+ * @brief This class implements often used functions concerning the file system management.
+ *
+ * @author J. Meier
+ */
+class FilesystemHelper : public HasReturnvaluesIF {
+ public:
+ static const uint8_t INTERFACE_ID = CLASS_ID::FILE_SYSTEM_HELPER;
+
+ //! [EXPORT] : [COMMENT] SD card specified with path string not mounted
+ static const ReturnValue_t SD_NOT_MOUNTED = MAKE_RETURN_CODE(0xA0);
+ //! [EXPORT] : [COMMENT] Specified file does not exist on filesystem
+ static const ReturnValue_t FILE_NOT_EXISTS = MAKE_RETURN_CODE(0xA1);
+
+ FilesystemHelper();
+ virtual ~FilesystemHelper();
+
+ /**
+ * @brief In case the path points to a directory on the sd card the function checks if the
+ * appropriate SD card is mounted.
+ *
+ * @param path Path to check
+ *
+ * @return RETURN_OK if path points to SD card and the appropriate SD card is mounted or if
+ * path does not point to SD card.
+ * Return error code if path points to SD card and the corresponding SD card is not
+ * mounted.
+ */
+ static ReturnValue_t checkPath(std::string path);
+
+ /**
+ * @brief Checks if the file exists on the filesystem.
+ *
+ * param file File to check
+ *
+ * @return RETURN_OK if fiel exists, otherwise return error code.
+ */
+ static ReturnValue_t fileExists(std::string file);
+};
+
+#endif /* BSP_Q7S_MEMORY_FILESYSTEMHELPER_H_ */
diff --git a/bsp_q7s/memory/SdCardManager.cpp b/bsp_q7s/memory/SdCardManager.cpp
index 06072253..4ca11787 100644
--- a/bsp_q7s/memory/SdCardManager.cpp
+++ b/bsp_q7s/memory/SdCardManager.cpp
@@ -1,6 +1,5 @@
#include "SdCardManager.h"
-#include "OBSWConfig.h"
#include
#include
#include
@@ -10,6 +9,7 @@
#include
#include
+#include "OBSWConfig.h"
#include "common/config/commonObjects.h"
#include "fsfw/ipc/MutexFactory.h"
#include "fsfw/serviceinterface/ServiceInterface.h"
diff --git a/bsp_q7s/xadc/CMakeLists.txt b/bsp_q7s/xadc/CMakeLists.txt
new file mode 100644
index 00000000..0f2ea7df
--- /dev/null
+++ b/bsp_q7s/xadc/CMakeLists.txt
@@ -0,0 +1,3 @@
+target_sources(${OBSW_NAME} PRIVATE
+ Xadc.cpp
+)
\ No newline at end of file
diff --git a/bsp_q7s/xadc/Xadc.cpp b/bsp_q7s/xadc/Xadc.cpp
new file mode 100644
index 00000000..e1f1a505
--- /dev/null
+++ b/bsp_q7s/xadc/Xadc.cpp
@@ -0,0 +1,144 @@
+#include "Xadc.h"
+
+#include
+#include
+
+#include
+
+#include "fsfw/serviceinterface/ServiceInterfaceStream.h"
+
+Xadc::Xadc() {}
+
+Xadc::~Xadc() {}
+
+ReturnValue_t Xadc::getTemperature(float& temperature) {
+ ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
+ int raw = 0;
+ int offset = 0;
+ float scale = 0;
+ result = readValFromFile(xadc::file::tempRaw.c_str(), raw);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ result = readValFromFile(xadc::file::tempOffset.c_str(), offset);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ result = readValFromFile(xadc::file::tempScale.c_str(), scale);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ temperature = (raw + offset) * scale / 1000;
+ return result;
+}
+
+ReturnValue_t Xadc::getVccPint(float& vccPint) {
+ ReturnValue_t result =
+ readVoltageFromSysfs(xadc::file::vccpintRaw, xadc::file::vccpintScale, vccPint);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ return HasReturnvaluesIF::RETURN_OK;
+}
+
+ReturnValue_t Xadc::getVccPaux(float& vccPaux) {
+ ReturnValue_t result =
+ readVoltageFromSysfs(xadc::file::vccpauxRaw, xadc::file::vccpauxScale, vccPaux);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ return HasReturnvaluesIF::RETURN_OK;
+}
+
+ReturnValue_t Xadc::getVccInt(float& vccInt) {
+ ReturnValue_t result =
+ readVoltageFromSysfs(xadc::file::vccintRaw, xadc::file::vccintScale, vccInt);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ return HasReturnvaluesIF::RETURN_OK;
+}
+
+ReturnValue_t Xadc::getVccAux(float& vccAux) {
+ ReturnValue_t result =
+ readVoltageFromSysfs(xadc::file::vccauxRaw, xadc::file::vccauxScale, vccAux);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ return HasReturnvaluesIF::RETURN_OK;
+}
+
+ReturnValue_t Xadc::getVccBram(float& vccBram) {
+ ReturnValue_t result =
+ readVoltageFromSysfs(xadc::file::vccbramRaw, xadc::file::vccbramScale, vccBram);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ return HasReturnvaluesIF::RETURN_OK;
+}
+
+ReturnValue_t Xadc::getVccOddr(float& vccOddr) {
+ ReturnValue_t result =
+ readVoltageFromSysfs(xadc::file::vccoddrRaw, xadc::file::vccoddrScale, vccOddr);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ return HasReturnvaluesIF::RETURN_OK;
+}
+
+ReturnValue_t Xadc::getVrefp(float& vrefp) {
+ ReturnValue_t result = readVoltageFromSysfs(xadc::file::vrefpRaw, xadc::file::vrefpScale, vrefp);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ return HasReturnvaluesIF::RETURN_OK;
+}
+
+ReturnValue_t Xadc::getVrefn(float& vrefn) {
+ ReturnValue_t result = readVoltageFromSysfs(xadc::file::vrefnRaw, xadc::file::vrefnScale, vrefn);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ return HasReturnvaluesIF::RETURN_OK;
+}
+
+ReturnValue_t Xadc::readVoltageFromSysfs(std::string rawFile, std::string scaleFile,
+ float& voltage) {
+ ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
+ float raw = 0;
+ float scale = 0;
+ result = readValFromFile(rawFile.c_str(), raw);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ result = readValFromFile(scaleFile.c_str(), scale);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ voltage = calculateVoltage(raw, scale);
+ return result;
+}
+
+float Xadc::calculateVoltage(int raw, float scale) { return static_cast(raw * scale); }
+
+template
+ReturnValue_t Xadc::readValFromFile(const char* filename, T& val) {
+ FILE* fp;
+ fp = fopen(filename, "r");
+ if (fp == nullptr) {
+ sif::warning << "Xadc::readValFromFile: Failed to open file " << filename << std::endl;
+ return HasReturnvaluesIF::RETURN_FAILED;
+ }
+ char valstring[MAX_STR_LENGTH] = "";
+ char* returnVal = fgets(valstring, MAX_STR_LENGTH, fp);
+ if (returnVal == nullptr) {
+ sif::warning << "Xadc::readValFromFile: Failed to read string from file " << filename
+ << std::endl;
+ fclose(fp);
+ return HasReturnvaluesIF::RETURN_FAILED;
+ }
+ std::istringstream valSstream(valstring);
+ valSstream >> val;
+ fclose(fp);
+ return HasReturnvaluesIF::RETURN_OK;
+}
diff --git a/bsp_q7s/xadc/Xadc.h b/bsp_q7s/xadc/Xadc.h
new file mode 100644
index 00000000..92ec2c0c
--- /dev/null
+++ b/bsp_q7s/xadc/Xadc.h
@@ -0,0 +1,108 @@
+#ifndef BSP_Q7S_XADC_XADC_H_
+#define BSP_Q7S_XADC_XADC_H_
+
+#include
+
+#include "fsfw/returnvalues/HasReturnvaluesIF.h"
+
+namespace xadc {
+using namespace std;
+static const string iioPath = "/sys/bus/iio/devices/iio:device1";
+namespace file {
+static const string tempOffset = iioPath + "/in_temp0_offset";
+static const string tempRaw = iioPath + "/in_temp0_raw";
+static const string tempScale = iioPath + "/in_temp0_scale";
+static const string vccintRaw = iioPath + "/in_voltage0_vccint_raw";
+static const string vccintScale = iioPath + "/in_voltage0_vccint_scale";
+static const string vccauxRaw = iioPath + "/in_voltage1_vccaux_raw";
+static const string vccauxScale = iioPath + "/in_voltage1_vccaux_scale";
+static const string vccbramRaw = iioPath + "/in_voltage2_vccbram_raw";
+static const string vccbramScale = iioPath + "/in_voltage2_vccbram_scale";
+static const string vccpintRaw = iioPath + "/in_voltage3_vccpint_raw";
+static const string vccpintScale = iioPath + "/in_voltage3_vccpint_scale";
+static const string vccpauxRaw = iioPath + "/in_voltage4_vccpaux_raw";
+static const string vccpauxScale = iioPath + "/in_voltage4_vccpaux_scale";
+static const string vccoddrRaw = iioPath + "/in_voltage5_vccoddr_raw";
+static const string vccoddrScale = iioPath + "/in_voltage5_vccoddr_scale";
+static const string vrefpRaw = iioPath + "/in_voltage6_vrefp_raw";
+static const string vrefpScale = iioPath + "/in_voltage6_vrefp_scale";
+static const string vrefnRaw = iioPath + "/in_voltage7_vrefn_raw";
+static const string vrefnScale = iioPath + "/in_voltage7_vrefn_scale";
+} // namespace file
+} // namespace xadc
+
+/**
+ * @brief Class providing access to the data generated by the analog mixed signal module (XADC).
+ *
+ * @details Details about the XADC peripheral of the Zynq-7020 can be found in the UG480 "7-Series
+ * FPGAs and Zynq-7000 SoC XADC Dual 12-Bit 1 MSPS Analog-to-Digital Converter" user guide
+ * from Xilinx.
+ *
+ * @author J. Meier
+ */
+class Xadc {
+ public:
+ /**
+ * @brief Constructor
+ */
+ Xadc();
+ virtual ~Xadc();
+
+ /**
+ * @brief Returns on-chip temperature degree celcius
+ */
+ ReturnValue_t getTemperature(float& temperature);
+
+ /**
+ * @brief Returns PS internal logic supply voltage in millivolts
+ */
+ ReturnValue_t getVccPint(float& vccPint);
+
+ /**
+ * @brief Returns PS auxiliary supply voltage in millivolts
+ */
+ ReturnValue_t getVccPaux(float& vccPaux);
+
+ /**
+ * @brief Returns PL internal supply voltage in millivolts
+ */
+ ReturnValue_t getVccInt(float& vccInt);
+
+ /**
+ * @brief Returns PL auxiliary supply voltage in millivolts
+ */
+ ReturnValue_t getVccAux(float& vccAux);
+
+ /**
+ * @brief Returns PL block RAM supply voltage in millivolts
+ */
+ ReturnValue_t getVccBram(float& vccBram);
+
+ /**
+ * @brief Returns the PS DDR I/O supply voltage
+ */
+ ReturnValue_t getVccOddr(float& vcOddr);
+
+ /**
+ * @brief Returns XADC reference input voltage relative to GND in millivolts
+ */
+ ReturnValue_t getVrefp(float& vrefp);
+
+ /**
+ * @brief Returns negative reference input voltage. Should normally be 0 V.
+ */
+ ReturnValue_t getVrefn(float& vrefn);
+
+ private:
+ // Maximum length of the string representation of a value in a xadc sysfs file
+ static const uint8_t MAX_STR_LENGTH = 15;
+
+ ReturnValue_t readVoltageFromSysfs(std::string rawFile, std::string scaleFile, float& voltage);
+
+ float calculateVoltage(int raw, float scale);
+
+ template
+ ReturnValue_t readValFromFile(const char* filename, T& val);
+};
+
+#endif /* BSP_Q7S_XADC_XADC_H_ */
diff --git a/bsp_te0720_1cfa/CMakeLists.txt b/bsp_te0720_1cfa/CMakeLists.txt
new file mode 100644
index 00000000..cb02f937
--- /dev/null
+++ b/bsp_te0720_1cfa/CMakeLists.txt
@@ -0,0 +1,7 @@
+target_sources(${OBSW_NAME} PUBLIC
+ InitMission.cpp
+ main.cpp
+ ObjectFactory.cpp
+)
+
+add_subdirectory(boardconfig)
diff --git a/bsp_te0720_1cfa/InitMission.cpp b/bsp_te0720_1cfa/InitMission.cpp
new file mode 100644
index 00000000..f1809bca
--- /dev/null
+++ b/bsp_te0720_1cfa/InitMission.cpp
@@ -0,0 +1,188 @@
+#include "InitMission.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+
+#include "OBSWConfig.h"
+#include "ObjectFactory.h"
+#include "objects/systemObjectList.h"
+#include "pollingsequence/pollingSequenceFactory.h"
+
+ServiceInterfaceStream sif::debug("DEBUG");
+ServiceInterfaceStream sif::info("INFO");
+ServiceInterfaceStream sif::warning("WARNING");
+ServiceInterfaceStream sif::error("ERROR");
+
+ObjectManagerIF* objectManager = nullptr;
+
+void initmission::initMission() {
+ sif::info << "Building global objects.." << std::endl;
+ /* Instantiate global object manager and also create all objects */
+ ObjectManager::instance()->setObjectFactoryFunction(ObjectFactory::produce, nullptr);
+ sif::info << "Initializing all objects.." << std::endl;
+ ObjectManager::instance()->initialize();
+
+ /* This function creates and starts all tasks */
+ initTasks();
+}
+
+void initmission::initTasks() {
+ TaskFactory* factory = TaskFactory::instance();
+ ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
+ if (factory == nullptr) {
+ /* Should never happen ! */
+ return;
+ }
+#if OBSW_PRINT_MISSED_DEADLINES == 1
+ void (*missedDeadlineFunc)(void) = TaskFactory::printMissedDeadline;
+#else
+ void (*missedDeadlineFunc)(void) = nullptr;
+#endif
+
+ /* TMTC Distribution */
+ PeriodicTaskIF* tmtcDistributor = factory->createPeriodicTask(
+ "DIST", 40, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.2, missedDeadlineFunc);
+ result = tmtcDistributor->addComponent(objects::CCSDS_PACKET_DISTRIBUTOR);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ sif::error << "Object add component failed" << std::endl;
+ }
+ result = tmtcDistributor->addComponent(objects::PUS_PACKET_DISTRIBUTOR);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ sif::error << "Object add component failed" << std::endl;
+ }
+ result = tmtcDistributor->addComponent(objects::TM_FUNNEL);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ sif::error << "Object add component failed" << std::endl;
+ }
+
+ PeriodicTaskIF* tmtcBridgeTask = factory->createPeriodicTask(
+ "TMTC_BRIDGE", 50, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.2, missedDeadlineFunc);
+ result = tmtcBridgeTask->addComponent(objects::TMTC_BRIDGE);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ sif::error << "Add component TMTC Bridge failed" << std::endl;
+ }
+ PeriodicTaskIF* tmtcPollingTask = factory->createPeriodicTask(
+ "TMTC_POLLING", 80, PeriodicTaskIF::MINIMUM_STACK_SIZE, 2.0, missedDeadlineFunc);
+ result = tmtcPollingTask->addComponent(objects::TMTC_POLLING_TASK);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ sif::error << "Add component TMTC Polling failed" << std::endl;
+ }
+
+ /* PUS Services */
+ std::vector pusTasks;
+ createPusTasks(*factory, missedDeadlineFunc, pusTasks);
+
+ std::vector pstTasks;
+ FixedTimeslotTaskIF* pst = factory->createFixedTimeslotTask(
+ "UART_PST", 70, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 1.0, missedDeadlineFunc);
+ result = pst::pstUart(pst);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ sif::error << "InitMission::initTasks: Creating PST failed!" << std::endl;
+ }
+ pstTasks.push_back(pst);
+
+ PeriodicTaskIF* mpsocHelperTask = factory->createPeriodicTask(
+ "PLOC_MPSOC_HELPER", 20, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.2, missedDeadlineFunc);
+ result = mpsocHelperTask->addComponent(objects::PLOC_MPSOC_HELPER);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ initmission::printAddObjectError("PLOC_MPSOC_HELPER", objects::PLOC_MPSOC_HELPER);
+ }
+ pstTasks.push_back(mpsocHelperTask);
+
+ auto taskStarter = [](std::vector& taskVector, std::string name) {
+ for (const auto& task : taskVector) {
+ if (task != nullptr) {
+ task->startTask();
+ } else {
+ sif::error << "Task in vector " << name << " is invalid!" << std::endl;
+ }
+ }
+ };
+
+ sif::info << "Starting tasks.." << std::endl;
+ tmtcDistributor->startTask();
+ tmtcBridgeTask->startTask();
+ tmtcPollingTask->startTask();
+
+ taskStarter(pstTasks, "PST Tasks");
+ taskStarter(pusTasks, "PUS Tasks");
+
+ sif::info << "Tasks started.." << std::endl;
+}
+
+void initmission::createPusTasks(TaskFactory& factory,
+ TaskDeadlineMissedFunction missedDeadlineFunc,
+ std::vector& taskVec) {
+ ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
+ PeriodicTaskIF* pusVerification = factory.createPeriodicTask(
+ "PUS_VERIF", 40, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.200, missedDeadlineFunc);
+ result = pusVerification->addComponent(objects::PUS_SERVICE_1_VERIFICATION);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ sif::error << "Object add component failed" << std::endl;
+ }
+ taskVec.push_back(pusVerification);
+
+ PeriodicTaskIF* pusEvents = factory.createPeriodicTask(
+ "PUS_EVENTS", 60, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.200, missedDeadlineFunc);
+ result = pusEvents->addComponent(objects::PUS_SERVICE_5_EVENT_REPORTING);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ initmission::printAddObjectError("PUS_EVENTS", objects::PUS_SERVICE_5_EVENT_REPORTING);
+ }
+ result = pusEvents->addComponent(objects::EVENT_MANAGER);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ initmission::printAddObjectError("PUS_MGMT", objects::EVENT_MANAGER);
+ }
+ taskVec.push_back(pusEvents);
+
+ PeriodicTaskIF* pusHighPrio = factory.createPeriodicTask(
+ "PUS_HIGH_PRIO", 50, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.200, missedDeadlineFunc);
+ result = pusHighPrio->addComponent(objects::PUS_SERVICE_2_DEVICE_ACCESS);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ initmission::printAddObjectError("PUS2", objects::PUS_SERVICE_2_DEVICE_ACCESS);
+ }
+ result = pusHighPrio->addComponent(objects::PUS_SERVICE_9_TIME_MGMT);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ initmission::printAddObjectError("PUS9", objects::PUS_SERVICE_9_TIME_MGMT);
+ }
+ taskVec.push_back(pusHighPrio);
+
+ PeriodicTaskIF* pusMedPrio = factory.createPeriodicTask(
+ "PUS_MED_PRIO", 40, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.8, missedDeadlineFunc);
+ result = pusMedPrio->addComponent(objects::PUS_SERVICE_8_FUNCTION_MGMT);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ initmission::printAddObjectError("PUS8", objects::PUS_SERVICE_8_FUNCTION_MGMT);
+ }
+ result = pusMedPrio->addComponent(objects::PUS_SERVICE_200_MODE_MGMT);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ initmission::printAddObjectError("PUS200", objects::PUS_SERVICE_200_MODE_MGMT);
+ }
+ result = pusMedPrio->addComponent(objects::PUS_SERVICE_20_PARAMETERS);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ initmission::printAddObjectError("PUS20", objects::PUS_SERVICE_20_PARAMETERS);
+ }
+ result = pusMedPrio->addComponent(objects::PUS_SERVICE_3_HOUSEKEEPING);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ initmission::printAddObjectError("PUS3", objects::PUS_SERVICE_3_HOUSEKEEPING);
+ }
+ taskVec.push_back(pusMedPrio);
+
+ PeriodicTaskIF* pusLowPrio = factory.createPeriodicTask(
+ "PUS_LOW_PRIO", 30, PeriodicTaskIF::MINIMUM_STACK_SIZE, 1.6, missedDeadlineFunc);
+ result = pusLowPrio->addComponent(objects::PUS_SERVICE_17_TEST);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ initmission::printAddObjectError("PUS17", objects::PUS_SERVICE_17_TEST);
+ }
+ result = pusLowPrio->addComponent(objects::INTERNAL_ERROR_REPORTER);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ initmission::printAddObjectError("INT_ERR_RPRT", objects::INTERNAL_ERROR_REPORTER);
+ }
+ taskVec.push_back(pusLowPrio);
+}
diff --git a/bsp_te0720_1cfa/InitMission.h b/bsp_te0720_1cfa/InitMission.h
new file mode 100644
index 00000000..c3ba58ec
--- /dev/null
+++ b/bsp_te0720_1cfa/InitMission.h
@@ -0,0 +1,21 @@
+#ifndef BSP_LINUX_INITMISSION_H_
+#define BSP_LINUX_INITMISSION_H_
+
+#include
+
+#include "fsfw/tasks/Typedef.h"
+
+class PeriodicTaskIF;
+class TaskFactory;
+
+namespace initmission {
+void initMission();
+void initTasks();
+
+void createPstTasks(TaskFactory& factory, TaskDeadlineMissedFunction missedDeadlineFunc,
+ std::vector& taskVec);
+void createPusTasks(TaskFactory& factory, TaskDeadlineMissedFunction missedDeadlineFunc,
+ std::vector& taskVec);
+}; // namespace initmission
+
+#endif /* BSP_LINUX_INITMISSION_H_ */
diff --git a/bsp_te0720_1cfa/ObjectFactory.cpp b/bsp_te0720_1cfa/ObjectFactory.cpp
new file mode 100644
index 00000000..eb6c4fa4
--- /dev/null
+++ b/bsp_te0720_1cfa/ObjectFactory.cpp
@@ -0,0 +1,151 @@
+#include "ObjectFactory.h"
+
+#include
+#include "fsfw_hal/linux/uart/UartComIF.h"
+#include "fsfw_hal/linux/i2c/I2cComIF.h"
+#include "fsfw_hal/linux/uart/UartCookie.h"
+
+#include "OBSWConfig.h"
+#include "busConf.h"
+#include "devConf.h"
+#include "fsfw/datapoollocal/LocalDataPoolManager.h"
+#include "fsfw/tmtcpacket/pus/tm.h"
+#include "fsfw/tmtcservices/CommandingServiceBase.h"
+#include "fsfw/tmtcservices/PusServiceBase.h"
+#include "fsfw_hal/linux/i2c/I2cCookie.h"
+#include "linux/devices/ploc/PlocMPSoCHandler.h"
+#include "linux/devices/ploc/PlocMPSoCHelper.h"
+#include "mission/devices/Tmp1075Handler.h"
+#include "mission/core/GenericFactory.h"
+#include "mission/utility/TmFunnel.h"
+#include "test/gpio/DummyGpioIF.h"
+#include "objects/systemObjectList.h"
+#include "devices/addresses.h"
+#include "devices/gpioIds.h"
+#include "tmtc/apid.h"
+#include "tmtc/pusIds.h"
+
+void Factory::setStaticFrameworkObjectIds() {
+ PusServiceBase::packetSource = objects::PUS_PACKET_DISTRIBUTOR;
+ PusServiceBase::packetDestination = objects::TM_FUNNEL;
+
+ CommandingServiceBase::defaultPacketSource = objects::PUS_PACKET_DISTRIBUTOR;
+ CommandingServiceBase::defaultPacketDestination = objects::TM_FUNNEL;
+
+ TmFunnel::downlinkDestination = objects::TMTC_BRIDGE;
+ TmFunnel::storageDestination = objects::NO_OBJECT;
+
+ VerificationReporter::messageReceiver = objects::PUS_SERVICE_1_VERIFICATION;
+ TmPacketBase::timeStamperId = objects::TIME_STAMPER;
+}
+
+void ObjectFactory::produce(void* args) {
+ Factory::setStaticFrameworkObjectIds();
+ ObjectFactory::produceGenericObjects();
+
+#if OBSW_ADD_PLOC_MPSOC == 1
+ UartCookie* mpsocUartCookie = new UartCookie(objects::PLOC_MPSOC_HANDLER, te0720_1cfa::MPSOC_UART,
+ uart::PLOC_MPSOC_BAUD, mpsoc::MAX_REPLY_SIZE);
+ mpsocUartCookie->setNoFixedSizeReply();
+ PlocMPSoCHelper* plocMpsocHelper = new PlocMPSoCHelper(objects::PLOC_MPSOC_HELPER);
+ new UartComIF(objects::UART_COM_IF);
+ auto dummyGpioIF = new DummyGpioIF();
+ PlocMPSoCHandler* plocMPSoCHandler = new PlocMPSoCHandler(
+ objects::PLOC_MPSOC_HANDLER, objects::UART_COM_IF, mpsocUartCookie, plocMpsocHelper,
+ Gpio(gpioIds::ENABLE_MPSOC_UART, dummyGpioIF), objects::PLOC_SUPERVISOR_HANDLER);
+ plocMPSoCHandler->setStartUpImmediately();
+#endif /* OBSW_ADD_PLOC_MPSOC == 1 */
+
+#if OBSW_TEST_LIBGPIOD == 1
+#if OBSW_TEST_GPIO_OPEN_BYLABEL == 1
+ /* Configure MIO0 as input */
+ GpiodRegular* testGpio = new GpiodRegular("MIO0", Direction::OUT, 0, "/amba_pl/gpio@41200000", 0);
+#elif OBSW_TEST_GPIO_OPEN_BY_LINE_NAME
+ GpiodRegularByLineName* testGpio =
+ new GpiodRegularByLineName("test-name", "gpio-test", Direction::OUT, 0);
+#else
+ /* Configure MIO0 as input */
+ GpiodRegular* testGpio = new GpiodRegular("gpiochip0", 0, "MIO0", gpio::IN, 0);
+#endif /* OBSW_TEST_GPIO_LABEL == 1 */
+ GpioCookie* gpioCookie = new GpioCookie;
+ gpioCookie->addGpio(gpioIds::TEST_ID_0, testGpio);
+ new LibgpiodTest(objects::LIBGPIOD_TEST, objects::GPIO_IF, gpioCookie);
+#endif
+
+#if OBSW_TEST_SUS == 1
+ GpioCookie* gpioCookieSus = new GpioCookie;
+ GpiodRegular* chipSelectSus = new GpiodRegular(
+ std::string("gpiochip1"), 9, std::string("Chip Select Sus Sensor"), Direction::OUT, 1);
+ gpioCookieSus->addGpio(gpioIds::CS_SUS_0, chipSelectSus);
+ gpioComIF->addGpios(gpioCookieSus);
+
+ SpiCookie* spiCookieSus =
+ new SpiCookie(addresses::SUS_0, std::string("/dev/spidev1.0"), SUS::MAX_CMD_SIZE,
+ spi::DEFAULT_MAX_1227_MODE, spi::DEFAULT_MAX_1227_SPEED);
+
+ new SusHandler(objects::SUS_0, objects::SPI_COM_IF, spiCookieSus, gpioComIF, gpioIds::CS_SUS_0);
+#endif
+
+#if OBSW_TEST_CCSDS_BRIDGE == 1
+ GpioCookie* gpioCookieCcsdsIp = new GpioCookie;
+ GpiodRegular* papbBusyN =
+ new GpiodRegular(std::string("gpiochip0"), 0, std::string("PAPBBusy_VC0"));
+ gpioCookieCcsdsIp->addGpio(gpioIds::PAPB_BUSY_N, papbBusyN);
+ GpiodRegular* papbEmpty =
+ new GpiodRegular(std::string("gpiochip0"), 1, std::string("PAPBEmpty_VC0"));
+ gpioCookieCcsdsIp->addGpio(gpioIds::PAPB_EMPTY, papbEmpty);
+ gpioComIF->addGpios(gpioCookieCcsdsIp);
+
+ new CCSDSIPCoreBridge(objects::CCSDS_IP_CORE_BRIDGE, objects::CCSDS_PACKET_DISTRIBUTOR,
+ objects::TM_STORE, objects::TC_STORE, gpioComIF, std::string("/dev/uio0"),
+ gpioIds::PAPB_BUSY_N, gpioIds::PAPB_EMPTY);
+#endif
+
+#if OBSW_TEST_RAD_SENSOR == 1
+ GpioCookie* gpioCookieRadSensor = new GpioCookie;
+ GpiodRegular* chipSelectRadSensor = new GpiodRegular(
+ std::string("gpiochip1"), 0, std::string("Chip select radiation sensor"), Direction::OUT, 1);
+ gpioCookieRadSensor->addGpio(gpioIds::CS_RAD_SENSOR, chipSelectRadSensor);
+ gpioComIF->addGpios(gpioCookieRadSensor);
+
+ SpiCookie* spiCookieRadSensor =
+ new SpiCookie(addresses::RAD_SENSOR, gpioIds::CS_RAD_SENSOR, std::string("/dev/spidev1.0"),
+ SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::DEFAULT_MAX_1227_SPEED);
+
+ RadiationSensorHandler* radSensor =
+ new RadiationSensorHandler(objects::RAD_SENSOR, objects::SPI_COM_IF, spiCookieRadSensor);
+ radSensor->setStartUpImmediately();
+#endif
+
+#if OBSW_TEST_TE7020_HEATER == 1
+ /* Configuration for MIO0 on TE0720-03-1CFA */
+ GpiodRegular* heaterGpio =
+ new GpiodRegular(std::string("gpiochip0"), 0, std::string("MIO0"), gpio::IN, 0);
+ GpioCookie* gpioCookie = new GpioCookie;
+ gpioCookie->addGpio(gpioIds::HEATER_0, heaterGpio);
+ new HeaterHandler(objects::HEATER_HANDLER, objects::GPIO_IF, gpioCookie, objects::PCDU_HANDLER,
+ pcduSwitches::TCS_BOARD_8V_HEATER_IN);
+#endif
+
+#if OBSW_ADD_PLOC_SUPERVISOR == 1
+ /* Configuration for MIO0 on TE0720-03-1CFA */
+ UartCookie* plocSupervisorCookie =
+ new UartCookie(objects::PLOC_SUPERVISOR_HANDLER, std::string("/dev/ttyPS1"),
+ UartModes::NON_CANONICAL, 115200, PLOC_SPV::MAX_PACKET_SIZE * 20);
+ plocSupervisorCookie->setNoFixedSizeReply();
+ PlocSupervisorHandler* plocSupervisor = new PlocSupervisorHandler(
+ objects::PLOC_SUPERVISOR_HANDLER, objects::UART_COM_IF, plocSupervisorCookie);
+ plocSupervisor->setStartUpImmediately();
+#endif
+
+new I2cComIF(objects::I2C_COM_IF);
+
+I2cCookie* i2cCookieTmp1075tcs1 =
+ new I2cCookie(addresses::TMP1075_TCS_1, TMP1075::MAX_REPLY_LENGTH, std::string("/dev/i2c-0"));
+I2cCookie* i2cCookieTmp1075tcs2 =
+ new I2cCookie(addresses::TMP1075_TCS_2, TMP1075::MAX_REPLY_LENGTH, std::string("/dev/i2c-0"));
+
+/* Temperature sensors */
+new Tmp1075Handler(objects::TMP1075_HANDLER_1, objects::I2C_COM_IF, i2cCookieTmp1075tcs1);
+new Tmp1075Handler(objects::TMP1075_HANDLER_2, objects::I2C_COM_IF, i2cCookieTmp1075tcs2);
+}
diff --git a/bsp_te0720_1cfa/ObjectFactory.h b/bsp_te0720_1cfa/ObjectFactory.h
new file mode 100644
index 00000000..b24dd321
--- /dev/null
+++ b/bsp_te0720_1cfa/ObjectFactory.h
@@ -0,0 +1,8 @@
+#ifndef BSP_LINUX_OBJECTFACTORY_H_
+#define BSP_LINUX_OBJECTFACTORY_H_
+
+namespace ObjectFactory {
+void produce(void* args);
+}; // namespace ObjectFactory
+
+#endif /* BSP_LINUX_OBJECTFACTORY_H_ */
diff --git a/bsp_te0720_1cfa/boardconfig/CMakeLists.txt b/bsp_te0720_1cfa/boardconfig/CMakeLists.txt
new file mode 100644
index 00000000..f9136e3e
--- /dev/null
+++ b/bsp_te0720_1cfa/boardconfig/CMakeLists.txt
@@ -0,0 +1,7 @@
+target_sources(${OBSW_NAME} PRIVATE
+ print.c
+)
+
+target_include_directories(${OBSW_NAME} PUBLIC
+ ${CMAKE_CURRENT_SOURCE_DIR}
+)
diff --git a/bsp_te0720_1cfa/boardconfig/busConf.h b/bsp_te0720_1cfa/boardconfig/busConf.h
new file mode 100644
index 00000000..893014c1
--- /dev/null
+++ b/bsp_te0720_1cfa/boardconfig/busConf.h
@@ -0,0 +1,11 @@
+#ifndef BSP_EGSE_BOARDCONFIG_BUSCONF_H_
+#define BSP_EGSE_BOARDCONFIG_BUSCONF_H_
+
+namespace te0720_1cfa {
+static constexpr char MPSOC_UART[] = "/dev/ttyPS1";
+namespace baudrate {
+
+}
+}
+
+#endif /* BSP_EGSE_BOARDCONFIG_BUSCONF_H_ */
diff --git a/bsp_te0720_1cfa/boardconfig/etl_profile.h b/bsp_te0720_1cfa/boardconfig/etl_profile.h
new file mode 100644
index 00000000..54aca344
--- /dev/null
+++ b/bsp_te0720_1cfa/boardconfig/etl_profile.h
@@ -0,0 +1,38 @@
+///\file
+
+/******************************************************************************
+The MIT License(MIT)
+
+Embedded Template Library.
+https://github.com/ETLCPP/etl
+https://www.etlcpp.com
+
+Copyright(c) 2019 jwellbelove
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files(the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions :
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+******************************************************************************/
+#ifndef __ETL_PROFILE_H__
+#define __ETL_PROFILE_H__
+
+#define ETL_CHECK_PUSH_POP
+
+#define ETL_CPP11_SUPPORTED 1
+#define ETL_NO_NULLPTR_SUPPORT 0
+
+#endif
diff --git a/bsp_te0720_1cfa/boardconfig/gcov.h b/bsp_te0720_1cfa/boardconfig/gcov.h
new file mode 100644
index 00000000..80acdd86
--- /dev/null
+++ b/bsp_te0720_1cfa/boardconfig/gcov.h
@@ -0,0 +1,15 @@
+#ifndef LINUX_GCOV_H_
+#define LINUX_GCOV_H_
+#include
+
+#ifdef GCOV
+extern "C" void __gcov_flush();
+#else
+void __gcov_flush() {
+ sif::info << "GCC GCOV: Please supply GCOV=1 in Makefile if "
+ "coverage information is desired.\n"
+ << std::flush;
+}
+#endif
+
+#endif /* LINUX_GCOV_H_ */
diff --git a/bsp_te0720_1cfa/boardconfig/print.c b/bsp_te0720_1cfa/boardconfig/print.c
new file mode 100644
index 00000000..1739e90b
--- /dev/null
+++ b/bsp_te0720_1cfa/boardconfig/print.c
@@ -0,0 +1,10 @@
+#include
+#include
+
+void printChar(const char* character, bool errStream) {
+ if (errStream) {
+ putc(*character, stderr);
+ return;
+ }
+ putc(*character, stdout);
+}
diff --git a/bsp_te0720_1cfa/boardconfig/print.h b/bsp_te0720_1cfa/boardconfig/print.h
new file mode 100644
index 00000000..8e7e2e5d
--- /dev/null
+++ b/bsp_te0720_1cfa/boardconfig/print.h
@@ -0,0 +1,8 @@
+#ifndef HOSTED_BOARDCONFIG_PRINT_H_
+#define HOSTED_BOARDCONFIG_PRINT_H_
+
+#include
+
+void printChar(const char* character, bool errStream);
+
+#endif /* HOSTED_BOARDCONFIG_PRINT_H_ */
diff --git a/bsp_te0720_1cfa/main.cpp b/bsp_te0720_1cfa/main.cpp
new file mode 100644
index 00000000..cb7d987e
--- /dev/null
+++ b/bsp_te0720_1cfa/main.cpp
@@ -0,0 +1,29 @@
+#include
+
+#include "InitMission.h"
+#include "OBSWConfig.h"
+#include "OBSWVersion.h"
+#include "fsfw/version.h"
+#include "fsfw/tasks/TaskFactory.h"
+
+/**
+ * @brief This is the main program entry point for the obsw running on the trenz electronic
+ * te0720-1cfa.
+ * @return
+ */
+int main(void) {
+ using namespace fsfw;
+ std::cout << "-- EIVE OBSW --" << std::endl;
+ std::cout << "-- Compiled for Trenz TE0720-1CFA"
+ << " --" << std::endl;
+ std::cout << "-- OBSW v" << SW_VERSION << "." << SW_SUBVERSION << "." << SW_REVISION << ", FSFW v"
+ << FSFW_VERSION << "--" << std::endl;
+ std::cout << "-- " << __DATE__ << " " << __TIME__ << " --" << std::endl;
+
+ initmission::initMission();
+
+ for (;;) {
+ /* Suspend main thread by sleeping it. */
+ TaskFactory::delayTask(5000);
+ }
+}
diff --git a/cmake/HardwareOsPreConfig.cmake b/cmake/HardwareOsPreConfig.cmake
index 88df808c..7b90eb54 100644
--- a/cmake/HardwareOsPreConfig.cmake
+++ b/cmake/HardwareOsPreConfig.cmake
@@ -59,6 +59,8 @@ if(TGT_BSP)
set(BSP_PATH "bsp_q7s")
elseif(TGT_BSP MATCHES "arm/egse")
set(BSP_PATH "bsp_egse")
+ elseif(TGT_BSP MATCHES "arm/te0720-1cfa")
+ set(BSP_PATH "bsp_te0720_1cfa")
else()
message(WARNING "CMake not configured for this target!")
message(FATAL_ERROR "Target: ${TGT_BSP}!")
diff --git a/cmake/PreProjectConfig.cmake b/cmake/PreProjectConfig.cmake
index fa50baf3..41dd7de4 100644
--- a/cmake/PreProjectConfig.cmake
+++ b/cmake/PreProjectConfig.cmake
@@ -12,9 +12,9 @@ endif()
# Disable compiler checks for cross-compiling.
if(FSFW_OSAL MATCHES linux AND TGT_BSP)
- if(TGT_BSP MATCHES "arm/q7s")
+ if(TGT_BSP MATCHES "arm/q7s" OR TGT_BSP MATCHES "arm/te0720-1cfa")
set(CMAKE_TOOLCHAIN_FILE
- "${CMAKE_SCRIPT_PATH}/Q7SCrossCompileConfig.cmake"
+ "${CMAKE_SCRIPT_PATH}/Zynq7020CrossCompileConfig.cmake"
PARENT_SCOPE
)
elseif(TGT_BSP MATCHES "arm/raspberrypi" OR TGT_BSP MATCHES "arm/egse")
diff --git a/cmake/Q7SCrossCompileConfig.cmake b/cmake/Zynq7020CrossCompileConfig.cmake
similarity index 87%
rename from cmake/Q7SCrossCompileConfig.cmake
rename to cmake/Zynq7020CrossCompileConfig.cmake
index db05c8f0..be6702a1 100644
--- a/cmake/Q7SCrossCompileConfig.cmake
+++ b/cmake/Zynq7020CrossCompileConfig.cmake
@@ -1,16 +1,16 @@
-if(DEFINED ENV{Q7S_SYSROOT})
- set(ENV{Q7S_ROOTFS} $ENV{Q7S_SYSROOT})
+if(DEFINED ENV{ZYNQ_7020_SYSROOT})
+ set(ENV{ZYNQ_7020_ROOTFS} $ENV{ZYNQ_7020_SYSROOT})
endif()
# CROSS_COMPILE also needs to be set accordingly or passed to the CMake command
-if(NOT DEFINED ENV{Q7S_ROOTFS})
+if(NOT DEFINED ENV{ZYNQ_7020_ROOTFS})
# Sysroot has not been cached yet and was not set in environment either
if(NOT DEFINED SYSROOT_PATH)
message(FATAL_ERROR
- "Define the Q7S_ROOTFS variable to point to the Q7S rootfs."
+ "Define the ZYNQ_7020_ROOTFS variable to point to the Zynq-7020 rootfs."
)
endif()
else()
- set(SYSROOT_PATH "$ENV{Q7S_ROOTFS}" CACHE PATH "Q7S root filesystem path")
+ set(SYSROOT_PATH "$ENV{ZYNQ_7020_ROOTFS}" CACHE PATH "Zynq-7020 root filesystem path")
endif()
if(NOT DEFINED ENV{CROSS_COMPILE})
@@ -87,18 +87,21 @@ set(C_FLAGS
-mfloat-abi=hard
${COMMON_FLAGS}
-lgpiod
- -lxiphos
)
+if (TGT_BSP MATCHES "arm/q7s")
+ set(C_FLAGS ${C_FLAGS} -lxiphos)
+endif()
+
string (REPLACE ";" " " C_FLAGS "${C_FLAGS}")
set(CMAKE_C_FLAGS
${C_FLAGS}
- CACHE STRING "C flags for Q7S"
+ CACHE STRING "C flags for Zynq-7020"
)
set(CMAKE_CXX_FLAGS
"${CMAKE_C_FLAGS}"
- CACHE STRING "CPP flags for Q7S"
+ CACHE STRING "CPP flags for Zynq-7020"
)
# search for programs in the build host directories
diff --git a/cmake/scripts/Q7S/q7s-env.sh b/cmake/scripts/Q7S/q7s-env.sh
index 818ff213..df9dbadc 100755
--- a/cmake/scripts/Q7S/q7s-env.sh
+++ b/cmake/scripts/Q7S/q7s-env.sh
@@ -2,6 +2,6 @@
export PATH=$PATH:"$HOME/EIVE/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin"
export CROSS_COMPILE="arm-linux-gnueabihf"
-export Q7S_SYSROOT="$HOME/Xilinx/cortexa9hf-neon-xiphos-linux-gnueabi"
+export ZYNQ_7020_SYSROOT="$HOME/Xilinx/cortexa9hf-neon-xiphos-linux-gnueabi"
export CONSOLE_PREFIX="[Q7S ENV]"
/bin/bash
diff --git a/cmake/scripts/Q7S/win-q7s-env.sh b/cmake/scripts/Q7S/win-q7s-env.sh
new file mode 100644
index 00000000..703949e3
--- /dev/null
+++ b/cmake/scripts/Q7S/win-q7s-env.sh
@@ -0,0 +1,49 @@
+#!/bin/sh
+# Run with: source win-q7s-env.sh [OPTIONS]
+function help () {
+ echo "source win-q7s-env.sh [options] -t|--toolchain= -s|--sysroot="
+}
+
+TOOLCHAIN_PATH="/c/Xilinx/Vitis/2019.2/gnu/aarch32/nt/gcc-arm-linux-gnueabi/bin"
+SYSROOT="/c/Users/${USER}/eive-software/cortexa9hf-neon-xiphos-linux-gnueabi"
+
+for i in "$@"; do
+ case $i in
+ -t=*|--toolchain=*)
+ TOOLCHAIN_PATH="${i#*=}"
+ shift
+ ;;
+ -s=*|--sysroot=*)
+ SYSROOT="${i#*=}"
+ shift
+ ;;
+ -h|--help)
+ help
+ shift
+ ;;
+ -*|--*)
+ echo "Unknown option $i"
+ help
+ return
+ ;;
+ *)
+ ;;
+ esac
+done
+
+if [ -d "$TOOLCHAIN_PATH" ]; then
+ export PATH=$PATH:"/c/Xilinx/Vitis/2019.2/gnu/aarch32/nt/gcc-arm-linux-gnueabi/bin"
+ export CROSS_COMPILE="arm-linux-gnueabihf"
+ echo "Set toolchain path to /c/Xilinx/Vitis/2019.2/gnu/aarch32/nt/gcc-arm-linux-gnueabi/bin"
+else
+ echo "Toolchain path $TOOLCHAIN_PATH does not exist"
+ return
+fi
+
+if [ -d "$SYSROOT" ]; then
+ export ZYNQ_7020_SYSROOT=$SYSROOT
+ echo "Set sysroot path to $SYSROOT"
+else
+ echo "Sysroot path $SYSROOT does not exist"
+ return
+fi
\ No newline at end of file
diff --git a/cmake/scripts/cmake-build-cfg.py b/cmake/scripts/cmake-build-cfg.py
index 5d1b1048..4c5ee536 100755
--- a/cmake/scripts/cmake-build-cfg.py
+++ b/cmake/scripts/cmake-build-cfg.py
@@ -12,6 +12,7 @@ import os
import sys
import argparse
import shutil
+import stat
def main():
@@ -102,7 +103,7 @@ def main():
build_path = source_location + os.path.sep + build_folder
remove_old_dir = False
if remove_old_dir:
- shutil.rmtree(build_path)
+ rm_build_dir(build_path)
os.chdir(source_location)
os.mkdir(build_folder)
print(f"Navigating into build directory: {build_path}")
@@ -117,6 +118,14 @@ def main():
print(f"\" {cmake_command} \"")
os.system(cmake_command)
print("-- CMake configuration done. --")
+
+
+def rm_build_dir(path: str):
+ # On windows the permissions of the build directory may have been set to read-only. If this
+ # is the case the permissions are changed before trying to delete the directory.
+ if not os.access(path, os.W_OK):
+ os.chmod(path, stat.S_IWUSR)
+ shutil.rmtree(path)
def determine_source_location() -> str:
diff --git a/cmake/scripts/te0720-1cfa/make-debug-cfg.sh b/cmake/scripts/te0720-1cfa/make-debug-cfg.sh
new file mode 100644
index 00000000..46008c41
--- /dev/null
+++ b/cmake/scripts/te0720-1cfa/make-debug-cfg.sh
@@ -0,0 +1,34 @@
+#!/bin/sh
+counter=0
+cfg_script_name="cmake-build-cfg.py"
+while [ ${counter} -lt 5 ]
+do
+ cd ..
+ if [ -f ${cfg_script_name} ];then
+ break
+ fi
+ counter=$((counter=counter + 1))
+done
+
+if [ "${counter}" -ge 5 ];then
+ echo "${cfg_script_name} not found in upper directories!"
+ exit 1
+fi
+
+
+os_fsfw="linux"
+tgt_bsp="arm/te0720-1cfa"
+build_generator="make"
+build_dir="build-Debug-te0720-1cfa"
+if [ "${OS}" = "Windows_NT" ]; then
+ python="py"
+# Could be other OS but this works for now.
+else
+ python="python3"
+fi
+
+echo "Running command (without the leading +):"
+set -x # Print command
+${python} ${cfg_script_name} -o "${os_fsfw}" -g "${build_generator}" -b "debug" -t "${tgt_bsp}" \
+ -l"${build_dir}"
+# set +x
diff --git a/cmake/scripts/Q7S/q7s-env-win.sh b/cmake/scripts/te0720-1cfa/win-env-te0720-1cfa.sh
similarity index 87%
rename from cmake/scripts/Q7S/q7s-env-win.sh
rename to cmake/scripts/te0720-1cfa/win-env-te0720-1cfa.sh
index 2cbc0bab..e77de4c8 100644
--- a/cmake/scripts/Q7S/q7s-env-win.sh
+++ b/cmake/scripts/te0720-1cfa/win-env-te0720-1cfa.sh
@@ -5,7 +5,7 @@ function help () {
}
TOOLCHAIN_PATH="/c/Xilinx/Vitis/2019.2/gnu/aarch32/nt/gcc-arm-linux-gnueabi/bin"
-SYSROOT="/c/Users/${USER}/eive-software/cortexa9hf-neon-xiphos-linux-gnueabi"
+SYSROOT="/c/Users/${USER}/eive-software/sysroots-petalinux-2019-2/cortexa9t2hf-neon-xilinx-linux-gnueabi"
for i in "$@"; do
case $i in
@@ -41,7 +41,7 @@ else
fi
if [ -d "$SYSROOT" ]; then
- export Q7S_SYSROOT=$SYSROOT
+ export ZYNQ_7020_SYSROOT=$SYSROOT
echo "Set sysroot path to $SYSROOT"
else
echo "Sysroot path $SYSROOT does not exist"
diff --git a/common/config/commonClassIds.h b/common/config/commonClassIds.h
index 01f186a4..03d51888 100644
--- a/common/config/commonClassIds.h
+++ b/common/config/commonClassIds.h
@@ -13,7 +13,8 @@ enum commonClassIds: uint8_t {
IMTQ_HANDLER, //IMTQ
RW_HANDLER, //RWHA
STR_HANDLER, //STRH
- PLOC_MPSOC_HANDLER, //PLMP
+ DWLPWRON_CMD, //DWLPWRON
+ MPSOC_TM, //MPTM
PLOC_SUPERVISOR_HANDLER, //PLSV
SUS_HANDLER, //SUSS
CCSDS_IP_CORE_BRIDGE, //IPCI
@@ -27,7 +28,10 @@ enum commonClassIds: uint8_t {
RATE_SETTER, //RS
ARCSEC_JSON_BASE, //JSONBASE
NVM_PARAM_BASE, //NVMB
+ FILE_SYSTEM_HELPER, //FSHLP
+ PLOC_MPSOC_HELPER, // PLMPHLP
SA_DEPL_HANDLER, //SADPL
+ MPSOC_RETURN_VALUES_IF, //MPSOCRTVIF
COMMON_CLASS_ID_END // [EXPORT] : [END]
};
diff --git a/common/config/commonObjects.h b/common/config/commonObjects.h
index 6cc90be9..a4f3319e 100644
--- a/common/config/commonObjects.h
+++ b/common/config/commonObjects.h
@@ -42,6 +42,7 @@ enum commonObjects: uint32_t {
IMTQ_HANDLER = 0x44140014,
PLOC_MPSOC_HANDLER = 0x44330015,
PLOC_SUPERVISOR_HANDLER = 0x44330016,
+ PLOC_SUPERVISOR_HELPER = 0x44330017,
/**
* Not yet specified which pt1000 will measure which device/location in the satellite.
@@ -89,8 +90,14 @@ enum commonObjects: uint32_t {
PLOC_UPDATER = 0x44330000,
PLOC_MEMORY_DUMPER = 0x44330001,
STR_HELPER = 0x44330002,
- AXI_PTME_CONFIG = 44330003,
- PTME_CONFIG = 44330004,
+ PLOC_MPSOC_HELPER = 0x44330003,
+ AXI_PTME_CONFIG = 44330004,
+ PTME_CONFIG = 44330005,
+
+ // 0x73 ('s') for assemblies and system/subsystem components
+ ACS_BOARD_ASS = 0x73000001,
+ SUS_BOARD_ASS = 0x73000002,
+ TCS_BOARD_ASS = 0x73000003
};
}
diff --git a/common/config/commonSubsystemIds.h b/common/config/commonSubsystemIds.h
index 9f293ec6..cd692231 100644
--- a/common/config/commonSubsystemIds.h
+++ b/common/config/commonSubsystemIds.h
@@ -6,20 +6,30 @@
namespace SUBSYSTEM_ID {
enum: uint8_t {
COMMON_SUBSYSTEM_ID_START = FW_SUBSYSTEM_ID_RANGE,
- PCDU_HANDLER = 108,
- HEATER_HANDLER = 109,
- SA_DEPL_HANDLER = 110,
- PLOC_MPSOC_HANDLER = 111,
- IMTQ_HANDLER = 112,
- RW_HANDLER = 113,
- STR_HANDLER = 114,
- PLOC_SUPERVISOR_HANDLER = 115,
- FILE_SYSTEM = 116,
- PLOC_UPDATER = 117,
- PLOC_MEMORY_DUMPER = 118,
- PDEC_HANDLER = 119,
- STR_HELPER = 120,
- PL_PCDU_HANDLER = 121,
+ ACS_SUBSYSTEM = 112,
+ PCDU_HANDLER = 113,
+ HEATER_HANDLER = 114,
+ SA_DEPL_HANDLER = 115,
+ PLOC_MPSOC_HANDLER = 116,
+ IMTQ_HANDLER = 117,
+ RW_HANDLER = 118,
+ STR_HANDLER = 119,
+ PLOC_SUPERVISOR_HANDLER = 120,
+ FILE_SYSTEM = 121,
+ PLOC_UPDATER = 122,
+ PLOC_MEMORY_DUMPER = 123,
+ PDEC_HANDLER = 124,
+ STR_HELPER = 125,
+ PLOC_MPSOC_HELPER = 126,
+ PL_PCDU_HANDLER = 127,
+ ACS_BOARD_ASS = 128,
+ SUS_BOARD_ASS = 129,
+ TCS_BOARD_ASS = 130,
+ GPS_HANDLER = 131,
+ P60_DOCK_HANDLER = 132,
+ PDU1_HANDLER = 133,
+ PDU2_HANDLER = 134,
+ ACU_HANDLER = 135,
COMMON_SUBSYSTEM_ID_END
};
}
diff --git a/common/config/devConf.h b/common/config/devConf.h
index 8a35a0fa..abb3b3e1 100644
--- a/common/config/devConf.h
+++ b/common/config/devConf.h
@@ -3,6 +3,7 @@
#include
#include
+#include
/**
* SPI configuration will be contained here to let the device handlers remain independent
@@ -28,6 +29,7 @@ static constexpr spi::SpiModes DEFAULT_L3G_MODE = spi::SpiModes::MODE_3;
* the decoder and buffer circuits. Thus frequency is here defined to 1 MHz.
*/
static const uint32_t SUS_MAX1227_SPI_FREQ = 976'000;
+static constexpr spi::SpiModes SUS_MAX_1227_MODE = spi::SpiModes::MODE_3;
static constexpr uint32_t DEFAULT_MAX_1227_SPEED = 976'000;
static constexpr spi::SpiModes DEFAULT_MAX_1227_MODE = spi::SpiModes::MODE_3;
@@ -48,11 +50,11 @@ static constexpr spi::SpiModes RTD_MODE = spi::SpiModes::MODE_3;
namespace uart {
static constexpr size_t HYPERION_GPS_REPLY_MAX_BUFFER = 1024;
-static constexpr uint32_t SYRLINKS_BAUD = 38400;
-static constexpr uint32_t GNSS_BAUD = 9600;
-static constexpr uint32_t PLOC_MPSOC_BAUD = 921600;
-static constexpr uint32_t PLOC_SUPERVISOR_BAUD = 115200;
-static constexpr uint32_t STAR_TRACKER_BAUD = 921600;
+static constexpr UartBaudRate SYRLINKS_BAUD = UartBaudRate::RATE_38400;
+static constexpr UartBaudRate GNSS_BAUD = UartBaudRate::RATE_9600;
+static constexpr UartBaudRate PLOC_MPSOC_BAUD = UartBaudRate::RATE_115200;
+static constexpr UartBaudRate PLOC_SUPERVISOR_BAUD = UartBaudRate::RATE_115200;
+static constexpr UartBaudRate STAR_TRACKER_BAUD = UartBaudRate::RATE_921600;
}
diff --git a/common/config/devices/gpioIds.h b/common/config/devices/gpioIds.h
index e6f42eb4..199439cc 100644
--- a/common/config/devices/gpioIds.h
+++ b/common/config/devices/gpioIds.h
@@ -119,7 +119,11 @@ enum gpioId_t {
PLPCDU_ENB_TX,
PLPCDU_ENB_HPA,
PLPCDU_ENB_MPA,
- PLPCDU_ADC_CS
+ PLPCDU_ADC_CS,
+
+ ENABLE_MPSOC_UART,
+ ENABLE_SUPV_UART
+
};
}
diff --git a/common/config/devices/powerSwitcherList.h b/common/config/devices/powerSwitcherList.h
index 45428a2e..d032428b 100644
--- a/common/config/devices/powerSwitcherList.h
+++ b/common/config/devices/powerSwitcherList.h
@@ -1,60 +1,6 @@
#ifndef FSFWCONFIG_DEVICES_POWERSWITCHERLIST_H_
#define FSFWCONFIG_DEVICES_POWERSWITCHERLIST_H_
-#include "OBSWConfig.h"
-
-#include
-
-namespace pcduSwitches {
- /* Switches are uint8_t datatype and go from 0 to 255 */
- enum SwitcherList: uint8_t {
- Q7S,
- PAYLOAD_PCDU_CH1,
- RW,
- TCS_BOARD_8V_HEATER_IN,
- SUS_REDUNDANT,
- DEPLOYMENT_MECHANISM,
- PAYLOAD_PCDU_CH6,
- ACS_BOARD_SIDE_B,
- PAYLOAD_CAMERA,
- TCS_BOARD_3V3,
- SYRLINKS,
- STAR_TRACKER,
- MGT,
- SUS_NOMINAL,
- SOLAR_CELL_EXP,
- PLOC,
- ACS_BOARD_SIDE_A,
- NUMBER_OF_SWITCHES
- };
-
- static const uint8_t ON = 1;
- static const uint8_t OFF = 0;
-
- /* Output states after reboot of the PDUs */
- static const uint8_t INIT_STATE_Q7S = ON;
- static const uint8_t INIT_STATE_PAYLOAD_PCDU_CH1 = OFF;
- static const uint8_t INIT_STATE_RW = OFF;
-#if BOARD_TE0720 == 1
- /* Because the TE0720 is not connected to the PCDU, this switch is always on */
- static const uint8_t INIT_STATE_TCS_BOARD_8V_HEATER_IN = ON;
-#else
- static const uint8_t INIT_STATE_TCS_BOARD_8V_HEATER_IN = OFF;
-#endif
- static const uint8_t INIT_STATE_SUS_REDUNDANT = OFF;
- static const uint8_t INIT_STATE_DEPLOYMENT_MECHANISM = OFF;
- static const uint8_t INIT_STATE_PAYLOAD_PCDU_CH6 = OFF;
- static const uint8_t INIT_STATE_ACS_BOARD_SIDE_B = OFF;
- static const uint8_t INIT_STATE_PAYLOAD_CAMERA = OFF;
- static const uint8_t INIT_STATE_TCS_BOARD_3V3 = OFF;
- static const uint8_t INIT_STATE_SYRLINKS = OFF;
- static const uint8_t INIT_STATE_STAR_TRACKER = OFF;
- static const uint8_t INIT_STATE_MGT = OFF;
- static const uint8_t INIT_STATE_SUS_NOMINAL = OFF;
- static const uint8_t INIT_STATE_SOLAR_CELL_EXP = OFF;
- static const uint8_t INIT_STATE_PLOC = OFF;
- static const uint8_t INIT_STATE_ACS_BOARD_SIDE_A = OFF;
-}
-
+#include "mission/devices/devicedefinitions/GomspaceDefinitions.h"
#endif /* FSFWCONFIG_DEVICES_POWERSWITCHERLIST_H_ */
diff --git a/common/config/eive/definitions.h b/common/config/eive/definitions.h
new file mode 100644
index 00000000..db430540
--- /dev/null
+++ b/common/config/eive/definitions.h
@@ -0,0 +1,25 @@
+#ifndef COMMON_CONFIG_DEFINITIONS_H_
+#define COMMON_CONFIG_DEFINITIONS_H_
+
+#include
+
+namespace config {
+
+static constexpr uint32_t PL_PCDU_TRANSITION_TIMEOUT_MS = 20 * 60 * 1000;
+static constexpr uint32_t LONGEST_MODE_TIMEOUT_SECONDS = PL_PCDU_TRANSITION_TIMEOUT_MS / 1000;
+
+/* Add mission configuration flags here */
+static constexpr uint32_t OBSW_FILESYSTEM_HANDLER_QUEUE_SIZE = 50;
+static constexpr uint32_t PLOC_UPDATER_QUEUE_SIZE = 50;
+static constexpr uint32_t STR_IMG_HELPER_QUEUE_SIZE = 50;
+
+static constexpr uint8_t LIVE_TM = 0;
+
+/* Limits for filename and path checks */
+static constexpr uint32_t MAX_PATH_SIZE = 100;
+static constexpr uint32_t MAX_FILENAME_SIZE = 50;
+
+}
+
+
+#endif /* COMMON_CONFIG_DEFINITIONS_H_ */
diff --git a/fsfw b/fsfw
index 47d15815..613dbe95 160000
--- a/fsfw
+++ b/fsfw
@@ -1 +1 @@
-Subproject commit 47d158156b9efa0edbca9b3a1694f4132b0b30e5
+Subproject commit 613dbe9592c30d9acf4cdb95d81d9f216f07374b
diff --git a/generators/.gitignore b/generators/.gitignore
index 181d655f..889fd273 100644
--- a/generators/.gitignore
+++ b/generators/.gitignore
@@ -1 +1,2 @@
.~lock*
+/venv
diff --git a/generators/.run/events.run.xml b/generators/.run/events.run.xml
index 18f71033..6bc73c96 100644
--- a/generators/.run/events.run.xml
+++ b/generators/.run/events.run.xml
@@ -12,7 +12,7 @@
-
+
diff --git a/generators/.run/objects.run.xml b/generators/.run/objects.run.xml
index 961b8ed9..df684cc8 100644
--- a/generators/.run/objects.run.xml
+++ b/generators/.run/objects.run.xml
@@ -12,7 +12,7 @@
-
+
diff --git a/generators/.run/returnvalues.run.xml b/generators/.run/returnvalues.run.xml
index 51b16449..dcb00efb 100644
--- a/generators/.run/returnvalues.run.xml
+++ b/generators/.run/returnvalues.run.xml
@@ -12,7 +12,7 @@
-
+
diff --git a/generators/bsp_q7s_events.csv b/generators/bsp_q7s_events.csv
index fa39dd9b..b0fd2400 100644
--- a/generators/bsp_q7s_events.csv
+++ b/generators/bsp_q7s_events.csv
@@ -77,65 +77,110 @@
8901;0x22c5;CLOCK_SET_FAILURE;LOW;;fsfw/src/fsfw/pus/Service9TimeManagement.h
9700;0x25e4;TEST;INFO;;fsfw/src/fsfw/pus/Service17Test.h
10600;0x2968;CHANGE_OF_SETUP_PARAMETER;LOW;;fsfw/hal/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h
-10900;0x2a94;GPIO_PULL_HIGH_FAILED;LOW;;mission/devices/HeaterHandler.h
-10901;0x2a95;GPIO_PULL_LOW_FAILED;LOW;;mission/devices/HeaterHandler.h
-10902;0x2a96;SWITCH_ALREADY_ON;LOW;;mission/devices/HeaterHandler.h
-10903;0x2a97;SWITCH_ALREADY_OFF;LOW;;mission/devices/HeaterHandler.h
-10904;0x2a98;MAIN_SWITCH_TIMEOUT;LOW;;mission/devices/HeaterHandler.h
-11000;0x2af8;MAIN_SWITCH_ON_TIMEOUT;LOW;;mission/devices/SolarArrayDeploymentHandler.h
-11001;0x2af9;MAIN_SWITCH_OFF_TIMEOUT;LOW;;mission/devices/SolarArrayDeploymentHandler.h
-11002;0x2afa;DEPLOYMENT_FAILED;HIGH;;mission/devices/SolarArrayDeploymentHandler.h
-11003;0x2afb;DEPL_SA1_GPIO_SWTICH_ON_FAILED;HIGH;;mission/devices/SolarArrayDeploymentHandler.h
-11004;0x2afc;DEPL_SA2_GPIO_SWTICH_ON_FAILED;HIGH;;mission/devices/SolarArrayDeploymentHandler.h
-11101;0x2b5d;MEMORY_READ_RPT_CRC_FAILURE;LOW;;mission/devices/PlocMPSoCHandler.h
-11102;0x2b5e;ACK_FAILURE;LOW;;mission/devices/PlocMPSoCHandler.h
-11103;0x2b5f;EXE_FAILURE;LOW;;mission/devices/PlocMPSoCHandler.h
-11104;0x2b60;CRC_FAILURE_EVENT;LOW;;mission/devices/PlocMPSoCHandler.h
-11201;0x2bc1;SELF_TEST_I2C_FAILURE;LOW;Get self test result returns I2C failure P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
-11202;0x2bc2;SELF_TEST_SPI_FAILURE;LOW;Get self test result returns SPI failure. This concerns the MTM connectivity. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
-11203;0x2bc3;SELF_TEST_ADC_FAILURE;LOW;Get self test result returns failure in measurement of current and temperature. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
-11204;0x2bc4;SELF_TEST_PWM_FAILURE;LOW;Get self test result returns PWM failure which concerns the coil actuation. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
-11205;0x2bc5;SELF_TEST_TC_FAILURE;LOW;Get self test result returns TC failure (system failure) P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
-11206;0x2bc6;SELF_TEST_MTM_RANGE_FAILURE;LOW;Get self test result returns failure that MTM values were outside of the expected range. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
-11207;0x2bc7;SELF_TEST_COIL_CURRENT_FAILURE;LOW;Get self test result returns failure indicating that the coil current was outside of the expected range P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
-11208;0x2bc8;INVALID_ERROR_BYTE;LOW;Received invalid error byte. This indicates an error of the communication link between IMTQ and OBC.;mission/devices/IMTQHandler.h
-11301;0x2c25;ERROR_STATE;HIGH;Reaction wheel signals an error state;mission/devices/RwHandler.h
-11401;0x2c89;BOOTING_FIRMWARE_FAILED;LOW;Failed to boot firmware;linux/devices/startracker/StarTrackerHandler.h
-11402;0x2c8a;BOOTING_BOOTLOADER_FAILED;LOW;Failed to boot star tracker into bootloader mode;linux/devices/startracker/StarTrackerHandler.h
-11501;0x2ced;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;bsp_q7s/devices/PlocSupervisorHandler.h
-11502;0x2cee;SUPV_ACK_FAILURE;LOW;PLOC supervisor received acknowledgment failure report;bsp_q7s/devices/PlocSupervisorHandler.h
-11503;0x2cef;SUPV_EXE_FAILURE;LOW;PLOC received execution failure report;bsp_q7s/devices/PlocSupervisorHandler.h
-11504;0x2cf0;SUPV_CRC_FAILURE_EVENT;LOW;PLOC supervisor reply has invalid crc;bsp_q7s/devices/PlocSupervisorHandler.h
-11600;0x2d50;ALLOC_FAILURE;MEDIUM;;bsp_q7s/core/CoreController.h
-11601;0x2d51;REBOOT_SW;MEDIUM; Software reboot occured. Can also be a systemd reboot. P1: Current Chip, P2: Current Copy;bsp_q7s/core/CoreController.h
-11603;0x2d53;REBOOT_HW;MEDIUM;;bsp_q7s/core/CoreController.h
-11700;0x2db4;UPDATE_FILE_NOT_EXISTS;LOW;;bsp_q7s/devices/PlocUpdater.h
-11701;0x2db5;ACTION_COMMANDING_FAILED;LOW;Failed to send command to supervisor handler P1: Return value of CommandActionHelper::commandAction P2: Action ID of command to send;bsp_q7s/devices/PlocUpdater.h
-11702;0x2db6;UPDATE_AVAILABLE_FAILED;LOW;Supervisor handler replied action message indicating a command execution failure of the update available command;bsp_q7s/devices/PlocUpdater.h
-11703;0x2db7;UPDATE_TRANSFER_FAILED;LOW;Supervisor handler failed to transfer an update space packet. P1: Parameter holds the number of update packets already sent (inclusive the failed packet);bsp_q7s/devices/PlocUpdater.h
-11704;0x2db8;UPDATE_VERIFY_FAILED;LOW;Supervisor failed to execute the update verify command.;bsp_q7s/devices/PlocUpdater.h
-11705;0x2db9;UPDATE_FINISHED;INFO;MPSoC update successful completed;bsp_q7s/devices/PlocUpdater.h
-11800;0x2e18;SEND_MRAM_DUMP_FAILED;LOW;Failed to send mram dump command to supervisor handler P1: Return value of commandAction function P2: Start address of MRAM to dump with this command;bsp_q7s/devices/PlocMemoryDumper.h
-11801;0x2e19;MRAM_DUMP_FAILED;LOW;Received completion failure report form PLOC supervisor handler P1: MRAM start address of failing dump command;bsp_q7s/devices/PlocMemoryDumper.h
-11802;0x2e1a;MRAM_DUMP_FINISHED;LOW;MRAM dump finished successfully;bsp_q7s/devices/PlocMemoryDumper.h
-11901;0x2e7d;INVALID_TC_FRAME;HIGH;;linux/obc/PdecHandler.h
-11902;0x2e7e;INVALID_FAR;HIGH;Read invalid FAR from PDEC after startup;linux/obc/PdecHandler.h
-11903;0x2e7f;CARRIER_LOCK;INFO;Carrier lock detected;linux/obc/PdecHandler.h
-11904;0x2e80;BIT_LOCK_PDEC;INFO;Bit lock detected (data valid);linux/obc/PdecHandler.h
-12000;0x2ee0;IMAGE_UPLOAD_FAILED;LOW;Image upload failed;linux/devices/startracker/StrHelper.h
-12001;0x2ee1;IMAGE_DOWNLOAD_FAILED;LOW;Image download failed;linux/devices/startracker/StrHelper.h
-12002;0x2ee2;IMAGE_UPLOAD_SUCCESSFUL;LOW;Uploading image to star tracker was successfulop;linux/devices/startracker/StrHelper.h
-12003;0x2ee3;IMAGE_DOWNLOAD_SUCCESSFUL;LOW;Image download was successful;linux/devices/startracker/StrHelper.h
-12004;0x2ee4;FLASH_WRITE_SUCCESSFUL;LOW;Finished flash write procedure successfully;linux/devices/startracker/StrHelper.h
-12005;0x2ee5;FLASH_READ_SUCCESSFUL;LOW;Finished flash read procedure successfully;linux/devices/startracker/StrHelper.h
-12006;0x2ee6;FLASH_READ_FAILED;LOW;Flash read procedure failed;linux/devices/startracker/StrHelper.h
-12007;0x2ee7;FIRMWARE_UPDATE_SUCCESSFUL;LOW;Firmware update was successful;linux/devices/startracker/StrHelper.h
-12008;0x2ee8;FIRMWARE_UPDATE_FAILED;LOW;Firmware update failed;linux/devices/startracker/StrHelper.h
-12009;0x2ee9;STR_HELPER_READING_REPLY_FAILED;LOW;Failed to read communication interface reply data P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux/devices/startracker/StrHelper.h
-12010;0x2eea;STR_HELPER_COM_ERROR;LOW;Unexpected stop of decoding sequence P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux/devices/startracker/StrHelper.h
-12011;0x2eeb;STR_HELPER_NO_REPLY;LOW;Star tracker did not send replies (maybe device is powered off) P1: Position of upload or download packet for which no reply was sent;linux/devices/startracker/StrHelper.h
-12012;0x2eec;STR_HELPER_DEC_ERROR;LOW;Error during decoding of received reply occurred P1: Return value of decoding function P2: Position of upload/download packet, or address of flash write/read request;linux/devices/startracker/StrHelper.h
-12013;0x2eed;POSITION_MISMATCH;LOW;Position mismatch P1: The expected position and thus the position for which the image upload/download failed;linux/devices/startracker/StrHelper.h
-12014;0x2eee;STR_HELPER_FILE_NOT_EXISTS;LOW;Specified file does not exist P1: Internal state of str helper;linux/devices/startracker/StrHelper.h
-12015;0x2eef;STR_HELPER_SENDING_PACKET_FAILED;LOW;;linux/devices/startracker/StrHelper.h
-12016;0x2ef0;STR_HELPER_REQUESTING_MSG_FAILED;LOW;;linux/devices/startracker/StrHelper.h
+11300;0x2c24;SWITCH_CMD_SENT;INFO;Indicates that a FSFW object requested setting a switch P1: 1 if on was requested, 0 for off | P2: Switch Index;mission/devices/devicedefinitions/powerDefinitions.h
+11301;0x2c25;SWITCH_HAS_CHANGED;INFO;Indicated that a swithc state has changed P1: New switch state, 1 for on, 0 for off | P2: Switch Index;mission/devices/devicedefinitions/powerDefinitions.h
+11302;0x2c26;SWITCHING_Q7S_DENIED;MEDIUM;;mission/devices/devicedefinitions/powerDefinitions.h
+11400;0x2c88;GPIO_PULL_HIGH_FAILED;LOW;;mission/devices/HeaterHandler.h
+11401;0x2c89;GPIO_PULL_LOW_FAILED;LOW;;mission/devices/HeaterHandler.h
+11402;0x2c8a;SWITCH_ALREADY_ON;LOW;;mission/devices/HeaterHandler.h
+11403;0x2c8b;SWITCH_ALREADY_OFF;LOW;;mission/devices/HeaterHandler.h
+11404;0x2c8c;MAIN_SWITCH_TIMEOUT;LOW;;mission/devices/HeaterHandler.h
+11500;0x2cec;MAIN_SWITCH_ON_TIMEOUT;LOW;;mission/devices/SolarArrayDeploymentHandler.h
+11501;0x2ced;MAIN_SWITCH_OFF_TIMEOUT;LOW;;mission/devices/SolarArrayDeploymentHandler.h
+11502;0x2cee;DEPLOYMENT_FAILED;HIGH;;mission/devices/SolarArrayDeploymentHandler.h
+11503;0x2cef;DEPL_SA1_GPIO_SWTICH_ON_FAILED;HIGH;;mission/devices/SolarArrayDeploymentHandler.h
+11504;0x2cf0;DEPL_SA2_GPIO_SWTICH_ON_FAILED;HIGH;;mission/devices/SolarArrayDeploymentHandler.h
+11601;0x2d51;MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC crc failure in telemetry packet;linux/devices/ploc/PlocMPSoCHandler.h
+11602;0x2d52;ACK_FAILURE;LOW;PLOC receive acknowledgment failure report P1: Command Id which leads the acknowledgment failure report P2: The status field inserted by the MPSoC into the data field;linux/devices/ploc/PlocMPSoCHandler.h
+11603;0x2d53;EXE_FAILURE;LOW;PLOC receive execution failure report P1: Command Id which leads the execution failure report P2: The status field inserted by the MPSoC into the data field;linux/devices/ploc/PlocMPSoCHandler.h
+11604;0x2d54;MPSOC_HANDLER_CRC_FAILURE;LOW;PLOC reply has invalid crc;linux/devices/ploc/PlocMPSoCHandler.h
+11605;0x2d55;MPSOC_HANDLER_SEQ_CNT_MISMATCH;LOW;Packet sequence count in received space packet does not match expected count P1: Expected sequence count P2: Received sequence count;linux/devices/ploc/PlocMPSoCHandler.h
+11606;0x2d56;MPSOC_SHUTDOWN_FAILED;HIGH;Supervisor fails to shutdown MPSoC. Requires to power off the PLOC and thus also to shutdown the supervisor.;linux/devices/ploc/PlocMPSoCHandler.h
+11701;0x2db5;SELF_TEST_I2C_FAILURE;LOW;Get self test result returns I2C failure P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
+11702;0x2db6;SELF_TEST_SPI_FAILURE;LOW;Get self test result returns SPI failure. This concerns the MTM connectivity. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
+11703;0x2db7;SELF_TEST_ADC_FAILURE;LOW;Get self test result returns failure in measurement of current and temperature. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
+11704;0x2db8;SELF_TEST_PWM_FAILURE;LOW;Get self test result returns PWM failure which concerns the coil actuation. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
+11705;0x2db9;SELF_TEST_TC_FAILURE;LOW;Get self test result returns TC failure (system failure) P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
+11706;0x2dba;SELF_TEST_MTM_RANGE_FAILURE;LOW;Get self test result returns failure that MTM values were outside of the expected range. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
+11707;0x2dbb;SELF_TEST_COIL_CURRENT_FAILURE;LOW;Get self test result returns failure indicating that the coil current was outside of the expected range P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
+11708;0x2dbc;INVALID_ERROR_BYTE;LOW;Received invalid error byte. This indicates an error of the communication link between IMTQ and OBC.;mission/devices/IMTQHandler.h
+11801;0x2e19;ERROR_STATE;HIGH;Reaction wheel signals an error state;mission/devices/RwHandler.h
+11901;0x2e7d;BOOTING_FIRMWARE_FAILED;LOW;Failed to boot firmware;linux/devices/startracker/StarTrackerHandler.h
+11902;0x2e7e;BOOTING_BOOTLOADER_FAILED;LOW;Failed to boot star tracker into bootloader mode;linux/devices/startracker/StarTrackerHandler.h
+12001;0x2ee1;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;linux/devices/ploc/PlocSupervisorHandler.h
+12002;0x2ee2;SUPV_ACK_FAILURE;LOW;PLOC supervisor received acknowledgment failure report;linux/devices/ploc/PlocSupervisorHandler.h
+12003;0x2ee3;SUPV_EXE_FAILURE;LOW;PLOC received execution failure report;linux/devices/ploc/PlocSupervisorHandler.h
+12004;0x2ee4;SUPV_CRC_FAILURE_EVENT;LOW;PLOC supervisor reply has invalid crc;linux/devices/ploc/PlocSupervisorHandler.h
+12100;0x2f44;SANITIZATION_FAILED;LOW;;bsp_q7s/memory/SdCardManager.h
+12101;0x2f45;MOUNTED_SD_CARD;INFO;;bsp_q7s/memory/SdCardManager.h
+12200;0x2fa8;UPDATE_FILE_NOT_EXISTS;LOW;;linux/devices/ploc/PlocUpdater.h
+12201;0x2fa9;ACTION_COMMANDING_FAILED;LOW;Failed to send command to supervisor handler P1: Return value of CommandActionHelper::commandAction P2: Action ID of command to send;linux/devices/ploc/PlocUpdater.h
+12202;0x2faa;UPDATE_AVAILABLE_FAILED;LOW;Supervisor handler replied action message indicating a command execution failure of the update available command;linux/devices/ploc/PlocUpdater.h
+12203;0x2fab;UPDATE_TRANSFER_FAILED;LOW;Supervisor handler failed to transfer an update space packet. P1: Parameter holds the number of update packets already sent (inclusive the failed packet);linux/devices/ploc/PlocUpdater.h
+12204;0x2fac;UPDATE_VERIFY_FAILED;LOW;Supervisor failed to execute the update verify command.;linux/devices/ploc/PlocUpdater.h
+12205;0x2fad;UPDATE_FINISHED;INFO;MPSoC update successful completed;linux/devices/ploc/PlocUpdater.h
+12300;0x300c;SEND_MRAM_DUMP_FAILED;LOW;Failed to send mram dump command to supervisor handler P1: Return value of commandAction function P2: Start address of MRAM to dump with this command;linux/devices/ploc/PlocMemoryDumper.h
+12301;0x300d;MRAM_DUMP_FAILED;LOW;Received completion failure report form PLOC supervisor handler P1: MRAM start address of failing dump command;linux/devices/ploc/PlocMemoryDumper.h
+12302;0x300e;MRAM_DUMP_FINISHED;LOW;MRAM dump finished successfully;linux/devices/ploc/PlocMemoryDumper.h
+12401;0x3071;INVALID_TC_FRAME;HIGH;;linux/obc/PdecHandler.h
+12402;0x3072;INVALID_FAR;HIGH;Read invalid FAR from PDEC after startup;linux/obc/PdecHandler.h
+12403;0x3073;CARRIER_LOCK;INFO;Carrier lock detected;linux/obc/PdecHandler.h
+12404;0x3074;BIT_LOCK_PDEC;INFO;Bit lock detected (data valid);linux/obc/PdecHandler.h
+12500;0x30d4;IMAGE_UPLOAD_FAILED;LOW;Image upload failed;linux/devices/startracker/StrHelper.h
+12501;0x30d5;IMAGE_DOWNLOAD_FAILED;LOW;Image download failed;linux/devices/startracker/StrHelper.h
+12502;0x30d6;IMAGE_UPLOAD_SUCCESSFUL;LOW;Uploading image to star tracker was successfulop;linux/devices/startracker/StrHelper.h
+12503;0x30d7;IMAGE_DOWNLOAD_SUCCESSFUL;LOW;Image download was successful;linux/devices/startracker/StrHelper.h
+12504;0x30d8;FLASH_WRITE_SUCCESSFUL;LOW;Finished flash write procedure successfully;linux/devices/startracker/StrHelper.h
+12505;0x30d9;FLASH_READ_SUCCESSFUL;LOW;Finished flash read procedure successfully;linux/devices/startracker/StrHelper.h
+12506;0x30da;FLASH_READ_FAILED;LOW;Flash read procedure failed;linux/devices/startracker/StrHelper.h
+12507;0x30db;FIRMWARE_UPDATE_SUCCESSFUL;LOW;Firmware update was successful;linux/devices/startracker/StrHelper.h
+12508;0x30dc;FIRMWARE_UPDATE_FAILED;LOW;Firmware update failed;linux/devices/startracker/StrHelper.h
+12509;0x30dd;STR_HELPER_READING_REPLY_FAILED;LOW;Failed to read communication interface reply data P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux/devices/startracker/StrHelper.h
+12510;0x30de;STR_HELPER_COM_ERROR;LOW;Unexpected stop of decoding sequence P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux/devices/startracker/StrHelper.h
+12511;0x30df;STR_HELPER_NO_REPLY;LOW;Star tracker did not send replies (maybe device is powered off) P1: Position of upload or download packet for which no reply was sent;linux/devices/startracker/StrHelper.h
+12512;0x30e0;STR_HELPER_DEC_ERROR;LOW;Error during decoding of received reply occurred P1: Return value of decoding function P2: Position of upload/download packet, or address of flash write/read request;linux/devices/startracker/StrHelper.h
+12513;0x30e1;POSITION_MISMATCH;LOW;Position mismatch P1: The expected position and thus the position for which the image upload/download failed;linux/devices/startracker/StrHelper.h
+12514;0x30e2;STR_HELPER_FILE_NOT_EXISTS;LOW;Specified file does not exist P1: Internal state of str helper;linux/devices/startracker/StrHelper.h
+12515;0x30e3;STR_HELPER_SENDING_PACKET_FAILED;LOW;;linux/devices/startracker/StrHelper.h
+12516;0x30e4;STR_HELPER_REQUESTING_MSG_FAILED;LOW;;linux/devices/startracker/StrHelper.h
+12600;0x3138;MPSOC_FLASH_WRITE_FAILED;LOW;Flash write fails;linux/devices/ploc/PlocMPSoCHelper.h
+12601;0x3139;MPSOC_FLASH_WRITE_SUCCESSFUL;LOW;Flash write successful;linux/devices/ploc/PlocMPSoCHelper.h
+12602;0x313a;SENDING_COMMAND_FAILED;LOW;;linux/devices/ploc/PlocMPSoCHelper.h
+12603;0x313b;MPSOC_HELPER_REQUESTING_REPLY_FAILED;LOW;Request receive message of communication interface failed P1: Return value returned by the communication interface requestReceiveMessage function P2: Internal state of MPSoC helper;linux/devices/ploc/PlocMPSoCHelper.h
+12604;0x313c;MPSOC_HELPER_READING_REPLY_FAILED;LOW;Reading receive message of communication interface failed P1: Return value returned by the communication interface readingReceivedMessage function P2: Internal state of MPSoC helper;linux/devices/ploc/PlocMPSoCHelper.h
+12605;0x313d;MISSING_ACK;LOW;Did not receive acknowledgement report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux/devices/ploc/PlocMPSoCHelper.h
+12606;0x313e;MISSING_EXE;LOW;Did not receive execution report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux/devices/ploc/PlocMPSoCHelper.h
+12607;0x313f;ACK_FAILURE_REPORT;LOW;Received acknowledgement failure report P1: Internal state of MPSoC;linux/devices/ploc/PlocMPSoCHelper.h
+12608;0x3140;EXE_FAILURE_REPORT;LOW;Received execution failure report P1: Internal state of MPSoC;linux/devices/ploc/PlocMPSoCHelper.h
+12609;0x3141;ACK_INVALID_APID;LOW;Expected acknowledgement report but received space packet with other apid P1: Apid of received space packet P2: Internal state of MPSoC;linux/devices/ploc/PlocMPSoCHelper.h
+12610;0x3142;EXE_INVALID_APID;LOW;Expected execution report but received space packet with other apid P1: Apid of received space packet P2: Internal state of MPSoC;linux/devices/ploc/PlocMPSoCHelper.h
+12611;0x3143;MPSOC_HELPER_SEQ_CNT_MISMATCH;LOW;Received sequence count does not match expected sequence count P1: Expected sequence count P2: Received sequence count;linux/devices/ploc/PlocMPSoCHelper.h
+12700;0x319c;TRANSITION_BACK_TO_OFF;MEDIUM;Could not transition properly and went back to ALL OFF;mission/devices/PayloadPcduHandler.h
+12701;0x319d;NEG_V_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
+12702;0x319e;U_DRO_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
+12703;0x319f;I_DRO_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
+12704;0x31a0;U_X8_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
+12705;0x31a1;I_X8_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
+12706;0x31a2;U_TX_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
+12707;0x31a3;I_TX_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
+12708;0x31a4;U_MPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
+12709;0x31a5;I_MPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
+12710;0x31a6;U_HPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
+12711;0x31a7;I_HPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
+12800;0x3200;TRANSITION_OTHER_SIDE_FAILED;HIGH;;mission/system/AcsBoardAssembly.h
+12801;0x3201;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;;mission/system/AcsBoardAssembly.h
+12802;0x3202;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;;mission/system/AcsBoardAssembly.h
+12803;0x3203;SIDE_SWITCH_TRANSITION_NOT_ALLOWED;LOW;Not implemented, would increase already high complexity. Operator should instead command the assembly off first and then command the assembly on into the desired mode/submode combination;mission/system/AcsBoardAssembly.h
+12900;0x3264;TRANSITION_OTHER_SIDE_FAILED;HIGH;;mission/system/SusAssembly.h
+12901;0x3265;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;;mission/system/SusAssembly.h
+12902;0x3266;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;;mission/system/SusAssembly.h
+12903;0x3267;SIDE_SWITCH_TRANSITION_NOT_ALLOWED;LOW;Not implemented, would increase already high complexity. Operator should instead command the assembly off first and then command the assembly on into the desired mode/submode combination;mission/system/SusAssembly.h
+13000;0x32c8;CHILDREN_LOST_MODE;MEDIUM;;mission/system/TcsBoardAssembly.h
+13100;0x332c;GPS_FIX_CHANGE;INFO;Fix has changed. P1: Old fix. P2: New fix 0: Not seen, 1: No Fix, 2: 2D-Fix, 3: 3D-Fix;mission/devices/devicedefinitions/GPSDefinitions.h
+13200;0x3390;P60_BOOT_COUNT;INFO;P60 boot count is broadcasted once at SW startup. P1: Boot count;mission/devices/P60DockHandler.h
+13201;0x3391;BATT_MODE;INFO;Battery mode is broadcasted at startup. P1: Mode;mission/devices/P60DockHandler.h
+13202;0x3392;BATT_MODE_CHANGED;MEDIUM;Battery mode has changed. P1: Old mode. P2: New mode;mission/devices/P60DockHandler.h
+13600;0x3520;ALLOC_FAILURE;MEDIUM;;bsp_q7s/core/CoreController.h
+13601;0x3521;REBOOT_SW;MEDIUM; Software reboot occured. Can also be a systemd reboot. P1: Current Chip, P2: Current Copy;bsp_q7s/core/CoreController.h
+13602;0x3522;REBOOT_MECHANISM_TRIGGERED;MEDIUM;The reboot mechanism was triggered. P1: First 16 bits: Last Chip, Last 16 bits: Last Copy, P2: Each byte is the respective reboot count for the slots;bsp_q7s/core/CoreController.h
+13603;0x3523;REBOOT_HW;MEDIUM;;bsp_q7s/core/CoreController.h
diff --git a/generators/bsp_q7s_objects.csv b/generators/bsp_q7s_objects.csv
index a0c0a6dc..a19c8e77 100644
--- a/generators/bsp_q7s_objects.csv
+++ b/generators/bsp_q7s_objects.csv
@@ -40,8 +40,10 @@
0x44330000;PLOC_UPDATER
0x44330001;PLOC_MEMORY_DUMPER
0x44330002;STR_HELPER
+0x44330003;PLOC_MPSOC_HELPER
0x44330015;PLOC_MPSOC_HANDLER
0x44330016;PLOC_SUPERVISOR_HANDLER
+0x44330017;PLOC_SUPERVISOR_HELPER
0x444100A2;SOLAR_ARRAY_DEPL_HANDLER
0x444100A4;HEATER_HANDLER
0x44420004;TMP1075_HANDLER_1
@@ -107,6 +109,9 @@
0x5400CAFE;DUMMY_INTERFACE
0x54123456;LIBGPIOD_TEST
0x54694269;TEST_TASK
+0x73000001;ACS_BOARD_ASS
+0x73000002;SUS_BOARD_ASS
+0x73000003;TCS_BOARD_ASS
0x73000100;TM_FUNNEL
0x73500000;CCSDS_IP_CORE_BRIDGE
0xFFFFFFFF;NO_OBJECT
diff --git a/generators/bsp_q7s_returnvalues.csv b/generators/bsp_q7s_returnvalues.csv
index 447da5e9..a0f1562c 100644
--- a/generators/bsp_q7s_returnvalues.csv
+++ b/generators/bsp_q7s_returnvalues.csv
@@ -1,545 +1,551 @@
0x0;OK;System-wide code for ok.;RETURN_OK;HasReturnvaluesIF.h;HasReturnvaluesIF
0x1;Failed;Unspecified system-wide code for failed.;RETURN_FAILED;HasReturnvaluesIF.h;HasReturnvaluesIF
-0x64a0;NVMB_KeyNotExists;Specified key does not exist in json file;0xA0;mission/memory/NVMParameterBase.h;NVM_PARAM_BASE
-0x57a0;PLMP_CrcFailure;;0xA0;mission/devices/PlocMPSoCHandler.h;PLOC_MPSOC_HANDLER
-0x57a1;PLMP_ReceivedAckFailure;;0xA1;mission/devices/PlocMPSoCHandler.h;PLOC_MPSOC_HANDLER
-0x57a2;PLMP_ReceivedExeFailure;;0xA2;mission/devices/PlocMPSoCHandler.h;PLOC_MPSOC_HANDLER
-0x57a3;PLMP_InvalidApid;;0xA3;mission/devices/PlocMPSoCHandler.h;PLOC_MPSOC_HANDLER
-0x59a0;SUSS_ErrorUnlockMutex;;0xA0;mission/devices/SusHandler.h;SUS_HANDLER
-0x59a1;SUSS_ErrorLockMutex;;0xA1;mission/devices/SusHandler.h;SUS_HANDLER
-0x65a0;SADPL_CommandNotSupported;;0xA0;mission/devices/SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER
-0x65a1;SADPL_DeploymentAlreadyExecuting;;0xA1;mission/devices/SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER
-0x65a2;SADPL_MainSwitchTimeoutFailure;;0xA2;mission/devices/SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER
-0x65a3;SADPL_SwitchingDeplSa1Failed;;0xA3;mission/devices/SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER
-0x65a4;SADPL_SwitchingDeplSa2Failed;;0xA4;mission/devices/SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER
-0x55b0;RWHA_SpiWriteFailure;;0xB0;mission/devices/RwHandler.h;RW_HANDLER
-0x55b1;RWHA_SpiReadFailure;Used by the spi send function to tell a failing read call;0xB1;mission/devices/RwHandler.h;RW_HANDLER
-0x55b2;RWHA_MissingStartSign;Can be used by the HDLC decoding mechanism to inform about a missing start sign 0x7E;0xB2;mission/devices/RwHandler.h;RW_HANDLER
-0x55b3;RWHA_InvalidSubstitute;Can be used by the HDLC decoding mechanism to inform about an invalid substitution combination;0xB3;mission/devices/RwHandler.h;RW_HANDLER
-0x55b4;RWHA_MissingEndSign;HDLC decoding mechanism never receives the end sign 0x7E;0xB4;mission/devices/RwHandler.h;RW_HANDLER
-0x55b5;RWHA_NoReply;Reaction wheel only responds with empty frames.;0xB5;mission/devices/RwHandler.h;RW_HANDLER
-0x55b6;RWHA_NoStartMarker;Expected a start marker as first byte;0xB6;mission/devices/RwHandler.h;RW_HANDLER
-0x55a0;RWHA_InvalidSpeed;Action Message with invalid speed was received. Valid speeds must be in the range of [-65000; 1000] or [1000; 65000];0xA0;mission/devices/RwHandler.h;RW_HANDLER
-0x55a1;RWHA_InvalidRampTime;Action Message with invalid ramp time was received.;0xA1;mission/devices/RwHandler.h;RW_HANDLER
-0x55a2;RWHA_SetSpeedCommandInvalidLength;Received set speed command has invalid length. Should be 6.;0xA2;mission/devices/RwHandler.h;RW_HANDLER
-0x55a3;RWHA_ExecutionFailed;Command execution failed;0xA3;mission/devices/RwHandler.h;RW_HANDLER
-0x55a4;RWHA_CrcError;Reaction wheel reply has invalid crc;0xA4;mission/devices/RwHandler.h;RW_HANDLER
-0x5e00;GOMS_PacketTooLong;;0;mission/devices/GomspaceDeviceHandler.h;GOM_SPACE_HANDLER
-0x5e01;GOMS_InvalidTableId;;1;mission/devices/GomspaceDeviceHandler.h;GOM_SPACE_HANDLER
-0x5e02;GOMS_InvalidAddress;;2;mission/devices/GomspaceDeviceHandler.h;GOM_SPACE_HANDLER
-0x5e03;GOMS_InvalidParamSize;;3;mission/devices/GomspaceDeviceHandler.h;GOM_SPACE_HANDLER
-0x5e04;GOMS_InvalidPayloadSize;;4;mission/devices/GomspaceDeviceHandler.h;GOM_SPACE_HANDLER
-0x5e05;GOMS_UnknownReplyId;;5;mission/devices/GomspaceDeviceHandler.h;GOM_SPACE_HANDLER
-0x54a0;IMTQ_InvalidCommandCode;;0xA0;mission/devices/IMTQHandler.h;IMTQ_HANDLER
-0x54a1;IMTQ_ParameterMissing;;0xA1;mission/devices/IMTQHandler.h;IMTQ_HANDLER
-0x54a2;IMTQ_ParameterInvalid;;0xA2;mission/devices/IMTQHandler.h;IMTQ_HANDLER
-0x54a3;IMTQ_CcUnavailable;;0xA3;mission/devices/IMTQHandler.h;IMTQ_HANDLER
-0x54a4;IMTQ_InternalProcessingError;;0xA4;mission/devices/IMTQHandler.h;IMTQ_HANDLER
-0x54a5;IMTQ_RejectedWithoutReason;;0xA5;mission/devices/IMTQHandler.h;IMTQ_HANDLER
-0x54a6;IMTQ_CmdErrUnknown;;0xA6;mission/devices/IMTQHandler.h;IMTQ_HANDLER
-0x54a7;IMTQ_UnexpectedSelfTestReply;The status reply to a self test command was received but no self test command has been sent. This should normally never happen.;0xA7;mission/devices/IMTQHandler.h;IMTQ_HANDLER
-0x53a0;SYRLINKS_CrcFailure;;0xA0;mission/devices/SyrlinksHkHandler.h;SYRLINKS_HANDLER
-0x53a1;SYRLINKS_UartFraminOrParityErrorAck;;0xA1;mission/devices/SyrlinksHkHandler.h;SYRLINKS_HANDLER
-0x53a2;SYRLINKS_BadCharacterAck;;0xA2;mission/devices/SyrlinksHkHandler.h;SYRLINKS_HANDLER
-0x53a3;SYRLINKS_BadParameterValueAck;;0xA3;mission/devices/SyrlinksHkHandler.h;SYRLINKS_HANDLER
-0x53a4;SYRLINKS_BadEndOfFrameAck;;0xA4;mission/devices/SyrlinksHkHandler.h;SYRLINKS_HANDLER
-0x53a5;SYRLINKS_UnknownCommandIdAck;;0xA5;mission/devices/SyrlinksHkHandler.h;SYRLINKS_HANDLER
-0x53a6;SYRLINKS_BadCrcAck;;0xA6;mission/devices/SyrlinksHkHandler.h;SYRLINKS_HANDLER
-0x53a7;SYRLINKS_ReplyWrongSize;;0xA7;mission/devices/SyrlinksHkHandler.h;SYRLINKS_HANDLER
-0x53a8;SYRLINKS_MissingStartFrameCharacter;;0xA8;mission/devices/SyrlinksHkHandler.h;SYRLINKS_HANDLER
-0x52a1;HEATER_CommandNotSupported;;0xA1;mission/devices/HeaterHandler.h;HEATER_HANDLER
-0x52a2;HEATER_InitFailed;;0xA2;mission/devices/HeaterHandler.h;HEATER_HANDLER
-0x52a3;HEATER_InvalidSwitchNr;;0xA3;mission/devices/HeaterHandler.h;HEATER_HANDLER
-0x52a4;HEATER_MainSwitchSetTimeout;;0xA4;mission/devices/HeaterHandler.h;HEATER_HANDLER
-0x52a5;HEATER_CommandAlreadyWaiting;;0xA5;mission/devices/HeaterHandler.h;HEATER_HANDLER
-0x61a0;CCSDS_CommandNotImplemented;Received action message with unknown action id;0xA0;mission/tmtc/CCSDSHandler.h;CCSDS_HANDLER
-0x2701; SM_DataTooLarge;;1;fsfw/src/fsfw/storagemanager/StorageManagerIF.h;STORAGE_MANAGER_IF
-0x2702; SM_DataStorageFull;;2;fsfw/src/fsfw/storagemanager/StorageManagerIF.h;STORAGE_MANAGER_IF
-0x2703; SM_IllegalStorageId;;3;fsfw/src/fsfw/storagemanager/StorageManagerIF.h;STORAGE_MANAGER_IF
-0x2704; SM_DataDoesNotExist;;4;fsfw/src/fsfw/storagemanager/StorageManagerIF.h;STORAGE_MANAGER_IF
-0x2705; SM_IllegalAddress;;5;fsfw/src/fsfw/storagemanager/StorageManagerIF.h;STORAGE_MANAGER_IF
-0x2706; SM_PoolTooLarge;;6;fsfw/src/fsfw/storagemanager/StorageManagerIF.h;STORAGE_MANAGER_IF
-0x601; PP_DoItMyself;;1;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x602; PP_PointsToVariable;;2;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x603; PP_PointsToMemory;;3;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x604; PP_ActivityCompleted;;4;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x605; PP_PointsToVectorUint8;;5;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x606; PP_PointsToVectorUint16;;6;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x607; PP_PointsToVectorUint32;;7;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x608; PP_PointsToVectorFloat;;8;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x6a0; PP_DumpNotSupported;;0xA0;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x6e0; PP_InvalidSize;;0xE0;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x6e1; PP_InvalidAddress;;0xE1;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x6e2; PP_InvalidContent;;0xE2;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x6e3; PP_UnalignedAccess;;0xE3;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x6e4; PP_WriteProtected;;0xE4;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x4100; FILS_GenericFileError;;0;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM
-0x4101; FILS_IsBusy;;1;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM
-0x4102; FILS_InvalidParameters;;2;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM
-0x4105; FILS_FileDoesNotExist;;5;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM
-0x4106; FILS_FileAlreadyExists;;6;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM
-0x4107; FILS_FileLocked;;7;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM
-0x410a; FILS_DirectoryDoesNotExist;;10;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM
-0x410b; FILS_DirectoryAlreadyExists;;11;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM
-0x410c; FILS_DirectoryNotEmpty;;12;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM
-0x410f; FILS_SequencePacketMissingWrite;;15;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM
-0x4110; FILS_SequencePacketMissingRead;;16;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM
-0x13e0; MH_UnknownCmd;;0xE0;fsfw/src/fsfw/memory/MemoryHelper.h;MEMORY_HELPER
-0x13e1; MH_InvalidAddress;;0xE1;fsfw/src/fsfw/memory/MemoryHelper.h;MEMORY_HELPER
-0x13e2; MH_InvalidSize;;0xE2;fsfw/src/fsfw/memory/MemoryHelper.h;MEMORY_HELPER
-0x13e3; MH_StateMismatch;;0xE3;fsfw/src/fsfw/memory/MemoryHelper.h;MEMORY_HELPER
-0x37a1; SGP4_InvalidEccentricity;;0xA1;fsfw/src/fsfw/coordinates/Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
-0x37a2; SGP4_InvalidMeanMotion;;0xA2;fsfw/src/fsfw/coordinates/Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
-0x37a3; SGP4_InvalidPerturbationElements;;0xA3;fsfw/src/fsfw/coordinates/Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
-0x37a4; SGP4_InvalidSemiLatusRectum;;0xA4;fsfw/src/fsfw/coordinates/Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
-0x37a5; SGP4_InvalidEpochElements;;0xA5;fsfw/src/fsfw/coordinates/Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
-0x37a6; SGP4_SatelliteHasDecayed;;0xA6;fsfw/src/fsfw/coordinates/Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
-0x37b1; SGP4_TleTooOld;;0xB1;fsfw/src/fsfw/coordinates/Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
-0x37b2; SGP4_TleNotInitialized;;0xB2;fsfw/src/fsfw/coordinates/Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
-0x1101; AL_Full;;0x01;fsfw/src/fsfw/container/ArrayList.h;ARRAY_LIST
-0x1501; FM_KeyAlreadyExists;;0x01;fsfw/src/fsfw/container/FixedMap.h;FIXED_MAP
-0x1502; FM_MapFull;;0x02;fsfw/src/fsfw/container/FixedMap.h;FIXED_MAP
-0x1503; FM_KeyDoesNotExist;;0x03;fsfw/src/fsfw/container/FixedMap.h;FIXED_MAP
-0x1801; FF_Full;;1;fsfw/src/fsfw/container/FIFOBase.h;FIFO_CLASS
-0x1802; FF_Empty;;2;fsfw/src/fsfw/container/FIFOBase.h;FIFO_CLASS
-0x1601; FMM_MapFull;;0x01;fsfw/src/fsfw/container/FixedOrderedMultimap.h;FIXED_MULTIMAP
-0x1602; FMM_KeyDoesNotExist;;0x02;fsfw/src/fsfw/container/FixedOrderedMultimap.h;FIXED_MULTIMAP
-0x3801; MUX_NotEnoughResources;;1;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF
-0x3802; MUX_InsufficientMemory;;2;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF
-0x3803; MUX_NoPrivilege;;3;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF
-0x3804; MUX_WrongAttributeSetting;;4;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF
-0x3805; MUX_MutexAlreadyLocked;;5;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF
-0x3806; MUX_MutexNotFound;;6;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF
-0x3807; MUX_MutexMaxLocks;;7;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF
-0x3808; MUX_CurrThreadAlreadyOwnsMutex;;8;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF
-0x3809; MUX_CurrThreadDoesNotOwnMutex;;9;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF
-0x380a; MUX_MutexTimeout;;10;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF
-0x380b; MUX_MutexInvalidId;;11;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF
-0x380c; MUX_MutexDestroyedWhileWaiting;;12;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF
-0x3901; MQI_Empty;;1;fsfw/src/fsfw/ipc/MessageQueueIF.h;MESSAGE_QUEUE_IF
-0x3902; MQI_Full;No space left for more messages;2;fsfw/src/fsfw/ipc/MessageQueueIF.h;MESSAGE_QUEUE_IF
-0x3903; MQI_NoReplyPartner;Returned if a reply method was called without partner;3;fsfw/src/fsfw/ipc/MessageQueueIF.h;MESSAGE_QUEUE_IF
-0x3904; MQI_DestinationInvalid;Returned if the target destination is invalid.;4;fsfw/src/fsfw/ipc/MessageQueueIF.h;MESSAGE_QUEUE_IF
-0xf01; CM_UnknownCommand;;1;fsfw/src/fsfw/ipc/CommandMessageIF.h;COMMAND_MESSAGE
-0xe01; HM_InvalidMode;;0x01;fsfw/src/fsfw/modes/HasModesIF.h;HAS_MODES_IF
-0xe02; HM_TransNotAllowed;;0x02;fsfw/src/fsfw/modes/HasModesIF.h;HAS_MODES_IF
-0xe03; HM_InTransition;;0x03;fsfw/src/fsfw/modes/HasModesIF.h;HAS_MODES_IF
-0xe04; HM_InvalidSubmode;;0x04;fsfw/src/fsfw/modes/HasModesIF.h;HAS_MODES_IF
-0xc02; MS_InvalidEntry;;0x02;fsfw/src/fsfw/subsystem/modes/ModeStoreIF.h;MODE_STORE_IF
-0xc03; MS_TooManyElements;;0x03;fsfw/src/fsfw/subsystem/modes/ModeStoreIF.h;MODE_STORE_IF
-0xc04; MS_CantStoreEmpty;;0x04;fsfw/src/fsfw/subsystem/modes/ModeStoreIF.h;MODE_STORE_IF
-0xb01; SB_ChildNotFound;;0x01;fsfw/src/fsfw/subsystem/SubsystemBase.h;SUBSYSTEM_BASE
-0xb02; SB_ChildInfoUpdated;;0x02;fsfw/src/fsfw/subsystem/SubsystemBase.h;SUBSYSTEM_BASE
-0xb03; SB_ChildDoesntHaveModes;;0x03;fsfw/src/fsfw/subsystem/SubsystemBase.h;SUBSYSTEM_BASE
-0xb04; SB_CouldNotInsertChild;;0x04;fsfw/src/fsfw/subsystem/SubsystemBase.h;SUBSYSTEM_BASE
-0xb05; SB_TableContainsInvalidObjectId;;0x05;fsfw/src/fsfw/subsystem/SubsystemBase.h;SUBSYSTEM_BASE
-0xd01; SS_SequenceAlreadyExists;;0x01;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0xd02; SS_TableAlreadyExists;;0x02;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0xd03; SS_TableDoesNotExist;;0x03;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0xd04; SS_TableOrSequenceLengthInvalid;;0x04;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0xd05; SS_SequenceDoesNotExist;;0x05;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0xd06; SS_TableContainsInvalidObjectId;;0x06;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0xd07; SS_FallbackSequenceDoesNotExist;;0x07;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0xd08; SS_NoTargetTable;;0x08;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0xd09; SS_SequenceOrTableTooLong;;0x09;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0xd0b; SS_IsFallbackSequence;;0x0B;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0xd0c; SS_AccessDenied;;0x0C;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0xd0e; SS_TableInUse;;0x0E;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0xda1; SS_TargetTableNotReached;;0xA1;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0xda2; SS_TableCheckFailed;;0xA2;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0x2401; EV_ListenerNotFound;;1;fsfw/src/fsfw/events/EventManagerIF.h;EVENT_MANAGER_IF
-0x4e1; RMP_CommandNoDescriptorsAvailable;;0xE1;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4e2; RMP_CommandBufferFull;;0xE2;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4e3; RMP_CommandChannelOutOfRange;;0xE3;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4e6; RMP_CommandChannelDeactivated;;0xE6;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4e7; RMP_CommandPortOutOfRange;;0xE7;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4e8; RMP_CommandPortInUse;;0xE8;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4e9; RMP_CommandNoChannel;;0xE9;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4ea; RMP_NoHwCrc;;0xEA;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4d0; RMP_ReplyNoReply;;0xD0;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4d1; RMP_ReplyNotSent;;0xD1;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4d2; RMP_ReplyNotYetSent;;0xD2;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4d3; RMP_ReplyMissmatch;;0xD3;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4d4; RMP_ReplyTimeout;;0xD4;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4c0; RMP_ReplyInterfaceBusy;;0xC0;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4c1; RMP_ReplyTransmissionError;;0xC1;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4c2; RMP_ReplyInvalidData;;0xC2;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4c3; RMP_ReplyNotSupported;;0xC3;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4f0; RMP_LinkDown;;0xF0;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4f1; RMP_SpwCredit;;0xF1;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4f2; RMP_SpwEscape;;0xF2;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4f3; RMP_SpwDisconnect;;0xF3;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4f4; RMP_SpwParity;;0xF4;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4f5; RMP_SpwWriteSync;;0xF5;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4f6; RMP_SpwInvalidAddress;;0xF6;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4f7; RMP_SpwEarlyEop;;0xF7;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4f8; RMP_SpwDma;;0xF8;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4f9; RMP_SpwLinkError;;0xF9;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x400; RMP_ReplyOk;;0;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x401; RMP_ReplyGeneralErrorCode;;1;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x402; RMP_ReplyUnusedPacketTypeOrCommandCode;;2;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x403; RMP_ReplyInvalidKey;;3;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x404; RMP_ReplyInvalidDataCrc;;4;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x405; RMP_ReplyEarlyEop;;5;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x406; RMP_ReplyTooMuchData;;6;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x407; RMP_ReplyEep;;7;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x408; RMP_ReplyReserved;;8;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x409; RMP_ReplyVerifyBufferOverrun;;9;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x40a; RMP_ReplyCommandNotImplementedOrNotAuthorised;;10;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x40b; RMP_ReplyRmwDataLengthError;;11;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x40c; RMP_ReplyInvalidTargetLogicalAddress;;12;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x1401; SE_BufferTooShort;;1;fsfw/src/fsfw/serialize/SerializeIF.h;SERIALIZE_IF
-0x1402; SE_StreamTooShort;;2;fsfw/src/fsfw/serialize/SerializeIF.h;SERIALIZE_IF
-0x1403; SE_TooManyElements;;3;fsfw/src/fsfw/serialize/SerializeIF.h;SERIALIZE_IF
-0x3ca0; PVA_InvalidReadWriteMode;;0xA0;fsfw/src/fsfw/datapool/PoolVariableIF.h;POOL_VARIABLE_IF
-0x3ca1; PVA_InvalidPoolEntry;;0xA1;fsfw/src/fsfw/datapool/PoolVariableIF.h;POOL_VARIABLE_IF
-0x801; DPS_InvalidParameterDefinition;;1;fsfw/src/fsfw/datapool/DataSetIF.h;DATA_SET_CLASS
-0x802; DPS_SetWasAlreadyRead;;2;fsfw/src/fsfw/datapool/DataSetIF.h;DATA_SET_CLASS
-0x803; DPS_CommitingWithoutReading;;3;fsfw/src/fsfw/datapool/DataSetIF.h;DATA_SET_CLASS
-0x804; DPS_DataSetUninitialised;;4;fsfw/src/fsfw/datapool/DataSetIF.h;DATA_SET_CLASS
-0x805; DPS_DataSetFull;;5;fsfw/src/fsfw/datapool/DataSetIF.h;DATA_SET_CLASS
-0x806; DPS_PoolVarNull;;6;fsfw/src/fsfw/datapool/DataSetIF.h;DATA_SET_CLASS
-0x1b00; TCC_IllegalApid;;0;fsfw/src/fsfw/tcdistribution/TcPacketCheckPUS.h;TC_PACKET_CHECK
-0x1b01; TCC_IncompletePacket;;1;fsfw/src/fsfw/tcdistribution/TcPacketCheckPUS.h;TC_PACKET_CHECK
-0x1b02; TCC_IncorrectChecksum;;2;fsfw/src/fsfw/tcdistribution/TcPacketCheckPUS.h;TC_PACKET_CHECK
-0x1b03; TCC_IllegalPacketType;;3;fsfw/src/fsfw/tcdistribution/TcPacketCheckPUS.h;TC_PACKET_CHECK
-0x1b04; TCC_IllegalPacketSubtype;;4;fsfw/src/fsfw/tcdistribution/TcPacketCheckPUS.h;TC_PACKET_CHECK
-0x1b05; TCC_IncorrectPrimaryHeader;;5;fsfw/src/fsfw/tcdistribution/TcPacketCheckPUS.h;TC_PACKET_CHECK
-0x1b06; TCC_IncorrectSecondaryHeader;;6;fsfw/src/fsfw/tcdistribution/TcPacketCheckPUS.h;TC_PACKET_CHECK
-0x1c01; TCD_PacketLost;;1;fsfw/src/fsfw/tcdistribution/TcDistributor.h;PACKET_DISTRIBUTION
-0x1c02; TCD_DestinationNotFound;;2;fsfw/src/fsfw/tcdistribution/TcDistributor.h;PACKET_DISTRIBUTION
-0x1c03; TCD_ServiceIdAlreadyExists;;3;fsfw/src/fsfw/tcdistribution/TcDistributor.h;PACKET_DISTRIBUTION
-0x2f01; POS_InPowerTransition;;1;fsfw/src/fsfw/power/PowerSwitcher.h;POWER_SWITCHER
-0x2f02; POS_SwitchStateMismatch;;2;fsfw/src/fsfw/power/PowerSwitcher.h;POWER_SWITCHER
-0x501; PS_SwitchOn;;1;fsfw/src/fsfw/power/PowerSwitchIF.h;POWER_SWITCH_IF
-0x500; PS_SwitchOff;;0;fsfw/src/fsfw/power/PowerSwitchIF.h;POWER_SWITCH_IF
-0x502; PS_SwitchTimeout;;2;fsfw/src/fsfw/power/PowerSwitchIF.h;POWER_SWITCH_IF
-0x503; PS_FuseOn;;3;fsfw/src/fsfw/power/PowerSwitchIF.h;POWER_SWITCH_IF
-0x504; PS_FuseOff;;4;fsfw/src/fsfw/power/PowerSwitchIF.h;POWER_SWITCH_IF
-0x3a00; SPH_ConnBroken;;0;fsfw/src/fsfw/osal/common/TcpTmTcServer.h;SEMAPHORE_IF
-0x2901; IEC_NoConfigurationTable;;0x01;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2902; IEC_NoCpuTable;;0x02;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2903; IEC_InvalidWorkspaceAddress;;0x03;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2904; IEC_TooLittleWorkspace;;0x04;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2905; IEC_WorkspaceAllocation;;0x05;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2906; IEC_InterruptStackTooSmall;;0x06;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2907; IEC_ThreadExitted;;0x07;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2908; IEC_InconsistentMpInformation;;0x08;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2909; IEC_InvalidNode;;0x09;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x290a; IEC_NoMpci;;0x0a;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x290b; IEC_BadPacket;;0x0b;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x290c; IEC_OutOfPackets;;0x0c;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x290d; IEC_OutOfGlobalObjects;;0x0d;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x290e; IEC_OutOfProxies;;0x0e;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x290f; IEC_InvalidGlobalId;;0x0f;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2910; IEC_BadStackHook;;0x10;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2911; IEC_BadAttributes;;0x11;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2912; IEC_ImplementationKeyCreateInconsistency;;0x12;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2913; IEC_ImplementationBlockingOperationCancel;;0x13;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2914; IEC_MutexObtainFromBadState;;0x14;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2915; IEC_UnlimitedAndMaximumIs0;;0x15;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2500; FDI_YourFault;;0;fsfw/src/fsfw/fdir/ConfirmsFailuresIF.h;HANDLES_FAILURES_IF
-0x2501; FDI_MyFault;;1;fsfw/src/fsfw/fdir/ConfirmsFailuresIF.h;HANDLES_FAILURES_IF
-0x2502; FDI_ConfirmLater;;2;fsfw/src/fsfw/fdir/ConfirmsFailuresIF.h;HANDLES_FAILURES_IF
-0x201; OM_InsertionFailed;;1;fsfw/src/fsfw/objectmanager/ObjectManagerIF.h;OBJECT_MANAGER_IF
-0x202; OM_NotFound;;2;fsfw/src/fsfw/objectmanager/ObjectManagerIF.h;OBJECT_MANAGER_IF
-0x203; OM_ChildInitFailed;;3;fsfw/src/fsfw/objectmanager/ObjectManagerIF.h;OBJECT_MANAGER_IF
-0x204; OM_InternalErrReporterUninit;;4;fsfw/src/fsfw/objectmanager/ObjectManagerIF.h;OBJECT_MANAGER_IF
-0x2101; TMF_Busy;;1;fsfw/src/fsfw/tmstorage/TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
-0x2102; TMF_LastPacketFound;;2;fsfw/src/fsfw/tmstorage/TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
-0x2103; TMF_StopFetch;;3;fsfw/src/fsfw/tmstorage/TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
-0x2104; TMF_Timeout;;4;fsfw/src/fsfw/tmstorage/TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
-0x2105; TMF_TmChannelFull;;5;fsfw/src/fsfw/tmstorage/TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
-0x2106; TMF_NotStored;;6;fsfw/src/fsfw/tmstorage/TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
-0x2107; TMF_AllDeleted;;7;fsfw/src/fsfw/tmstorage/TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
-0x2108; TMF_InvalidData;;8;fsfw/src/fsfw/tmstorage/TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
-0x2109; TMF_NotReady;;9;fsfw/src/fsfw/tmstorage/TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
-0x2001; TMB_Busy;;1;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x2002; TMB_Full;;2;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x2003; TMB_Empty;;3;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x2004; TMB_NullRequested;;4;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x2005; TMB_TooLarge;;5;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x2006; TMB_NotReady;;6;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x2007; TMB_DumpError;;7;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x2008; TMB_CrcError;;8;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x2009; TMB_Timeout;;9;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x200a; TMB_IdlePacketFound;;10;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x200b; TMB_TelecommandFound;;11;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x200c; TMB_NoPusATm;;12;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x200d; TMB_TooSmall;;13;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x200e; TMB_BlockNotFound;;14;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x200f; TMB_InvalidRequest;;15;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x2c01; PAW_UnknownDatatype;;0x01;fsfw/src/fsfw/parameters/ParameterWrapper.h;PARAMETER_WRAPPER
-0x2c02; PAW_DatatypeMissmatch;;0x02;fsfw/src/fsfw/parameters/ParameterWrapper.h;PARAMETER_WRAPPER
-0x2c03; PAW_Readonly;;0x03;fsfw/src/fsfw/parameters/ParameterWrapper.h;PARAMETER_WRAPPER
-0x2c04; PAW_TooBig;;0x04;fsfw/src/fsfw/parameters/ParameterWrapper.h;PARAMETER_WRAPPER
-0x2c05; PAW_SourceNotSet;;0x05;fsfw/src/fsfw/parameters/ParameterWrapper.h;PARAMETER_WRAPPER
-0x2c06; PAW_OutOfBounds;;0x06;fsfw/src/fsfw/parameters/ParameterWrapper.h;PARAMETER_WRAPPER
-0x2c07; PAW_NotSet;;0x07;fsfw/src/fsfw/parameters/ParameterWrapper.h;PARAMETER_WRAPPER
-0x2c08; PAW_ColumnOrRowsZero;;0x08;fsfw/src/fsfw/parameters/ParameterWrapper.h;PARAMETER_WRAPPER
-0x2d01; HPA_InvalidIdentifierId;;0x01;fsfw/src/fsfw/parameters/HasParametersIF.h;HAS_PARAMETERS_IF
-0x2d02; HPA_InvalidDomainId;;0x02;fsfw/src/fsfw/parameters/HasParametersIF.h;HAS_PARAMETERS_IF
-0x2d03; HPA_InvalidValue;;0x03;fsfw/src/fsfw/parameters/HasParametersIF.h;HAS_PARAMETERS_IF
-0x2d05; HPA_ReadOnly;;0x05;fsfw/src/fsfw/parameters/HasParametersIF.h;HAS_PARAMETERS_IF
-0x3a01; SPH_SemaphoreTimeout;;1;fsfw/src/fsfw/tasks/SemaphoreIF.h;SEMAPHORE_IF
-0x3a02; SPH_SemaphoreNotOwned;;2;fsfw/src/fsfw/tasks/SemaphoreIF.h;SEMAPHORE_IF
-0x3a03; SPH_SemaphoreInvalid;;3;fsfw/src/fsfw/tasks/SemaphoreIF.h;SEMAPHORE_IF
-0x1a01; TRC_NotEnoughSensors;;1;fsfw/src/fsfw/monitoring/TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK
-0x1a02; TRC_LowestValueOol;;2;fsfw/src/fsfw/monitoring/TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK
-0x1a03; TRC_HighestValueOol;;3;fsfw/src/fsfw/monitoring/TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK
-0x1a04; TRC_BothValuesOol;;4;fsfw/src/fsfw/monitoring/TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK
-0x1a05; TRC_DuplexOol;;5;fsfw/src/fsfw/monitoring/TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK
-0x3001; LIM_Unchecked;;1;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF
-0x3002; LIM_Invalid;;2;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF
-0x3003; LIM_Unselected;;3;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF
-0x3004; LIM_BelowLowLimit;;4;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF
-0x3005; LIM_AboveHighLimit;;5;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF
-0x3006; LIM_UnexpectedValue;;6;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF
-0x3007; LIM_OutOfRange;;7;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF
-0x30a0; LIM_FirstSample;;0xA0;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF
-0x30e0; LIM_InvalidSize;;0xE0;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF
-0x30e1; LIM_WrongType;;0xE1;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF
-0x30e2; LIM_WrongPid;;0xE2;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF
-0x30e3; LIM_WrongLimitId;;0xE3;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF
-0x30ee; LIM_MonitorNotFound;;0xEE;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF
-0x3501; CFDP_InvalidTlvType;;1;fsfw/src/fsfw/cfdp/definitions.h;CFDP
-0x3502; CFDP_InvalidDirectiveFields;;2;fsfw/src/fsfw/cfdp/definitions.h;CFDP
-0x3503; CFDP_InvalidPduDatafieldLen;;3;fsfw/src/fsfw/cfdp/definitions.h;CFDP
-0x3504; CFDP_InvalidAckDirectiveFields;;4;fsfw/src/fsfw/cfdp/definitions.h;CFDP
-0x3505; CFDP_MetadataCantParseOptions;;5;fsfw/src/fsfw/cfdp/definitions.h;CFDP
-0x3506; CFDP_FinishedCantParseFsResponses;;6;fsfw/src/fsfw/cfdp/definitions.h;CFDP
-0x3508; CFDP_FilestoreRequiresSecondFile;;8;fsfw/src/fsfw/cfdp/definitions.h;CFDP
-0x3509; CFDP_FilestoreResponseCantParseFsMessage;;9;fsfw/src/fsfw/cfdp/definitions.h;CFDP
-0x2b01; CCS_BcIsSetVrCommand;;0x01;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2b02; CCS_BcIsUnlockCommand;;0x02;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bb0; CCS_BcIllegalCommand;;0xB0;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bb1; CCS_BoardReadingNotFinished;;0xB1;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bf0; CCS_NsPositiveW;;0xF0;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bf1; CCS_NsNegativeW;;0xF1;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bf2; CCS_NsLockout;;0xF2;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bf3; CCS_FarmInLockout;;0xF3;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bf4; CCS_FarmInWait;;0xF4;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2be0; CCS_WrongSymbol;;0xE0;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2be1; CCS_DoubleStart;;0xE1;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2be2; CCS_StartSymbolMissed;;0xE2;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2be3; CCS_EndWithoutStart;;0xE3;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2be4; CCS_TooLarge;;0xE4;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2be5; CCS_TooShort;;0xE5;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2be6; CCS_WrongTfVersion;;0xE6;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2be7; CCS_WrongSpacecraftId;;0xE7;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2be8; CCS_NoValidFrameType;;0xE8;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2be9; CCS_CrcFailed;;0xE9;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bea; CCS_VcNotFound;;0xEA;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2beb; CCS_ForwardingFailed;;0xEB;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bec; CCS_ContentTooLarge;;0xEC;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bed; CCS_ResidualData;;0xED;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bee; CCS_DataCorrupted;;0xEE;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bef; CCS_IllegalSegmentationFlag;;0xEF;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bd0; CCS_IllegalFlagCombination;;0xD0;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bd1; CCS_ShorterThanHeader;;0xD1;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bd2; CCS_TooShortBlockedPacket;;0xD2;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bd3; CCS_TooShortMapExtraction;;0xD3;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x3301; DC_NoReplyReceived;;0x01;fsfw/src/fsfw/devicehandlers/DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF
-0x3302; DC_ProtocolError;;0x02;fsfw/src/fsfw/devicehandlers/DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF
-0x3303; DC_Nullpointer;;0x03;fsfw/src/fsfw/devicehandlers/DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF
-0x3304; DC_InvalidCookieType;;0x04;fsfw/src/fsfw/devicehandlers/DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF
-0x3305; DC_NotActive;;0x05;fsfw/src/fsfw/devicehandlers/DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF
-0x3306; DC_TooMuchData;;0x06;fsfw/src/fsfw/devicehandlers/DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF
-0x3a0; DHB_InvalidChannel;;0xA0;fsfw/src/fsfw/devicehandlers/DeviceHandlerBase.h;DEVICE_HANDLER_BASE
-0x3b0; DHB_AperiodicReply;;0xB0;fsfw/src/fsfw/devicehandlers/DeviceHandlerBase.h;DEVICE_HANDLER_BASE
-0x3b1; DHB_IgnoreReplyData;;0xB1;fsfw/src/fsfw/devicehandlers/DeviceHandlerBase.h;DEVICE_HANDLER_BASE
-0x3b2; DHB_IgnoreFullPacket;;0xB2;fsfw/src/fsfw/devicehandlers/DeviceHandlerBase.h;DEVICE_HANDLER_BASE
-0x3c0; DHB_NothingToSend;;0xC0;fsfw/src/fsfw/devicehandlers/DeviceHandlerBase.h;DEVICE_HANDLER_BASE
-0x3c2; DHB_CommandMapError;;0xC2;fsfw/src/fsfw/devicehandlers/DeviceHandlerBase.h;DEVICE_HANDLER_BASE
-0x3d0; DHB_NoSwitch;;0xD0;fsfw/src/fsfw/devicehandlers/DeviceHandlerBase.h;DEVICE_HANDLER_BASE
-0x3e0; DHB_ChildTimeout;;0xE0;fsfw/src/fsfw/devicehandlers/DeviceHandlerBase.h;DEVICE_HANDLER_BASE
-0x3e1; DHB_SwitchFailed;;0xE1;fsfw/src/fsfw/devicehandlers/DeviceHandlerBase.h;DEVICE_HANDLER_BASE
-0x1201; AB_NeedSecondStep;;0x01;fsfw/src/fsfw/devicehandlers/AssemblyBase.h;ASSEMBLY_BASE
-0x1202; AB_NeedToReconfigure;;0x02;fsfw/src/fsfw/devicehandlers/AssemblyBase.h;ASSEMBLY_BASE
-0x1203; AB_ModeFallback;;0x03;fsfw/src/fsfw/devicehandlers/AssemblyBase.h;ASSEMBLY_BASE
-0x1204; AB_ChildNotCommandable;;0x04;fsfw/src/fsfw/devicehandlers/AssemblyBase.h;ASSEMBLY_BASE
-0x1205; AB_NeedToChangeHealth;;0x05;fsfw/src/fsfw/devicehandlers/AssemblyBase.h;ASSEMBLY_BASE
-0x12a1; AB_NotEnoughChildrenInCorrectState;;0xa1;fsfw/src/fsfw/devicehandlers/AssemblyBase.h;ASSEMBLY_BASE
-0x26a0; DHI_NoCommandData;;0xA0;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26a1; DHI_CommandNotSupported;;0xA1;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26a2; DHI_CommandAlreadySent;;0xA2;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26a3; DHI_CommandWasNotSent;;0xA3;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26a4; DHI_CantSwitchAddress;;0xA4;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26a5; DHI_WrongModeForCommand;;0xA5;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26a6; DHI_Timeout;;0xA6;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26a7; DHI_Busy;;0xA7;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26a8; DHI_NoReplyExpected;;0xA8;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26a9; DHI_NonOpTemperature;;0xA9;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26aa; DHI_CommandNotImplemented;;0xAA;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26b0; DHI_ChecksumError;;0xB0;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26b1; DHI_LengthMissmatch;;0xB1;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26b2; DHI_InvalidData;;0xB2;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26b3; DHI_ProtocolError;;0xB3;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26c0; DHI_DeviceDidNotExecute;;0xC0;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26c1; DHI_DeviceReportedError;;0xC1;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26c2; DHI_UnknownDeviceReply;;0xC2;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26c3; DHI_DeviceReplyInvalid;;0xC3;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26d0; DHI_InvalidCommandParameter;;0xD0;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26d1; DHI_InvalidNumberOrLengthOfParameters;;0xD1;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x2301; MT_TooDetailedRequest;;1;fsfw/src/fsfw/globalfunctions/matching/MatchTree.h;MATCH_TREE_CLASS
-0x2302; MT_TooGeneralRequest;;2;fsfw/src/fsfw/globalfunctions/matching/MatchTree.h;MATCH_TREE_CLASS
-0x2303; MT_NoMatch;;3;fsfw/src/fsfw/globalfunctions/matching/MatchTree.h;MATCH_TREE_CLASS
-0x2304; MT_Full;;4;fsfw/src/fsfw/globalfunctions/matching/MatchTree.h;MATCH_TREE_CLASS
-0x2305; MT_NewNodeCreated;;5;fsfw/src/fsfw/globalfunctions/matching/MatchTree.h;MATCH_TREE_CLASS
-0x3e01; DLEE_StreamTooShort;;0x01;fsfw/src/fsfw/globalfunctions/DleEncoder.h;DLE_ENCODER
-0x3e02; DLEE_DecodingError;;0x02;fsfw/src/fsfw/globalfunctions/DleEncoder.h;DLE_ENCODER
-0x2e01; ASC_TooLongForTargetType;;1;fsfw/src/fsfw/globalfunctions/AsciiConverter.h;ASCII_CONVERTER
-0x2e02; ASC_InvalidCharacters;;2;fsfw/src/fsfw/globalfunctions/AsciiConverter.h;ASCII_CONVERTER
-0x2e03; ASC_BufferTooSmall;;0x3;fsfw/src/fsfw/globalfunctions/AsciiConverter.h;ASCII_CONVERTER
-0x1701; HHI_ObjectNotHealthy;;1;fsfw/src/fsfw/health/HasHealthIF.h;HAS_HEALTH_IF
-0x1702; HHI_InvalidHealthState;;2;fsfw/src/fsfw/health/HasHealthIF.h;HAS_HEALTH_IF
-0x3101; CF_ObjectHasNoFunctions;;1;fsfw/src/fsfw/action/CommandsActionsIF.h;COMMANDS_ACTIONS_IF
-0x3102; CF_AlreadyCommanding;;2;fsfw/src/fsfw/action/CommandsActionsIF.h;COMMANDS_ACTIONS_IF
-0x3201; HF_IsBusy;;1;fsfw/src/fsfw/action/HasActionsIF.h;HAS_ACTIONS_IF
-0x3202; HF_InvalidParameters;;2;fsfw/src/fsfw/action/HasActionsIF.h;HAS_ACTIONS_IF
-0x3203; HF_ExecutionFinished;;3;fsfw/src/fsfw/action/HasActionsIF.h;HAS_ACTIONS_IF
-0x3204; HF_InvalidActionId;;4;fsfw/src/fsfw/action/HasActionsIF.h;HAS_ACTIONS_IF
-0x3601; TSI_BadTimestamp;;1;fsfw/src/fsfw/timemanager/TimeStamperIF.h;TIME_STAMPER_IF
-0x1000; TIM_UnsupportedTimeFormat;;0;fsfw/src/fsfw/timemanager/CCSDSTime.h;CCSDS_TIME_HELPER_CLASS
-0x1001; TIM_NotEnoughInformationForTargetFormat;;1;fsfw/src/fsfw/timemanager/CCSDSTime.h;CCSDS_TIME_HELPER_CLASS
-0x1002; TIM_LengthMismatch;;2;fsfw/src/fsfw/timemanager/CCSDSTime.h;CCSDS_TIME_HELPER_CLASS
-0x1003; TIM_InvalidTimeFormat;;3;fsfw/src/fsfw/timemanager/CCSDSTime.h;CCSDS_TIME_HELPER_CLASS
-0x1004; TIM_InvalidDayOfYear;;4;fsfw/src/fsfw/timemanager/CCSDSTime.h;CCSDS_TIME_HELPER_CLASS
-0x1005; TIM_TimeDoesNotFitFormat;;5;fsfw/src/fsfw/timemanager/CCSDSTime.h;CCSDS_TIME_HELPER_CLASS
-0x3b00; LPIF_PoolEntryNotFound;;0x00;fsfw/src/fsfw/datapoollocal/localPoolDefinitions.h;LOCAL_POOL_OWNER_IF
-0x3b01; LPIF_PoolEntryTypeConflict;;0x01;fsfw/src/fsfw/datapoollocal/localPoolDefinitions.h;LOCAL_POOL_OWNER_IF
-0x3d00; HKM_QueueOrDestinationInvalid;;0;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h;HOUSEKEEPING_MANAGER
-0x3d01; HKM_WrongHkPacketType;;1;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h;HOUSEKEEPING_MANAGER
-0x3d02; HKM_ReportingStatusUnchanged;;2;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h;HOUSEKEEPING_MANAGER
-0x3d03; HKM_PeriodicHelperInvalid;;3;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h;HOUSEKEEPING_MANAGER
-0x3d04; HKM_PoolobjectNotFound;;4;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h;HOUSEKEEPING_MANAGER
-0x3d05; HKM_DatasetNotFound;;5;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h;HOUSEKEEPING_MANAGER
-0x2801; TC_InvalidTargetState;;1;fsfw/src/fsfw/thermal/ThermalComponentIF.h;THERMAL_COMPONENT_IF
-0x28f1; TC_AboveOperationalLimit;;0xF1;fsfw/src/fsfw/thermal/ThermalComponentIF.h;THERMAL_COMPONENT_IF
-0x28f2; TC_BelowOperationalLimit;;0xF2;fsfw/src/fsfw/thermal/ThermalComponentIF.h;THERMAL_COMPONENT_IF
-0x1f01; CSB_ExecutionComplete;;1;fsfw/src/fsfw/tmtcservices/CommandingServiceBase.h;COMMAND_SERVICE_BASE
-0x1f02; CSB_NoStepMessage;;2;fsfw/src/fsfw/tmtcservices/CommandingServiceBase.h;COMMAND_SERVICE_BASE
-0x1f03; CSB_ObjectBusy;;3;fsfw/src/fsfw/tmtcservices/CommandingServiceBase.h;COMMAND_SERVICE_BASE
-0x1f04; CSB_Busy;;4;fsfw/src/fsfw/tmtcservices/CommandingServiceBase.h;COMMAND_SERVICE_BASE
-0x1f05; CSB_InvalidTc;;5;fsfw/src/fsfw/tmtcservices/CommandingServiceBase.h;COMMAND_SERVICE_BASE
-0x1f06; CSB_InvalidObject;;6;fsfw/src/fsfw/tmtcservices/CommandingServiceBase.h;COMMAND_SERVICE_BASE
-0x1f07; CSB_InvalidReply;;7;fsfw/src/fsfw/tmtcservices/CommandingServiceBase.h;COMMAND_SERVICE_BASE
-0x4a00; SPPA_NoPacketFound;;0x00;fsfw/src/fsfw/tmtcservices/SpacePacketParser.h;SPACE_PACKET_PARSER
-0x4a01; SPPA_SplitPacket;;0x01;fsfw/src/fsfw/tmtcservices/SpacePacketParser.h;SPACE_PACKET_PARSER
-0x1d01; PUS_ActivityStarted;;1;fsfw/src/fsfw/tmtcservices/AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF
-0x1d02; PUS_InvalidSubservice;;2;fsfw/src/fsfw/tmtcservices/AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF
-0x1d03; PUS_IllegalApplicationData;;3;fsfw/src/fsfw/tmtcservices/AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF
-0x1d04; PUS_SendTmFailed;;4;fsfw/src/fsfw/tmtcservices/AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF
-0x1d05; PUS_Timeout;;5;fsfw/src/fsfw/tmtcservices/AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF
-0x4300; HSPI_OpeningFileFailed;;0;fsfw/hal/src/fsfw_hal/linux/spi/SpiComIF.h;HAL_SPI
-0x4301; HSPI_FullDuplexTransferFailed;;1;fsfw/hal/src/fsfw_hal/linux/spi/SpiComIF.h;HAL_SPI
-0x4302; HSPI_HalfDuplexTransferFailed;;2;fsfw/hal/src/fsfw_hal/linux/spi/SpiComIF.h;HAL_SPI
-0x4601; HGIO_UnknownGpioId;;1;fsfw/hal/src/fsfw_hal/linux/gpio/LinuxLibgpioIF.h;HAL_GPIO
-0x4602; HGIO_DriveGpioFailure;;2;fsfw/hal/src/fsfw_hal/linux/gpio/LinuxLibgpioIF.h;HAL_GPIO
-0x4603; HGIO_GpioTypeFailure;;3;fsfw/hal/src/fsfw_hal/linux/gpio/LinuxLibgpioIF.h;HAL_GPIO
-0x4604; HGIO_GpioInvalidInstance;;4;fsfw/hal/src/fsfw_hal/linux/gpio/LinuxLibgpioIF.h;HAL_GPIO
-0x4605; HGIO_GpioDuplicateDetected;;5;fsfw/hal/src/fsfw_hal/linux/gpio/LinuxLibgpioIF.h;HAL_GPIO
-0x4401; HURT_UartReadFailure;;1;fsfw/hal/src/fsfw_hal/linux/uart/UartComIF.h;HAL_UART
-0x4402; HURT_UartReadSizeMissmatch;;2;fsfw/hal/src/fsfw_hal/linux/uart/UartComIF.h;HAL_UART
-0x4403; HURT_UartRxBufferTooSmall;;3;fsfw/hal/src/fsfw_hal/linux/uart/UartComIF.h;HAL_UART
-0x4200; UXOS_ExecutionFinished;Execution of the current command has finished;0;fsfw/hal/src/fsfw_hal/linux/CommandExecutor.h;LINUX_OSAL
-0x4201; UXOS_CommandPending;Command is pending. This will also be returned if the user tries to load another command but a command is still pending;1;fsfw/hal/src/fsfw_hal/linux/CommandExecutor.h;LINUX_OSAL
-0x4202; UXOS_BytesRead;Some bytes have been read from the executing process;2;fsfw/hal/src/fsfw_hal/linux/CommandExecutor.h;LINUX_OSAL
-0x4203; UXOS_CommandError;Command execution failed;3;fsfw/hal/src/fsfw_hal/linux/CommandExecutor.h;LINUX_OSAL
-0x4204; UXOS_NoCommandLoadedOrPending;;4;fsfw/hal/src/fsfw_hal/linux/CommandExecutor.h;LINUX_OSAL
-0x4206; UXOS_PcloseCallError;;6;fsfw/hal/src/fsfw_hal/linux/CommandExecutor.h;LINUX_OSAL
-0x6d00; SCBU_KeyNotFound;;0;bsp_q7s/memory/scratchApi.h;SCRATCH_BUFFER
-0x6c00; SDMA_OpOngoing;;0;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER
-0x6c01; SDMA_AlreadyOn;;1;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER
-0x6c02; SDMA_AlreadyMounted;;2;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER
-0x6c03; SDMA_AlreadyOff;;3;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER
-0x6c0a; SDMA_StatusFileNexists;;10;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER
-0x6c0b; SDMA_StatusFileFormatInvalid;;11;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER
-0x6c0c; SDMA_MountError;;12;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER
-0x6c0d; SDMA_UnmountError;;13;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER
-0x6c0e; SDMA_SystemCallError;;14;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER
-0x6c0f; SDMA_PopenCallError;;15;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER
-0x58a0;PLSV_CrcFailure;Space Packet received from PLOC supervisor has invalid CRC;0xA0;bsp_q7s/devices/PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
-0x58a1;PLSV_ReceivedAckFailure;Received ACK failure reply from PLOC supervisor;0xA1;bsp_q7s/devices/PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
-0x58a2;PLSV_ReceivedExeFailure;Received execution failure reply from PLOC supervisor;0xA2;bsp_q7s/devices/PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
-0x58a3;PLSV_InvalidApid;Received space packet with invalid APID from PLOC supervisor;0xA3;bsp_q7s/devices/PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
-0x58a4;PLSV_GetTimeFailure;Failed to read current system time;0xA4;bsp_q7s/devices/PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
-0x58a5;PLSV_InvalidUartComIf;Invalid communication interface specified;0xA5;bsp_q7s/devices/PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
-0x58a6;PLSV_InvalidWatchdog;Received command with invalid watchdog parameter. Valid watchdogs are 0 for PS, 1 for PL and 2 for INT;0xA6;bsp_q7s/devices/PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
-0x58a7;PLSV_InvalidWatchdogTimeout;Received watchdog timeout config command with invalid timeout. Valid timeouts must be in the range between 1000 and 360000 ms.;0xA7;bsp_q7s/devices/PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
-0x58a8;PLSV_InvalidLatchupId;Received latchup config command with invalid latchup ID;0xA8;bsp_q7s/devices/PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
-0x58a9;PLSV_SweepPeriodTooSmall;Received set adc sweep period command with invalid sweep period. Must be larger than 21.;0xA9;bsp_q7s/devices/PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
-0x58aa;PLSV_InvalidTestParam;Receive auto EM test command with invalid test param. Valid params are 1 and 2.;0xAA;bsp_q7s/devices/PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
-0x58ab;PLSV_MramPacketParsingFailure;Returned when scanning for MRAM dump packets failed.;0xAB;bsp_q7s/devices/PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
-0x58ac;PLSV_InvalidMramAddresses;Returned when the start and stop addresses of the MRAM dump or MRAM wipe commands are invalid (e.g. start address bigger than stop address);0xAC;bsp_q7s/devices/PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
-0x58ad;PLSV_NoMramPacket;Expect reception of an MRAM dump packet but received space packet with other apid.;0xAD;bsp_q7s/devices/PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
-0x58ae;PLSV_PathDoesNotExist;Path to PLOC directory on SD card does not exist;0xAE;bsp_q7s/devices/PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
-0x58af;PLSV_MramFileNotExists;MRAM dump file does not exists. The file should actually already have been created with the reception of the first dump packet.;0xAF;bsp_q7s/devices/PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
-0x5ca0;PLUD_UpdaterBusy;Updater is already performing an update;0xA0;bsp_q7s/devices/PlocUpdater.h;PLOC_UPDATER
-0x5ca1;PLUD_NameTooLong;Received update command with invalid path string (too long).;0xA1;bsp_q7s/devices/PlocUpdater.h;PLOC_UPDATER
-0x5ca2;PLUD_SdNotMounted;Received command to initiate update but SD card with update image not mounted.;0xA2;bsp_q7s/devices/PlocUpdater.h;PLOC_UPDATER
-0x5ca3;PLUD_FileNotExists;Update file received with update command does not exist.;0xA3;bsp_q7s/devices/PlocUpdater.h;PLOC_UPDATER
-0x5fa0;PLMEMDUMP_MramAddressTooHigh;The capacity of the MRAM amounts to 512 kB. Thus the maximum address must not be higher than 0x7d000.;0xA0;bsp_q7s/devices/PlocMemoryDumper.h;PLOC_MEMORY_DUMPER
-0x5fa1;PLMEMDUMP_MramInvalidAddressCombination;The specified end address is lower than the start address;0xA1;bsp_q7s/devices/PlocMemoryDumper.h;PLOC_MEMORY_DUMPER
-0x6301;JSONBASE_JsonFileNotExists;Specified json file does not exist;1;linux/devices/startracker/ArcsecJsonParamBase.h;ARCSEC_JSON_BASE
-0x6302;JSONBASE_SetNotExists;Requested set does not exist in json file;2;linux/devices/startracker/ArcsecJsonParamBase.h;ARCSEC_JSON_BASE
-0x6303;JSONBASE_ParamNotExists;Requested parameter does not exist in json file;3;linux/devices/startracker/ArcsecJsonParamBase.h;ARCSEC_JSON_BASE
-0x56a0;STRH_TemperatureReqFailed;Status in temperature reply signals error;0xA0;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56a1;STRH_PingFailed;Ping command failed;0xA1;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56a2;STRH_VersionReqFailed;Status in version reply signals error;0xA2;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x5da0;STRHLP_SdNotMounted;SD card specified in path string not mounted;0xA0;linux/devices/startracker/StrHelper.h;STR_HELPER
-0x5da1;STRHLP_FileNotExists;Specified file does not exist on filesystem;0xA1;linux/devices/startracker/StrHelper.h;STR_HELPER
-0x5da2;STRHLP_PathNotExists;Specified path does not exist;0xA2;linux/devices/startracker/StrHelper.h;STR_HELPER
-0x5da3;STRHLP_FileCreationFailed;Failed to create download image or read flash file;0xA3;linux/devices/startracker/StrHelper.h;STR_HELPER
-0x5da4;STRHLP_RegionMismatch;Region in flash write/read reply does not match expected region;0xA4;linux/devices/startracker/StrHelper.h;STR_HELPER
-0x5da5;STRHLP_AddressMismatch;Address in flash write/read reply does not match expected address;0xA5;linux/devices/startracker/StrHelper.h;STR_HELPER
-0x5da6;STRHLP_LengthMismatch;Length in flash write/read reply does not match expected length;0xA6;linux/devices/startracker/StrHelper.h;STR_HELPER
-0x5da7;STRHLP_StatusError;Status field in reply signals error;0xA7;linux/devices/startracker/StrHelper.h;STR_HELPER
-0x5da8;STRHLP_InvalidTypeId;Reply has invalid type ID (should be of action reply type);0xA8;linux/devices/startracker/StrHelper.h;STR_HELPER
-0x56a3;STRH_InterfaceReqFailed;Status in interface reply signals error;0xA3;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56a4;STRH_PowerReqFailed;Status in power reply signals error;0xA4;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56a5;STRH_SetParamFailed;Status of reply to parameter set command signals error;0xA5;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56a6;STRH_ActionFailed;Status of reply to action command signals error;0xA6;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56a7;STRH_FilePathTooLong;Received invalid path string. Exceeds allowed length;0xA7;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56a8;STRH_FilenameTooLong;Name of file received with command is too long;0xA8;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56a9;STRH_InvalidProgram;Received version reply with invalid program ID;0xA9;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56aa;STRH_ReplyError;Status field reply signals error;0xAA;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56ab;STRH_CommandTooShort;Received command which is too short (some data is missing for proper execution);0xAB;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56ac;STRH_InvalidLength;Received command with invalid length (too few or too many parameters);0xAC;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56ad;STRH_RegionMismatch;Region mismatch between send and received data;0xAD;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56ae;STRH_AddressMismatch;Address mismatch between send and received data;0xAE;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56af;STRH_LengthMismatch;Length field mismatch between send and received data;0xAF;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56b0;STRH_FileNotExists;Specified file does not exist;0xB0;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56b1;STRH_InvalidType;Download blob pixel command has invalid type field;0xB1;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56b2;STRH_InvalidId;Received FPGA action command with invalid ID;0xB2;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56b3;STRH_ReplyTooShort;Received reply is too short;0xB3;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56b4;STRH_CrcFailure;Received reply with invalid CRC;0xB4;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56b5;STRH_StrHelperExecuting;Star tracker handler currently executing a command and using the communication interface;0xB5;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56b6;STRH_StartrackerAlreadyBooted;Star tracker is already in firmware mode;0xB6;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56b7;STRH_StartrackerRunningFirmware;Star tracker is in firmware mode but must be in bootloader mode to execute this command;0xB7;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56b8;STRH_StartrackerRunningBootloader;Star tracker is in bootloader mode but must be in firmware mode to execute this command;0xB8;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x5ba0;PTME_UnknownVcId;;0xA0;linux/obc/Ptme.h;PTME
-0x60a0;PDEC_AbandonedCltu;;0xA0;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x60a1;PDEC_FrameDirty;;0xA1;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x60a2;PDEC_FrameIllegalMultipleReasons;;0xA2;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x60a3;PDEC_AdDiscardedLockout;;0xA3;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x60a4;PDEC_AdDiscardedWait;;0xA4;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x60a5;PDEC_AdDiscardedNsVs;;0xA5;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x60b0;PDEC_CommandNotImplemented;Received action message with unknown action id;0xB0;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x60a6;PDEC_NoReport;;0xA6;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x60a7;PDEC_ErrorVersionNumber;;0xA7;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x60a8;PDEC_IllegalCombination;;0xA8;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x60a9;PDEC_InvalidScId;;0xA9;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x60aa;PDEC_InvalidVcIdMsb;;0xAA;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x60ab;PDEC_InvalidVcIdLsb;;0xAB;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x60ac;PDEC_NsNotZero;;0xAC;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x60ae;PDEC_InvalidBcCc;;0xAE;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x62a0;RS_RateNotSupported;The commanded rate is not supported by the current FPGA design;0xA0;linux/obc/PtmeConfig.h;RATE_SETTER
-0x62a1;RS_BadBitRate;Bad bitrate has been commanded (e.g. 0);0xA1;linux/obc/PtmeConfig.h;RATE_SETTER
-0x62a2;RS_ClkInversionFailed;Failed to invert clock and thus change the time the data is updated with respect to the tx clock;0xA2;linux/obc/PtmeConfig.h;RATE_SETTER
-0x62a3;RS_TxManipulatorConfigFailed;Failed to change configuration bit of tx clock manipulator;0xA3;linux/obc/PtmeConfig.h;RATE_SETTER
-0x5aa0;IPCI_PapbBusy;;0xA0;linux/archive/tmtc/CCSDSIPCoreBridge.h;CCSDS_IP_CORE_BRIDGE
-0x5a01;IPCI_UnknownGpioId;;1;linux/archive/gpio/LinuxLibgpioIF.h;CCSDS_IP_CORE_BRIDGE
-0x5a02;IPCI_DriveGpioFailure;;2;linux/archive/gpio/LinuxLibgpioIF.h;CCSDS_IP_CORE_BRIDGE
-0x5a03;IPCI_GpioTypeFailure;;3;linux/archive/gpio/LinuxLibgpioIF.h;CCSDS_IP_CORE_BRIDGE
-0x5a04;IPCI_GpioInvalidInstance;;4;linux/archive/gpio/LinuxLibgpioIF.h;CCSDS_IP_CORE_BRIDGE
+0x5f00;GOMS_PacketTooLong;;0;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER
+0x5f01;GOMS_InvalidTableId;;1;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER
+0x5f02;GOMS_InvalidAddress;;2;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER
+0x5f03;GOMS_InvalidParamSize;;3;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER
+0x5f04;GOMS_InvalidPayloadSize;;4;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER
+0x5f05;GOMS_UnknownReplyId;;5;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER
+0x52a1;HEATER_CommandNotSupported;;0xA1;mission\devices\HeaterHandler.h;HEATER_HANDLER
+0x52a2;HEATER_InitFailed;;0xA2;mission\devices\HeaterHandler.h;HEATER_HANDLER
+0x52a3;HEATER_InvalidSwitchNr;;0xA3;mission\devices\HeaterHandler.h;HEATER_HANDLER
+0x52a4;HEATER_MainSwitchSetTimeout;;0xA4;mission\devices\HeaterHandler.h;HEATER_HANDLER
+0x52a5;HEATER_CommandAlreadyWaiting;;0xA5;mission\devices\HeaterHandler.h;HEATER_HANDLER
+0x54a0;IMTQ_InvalidCommandCode;;0xA0;mission\devices\IMTQHandler.h;IMTQ_HANDLER
+0x54a1;IMTQ_ParameterMissing;;0xA1;mission\devices\IMTQHandler.h;IMTQ_HANDLER
+0x54a2;IMTQ_ParameterInvalid;;0xA2;mission\devices\IMTQHandler.h;IMTQ_HANDLER
+0x54a3;IMTQ_CcUnavailable;;0xA3;mission\devices\IMTQHandler.h;IMTQ_HANDLER
+0x54a4;IMTQ_InternalProcessingError;;0xA4;mission\devices\IMTQHandler.h;IMTQ_HANDLER
+0x54a5;IMTQ_RejectedWithoutReason;;0xA5;mission\devices\IMTQHandler.h;IMTQ_HANDLER
+0x54a6;IMTQ_CmdErrUnknown;;0xA6;mission\devices\IMTQHandler.h;IMTQ_HANDLER
+0x54a7;IMTQ_UnexpectedSelfTestReply;The status reply to a self test command was received but no self test command has been sent. This should normally never happen.;0xA7;mission\devices\IMTQHandler.h;IMTQ_HANDLER
+0x55b0;RWHA_SpiWriteFailure;;0xB0;mission\devices\RwHandler.h;RW_HANDLER
+0x55b1;RWHA_SpiReadFailure;Used by the spi send function to tell a failing read call;0xB1;mission\devices\RwHandler.h;RW_HANDLER
+0x55b2;RWHA_MissingStartSign;Can be used by the HDLC decoding mechanism to inform about a missing start sign 0x7E;0xB2;mission\devices\RwHandler.h;RW_HANDLER
+0x55b3;RWHA_InvalidSubstitute;Can be used by the HDLC decoding mechanism to inform about an invalid substitution combination;0xB3;mission\devices\RwHandler.h;RW_HANDLER
+0x55b4;RWHA_MissingEndSign;HDLC decoding mechanism never receives the end sign 0x7E;0xB4;mission\devices\RwHandler.h;RW_HANDLER
+0x55b5;RWHA_NoReply;Reaction wheel only responds with empty frames.;0xB5;mission\devices\RwHandler.h;RW_HANDLER
+0x55b6;RWHA_NoStartMarker;Expected a start marker as first byte;0xB6;mission\devices\RwHandler.h;RW_HANDLER
+0x55a0;RWHA_InvalidSpeed;Action Message with invalid speed was received. Valid speeds must be in the range of [-65000; 1000] or [1000; 65000];0xA0;mission\devices\RwHandler.h;RW_HANDLER
+0x55a1;RWHA_InvalidRampTime;Action Message with invalid ramp time was received.;0xA1;mission\devices\RwHandler.h;RW_HANDLER
+0x55a2;RWHA_SetSpeedCommandInvalidLength;Received set speed command has invalid length. Should be 6.;0xA2;mission\devices\RwHandler.h;RW_HANDLER
+0x55a3;RWHA_ExecutionFailed;Command execution failed;0xA3;mission\devices\RwHandler.h;RW_HANDLER
+0x55a4;RWHA_CrcError;Reaction wheel reply has invalid crc;0xA4;mission\devices\RwHandler.h;RW_HANDLER
+0x68a0;SADPL_CommandNotSupported;;0xA0;mission\devices\SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER
+0x68a1;SADPL_DeploymentAlreadyExecuting;;0xA1;mission\devices\SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER
+0x68a2;SADPL_MainSwitchTimeoutFailure;;0xA2;mission\devices\SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER
+0x68a3;SADPL_SwitchingDeplSa1Failed;;0xA3;mission\devices\SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER
+0x68a4;SADPL_SwitchingDeplSa2Failed;;0xA4;mission\devices\SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER
+0x5aa0;SUSS_ErrorUnlockMutex;;0xA0;mission\devices\SusHandler.h;SUS_HANDLER
+0x5aa1;SUSS_ErrorLockMutex;;0xA1;mission\devices\SusHandler.h;SUS_HANDLER
+0x53a0;SYRLINKS_CrcFailure;;0xA0;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER
+0x53a1;SYRLINKS_UartFraminOrParityErrorAck;;0xA1;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER
+0x53a2;SYRLINKS_BadCharacterAck;;0xA2;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER
+0x53a3;SYRLINKS_BadParameterValueAck;;0xA3;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER
+0x53a4;SYRLINKS_BadEndOfFrameAck;;0xA4;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER
+0x53a5;SYRLINKS_UnknownCommandIdAck;;0xA5;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER
+0x53a6;SYRLINKS_BadCrcAck;;0xA6;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER
+0x53a7;SYRLINKS_ReplyWrongSize;;0xA7;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER
+0x53a8;SYRLINKS_MissingStartFrameCharacter;;0xA8;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER
+0x65a0;NVMB_KeyNotExists;Specified key does not exist in json file;0xA0;mission\memory\NVMParameterBase.h;NVM_PARAM_BASE
+0x62a0;CCSDS_CommandNotImplemented;Received action message with unknown action id;0xA0;mission\tmtc\CCSDSHandler.h;CCSDS_HANDLER
+0x4601; HGIO_UnknownGpioId;;1;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO
+0x4602; HGIO_DriveGpioFailure;;2;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO
+0x4603; HGIO_GpioTypeFailure;;3;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO
+0x4604; HGIO_GpioInvalidInstance;;4;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO
+0x4605; HGIO_GpioDuplicateDetected;;5;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO
+0x4300; HSPI_HalTimeoutRetval;;0;fsfw\hal\src\fsfw_hal\stm32h7\spi\spiDefinitions.h;HAL_SPI
+0x4301; HSPI_HalBusyRetval;;1;fsfw\hal\src\fsfw_hal\stm32h7\spi\spiDefinitions.h;HAL_SPI
+0x4302; HSPI_HalErrorRetval;;2;fsfw\hal\src\fsfw_hal\stm32h7\spi\spiDefinitions.h;HAL_SPI
+0x4401; HURT_UartReadFailure;;1;fsfw\hal\src\fsfw_hal\linux\uart\UartComIF.h;HAL_UART
+0x4402; HURT_UartReadSizeMissmatch;;2;fsfw\hal\src\fsfw_hal\linux\uart\UartComIF.h;HAL_UART
+0x4403; HURT_UartRxBufferTooSmall;;3;fsfw\hal\src\fsfw_hal\linux\uart\UartComIF.h;HAL_UART
+0x4200; UXOS_ExecutionFinished;Execution of the current command has finished;0;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL
+0x4201; UXOS_CommandPending;Command is pending. This will also be returned if the user tries to load another command but a command is still pending;1;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL
+0x4202; UXOS_BytesRead;Some bytes have been read from the executing process;2;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL
+0x4203; UXOS_CommandError;Command execution failed;3;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL
+0x4204; UXOS_NoCommandLoadedOrPending;;4;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL
+0x4206; UXOS_PcloseCallError;;6;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL
+0x3101; CF_ObjectHasNoFunctions;;1;fsfw\src\fsfw\action\CommandsActionsIF.h;COMMANDS_ACTIONS_IF
+0x3102; CF_AlreadyCommanding;;2;fsfw\src\fsfw\action\CommandsActionsIF.h;COMMANDS_ACTIONS_IF
+0x3201; HF_IsBusy;;1;fsfw\src\fsfw\action\HasActionsIF.h;HAS_ACTIONS_IF
+0x3202; HF_InvalidParameters;;2;fsfw\src\fsfw\action\HasActionsIF.h;HAS_ACTIONS_IF
+0x3203; HF_ExecutionFinished;;3;fsfw\src\fsfw\action\HasActionsIF.h;HAS_ACTIONS_IF
+0x3204; HF_InvalidActionId;;4;fsfw\src\fsfw\action\HasActionsIF.h;HAS_ACTIONS_IF
+0x3501; CFDP_InvalidTlvType;;1;fsfw\src\fsfw\cfdp\definitions.h;CFDP
+0x3502; CFDP_InvalidDirectiveFields;;2;fsfw\src\fsfw\cfdp\definitions.h;CFDP
+0x3503; CFDP_InvalidPduDatafieldLen;;3;fsfw\src\fsfw\cfdp\definitions.h;CFDP
+0x3504; CFDP_InvalidAckDirectiveFields;;4;fsfw\src\fsfw\cfdp\definitions.h;CFDP
+0x3505; CFDP_MetadataCantParseOptions;;5;fsfw\src\fsfw\cfdp\definitions.h;CFDP
+0x3506; CFDP_FinishedCantParseFsResponses;;6;fsfw\src\fsfw\cfdp\definitions.h;CFDP
+0x3508; CFDP_FilestoreRequiresSecondFile;;8;fsfw\src\fsfw\cfdp\definitions.h;CFDP
+0x3509; CFDP_FilestoreResponseCantParseFsMessage;;9;fsfw\src\fsfw\cfdp\definitions.h;CFDP
+0x1101; AL_Full;;0x01;fsfw\src\fsfw\container\ArrayList.h;ARRAY_LIST
+0x1801; FF_Full;;1;fsfw\src\fsfw\container\FIFOBase.h;FIFO_CLASS
+0x1802; FF_Empty;;2;fsfw\src\fsfw\container\FIFOBase.h;FIFO_CLASS
+0x1501; FM_KeyAlreadyExists;;0x01;fsfw\src\fsfw\container\FixedMap.h;FIXED_MAP
+0x1502; FM_MapFull;;0x02;fsfw\src\fsfw\container\FixedMap.h;FIXED_MAP
+0x1503; FM_KeyDoesNotExist;;0x03;fsfw\src\fsfw\container\FixedMap.h;FIXED_MAP
+0x1601; FMM_MapFull;;0x01;fsfw\src\fsfw\container\FixedOrderedMultimap.h;FIXED_MULTIMAP
+0x1602; FMM_KeyDoesNotExist;;0x02;fsfw\src\fsfw\container\FixedOrderedMultimap.h;FIXED_MULTIMAP
+0x37a1; SGP4_InvalidEccentricity;;0xA1;fsfw\src\fsfw\coordinates\Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
+0x37a2; SGP4_InvalidMeanMotion;;0xA2;fsfw\src\fsfw\coordinates\Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
+0x37a3; SGP4_InvalidPerturbationElements;;0xA3;fsfw\src\fsfw\coordinates\Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
+0x37a4; SGP4_InvalidSemiLatusRectum;;0xA4;fsfw\src\fsfw\coordinates\Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
+0x37a5; SGP4_InvalidEpochElements;;0xA5;fsfw\src\fsfw\coordinates\Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
+0x37a6; SGP4_SatelliteHasDecayed;;0xA6;fsfw\src\fsfw\coordinates\Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
+0x37b1; SGP4_TleTooOld;;0xB1;fsfw\src\fsfw\coordinates\Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
+0x37b2; SGP4_TleNotInitialized;;0xB2;fsfw\src\fsfw\coordinates\Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
+0x2b01; CCS_BcIsSetVrCommand;;0x01;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2b02; CCS_BcIsUnlockCommand;;0x02;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bb0; CCS_BcIllegalCommand;;0xB0;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bb1; CCS_BoardReadingNotFinished;;0xB1;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bf0; CCS_NsPositiveW;;0xF0;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bf1; CCS_NsNegativeW;;0xF1;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bf2; CCS_NsLockout;;0xF2;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bf3; CCS_FarmInLockout;;0xF3;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bf4; CCS_FarmInWait;;0xF4;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2be0; CCS_WrongSymbol;;0xE0;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2be1; CCS_DoubleStart;;0xE1;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2be2; CCS_StartSymbolMissed;;0xE2;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2be3; CCS_EndWithoutStart;;0xE3;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2be4; CCS_TooLarge;;0xE4;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2be5; CCS_TooShort;;0xE5;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2be6; CCS_WrongTfVersion;;0xE6;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2be7; CCS_WrongSpacecraftId;;0xE7;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2be8; CCS_NoValidFrameType;;0xE8;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2be9; CCS_CrcFailed;;0xE9;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bea; CCS_VcNotFound;;0xEA;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2beb; CCS_ForwardingFailed;;0xEB;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bec; CCS_ContentTooLarge;;0xEC;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bed; CCS_ResidualData;;0xED;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bee; CCS_DataCorrupted;;0xEE;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bef; CCS_IllegalSegmentationFlag;;0xEF;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bd0; CCS_IllegalFlagCombination;;0xD0;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bd1; CCS_ShorterThanHeader;;0xD1;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bd2; CCS_TooShortBlockedPacket;;0xD2;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bd3; CCS_TooShortMapExtraction;;0xD3;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x801; DPS_InvalidParameterDefinition;;1;fsfw\src\fsfw\datapool\DataSetIF.h;DATA_SET_CLASS
+0x802; DPS_SetWasAlreadyRead;;2;fsfw\src\fsfw\datapool\DataSetIF.h;DATA_SET_CLASS
+0x803; DPS_CommitingWithoutReading;;3;fsfw\src\fsfw\datapool\DataSetIF.h;DATA_SET_CLASS
+0x804; DPS_DataSetUninitialised;;4;fsfw\src\fsfw\datapool\DataSetIF.h;DATA_SET_CLASS
+0x805; DPS_DataSetFull;;5;fsfw\src\fsfw\datapool\DataSetIF.h;DATA_SET_CLASS
+0x806; DPS_PoolVarNull;;6;fsfw\src\fsfw\datapool\DataSetIF.h;DATA_SET_CLASS
+0x3ca0; PVA_InvalidReadWriteMode;;0xA0;fsfw\src\fsfw\datapool\PoolVariableIF.h;POOL_VARIABLE_IF
+0x3ca1; PVA_InvalidPoolEntry;;0xA1;fsfw\src\fsfw\datapool\PoolVariableIF.h;POOL_VARIABLE_IF
+0x3d00; HKM_QueueOrDestinationInvalid;;0;fsfw\src\fsfw\datapoollocal\LocalDataPoolManager.h;HOUSEKEEPING_MANAGER
+0x3d01; HKM_WrongHkPacketType;;1;fsfw\src\fsfw\datapoollocal\LocalDataPoolManager.h;HOUSEKEEPING_MANAGER
+0x3d02; HKM_ReportingStatusUnchanged;;2;fsfw\src\fsfw\datapoollocal\LocalDataPoolManager.h;HOUSEKEEPING_MANAGER
+0x3d03; HKM_PeriodicHelperInvalid;;3;fsfw\src\fsfw\datapoollocal\LocalDataPoolManager.h;HOUSEKEEPING_MANAGER
+0x3d04; HKM_PoolobjectNotFound;;4;fsfw\src\fsfw\datapoollocal\LocalDataPoolManager.h;HOUSEKEEPING_MANAGER
+0x3d05; HKM_DatasetNotFound;;5;fsfw\src\fsfw\datapoollocal\LocalDataPoolManager.h;HOUSEKEEPING_MANAGER
+0x3b00; LPIF_PoolEntryNotFound;;0x00;fsfw\src\fsfw\datapoollocal\localPoolDefinitions.h;LOCAL_POOL_OWNER_IF
+0x3b01; LPIF_PoolEntryTypeConflict;;0x01;fsfw\src\fsfw\datapoollocal\localPoolDefinitions.h;LOCAL_POOL_OWNER_IF
+0x1201; AB_NeedSecondStep;;0x01;fsfw\src\fsfw\devicehandlers\AssemblyBase.h;ASSEMBLY_BASE
+0x1202; AB_NeedToReconfigure;;0x02;fsfw\src\fsfw\devicehandlers\AssemblyBase.h;ASSEMBLY_BASE
+0x1203; AB_ModeFallback;;0x03;fsfw\src\fsfw\devicehandlers\AssemblyBase.h;ASSEMBLY_BASE
+0x1204; AB_ChildNotCommandable;;0x04;fsfw\src\fsfw\devicehandlers\AssemblyBase.h;ASSEMBLY_BASE
+0x1205; AB_NeedToChangeHealth;;0x05;fsfw\src\fsfw\devicehandlers\AssemblyBase.h;ASSEMBLY_BASE
+0x12a1; AB_NotEnoughChildrenInCorrectState;;0xa1;fsfw\src\fsfw\devicehandlers\AssemblyBase.h;ASSEMBLY_BASE
+0x3301; DC_NoReplyReceived;;0x01;fsfw\src\fsfw\devicehandlers\DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF
+0x3302; DC_ProtocolError;;0x02;fsfw\src\fsfw\devicehandlers\DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF
+0x3303; DC_Nullpointer;;0x03;fsfw\src\fsfw\devicehandlers\DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF
+0x3304; DC_InvalidCookieType;;0x04;fsfw\src\fsfw\devicehandlers\DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF
+0x3305; DC_NotActive;;0x05;fsfw\src\fsfw\devicehandlers\DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF
+0x3306; DC_TooMuchData;;0x06;fsfw\src\fsfw\devicehandlers\DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF
+0x3a0; DHB_InvalidChannel;;0xA0;fsfw\src\fsfw\devicehandlers\DeviceHandlerBase.h;DEVICE_HANDLER_BASE
+0x3b0; DHB_AperiodicReply;;0xB0;fsfw\src\fsfw\devicehandlers\DeviceHandlerBase.h;DEVICE_HANDLER_BASE
+0x3b1; DHB_IgnoreReplyData;;0xB1;fsfw\src\fsfw\devicehandlers\DeviceHandlerBase.h;DEVICE_HANDLER_BASE
+0x3b2; DHB_IgnoreFullPacket;;0xB2;fsfw\src\fsfw\devicehandlers\DeviceHandlerBase.h;DEVICE_HANDLER_BASE
+0x3c0; DHB_NothingToSend;;0xC0;fsfw\src\fsfw\devicehandlers\DeviceHandlerBase.h;DEVICE_HANDLER_BASE
+0x3c2; DHB_CommandMapError;;0xC2;fsfw\src\fsfw\devicehandlers\DeviceHandlerBase.h;DEVICE_HANDLER_BASE
+0x3d0; DHB_NoSwitch;;0xD0;fsfw\src\fsfw\devicehandlers\DeviceHandlerBase.h;DEVICE_HANDLER_BASE
+0x3e0; DHB_ChildTimeout;;0xE0;fsfw\src\fsfw\devicehandlers\DeviceHandlerBase.h;DEVICE_HANDLER_BASE
+0x3e1; DHB_SwitchFailed;;0xE1;fsfw\src\fsfw\devicehandlers\DeviceHandlerBase.h;DEVICE_HANDLER_BASE
+0x26a0; DHI_NoCommandData;;0xA0;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26a1; DHI_CommandNotSupported;;0xA1;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26a2; DHI_CommandAlreadySent;;0xA2;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26a3; DHI_CommandWasNotSent;;0xA3;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26a4; DHI_CantSwitchAddress;;0xA4;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26a5; DHI_WrongModeForCommand;;0xA5;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26a6; DHI_Timeout;;0xA6;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26a7; DHI_Busy;;0xA7;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26a8; DHI_NoReplyExpected;;0xA8;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26a9; DHI_NonOpTemperature;;0xA9;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26aa; DHI_CommandNotImplemented;;0xAA;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26b0; DHI_ChecksumError;;0xB0;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26b1; DHI_LengthMissmatch;;0xB1;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26b2; DHI_InvalidData;;0xB2;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26b3; DHI_ProtocolError;;0xB3;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26c0; DHI_DeviceDidNotExecute;;0xC0;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26c1; DHI_DeviceReportedError;;0xC1;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26c2; DHI_UnknownDeviceReply;;0xC2;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26c3; DHI_DeviceReplyInvalid;;0xC3;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26d0; DHI_InvalidCommandParameter;;0xD0;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26d1; DHI_InvalidNumberOrLengthOfParameters;;0xD1;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x2401; EV_ListenerNotFound;;1;fsfw\src\fsfw\events\EventManagerIF.h;EVENT_MANAGER_IF
+0x2500; FDI_YourFault;;0;fsfw\src\fsfw\fdir\ConfirmsFailuresIF.h;HANDLES_FAILURES_IF
+0x2501; FDI_MyFault;;1;fsfw\src\fsfw\fdir\ConfirmsFailuresIF.h;HANDLES_FAILURES_IF
+0x2502; FDI_ConfirmLater;;2;fsfw\src\fsfw\fdir\ConfirmsFailuresIF.h;HANDLES_FAILURES_IF
+0x2301; MT_TooDetailedRequest;;1;fsfw\src\fsfw\globalfunctions\matching\MatchTree.h;MATCH_TREE_CLASS
+0x2302; MT_TooGeneralRequest;;2;fsfw\src\fsfw\globalfunctions\matching\MatchTree.h;MATCH_TREE_CLASS
+0x2303; MT_NoMatch;;3;fsfw\src\fsfw\globalfunctions\matching\MatchTree.h;MATCH_TREE_CLASS
+0x2304; MT_Full;;4;fsfw\src\fsfw\globalfunctions\matching\MatchTree.h;MATCH_TREE_CLASS
+0x2305; MT_NewNodeCreated;;5;fsfw\src\fsfw\globalfunctions\matching\MatchTree.h;MATCH_TREE_CLASS
+0x2e01; ASC_TooLongForTargetType;;1;fsfw\src\fsfw\globalfunctions\AsciiConverter.h;ASCII_CONVERTER
+0x2e02; ASC_InvalidCharacters;;2;fsfw\src\fsfw\globalfunctions\AsciiConverter.h;ASCII_CONVERTER
+0x2e03; ASC_BufferTooSmall;;0x3;fsfw\src\fsfw\globalfunctions\AsciiConverter.h;ASCII_CONVERTER
+0x3e01; DLEE_StreamTooShort;;0x01;fsfw\src\fsfw\globalfunctions\DleEncoder.h;DLE_ENCODER
+0x3e02; DLEE_DecodingError;;0x02;fsfw\src\fsfw\globalfunctions\DleEncoder.h;DLE_ENCODER
+0x1701; HHI_ObjectNotHealthy;;1;fsfw\src\fsfw\health\HasHealthIF.h;HAS_HEALTH_IF
+0x1702; HHI_InvalidHealthState;;2;fsfw\src\fsfw\health\HasHealthIF.h;HAS_HEALTH_IF
+0xf01; CM_UnknownCommand;;1;fsfw\src\fsfw\ipc\CommandMessageIF.h;COMMAND_MESSAGE
+0x3901; MQI_Empty;;1;fsfw\src\fsfw\ipc\MessageQueueIF.h;MESSAGE_QUEUE_IF
+0x3902; MQI_Full;No space left for more messages;2;fsfw\src\fsfw\ipc\MessageQueueIF.h;MESSAGE_QUEUE_IF
+0x3903; MQI_NoReplyPartner;Returned if a reply method was called without partner;3;fsfw\src\fsfw\ipc\MessageQueueIF.h;MESSAGE_QUEUE_IF
+0x3904; MQI_DestinationInvalid;Returned if the target destination is invalid.;4;fsfw\src\fsfw\ipc\MessageQueueIF.h;MESSAGE_QUEUE_IF
+0x3801; MUX_NotEnoughResources;;1;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF
+0x3802; MUX_InsufficientMemory;;2;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF
+0x3803; MUX_NoPrivilege;;3;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF
+0x3804; MUX_WrongAttributeSetting;;4;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF
+0x3805; MUX_MutexAlreadyLocked;;5;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF
+0x3806; MUX_MutexNotFound;;6;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF
+0x3807; MUX_MutexMaxLocks;;7;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF
+0x3808; MUX_CurrThreadAlreadyOwnsMutex;;8;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF
+0x3809; MUX_CurrThreadDoesNotOwnMutex;;9;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF
+0x380a; MUX_MutexTimeout;;10;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF
+0x380b; MUX_MutexInvalidId;;11;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF
+0x380c; MUX_MutexDestroyedWhileWaiting;;12;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF
+0x4100; FILS_GenericFileError;;0;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM
+0x4101; FILS_IsBusy;;1;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM
+0x4102; FILS_InvalidParameters;;2;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM
+0x4105; FILS_FileDoesNotExist;;5;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM
+0x4106; FILS_FileAlreadyExists;;6;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM
+0x4107; FILS_FileLocked;;7;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM
+0x410a; FILS_DirectoryDoesNotExist;;10;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM
+0x410b; FILS_DirectoryAlreadyExists;;11;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM
+0x410c; FILS_DirectoryNotEmpty;;12;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM
+0x410f; FILS_SequencePacketMissingWrite;;15;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM
+0x4110; FILS_SequencePacketMissingRead;;16;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM
+0x601; PP_DoItMyself;;1;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x602; PP_PointsToVariable;;2;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x603; PP_PointsToMemory;;3;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x604; PP_ActivityCompleted;;4;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x605; PP_PointsToVectorUint8;;5;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x606; PP_PointsToVectorUint16;;6;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x607; PP_PointsToVectorUint32;;7;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x608; PP_PointsToVectorFloat;;8;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x6a0; PP_DumpNotSupported;;0xA0;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x6e0; PP_InvalidSize;;0xE0;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x6e1; PP_InvalidAddress;;0xE1;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x6e2; PP_InvalidContent;;0xE2;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x6e3; PP_UnalignedAccess;;0xE3;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x6e4; PP_WriteProtected;;0xE4;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x13e0; MH_UnknownCmd;;0xE0;fsfw\src\fsfw\memory\MemoryHelper.h;MEMORY_HELPER
+0x13e1; MH_InvalidAddress;;0xE1;fsfw\src\fsfw\memory\MemoryHelper.h;MEMORY_HELPER
+0x13e2; MH_InvalidSize;;0xE2;fsfw\src\fsfw\memory\MemoryHelper.h;MEMORY_HELPER
+0x13e3; MH_StateMismatch;;0xE3;fsfw\src\fsfw\memory\MemoryHelper.h;MEMORY_HELPER
+0xe01; HM_InvalidMode;;0x01;fsfw\src\fsfw\modes\HasModesIF.h;HAS_MODES_IF
+0xe02; HM_TransNotAllowed;;0x02;fsfw\src\fsfw\modes\HasModesIF.h;HAS_MODES_IF
+0xe03; HM_InTransition;;0x03;fsfw\src\fsfw\modes\HasModesIF.h;HAS_MODES_IF
+0xe04; HM_InvalidSubmode;;0x04;fsfw\src\fsfw\modes\HasModesIF.h;HAS_MODES_IF
+0x3001; LIM_Unchecked;;1;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF
+0x3002; LIM_Invalid;;2;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF
+0x3003; LIM_Unselected;;3;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF
+0x3004; LIM_BelowLowLimit;;4;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF
+0x3005; LIM_AboveHighLimit;;5;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF
+0x3006; LIM_UnexpectedValue;;6;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF
+0x3007; LIM_OutOfRange;;7;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF
+0x30a0; LIM_FirstSample;;0xA0;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF
+0x30e0; LIM_InvalidSize;;0xE0;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF
+0x30e1; LIM_WrongType;;0xE1;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF
+0x30e2; LIM_WrongPid;;0xE2;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF
+0x30e3; LIM_WrongLimitId;;0xE3;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF
+0x30ee; LIM_MonitorNotFound;;0xEE;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF
+0x1a01; TRC_NotEnoughSensors;;1;fsfw\src\fsfw\monitoring\TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK
+0x1a02; TRC_LowestValueOol;;2;fsfw\src\fsfw\monitoring\TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK
+0x1a03; TRC_HighestValueOol;;3;fsfw\src\fsfw\monitoring\TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK
+0x1a04; TRC_BothValuesOol;;4;fsfw\src\fsfw\monitoring\TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK
+0x1a05; TRC_DuplexOol;;5;fsfw\src\fsfw\monitoring\TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK
+0x201; OM_InsertionFailed;;1;fsfw\src\fsfw\objectmanager\ObjectManagerIF.h;OBJECT_MANAGER_IF
+0x202; OM_NotFound;;2;fsfw\src\fsfw\objectmanager\ObjectManagerIF.h;OBJECT_MANAGER_IF
+0x203; OM_ChildInitFailed;;3;fsfw\src\fsfw\objectmanager\ObjectManagerIF.h;OBJECT_MANAGER_IF
+0x204; OM_InternalErrReporterUninit;;4;fsfw\src\fsfw\objectmanager\ObjectManagerIF.h;OBJECT_MANAGER_IF
+0x200; OM_ConnBroken;;0;fsfw\src\fsfw\osal\common\TcpTmTcServer.h;OBJECT_MANAGER_IF
+0x2901; IEC_NoConfigurationTable;;0x01;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2902; IEC_NoCpuTable;;0x02;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2903; IEC_InvalidWorkspaceAddress;;0x03;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2904; IEC_TooLittleWorkspace;;0x04;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2905; IEC_WorkspaceAllocation;;0x05;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2906; IEC_InterruptStackTooSmall;;0x06;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2907; IEC_ThreadExitted;;0x07;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2908; IEC_InconsistentMpInformation;;0x08;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2909; IEC_InvalidNode;;0x09;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x290a; IEC_NoMpci;;0x0a;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x290b; IEC_BadPacket;;0x0b;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x290c; IEC_OutOfPackets;;0x0c;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x290d; IEC_OutOfGlobalObjects;;0x0d;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x290e; IEC_OutOfProxies;;0x0e;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x290f; IEC_InvalidGlobalId;;0x0f;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2910; IEC_BadStackHook;;0x10;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2911; IEC_BadAttributes;;0x11;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2912; IEC_ImplementationKeyCreateInconsistency;;0x12;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2913; IEC_ImplementationBlockingOperationCancel;;0x13;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2914; IEC_MutexObtainFromBadState;;0x14;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2915; IEC_UnlimitedAndMaximumIs0;;0x15;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2d01; HPA_InvalidIdentifierId;;0x01;fsfw\src\fsfw\parameters\HasParametersIF.h;HAS_PARAMETERS_IF
+0x2d02; HPA_InvalidDomainId;;0x02;fsfw\src\fsfw\parameters\HasParametersIF.h;HAS_PARAMETERS_IF
+0x2d03; HPA_InvalidValue;;0x03;fsfw\src\fsfw\parameters\HasParametersIF.h;HAS_PARAMETERS_IF
+0x2d05; HPA_ReadOnly;;0x05;fsfw\src\fsfw\parameters\HasParametersIF.h;HAS_PARAMETERS_IF
+0x2c01; PAW_UnknownDatatype;;0x01;fsfw\src\fsfw\parameters\ParameterWrapper.h;PARAMETER_WRAPPER
+0x2c02; PAW_DatatypeMissmatch;;0x02;fsfw\src\fsfw\parameters\ParameterWrapper.h;PARAMETER_WRAPPER
+0x2c03; PAW_Readonly;;0x03;fsfw\src\fsfw\parameters\ParameterWrapper.h;PARAMETER_WRAPPER
+0x2c04; PAW_TooBig;;0x04;fsfw\src\fsfw\parameters\ParameterWrapper.h;PARAMETER_WRAPPER
+0x2c05; PAW_SourceNotSet;;0x05;fsfw\src\fsfw\parameters\ParameterWrapper.h;PARAMETER_WRAPPER
+0x2c06; PAW_OutOfBounds;;0x06;fsfw\src\fsfw\parameters\ParameterWrapper.h;PARAMETER_WRAPPER
+0x2c07; PAW_NotSet;;0x07;fsfw\src\fsfw\parameters\ParameterWrapper.h;PARAMETER_WRAPPER
+0x2c08; PAW_ColumnOrRowsZero;;0x08;fsfw\src\fsfw\parameters\ParameterWrapper.h;PARAMETER_WRAPPER
+0x2f01; POS_InPowerTransition;;1;fsfw\src\fsfw\power\PowerSwitcher.h;POWER_SWITCHER
+0x2f02; POS_SwitchStateMismatch;;2;fsfw\src\fsfw\power\PowerSwitcher.h;POWER_SWITCHER
+0x501; PS_SwitchOn;;1;fsfw\src\fsfw\power\PowerSwitchIF.h;POWER_SWITCH_IF
+0x500; PS_SwitchOff;;0;fsfw\src\fsfw\power\PowerSwitchIF.h;POWER_SWITCH_IF
+0x502; PS_SwitchTimeout;;2;fsfw\src\fsfw\power\PowerSwitchIF.h;POWER_SWITCH_IF
+0x503; PS_FuseOn;;3;fsfw\src\fsfw\power\PowerSwitchIF.h;POWER_SWITCH_IF
+0x504; PS_FuseOff;;4;fsfw\src\fsfw\power\PowerSwitchIF.h;POWER_SWITCH_IF
+0x4e1; RMP_CommandNoDescriptorsAvailable;;0xE1;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4e2; RMP_CommandBufferFull;;0xE2;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4e3; RMP_CommandChannelOutOfRange;;0xE3;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4e6; RMP_CommandChannelDeactivated;;0xE6;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4e7; RMP_CommandPortOutOfRange;;0xE7;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4e8; RMP_CommandPortInUse;;0xE8;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4e9; RMP_CommandNoChannel;;0xE9;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4ea; RMP_NoHwCrc;;0xEA;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4d0; RMP_ReplyNoReply;;0xD0;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4d1; RMP_ReplyNotSent;;0xD1;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4d2; RMP_ReplyNotYetSent;;0xD2;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4d3; RMP_ReplyMissmatch;;0xD3;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4d4; RMP_ReplyTimeout;;0xD4;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4c0; RMP_ReplyInterfaceBusy;;0xC0;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4c1; RMP_ReplyTransmissionError;;0xC1;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4c2; RMP_ReplyInvalidData;;0xC2;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4c3; RMP_ReplyNotSupported;;0xC3;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4f0; RMP_LinkDown;;0xF0;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4f1; RMP_SpwCredit;;0xF1;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4f2; RMP_SpwEscape;;0xF2;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4f3; RMP_SpwDisconnect;;0xF3;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4f4; RMP_SpwParity;;0xF4;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4f5; RMP_SpwWriteSync;;0xF5;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4f6; RMP_SpwInvalidAddress;;0xF6;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4f7; RMP_SpwEarlyEop;;0xF7;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4f8; RMP_SpwDma;;0xF8;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4f9; RMP_SpwLinkError;;0xF9;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x400; RMP_ReplyOk;;0;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x401; RMP_ReplyGeneralErrorCode;;1;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x402; RMP_ReplyUnusedPacketTypeOrCommandCode;;2;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x403; RMP_ReplyInvalidKey;;3;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x404; RMP_ReplyInvalidDataCrc;;4;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x405; RMP_ReplyEarlyEop;;5;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x406; RMP_ReplyTooMuchData;;6;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x407; RMP_ReplyEep;;7;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x408; RMP_ReplyReserved;;8;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x409; RMP_ReplyVerifyBufferOverrun;;9;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x40a; RMP_ReplyCommandNotImplementedOrNotAuthorised;;10;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x40b; RMP_ReplyRmwDataLengthError;;11;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x40c; RMP_ReplyInvalidTargetLogicalAddress;;12;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x1401; SE_BufferTooShort;;1;fsfw\src\fsfw\serialize\SerializeIF.h;SERIALIZE_IF
+0x1402; SE_StreamTooShort;;2;fsfw\src\fsfw\serialize\SerializeIF.h;SERIALIZE_IF
+0x1403; SE_TooManyElements;;3;fsfw\src\fsfw\serialize\SerializeIF.h;SERIALIZE_IF
+0x2701; SM_DataTooLarge;;1;fsfw\src\fsfw\storagemanager\StorageManagerIF.h;STORAGE_MANAGER_IF
+0x2702; SM_DataStorageFull;;2;fsfw\src\fsfw\storagemanager\StorageManagerIF.h;STORAGE_MANAGER_IF
+0x2703; SM_IllegalStorageId;;3;fsfw\src\fsfw\storagemanager\StorageManagerIF.h;STORAGE_MANAGER_IF
+0x2704; SM_DataDoesNotExist;;4;fsfw\src\fsfw\storagemanager\StorageManagerIF.h;STORAGE_MANAGER_IF
+0x2705; SM_IllegalAddress;;5;fsfw\src\fsfw\storagemanager\StorageManagerIF.h;STORAGE_MANAGER_IF
+0x2706; SM_PoolTooLarge;;6;fsfw\src\fsfw\storagemanager\StorageManagerIF.h;STORAGE_MANAGER_IF
+0xc02; MS_InvalidEntry;;0x02;fsfw\src\fsfw\subsystem\modes\ModeStoreIF.h;MODE_STORE_IF
+0xc03; MS_TooManyElements;;0x03;fsfw\src\fsfw\subsystem\modes\ModeStoreIF.h;MODE_STORE_IF
+0xc04; MS_CantStoreEmpty;;0x04;fsfw\src\fsfw\subsystem\modes\ModeStoreIF.h;MODE_STORE_IF
+0xd01; SS_SequenceAlreadyExists;;0x01;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xd02; SS_TableAlreadyExists;;0x02;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xd03; SS_TableDoesNotExist;;0x03;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xd04; SS_TableOrSequenceLengthInvalid;;0x04;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xd05; SS_SequenceDoesNotExist;;0x05;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xd06; SS_TableContainsInvalidObjectId;;0x06;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xd07; SS_FallbackSequenceDoesNotExist;;0x07;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xd08; SS_NoTargetTable;;0x08;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xd09; SS_SequenceOrTableTooLong;;0x09;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xd0b; SS_IsFallbackSequence;;0x0B;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xd0c; SS_AccessDenied;;0x0C;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xd0e; SS_TableInUse;;0x0E;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xda1; SS_TargetTableNotReached;;0xA1;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xda2; SS_TableCheckFailed;;0xA2;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xb01; SB_ChildNotFound;;0x01;fsfw\src\fsfw\subsystem\SubsystemBase.h;SUBSYSTEM_BASE
+0xb02; SB_ChildInfoUpdated;;0x02;fsfw\src\fsfw\subsystem\SubsystemBase.h;SUBSYSTEM_BASE
+0xb03; SB_ChildDoesntHaveModes;;0x03;fsfw\src\fsfw\subsystem\SubsystemBase.h;SUBSYSTEM_BASE
+0xb04; SB_CouldNotInsertChild;;0x04;fsfw\src\fsfw\subsystem\SubsystemBase.h;SUBSYSTEM_BASE
+0xb05; SB_TableContainsInvalidObjectId;;0x05;fsfw\src\fsfw\subsystem\SubsystemBase.h;SUBSYSTEM_BASE
+0x3a01; SPH_SemaphoreTimeout;;1;fsfw\src\fsfw\tasks\SemaphoreIF.h;SEMAPHORE_IF
+0x3a02; SPH_SemaphoreNotOwned;;2;fsfw\src\fsfw\tasks\SemaphoreIF.h;SEMAPHORE_IF
+0x3a03; SPH_SemaphoreInvalid;;3;fsfw\src\fsfw\tasks\SemaphoreIF.h;SEMAPHORE_IF
+0x1c01; TCD_PacketLost;;1;fsfw\src\fsfw\tcdistribution\TcDistributor.h;PACKET_DISTRIBUTION
+0x1c02; TCD_DestinationNotFound;;2;fsfw\src\fsfw\tcdistribution\TcDistributor.h;PACKET_DISTRIBUTION
+0x1c03; TCD_ServiceIdAlreadyExists;;3;fsfw\src\fsfw\tcdistribution\TcDistributor.h;PACKET_DISTRIBUTION
+0x1b00; TCC_IllegalApid;;0;fsfw\src\fsfw\tcdistribution\TcPacketCheckPUS.h;TC_PACKET_CHECK
+0x1b01; TCC_IncompletePacket;;1;fsfw\src\fsfw\tcdistribution\TcPacketCheckPUS.h;TC_PACKET_CHECK
+0x1b02; TCC_IncorrectChecksum;;2;fsfw\src\fsfw\tcdistribution\TcPacketCheckPUS.h;TC_PACKET_CHECK
+0x1b03; TCC_IllegalPacketType;;3;fsfw\src\fsfw\tcdistribution\TcPacketCheckPUS.h;TC_PACKET_CHECK
+0x1b04; TCC_IllegalPacketSubtype;;4;fsfw\src\fsfw\tcdistribution\TcPacketCheckPUS.h;TC_PACKET_CHECK
+0x1b05; TCC_IncorrectPrimaryHeader;;5;fsfw\src\fsfw\tcdistribution\TcPacketCheckPUS.h;TC_PACKET_CHECK
+0x1b06; TCC_IncorrectSecondaryHeader;;6;fsfw\src\fsfw\tcdistribution\TcPacketCheckPUS.h;TC_PACKET_CHECK
+0x2801; TC_InvalidTargetState;;1;fsfw\src\fsfw\thermal\ThermalComponentIF.h;THERMAL_COMPONENT_IF
+0x28f1; TC_AboveOperationalLimit;;0xF1;fsfw\src\fsfw\thermal\ThermalComponentIF.h;THERMAL_COMPONENT_IF
+0x28f2; TC_BelowOperationalLimit;;0xF2;fsfw\src\fsfw\thermal\ThermalComponentIF.h;THERMAL_COMPONENT_IF
+0x1000; TIM_UnsupportedTimeFormat;;0;fsfw\src\fsfw\timemanager\CCSDSTime.h;CCSDS_TIME_HELPER_CLASS
+0x1001; TIM_NotEnoughInformationForTargetFormat;;1;fsfw\src\fsfw\timemanager\CCSDSTime.h;CCSDS_TIME_HELPER_CLASS
+0x1002; TIM_LengthMismatch;;2;fsfw\src\fsfw\timemanager\CCSDSTime.h;CCSDS_TIME_HELPER_CLASS
+0x1003; TIM_InvalidTimeFormat;;3;fsfw\src\fsfw\timemanager\CCSDSTime.h;CCSDS_TIME_HELPER_CLASS
+0x1004; TIM_InvalidDayOfYear;;4;fsfw\src\fsfw\timemanager\CCSDSTime.h;CCSDS_TIME_HELPER_CLASS
+0x1005; TIM_TimeDoesNotFitFormat;;5;fsfw\src\fsfw\timemanager\CCSDSTime.h;CCSDS_TIME_HELPER_CLASS
+0x3601; TSI_BadTimestamp;;1;fsfw\src\fsfw\timemanager\TimeStamperIF.h;TIME_STAMPER_IF
+0x2001; TMB_Busy;;1;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x2002; TMB_Full;;2;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x2003; TMB_Empty;;3;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x2004; TMB_NullRequested;;4;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x2005; TMB_TooLarge;;5;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x2006; TMB_NotReady;;6;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x2007; TMB_DumpError;;7;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x2008; TMB_CrcError;;8;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x2009; TMB_Timeout;;9;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x200a; TMB_IdlePacketFound;;10;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x200b; TMB_TelecommandFound;;11;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x200c; TMB_NoPusATm;;12;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x200d; TMB_TooSmall;;13;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x200e; TMB_BlockNotFound;;14;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x200f; TMB_InvalidRequest;;15;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x2101; TMF_Busy;;1;fsfw\src\fsfw\tmstorage\TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
+0x2102; TMF_LastPacketFound;;2;fsfw\src\fsfw\tmstorage\TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
+0x2103; TMF_StopFetch;;3;fsfw\src\fsfw\tmstorage\TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
+0x2104; TMF_Timeout;;4;fsfw\src\fsfw\tmstorage\TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
+0x2105; TMF_TmChannelFull;;5;fsfw\src\fsfw\tmstorage\TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
+0x2106; TMF_NotStored;;6;fsfw\src\fsfw\tmstorage\TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
+0x2107; TMF_AllDeleted;;7;fsfw\src\fsfw\tmstorage\TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
+0x2108; TMF_InvalidData;;8;fsfw\src\fsfw\tmstorage\TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
+0x2109; TMF_NotReady;;9;fsfw\src\fsfw\tmstorage\TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
+0x1d01; PUS_ActivityStarted;;1;fsfw\src\fsfw\tmtcservices\AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF
+0x1d02; PUS_InvalidSubservice;;2;fsfw\src\fsfw\tmtcservices\AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF
+0x1d03; PUS_IllegalApplicationData;;3;fsfw\src\fsfw\tmtcservices\AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF
+0x1d04; PUS_SendTmFailed;;4;fsfw\src\fsfw\tmtcservices\AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF
+0x1d05; PUS_Timeout;;5;fsfw\src\fsfw\tmtcservices\AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF
+0x1f01; CSB_ExecutionComplete;;1;fsfw\src\fsfw\tmtcservices\CommandingServiceBase.h;COMMAND_SERVICE_BASE
+0x1f02; CSB_NoStepMessage;;2;fsfw\src\fsfw\tmtcservices\CommandingServiceBase.h;COMMAND_SERVICE_BASE
+0x1f03; CSB_ObjectBusy;;3;fsfw\src\fsfw\tmtcservices\CommandingServiceBase.h;COMMAND_SERVICE_BASE
+0x1f04; CSB_Busy;;4;fsfw\src\fsfw\tmtcservices\CommandingServiceBase.h;COMMAND_SERVICE_BASE
+0x1f05; CSB_InvalidTc;;5;fsfw\src\fsfw\tmtcservices\CommandingServiceBase.h;COMMAND_SERVICE_BASE
+0x1f06; CSB_InvalidObject;;6;fsfw\src\fsfw\tmtcservices\CommandingServiceBase.h;COMMAND_SERVICE_BASE
+0x1f07; CSB_InvalidReply;;7;fsfw\src\fsfw\tmtcservices\CommandingServiceBase.h;COMMAND_SERVICE_BASE
+0x4a00; SPPA_NoPacketFound;;0x00;fsfw\src\fsfw\tmtcservices\SpacePacketParser.h;SPACE_PACKET_PARSER
+0x4a01; SPPA_SplitPacket;;0x01;fsfw\src\fsfw\tmtcservices\SpacePacketParser.h;SPACE_PACKET_PARSER
+0x66a0;FSHLP_SdNotMounted;SD card specified with path string not mounted;0xA0;bsp_q7s\memory\FilesystemHelper.h;FILE_SYSTEM_HELPER
+0x66a1;FSHLP_FileNotExists;Specified file does not exist on filesystem;0xA1;bsp_q7s\memory\FilesystemHelper.h;FILE_SYSTEM_HELPER
+0x7100; SCBU_KeyNotFound;;0;bsp_q7s\memory\scratchApi.h;SCRATCH_BUFFER
+0x7000; SDMA_OpOngoing;;0;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER
+0x7001; SDMA_AlreadyOn;;1;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER
+0x7002; SDMA_AlreadyMounted;;2;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER
+0x7003; SDMA_AlreadyOff;;3;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER
+0x700a; SDMA_StatusFileNexists;;10;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER
+0x700b; SDMA_StatusFileFormatInvalid;;11;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER
+0x700c; SDMA_MountError;;12;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER
+0x700d; SDMA_UnmountError;;13;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER
+0x700e; SDMA_SystemCallError;;14;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER
+0x700f; SDMA_PopenCallError;;15;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER
+0x69a0;MPSOCRTVIF_CrcFailure;Space Packet received from PLOC has invalid CRC;0xA0;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
+0x69a1;MPSOCRTVIF_ReceivedAckFailure;Received ACK failure reply from PLOC;0xA1;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
+0x69a2;MPSOCRTVIF_ReceivedExeFailure;Received execution failure reply from PLOC;0xA2;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
+0x69a3;MPSOCRTVIF_InvalidApid;Received space packet with invalid APID from PLOC;0xA3;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
+0x69a4;MPSOCRTVIF_InvalidLength;Received command with invalid length;0xA4;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
+0x69a5;MPSOCRTVIF_FilenameTooLong;Filename of file in OBC filesystem is too long;0xA5;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
+0x69a6;MPSOCRTVIF_MpsocHelperExecuting;MPSoC helper is currently executing a command;0xA6;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
+0x69a7;MPSOCRTVIF_MpsocFilenameTooLong;Filename of MPSoC file is to long (max. 256 bytes);0xA7;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
+0x69a8;MPSOCRTVIF_InvalidParameter;Command has invalid parameter;0xA8;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
+0x69a9;MPSOCRTVIF_NameTooLong;Received command has file string with invalid length;0xA9;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
+0x57e0;DWLPWRON_InvalidMode;Received command has invalid JESD mode (valid modes are 0 - 5);0xE0;linux\devices\devicedefinitions\PlocMPSoCDefinitions.h;DWLPWRON_CMD
+0x57e1;DWLPWRON_InvalidLaneRate;Received command has invalid lane rate (valid lane rate are 0 - 9);0xE1;linux\devices\devicedefinitions\PlocMPSoCDefinitions.h;DWLPWRON_CMD
+0x60a0;PLMEMDUMP_MramAddressTooHigh;The capacity of the MRAM amounts to 512 kB. Thus the maximum address must not be higher than 0x7d000.;0xA0;linux\devices\ploc\PlocMemoryDumper.h;PLOC_MEMORY_DUMPER
+0x60a1;PLMEMDUMP_MramInvalidAddressCombination;The specified end address is lower than the start address;0xA1;linux\devices\ploc\PlocMemoryDumper.h;PLOC_MEMORY_DUMPER
+0x67a0; PLMPHLP_FileClosedAccidentally;File accidentally close;0xA0;linux\devices\ploc\PlocMPSoCHelper.h;PLOC_MPSOC_HELPER
+0x59a0;PLSV_CrcFailure;Space Packet received from PLOC supervisor has invalid CRC;0xA0;linux\devices\ploc\PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
+0x59a1;PLSV_ReceivedAckFailure;Received ACK failure reply from PLOC supervisor;0xA1;linux\devices\ploc\PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
+0x59a2;PLSV_ReceivedExeFailure;Received execution failure reply from PLOC supervisor;0xA2;linux\devices\ploc\PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
+0x59a3;PLSV_InvalidApid;Received space packet with invalid APID from PLOC supervisor;0xA3;linux\devices\ploc\PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
+0x59a4;PLSV_GetTimeFailure;Failed to read current system time;0xA4;linux\devices\ploc\PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
+0x59a5;PLSV_InvalidWatchdog;Received command with invalid watchdog parameter. Valid watchdogs are 0 for PS, 1 for PL and 2 for INT;0xA5;linux\devices\ploc\PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
+0x59a6;PLSV_InvalidWatchdogTimeout;Received watchdog timeout config command with invalid timeout. Valid timeouts must be in the range between 1000 and 360000 ms.;0xA6;linux\devices\ploc\PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
+0x59a7;PLSV_InvalidLatchupId;Received latchup config command with invalid latchup ID;0xA7;linux\devices\ploc\PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
+0x59a8;PLSV_SweepPeriodTooSmall;Received set adc sweep period command with invalid sweep period. Must be larger than 21.;0xA8;linux\devices\ploc\PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
+0x59a9;PLSV_InvalidTestParam;Receive auto EM test command with invalid test param. Valid params are 1 and 2.;0xA9;linux\devices\ploc\PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
+0x59aa;PLSV_MramPacketParsingFailure;Returned when scanning for MRAM dump packets failed.;0xAA;linux\devices\ploc\PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
+0x59ab;PLSV_InvalidMramAddresses;Returned when the start and stop addresses of the MRAM dump or MRAM wipe commands are invalid (e.g. start address bigger than stop address);0xAB;linux\devices\ploc\PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
+0x59ac;PLSV_NoMramPacket;Expect reception of an MRAM dump packet but received space packet with other apid.;0xAC;linux\devices\ploc\PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
+0x59ad;PLSV_PathDoesNotExist;Path to PLOC directory on SD card does not exist;0xAD;linux\devices\ploc\PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
+0x59ae;PLSV_MramFileNotExists;MRAM dump file does not exists. The file should actually already have been created with the reception of the first dump packet.;0xAE;linux\devices\ploc\PlocSupervisorHandler.h;PLOC_SUPERVISOR_HANDLER
+0x5da0;PLUD_UpdaterBusy;Updater is already performing an update;0xA0;linux\devices\ploc\PlocUpdater.h;PLOC_UPDATER
+0x5da1;PLUD_NameTooLong;Received update command with invalid path string (too long).;0xA1;linux\devices\ploc\PlocUpdater.h;PLOC_UPDATER
+0x5da2;PLUD_SdNotMounted;Received command to initiate update but SD card with update image not mounted.;0xA2;linux\devices\ploc\PlocUpdater.h;PLOC_UPDATER
+0x5da3;PLUD_FileNotExists;Update file received with update command does not exist.;0xA3;linux\devices\ploc\PlocUpdater.h;PLOC_UPDATER
+0x56a0;STRH_TemperatureReqFailed;Status in temperature reply signals error;0xA0;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x56a1;STRH_PingFailed;Ping command failed;0xA1;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x56a2;STRH_VersionReqFailed;Status in version reply signals error;0xA2;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x6401;JSONBASE_JsonFileNotExists;Specified json file does not exist;1;linux\devices\startracker\ArcsecJsonParamBase.h;ARCSEC_JSON_BASE
+0x6402;JSONBASE_SetNotExists;Requested set does not exist in json file;2;linux\devices\startracker\ArcsecJsonParamBase.h;ARCSEC_JSON_BASE
+0x6403;JSONBASE_ParamNotExists;Requested parameter does not exist in json file;3;linux\devices\startracker\ArcsecJsonParamBase.h;ARCSEC_JSON_BASE
+0x56a3;STRH_InterfaceReqFailed;Status in interface reply signals error;0xA3;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x56a4;STRH_PowerReqFailed;Status in power reply signals error;0xA4;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x56a5;STRH_SetParamFailed;Status of reply to parameter set command signals error;0xA5;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x56a6;STRH_ActionFailed;Status of reply to action command signals error;0xA6;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x56a7;STRH_FilePathTooLong;Received invalid path string. Exceeds allowed length;0xA7;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x56a8;STRH_FilenameTooLong;Name of file received with command is too long;0xA8;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x56a9;STRH_InvalidProgram;Received version reply with invalid program ID;0xA9;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x56aa;STRH_ReplyError;Status field reply signals error;0xAA;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x56ab;STRH_CommandTooShort;Received command which is too short (some data is missing for proper execution);0xAB;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x56ac;STRH_InvalidLength;Received command with invalid length (too few or too many parameters);0xAC;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x56ad;STRH_RegionMismatch;Region mismatch between send and received data;0xAD;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x56ae;STRH_AddressMismatch;Address mismatch between send and received data;0xAE;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x56af;STRH_LengthMismatch;Length field mismatch between send and received data;0xAF;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x56b0;STRH_FileNotExists;Specified file does not exist;0xB0;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x56b1;STRH_InvalidType;Download blob pixel command has invalid type field;0xB1;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x56b2;STRH_InvalidId;Received FPGA action command with invalid ID;0xB2;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x56b3;STRH_ReplyTooShort;Received reply is too short;0xB3;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x56b4;STRH_CrcFailure;Received reply with invalid CRC;0xB4;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x56b5;STRH_StrHelperExecuting;Star tracker handler currently executing a command and using the communication interface;0xB5;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x56b6;STRH_StartrackerAlreadyBooted;Star tracker is already in firmware mode;0xB6;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x56b7;STRH_StartrackerRunningFirmware;Star tracker is in firmware mode but must be in bootloader mode to execute this command;0xB7;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x56b8;STRH_StartrackerRunningBootloader;Star tracker is in bootloader mode but must be in firmware mode to execute this command;0xB8;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x5ea0;STRHLP_SdNotMounted;SD card specified in path string not mounted;0xA0;linux\devices\startracker\StrHelper.h;STR_HELPER
+0x5ea1;STRHLP_FileNotExists;Specified file does not exist on filesystem;0xA1;linux\devices\startracker\StrHelper.h;STR_HELPER
+0x5ea2;STRHLP_PathNotExists;Specified path does not exist;0xA2;linux\devices\startracker\StrHelper.h;STR_HELPER
+0x5ea3;STRHLP_FileCreationFailed;Failed to create download image or read flash file;0xA3;linux\devices\startracker\StrHelper.h;STR_HELPER
+0x5ea4;STRHLP_RegionMismatch;Region in flash write/read reply does not match expected region;0xA4;linux\devices\startracker\StrHelper.h;STR_HELPER
+0x5ea5;STRHLP_AddressMismatch;Address in flash write/read reply does not match expected address;0xA5;linux\devices\startracker\StrHelper.h;STR_HELPER
+0x5ea6;STRHLP_LengthMismatch;Length in flash write/read reply does not match expected length;0xA6;linux\devices\startracker\StrHelper.h;STR_HELPER
+0x5ea7;STRHLP_StatusError;Status field in reply signals error;0xA7;linux\devices\startracker\StrHelper.h;STR_HELPER
+0x5ea8;STRHLP_InvalidTypeId;Reply has invalid type ID (should be of action reply type);0xA8;linux\devices\startracker\StrHelper.h;STR_HELPER
+0x5ba0;IPCI_PapbBusy;;0xA0;linux\obc\PapbVcInterface.h;CCSDS_IP_CORE_BRIDGE
+0x61a0;PDEC_AbandonedCltu;;0xA0;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x61a1;PDEC_FrameDirty;;0xA1;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x61a2;PDEC_FrameIllegalMultipleReasons;;0xA2;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x61a3;PDEC_AdDiscardedLockout;;0xA3;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x61a4;PDEC_AdDiscardedWait;;0xA4;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x61a5;PDEC_AdDiscardedNsVs;;0xA5;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x61b0;PDEC_CommandNotImplemented;Received action message with unknown action id;0xB0;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x61a6;PDEC_NoReport;;0xA6;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x61a7;PDEC_ErrorVersionNumber;;0xA7;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x61a8;PDEC_IllegalCombination;;0xA8;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x61a9;PDEC_InvalidScId;;0xA9;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x61aa;PDEC_InvalidVcIdMsb;;0xAA;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x61ab;PDEC_InvalidVcIdLsb;;0xAB;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x61ac;PDEC_NsNotZero;;0xAC;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x61ae;PDEC_InvalidBcCc;;0xAE;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x5ca0;PTME_UnknownVcId;;0xA0;linux\obc\Ptme.h;PTME
+0x63a0;RS_RateNotSupported;The commanded rate is not supported by the current FPGA design;0xA0;linux\obc\PtmeConfig.h;RATE_SETTER
+0x63a1;RS_BadBitRate;Bad bitrate has been commanded (e.g. 0);0xA1;linux\obc\PtmeConfig.h;RATE_SETTER
+0x63a2;RS_ClkInversionFailed;Failed to invert clock and thus change the time the data is updated with respect to the tx clock;0xA2;linux\obc\PtmeConfig.h;RATE_SETTER
+0x63a3;RS_TxManipulatorConfigFailed;Failed to change configuration bit of tx clock manipulator;0xA3;linux\obc\PtmeConfig.h;RATE_SETTER
diff --git a/generators/events/event_parser.py b/generators/events/event_parser.py
index 7b6b86c8..9398ba98 100644
--- a/generators/events/event_parser.py
+++ b/generators/events/event_parser.py
@@ -82,7 +82,10 @@ def parse_events(
handle_csv_export(
file_name=CSV_FILENAME, event_list=event_list, file_separator=FILE_SEPARATOR
)
- copy_file(filename=CSV_FILENAME, destination=CSV_COPY_DEST, delete_existing_file=True)
+ LOGGER.info(f"Copying CSV file to {CSV_COPY_DEST}")
+ copy_file(
+ filename=CSV_FILENAME, destination=CSV_COPY_DEST, delete_existing_file=True
+ )
if generate_cpp:
handle_cpp_export(
@@ -93,7 +96,7 @@ def parse_events(
header_file_name=CPP_H_FILENAME,
)
if COPY_CPP_FILE:
- LOGGER.info(f"EventParser: Copying file to {CPP_COPY_DESTINATION}")
+ LOGGER.info(f"EventParser: Copying CPP translation file to {CPP_COPY_DESTINATION}")
copy_file(CPP_FILENAME, CPP_COPY_DESTINATION)
copy_file(CPP_H_FILENAME, CPP_COPY_DESTINATION)
diff --git a/generators/events/translateEvents.cpp b/generators/events/translateEvents.cpp
index 4b46ede3..1a24c553 100644
--- a/generators/events/translateEvents.cpp
+++ b/generators/events/translateEvents.cpp
@@ -1,7 +1,7 @@
/**
- * @brief Auto-generated event translation file. Contains 141 translations.
+ * @brief Auto-generated event translation file. Contains 186 translations.
* @details
- * Generated on: 2022-03-04 15:13:02
+ * Generated on: 2022-04-08 14:13:35
*/
#include "translateEvents.h"
@@ -84,6 +84,9 @@ const char *CLOCK_SET_STRING = "CLOCK_SET";
const char *CLOCK_SET_FAILURE_STRING = "CLOCK_SET_FAILURE";
const char *TEST_STRING = "TEST";
const char *CHANGE_OF_SETUP_PARAMETER_STRING = "CHANGE_OF_SETUP_PARAMETER";
+const char *SWITCH_CMD_SENT_STRING = "SWITCH_CMD_SENT";
+const char *SWITCH_HAS_CHANGED_STRING = "SWITCH_HAS_CHANGED";
+const char *SWITCHING_Q7S_DENIED_STRING = "SWITCHING_Q7S_DENIED";
const char *GPIO_PULL_HIGH_FAILED_STRING = "GPIO_PULL_HIGH_FAILED";
const char *GPIO_PULL_LOW_FAILED_STRING = "GPIO_PULL_LOW_FAILED";
const char *SWITCH_ALREADY_ON_STRING = "SWITCH_ALREADY_ON";
@@ -97,7 +100,9 @@ const char *DEPL_SA2_GPIO_SWTICH_ON_FAILED_STRING = "DEPL_SA2_GPIO_SWTICH_ON_FAI
const char *MEMORY_READ_RPT_CRC_FAILURE_STRING = "MEMORY_READ_RPT_CRC_FAILURE";
const char *ACK_FAILURE_STRING = "ACK_FAILURE";
const char *EXE_FAILURE_STRING = "EXE_FAILURE";
-const char *CRC_FAILURE_EVENT_STRING = "CRC_FAILURE_EVENT";
+const char *MPSOC_HANDLER_CRC_FAILURE_STRING = "MPSOC_HANDLER_CRC_FAILURE";
+const char *MPSOC_HANDLER_SEQ_CNT_MISMATCH_STRING = "MPSOC_HANDLER_SEQ_CNT_MISMATCH";
+const char *MPSOC_SHUTDOWN_FAILED_STRING = "MPSOC_SHUTDOWN_FAILED";
const char *SELF_TEST_I2C_FAILURE_STRING = "SELF_TEST_I2C_FAILURE";
const char *SELF_TEST_SPI_FAILURE_STRING = "SELF_TEST_SPI_FAILURE";
const char *SELF_TEST_ADC_FAILURE_STRING = "SELF_TEST_ADC_FAILURE";
@@ -113,9 +118,8 @@ const char *SUPV_MEMORY_READ_RPT_CRC_FAILURE_STRING = "SUPV_MEMORY_READ_RPT_CRC_
const char *SUPV_ACK_FAILURE_STRING = "SUPV_ACK_FAILURE";
const char *SUPV_EXE_FAILURE_STRING = "SUPV_EXE_FAILURE";
const char *SUPV_CRC_FAILURE_EVENT_STRING = "SUPV_CRC_FAILURE_EVENT";
-const char *ALLOC_FAILURE_STRING = "ALLOC_FAILURE";
-const char *REBOOT_SW_STRING = "REBOOT_SW";
-const char *REBOOT_HW_STRING = "REBOOT_HW";
+const char *SANITIZATION_FAILED_STRING = "SANITIZATION_FAILED";
+const char *MOUNTED_SD_CARD_STRING = "MOUNTED_SD_CARD";
const char *UPDATE_FILE_NOT_EXISTS_STRING = "UPDATE_FILE_NOT_EXISTS";
const char *ACTION_COMMANDING_FAILED_STRING = "ACTION_COMMANDING_FAILED";
const char *UPDATE_AVAILABLE_FAILED_STRING = "UPDATE_AVAILABLE_FAILED";
@@ -146,6 +150,43 @@ const char *POSITION_MISMATCH_STRING = "POSITION_MISMATCH";
const char *STR_HELPER_FILE_NOT_EXISTS_STRING = "STR_HELPER_FILE_NOT_EXISTS";
const char *STR_HELPER_SENDING_PACKET_FAILED_STRING = "STR_HELPER_SENDING_PACKET_FAILED";
const char *STR_HELPER_REQUESTING_MSG_FAILED_STRING = "STR_HELPER_REQUESTING_MSG_FAILED";
+const char *MPSOC_FLASH_WRITE_FAILED_STRING = "MPSOC_FLASH_WRITE_FAILED";
+const char *MPSOC_FLASH_WRITE_SUCCESSFUL_STRING = "MPSOC_FLASH_WRITE_SUCCESSFUL";
+const char *SENDING_COMMAND_FAILED_STRING = "SENDING_COMMAND_FAILED";
+const char *MPSOC_HELPER_REQUESTING_REPLY_FAILED_STRING = "MPSOC_HELPER_REQUESTING_REPLY_FAILED";
+const char *MPSOC_HELPER_READING_REPLY_FAILED_STRING = "MPSOC_HELPER_READING_REPLY_FAILED";
+const char *MISSING_ACK_STRING = "MISSING_ACK";
+const char *MISSING_EXE_STRING = "MISSING_EXE";
+const char *ACK_FAILURE_REPORT_STRING = "ACK_FAILURE_REPORT";
+const char *EXE_FAILURE_REPORT_STRING = "EXE_FAILURE_REPORT";
+const char *ACK_INVALID_APID_STRING = "ACK_INVALID_APID";
+const char *EXE_INVALID_APID_STRING = "EXE_INVALID_APID";
+const char *MPSOC_HELPER_SEQ_CNT_MISMATCH_STRING = "MPSOC_HELPER_SEQ_CNT_MISMATCH";
+const char *TRANSITION_BACK_TO_OFF_STRING = "TRANSITION_BACK_TO_OFF";
+const char *NEG_V_OUT_OF_BOUNDS_STRING = "NEG_V_OUT_OF_BOUNDS";
+const char *U_DRO_OUT_OF_BOUNDS_STRING = "U_DRO_OUT_OF_BOUNDS";
+const char *I_DRO_OUT_OF_BOUNDS_STRING = "I_DRO_OUT_OF_BOUNDS";
+const char *U_X8_OUT_OF_BOUNDS_STRING = "U_X8_OUT_OF_BOUNDS";
+const char *I_X8_OUT_OF_BOUNDS_STRING = "I_X8_OUT_OF_BOUNDS";
+const char *U_TX_OUT_OF_BOUNDS_STRING = "U_TX_OUT_OF_BOUNDS";
+const char *I_TX_OUT_OF_BOUNDS_STRING = "I_TX_OUT_OF_BOUNDS";
+const char *U_MPA_OUT_OF_BOUNDS_STRING = "U_MPA_OUT_OF_BOUNDS";
+const char *I_MPA_OUT_OF_BOUNDS_STRING = "I_MPA_OUT_OF_BOUNDS";
+const char *U_HPA_OUT_OF_BOUNDS_STRING = "U_HPA_OUT_OF_BOUNDS";
+const char *I_HPA_OUT_OF_BOUNDS_STRING = "I_HPA_OUT_OF_BOUNDS";
+const char *TRANSITION_OTHER_SIDE_FAILED_STRING = "TRANSITION_OTHER_SIDE_FAILED";
+const char *NOT_ENOUGH_DEVICES_DUAL_MODE_STRING = "NOT_ENOUGH_DEVICES_DUAL_MODE";
+const char *POWER_STATE_MACHINE_TIMEOUT_STRING = "POWER_STATE_MACHINE_TIMEOUT";
+const char *SIDE_SWITCH_TRANSITION_NOT_ALLOWED_STRING = "SIDE_SWITCH_TRANSITION_NOT_ALLOWED";
+const char *CHILDREN_LOST_MODE_STRING = "CHILDREN_LOST_MODE";
+const char *GPS_FIX_CHANGE_STRING = "GPS_FIX_CHANGE";
+const char *P60_BOOT_COUNT_STRING = "P60_BOOT_COUNT";
+const char *BATT_MODE_STRING = "BATT_MODE";
+const char *BATT_MODE_CHANGED_STRING = "BATT_MODE_CHANGED";
+const char *ALLOC_FAILURE_STRING = "ALLOC_FAILURE";
+const char *REBOOT_SW_STRING = "REBOOT_SW";
+const char *REBOOT_MECHANISM_TRIGGERED_STRING = "REBOOT_MECHANISM_TRIGGERED";
+const char *REBOOT_HW_STRING = "REBOOT_HW";
const char *translateEvents(Event event) {
switch ((event & 0xFFFF)) {
@@ -307,130 +348,212 @@ const char *translateEvents(Event event) {
return TEST_STRING;
case (10600):
return CHANGE_OF_SETUP_PARAMETER_STRING;
- case (10900):
- return GPIO_PULL_HIGH_FAILED_STRING;
- case (10901):
- return GPIO_PULL_LOW_FAILED_STRING;
- case (10902):
- return SWITCH_ALREADY_ON_STRING;
- case (10903):
- return SWITCH_ALREADY_OFF_STRING;
- case (10904):
- return MAIN_SWITCH_TIMEOUT_STRING;
- case (11000):
- return MAIN_SWITCH_ON_TIMEOUT_STRING;
- case (11001):
- return MAIN_SWITCH_OFF_TIMEOUT_STRING;
- case (11002):
- return DEPLOYMENT_FAILED_STRING;
- case (11003):
- return DEPL_SA1_GPIO_SWTICH_ON_FAILED_STRING;
- case (11004):
- return DEPL_SA2_GPIO_SWTICH_ON_FAILED_STRING;
- case (11101):
- return MEMORY_READ_RPT_CRC_FAILURE_STRING;
- case (11102):
- return ACK_FAILURE_STRING;
- case (11103):
- return EXE_FAILURE_STRING;
- case (11104):
- return CRC_FAILURE_EVENT_STRING;
- case (11201):
- return SELF_TEST_I2C_FAILURE_STRING;
- case (11202):
- return SELF_TEST_SPI_FAILURE_STRING;
- case (11203):
- return SELF_TEST_ADC_FAILURE_STRING;
- case (11204):
- return SELF_TEST_PWM_FAILURE_STRING;
- case (11205):
- return SELF_TEST_TC_FAILURE_STRING;
- case (11206):
- return SELF_TEST_MTM_RANGE_FAILURE_STRING;
- case (11207):
- return SELF_TEST_COIL_CURRENT_FAILURE_STRING;
- case (11208):
- return INVALID_ERROR_BYTE_STRING;
+ case (11300):
+ return SWITCH_CMD_SENT_STRING;
case (11301):
- return ERROR_STATE_STRING;
+ return SWITCH_HAS_CHANGED_STRING;
+ case (11302):
+ return SWITCHING_Q7S_DENIED_STRING;
+ case (11400):
+ return GPIO_PULL_HIGH_FAILED_STRING;
case (11401):
- return BOOTING_FIRMWARE_FAILED_STRING;
+ return GPIO_PULL_LOW_FAILED_STRING;
case (11402):
- return BOOTING_BOOTLOADER_FAILED_STRING;
+ return SWITCH_ALREADY_ON_STRING;
+ case (11403):
+ return SWITCH_ALREADY_OFF_STRING;
+ case (11404):
+ return MAIN_SWITCH_TIMEOUT_STRING;
+ case (11500):
+ return MAIN_SWITCH_ON_TIMEOUT_STRING;
case (11501):
- return SUPV_MEMORY_READ_RPT_CRC_FAILURE_STRING;
+ return MAIN_SWITCH_OFF_TIMEOUT_STRING;
case (11502):
- return SUPV_ACK_FAILURE_STRING;
+ return DEPLOYMENT_FAILED_STRING;
case (11503):
- return SUPV_EXE_FAILURE_STRING;
+ return DEPL_SA1_GPIO_SWTICH_ON_FAILED_STRING;
case (11504):
- return SUPV_CRC_FAILURE_EVENT_STRING;
- case (11600):
- return ALLOC_FAILURE_STRING;
+ return DEPL_SA2_GPIO_SWTICH_ON_FAILED_STRING;
case (11601):
- return REBOOT_SW_STRING;
+ return MEMORY_READ_RPT_CRC_FAILURE_STRING;
+ case (11602):
+ return ACK_FAILURE_STRING;
case (11603):
- return REBOOT_HW_STRING;
- case (11700):
- return UPDATE_FILE_NOT_EXISTS_STRING;
+ return EXE_FAILURE_STRING;
+ case (11604):
+ return MPSOC_HANDLER_CRC_FAILURE_STRING;
+ case (11605):
+ return MPSOC_HANDLER_SEQ_CNT_MISMATCH_STRING;
+ case (11606):
+ return MPSOC_SHUTDOWN_FAILED_STRING;
case (11701):
- return ACTION_COMMANDING_FAILED_STRING;
+ return SELF_TEST_I2C_FAILURE_STRING;
case (11702):
- return UPDATE_AVAILABLE_FAILED_STRING;
+ return SELF_TEST_SPI_FAILURE_STRING;
case (11703):
- return UPDATE_TRANSFER_FAILED_STRING;
+ return SELF_TEST_ADC_FAILURE_STRING;
case (11704):
- return UPDATE_VERIFY_FAILED_STRING;
+ return SELF_TEST_PWM_FAILURE_STRING;
case (11705):
- return UPDATE_FINISHED_STRING;
- case (11800):
- return SEND_MRAM_DUMP_FAILED_STRING;
+ return SELF_TEST_TC_FAILURE_STRING;
+ case (11706):
+ return SELF_TEST_MTM_RANGE_FAILURE_STRING;
+ case (11707):
+ return SELF_TEST_COIL_CURRENT_FAILURE_STRING;
+ case (11708):
+ return INVALID_ERROR_BYTE_STRING;
case (11801):
- return MRAM_DUMP_FAILED_STRING;
- case (11802):
- return MRAM_DUMP_FINISHED_STRING;
+ return ERROR_STATE_STRING;
case (11901):
- return INVALID_TC_FRAME_STRING;
+ return BOOTING_FIRMWARE_FAILED_STRING;
case (11902):
- return INVALID_FAR_STRING;
- case (11903):
- return CARRIER_LOCK_STRING;
- case (11904):
- return BIT_LOCK_PDEC_STRING;
- case (12000):
- return IMAGE_UPLOAD_FAILED_STRING;
+ return BOOTING_BOOTLOADER_FAILED_STRING;
case (12001):
- return IMAGE_DOWNLOAD_FAILED_STRING;
+ return SUPV_MEMORY_READ_RPT_CRC_FAILURE_STRING;
case (12002):
- return IMAGE_UPLOAD_SUCCESSFUL_STRING;
+ return SUPV_ACK_FAILURE_STRING;
case (12003):
- return IMAGE_DOWNLOAD_SUCCESSFUL_STRING;
+ return SUPV_EXE_FAILURE_STRING;
case (12004):
+ return SUPV_CRC_FAILURE_EVENT_STRING;
+ case (12100):
+ return SANITIZATION_FAILED_STRING;
+ case (12101):
+ return MOUNTED_SD_CARD_STRING;
+ case (12200):
+ return UPDATE_FILE_NOT_EXISTS_STRING;
+ case (12201):
+ return ACTION_COMMANDING_FAILED_STRING;
+ case (12202):
+ return UPDATE_AVAILABLE_FAILED_STRING;
+ case (12203):
+ return UPDATE_TRANSFER_FAILED_STRING;
+ case (12204):
+ return UPDATE_VERIFY_FAILED_STRING;
+ case (12205):
+ return UPDATE_FINISHED_STRING;
+ case (12300):
+ return SEND_MRAM_DUMP_FAILED_STRING;
+ case (12301):
+ return MRAM_DUMP_FAILED_STRING;
+ case (12302):
+ return MRAM_DUMP_FINISHED_STRING;
+ case (12401):
+ return INVALID_TC_FRAME_STRING;
+ case (12402):
+ return INVALID_FAR_STRING;
+ case (12403):
+ return CARRIER_LOCK_STRING;
+ case (12404):
+ return BIT_LOCK_PDEC_STRING;
+ case (12500):
+ return IMAGE_UPLOAD_FAILED_STRING;
+ case (12501):
+ return IMAGE_DOWNLOAD_FAILED_STRING;
+ case (12502):
+ return IMAGE_UPLOAD_SUCCESSFUL_STRING;
+ case (12503):
+ return IMAGE_DOWNLOAD_SUCCESSFUL_STRING;
+ case (12504):
return FLASH_WRITE_SUCCESSFUL_STRING;
- case (12005):
+ case (12505):
return FLASH_READ_SUCCESSFUL_STRING;
- case (12006):
+ case (12506):
return FLASH_READ_FAILED_STRING;
- case (12007):
+ case (12507):
return FIRMWARE_UPDATE_SUCCESSFUL_STRING;
- case (12008):
+ case (12508):
return FIRMWARE_UPDATE_FAILED_STRING;
- case (12009):
+ case (12509):
return STR_HELPER_READING_REPLY_FAILED_STRING;
- case (12010):
+ case (12510):
return STR_HELPER_COM_ERROR_STRING;
- case (12011):
+ case (12511):
return STR_HELPER_NO_REPLY_STRING;
- case (12012):
+ case (12512):
return STR_HELPER_DEC_ERROR_STRING;
- case (12013):
+ case (12513):
return POSITION_MISMATCH_STRING;
- case (12014):
+ case (12514):
return STR_HELPER_FILE_NOT_EXISTS_STRING;
- case (12015):
+ case (12515):
return STR_HELPER_SENDING_PACKET_FAILED_STRING;
- case (12016):
+ case (12516):
return STR_HELPER_REQUESTING_MSG_FAILED_STRING;
+ case (12600):
+ return MPSOC_FLASH_WRITE_FAILED_STRING;
+ case (12601):
+ return MPSOC_FLASH_WRITE_SUCCESSFUL_STRING;
+ case (12602):
+ return SENDING_COMMAND_FAILED_STRING;
+ case (12603):
+ return MPSOC_HELPER_REQUESTING_REPLY_FAILED_STRING;
+ case (12604):
+ return MPSOC_HELPER_READING_REPLY_FAILED_STRING;
+ case (12605):
+ return MISSING_ACK_STRING;
+ case (12606):
+ return MISSING_EXE_STRING;
+ case (12607):
+ return ACK_FAILURE_REPORT_STRING;
+ case (12608):
+ return EXE_FAILURE_REPORT_STRING;
+ case (12609):
+ return ACK_INVALID_APID_STRING;
+ case (12610):
+ return EXE_INVALID_APID_STRING;
+ case (12611):
+ return MPSOC_HELPER_SEQ_CNT_MISMATCH_STRING;
+ case (12700):
+ return TRANSITION_BACK_TO_OFF_STRING;
+ case (12701):
+ return NEG_V_OUT_OF_BOUNDS_STRING;
+ case (12702):
+ return U_DRO_OUT_OF_BOUNDS_STRING;
+ case (12703):
+ return I_DRO_OUT_OF_BOUNDS_STRING;
+ case (12704):
+ return U_X8_OUT_OF_BOUNDS_STRING;
+ case (12705):
+ return I_X8_OUT_OF_BOUNDS_STRING;
+ case (12706):
+ return U_TX_OUT_OF_BOUNDS_STRING;
+ case (12707):
+ return I_TX_OUT_OF_BOUNDS_STRING;
+ case (12708):
+ return U_MPA_OUT_OF_BOUNDS_STRING;
+ case (12709):
+ return I_MPA_OUT_OF_BOUNDS_STRING;
+ case (12710):
+ return U_HPA_OUT_OF_BOUNDS_STRING;
+ case (12711):
+ return I_HPA_OUT_OF_BOUNDS_STRING;
+ case (12800):
+ return TRANSITION_OTHER_SIDE_FAILED_STRING;
+ case (12801):
+ return NOT_ENOUGH_DEVICES_DUAL_MODE_STRING;
+ case (12802):
+ return POWER_STATE_MACHINE_TIMEOUT_STRING;
+ case (12803):
+ return SIDE_SWITCH_TRANSITION_NOT_ALLOWED_STRING;
+ case (13000):
+ return CHILDREN_LOST_MODE_STRING;
+ case (13100):
+ return GPS_FIX_CHANGE_STRING;
+ case (13200):
+ return P60_BOOT_COUNT_STRING;
+ case (13201):
+ return BATT_MODE_STRING;
+ case (13202):
+ return BATT_MODE_CHANGED_STRING;
+ case (13600):
+ return ALLOC_FAILURE_STRING;
+ case (13601):
+ return REBOOT_SW_STRING;
+ case (13602):
+ return REBOOT_MECHANISM_TRIGGERED_STRING;
+ case (13603):
+ return REBOOT_HW_STRING;
default:
return "UNKNOWN_EVENT";
}
diff --git a/generators/fsfwgen b/generators/fsfwgen
index c5ef1783..5ad9fb94 160000
--- a/generators/fsfwgen
+++ b/generators/fsfwgen
@@ -1 +1 @@
-Subproject commit c5ef1783a3b082c0e88561bd91bc3ee0f459fafc
+Subproject commit 5ad9fb94af3312d29863527106396395f7b808a5
diff --git a/generators/fsfwgen.py b/generators/gen.py
similarity index 85%
rename from generators/fsfwgen.py
rename to generators/gen.py
index 3d6c1038..f79e7226 100755
--- a/generators/fsfwgen.py
+++ b/generators/gen.py
@@ -31,7 +31,11 @@ def main():
LOGGER.info("Generating returnvalue data")
time.sleep(0.05)
parse_returnvalues()
- pass
+ elif args.type == "all":
+ LOGGER.info("Generating all data")
+ parse_objects()
+ parse_events()
+ parse_returnvalues()
if __name__ == "__main__":
diff --git a/generators/objects/objects.py b/generators/objects/objects.py
index 3ea80e8e..fa174bc1 100644
--- a/generators/objects/objects.py
+++ b/generators/objects/objects.py
@@ -118,5 +118,5 @@ def handle_file_export(list_items):
copy_file(
filename=CSV_OBJECT_FILENAME,
destination=CSV_COPY_DEST,
- delete_existing_file=True
+ delete_existing_file=True,
)
diff --git a/generators/objects/translateObjects.cpp b/generators/objects/translateObjects.cpp
index b0b6d55d..70904882 100644
--- a/generators/objects/translateObjects.cpp
+++ b/generators/objects/translateObjects.cpp
@@ -1,8 +1,8 @@
/**
* @brief Auto-generated object translation file.
* @details
- * Contains 112 translations.
- * Generated on: 2022-03-04 15:13:13
+ * Contains 117 translations.
+ * Generated on: 2022-04-08 14:13:35
*/
#include "translateObjects.h"
@@ -48,8 +48,10 @@ const char *RAD_SENSOR_STRING = "RAD_SENSOR";
const char *PLOC_UPDATER_STRING = "PLOC_UPDATER";
const char *PLOC_MEMORY_DUMPER_STRING = "PLOC_MEMORY_DUMPER";
const char *STR_HELPER_STRING = "STR_HELPER";
+const char *PLOC_MPSOC_HELPER_STRING = "PLOC_MPSOC_HELPER";
const char *PLOC_MPSOC_HANDLER_STRING = "PLOC_MPSOC_HANDLER";
const char *PLOC_SUPERVISOR_HANDLER_STRING = "PLOC_SUPERVISOR_HANDLER";
+const char *PLOC_SUPERVISOR_HELPER_STRING = "PLOC_SUPERVISOR_HELPER";
const char *SOLAR_ARRAY_DEPL_HANDLER_STRING = "SOLAR_ARRAY_DEPL_HANDLER";
const char *HEATER_HANDLER_STRING = "HEATER_HANDLER";
const char *TMP1075_HANDLER_1_STRING = "TMP1075_HANDLER_1";
@@ -115,6 +117,9 @@ const char *DUMMY_HANDLER_STRING = "DUMMY_HANDLER";
const char *DUMMY_INTERFACE_STRING = "DUMMY_INTERFACE";
const char *LIBGPIOD_TEST_STRING = "LIBGPIOD_TEST";
const char *TEST_TASK_STRING = "TEST_TASK";
+const char *ACS_BOARD_ASS_STRING = "ACS_BOARD_ASS";
+const char *SUS_BOARD_ASS_STRING = "SUS_BOARD_ASS";
+const char *TCS_BOARD_ASS_STRING = "TCS_BOARD_ASS";
const char *TM_FUNNEL_STRING = "TM_FUNNEL";
const char *CCSDS_IP_CORE_BRIDGE_STRING = "CCSDS_IP_CORE_BRIDGE";
const char *NO_OBJECT_STRING = "NO_OBJECT";
@@ -205,10 +210,14 @@ const char *translateObject(object_id_t object) {
return PLOC_MEMORY_DUMPER_STRING;
case 0x44330002:
return STR_HELPER_STRING;
+ case 0x44330003:
+ return PLOC_MPSOC_HELPER_STRING;
case 0x44330015:
return PLOC_MPSOC_HANDLER_STRING;
case 0x44330016:
return PLOC_SUPERVISOR_HANDLER_STRING;
+ case 0x44330017:
+ return PLOC_SUPERVISOR_HELPER_STRING;
case 0x444100A2:
return SOLAR_ARRAY_DEPL_HANDLER_STRING;
case 0x444100A4:
@@ -339,6 +348,12 @@ const char *translateObject(object_id_t object) {
return LIBGPIOD_TEST_STRING;
case 0x54694269:
return TEST_TASK_STRING;
+ case 0x73000001:
+ return ACS_BOARD_ASS_STRING;
+ case 0x73000002:
+ return SUS_BOARD_ASS_STRING;
+ case 0x73000003:
+ return TCS_BOARD_ASS_STRING;
case 0x73000100:
return TM_FUNNEL_STRING;
case 0x73500000:
diff --git a/generators/returnvalues/returnvalues_parser.py b/generators/returnvalues/returnvalues_parser.py
index 48d929ea..5bcf3bc2 100644
--- a/generators/returnvalues/returnvalues_parser.py
+++ b/generators/returnvalues/returnvalues_parser.py
@@ -1,14 +1,7 @@
-#! /usr/bin/python3
+#! /usr/bin/env python3
# -*- coding: utf-8 -*-
-"""
-:file: returnvalues_parser.py
-:brief: Part of the MOD export tools for the SOURCE project by KSat.
-TODO: Integrate into Parser Structure instead of calling this file (no cpp file generated yet)
-:details:
-Return Value exporter.
-To use MySQLdb, run pip install mysqlclient or install in IDE. On Windows, Build Tools
-installation might be necessary.
-:data: 21.11.2019
+"""Part of the MIB export tools for the EIVE project by.
+Returnvalue exporter.
"""
from fsfwgen.core import get_console_logger
from fsfwgen.utility.file_management import copy_file
@@ -87,7 +80,7 @@ def parse_returnvalues():
copy_file(
filename=CSV_RETVAL_FILENAME,
destination=CSV_COPY_DEST,
- delete_existing_file=True
+ delete_existing_file=True,
)
if EXPORT_TO_SQL:
LOGGER.info("ReturnvalueParser: Exporting to SQL")
diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt
index 79891a84..c183ea60 100644
--- a/linux/CMakeLists.txt
+++ b/linux/CMakeLists.txt
@@ -1,6 +1,11 @@
add_subdirectory(csp)
add_subdirectory(utility)
+add_subdirectory(callbacks)
add_subdirectory(boardtest)
add_subdirectory(devices)
add_subdirectory(fsfwconfig)
-add_subdirectory(obc)
\ No newline at end of file
+add_subdirectory(obc)
+
+target_sources(${OBSW_NAME} PUBLIC
+ ObjectFactory.cpp
+)
\ No newline at end of file
diff --git a/linux/ObjectFactory.cpp b/linux/ObjectFactory.cpp
new file mode 100644
index 00000000..7811fdbe
--- /dev/null
+++ b/linux/ObjectFactory.cpp
@@ -0,0 +1,286 @@
+#include "ObjectFactory.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "OBSWConfig.h"
+#include "devConf.h"
+#include "devices/addresses.h"
+#include "devices/gpioIds.h"
+
+void ObjectFactory::createSunSensorComponents(GpioIF* gpioComIF, SpiComIF* spiComIF,
+ PowerSwitchIF* pwrSwitcher, std::string spiDev) {
+ using namespace gpio;
+ GpioCookie* gpioCookieSus = new GpioCookie();
+ GpioCallback* susgpio = nullptr;
+
+ susgpio = new GpioCallback("Chip select SUS 0", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ gpioCookieSus->addGpio(gpioIds::CS_SUS_0, susgpio);
+ susgpio = new GpioCallback("Chip select SUS 1", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ gpioCookieSus->addGpio(gpioIds::CS_SUS_1, susgpio);
+ susgpio = new GpioCallback("Chip select SUS 2", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ gpioCookieSus->addGpio(gpioIds::CS_SUS_2, susgpio);
+ susgpio = new GpioCallback("Chip select SUS 3", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ gpioCookieSus->addGpio(gpioIds::CS_SUS_3, susgpio);
+ susgpio = new GpioCallback("Chip select SUS 4", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ gpioCookieSus->addGpio(gpioIds::CS_SUS_4, susgpio);
+ susgpio = new GpioCallback("Chip select SUS 5", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ gpioCookieSus->addGpio(gpioIds::CS_SUS_5, susgpio);
+ susgpio = new GpioCallback("Chip select SUS 6", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ gpioCookieSus->addGpio(gpioIds::CS_SUS_6, susgpio);
+ susgpio = new GpioCallback("Chip select SUS 7", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ gpioCookieSus->addGpio(gpioIds::CS_SUS_7, susgpio);
+ susgpio = new GpioCallback("Chip select SUS 8", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ gpioCookieSus->addGpio(gpioIds::CS_SUS_8, susgpio);
+ susgpio = new GpioCallback("Chip select SUS 9", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ gpioCookieSus->addGpio(gpioIds::CS_SUS_9, susgpio);
+ susgpio = new GpioCallback("Chip select SUS 10", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ gpioCookieSus->addGpio(gpioIds::CS_SUS_10, susgpio);
+ susgpio = new GpioCallback("Chip select SUS 11", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ gpioCookieSus->addGpio(gpioIds::CS_SUS_11, susgpio);
+
+ gpioComIF->addGpios(gpioCookieSus);
+
+#if OBSW_ADD_SUN_SENSORS == 1
+ SusFdir* fdir = nullptr;
+ std::array susHandlers = {};
+ SpiCookie* spiCookie =
+ new SpiCookie(addresses::SUS_0, gpioIds::CS_SUS_0, spiDev, SUS::MAX_CMD_SIZE,
+ spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
+ susHandlers[0] = new SusHandler(objects::SUS_0, 0, objects::SPI_COM_IF, spiCookie);
+ fdir = new SusFdir(objects::SUS_0);
+ susHandlers[0]->setParent(objects::SUS_BOARD_ASS);
+ susHandlers[0]->setCustomFdir(fdir);
+
+ spiCookie = new SpiCookie(addresses::SUS_1, gpioIds::CS_SUS_1, spiDev, SUS::MAX_CMD_SIZE,
+ spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
+ susHandlers[1] = new SusHandler(objects::SUS_1, 1, objects::SPI_COM_IF, spiCookie);
+ fdir = new SusFdir(objects::SUS_1);
+ susHandlers[1]->setParent(objects::SUS_BOARD_ASS);
+ susHandlers[1]->setCustomFdir(fdir);
+
+ spiCookie = new SpiCookie(addresses::SUS_2, gpioIds::CS_SUS_2, spiDev, SUS::MAX_CMD_SIZE,
+ spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
+ susHandlers[2] = new SusHandler(objects::SUS_2, 2, objects::SPI_COM_IF, spiCookie);
+ fdir = new SusFdir(objects::SUS_2);
+ susHandlers[2]->setParent(objects::SUS_BOARD_ASS);
+ susHandlers[2]->setCustomFdir(fdir);
+
+ spiCookie = new SpiCookie(addresses::SUS_3, gpioIds::CS_SUS_3, spiDev, SUS::MAX_CMD_SIZE,
+ spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
+ susHandlers[3] = new SusHandler(objects::SUS_3, 3, objects::SPI_COM_IF, spiCookie);
+ fdir = new SusFdir(objects::SUS_3);
+ susHandlers[3]->setParent(objects::SUS_BOARD_ASS);
+ susHandlers[3]->setCustomFdir(fdir);
+
+ spiCookie = new SpiCookie(addresses::SUS_4, gpioIds::CS_SUS_4, spiDev, SUS::MAX_CMD_SIZE,
+ spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
+ susHandlers[4] = new SusHandler(objects::SUS_4, 4, objects::SPI_COM_IF, spiCookie);
+ fdir = new SusFdir(objects::SUS_4);
+ susHandlers[4]->setParent(objects::SUS_BOARD_ASS);
+ susHandlers[4]->setCustomFdir(fdir);
+
+ spiCookie = new SpiCookie(addresses::SUS_5, gpioIds::CS_SUS_5, spiDev, SUS::MAX_CMD_SIZE,
+ spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
+ susHandlers[5] = new SusHandler(objects::SUS_5, 5, objects::SPI_COM_IF, spiCookie);
+ fdir = new SusFdir(objects::SUS_5);
+ susHandlers[5]->setParent(objects::SUS_BOARD_ASS);
+ susHandlers[5]->setCustomFdir(fdir);
+
+ spiCookie = new SpiCookie(addresses::SUS_6, gpioIds::CS_SUS_6, spiDev, SUS::MAX_CMD_SIZE,
+ spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
+ susHandlers[6] = new SusHandler(objects::SUS_6, 6, objects::SPI_COM_IF, spiCookie);
+ fdir = new SusFdir(objects::SUS_6);
+ susHandlers[6]->setParent(objects::SUS_BOARD_ASS);
+ susHandlers[6]->setCustomFdir(fdir);
+
+ spiCookie = new SpiCookie(addresses::SUS_7, gpioIds::CS_SUS_7, spiDev, SUS::MAX_CMD_SIZE,
+ spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
+ susHandlers[7] = new SusHandler(objects::SUS_7, 7, objects::SPI_COM_IF, spiCookie);
+ fdir = new SusFdir(objects::SUS_7);
+ susHandlers[7]->setParent(objects::SUS_BOARD_ASS);
+ susHandlers[7]->setCustomFdir(fdir);
+
+ spiCookie = new SpiCookie(addresses::SUS_8, gpioIds::CS_SUS_8, spiDev, SUS::MAX_CMD_SIZE,
+ spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
+ susHandlers[8] = new SusHandler(objects::SUS_8, 8, objects::SPI_COM_IF, spiCookie);
+ fdir = new SusFdir(objects::SUS_8);
+ susHandlers[8]->setParent(objects::SUS_BOARD_ASS);
+ susHandlers[8]->setCustomFdir(fdir);
+
+ spiCookie = new SpiCookie(addresses::SUS_9, gpioIds::CS_SUS_9, spiDev, SUS::MAX_CMD_SIZE,
+ spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
+ susHandlers[9] = new SusHandler(objects::SUS_9, 9, objects::SPI_COM_IF, spiCookie);
+ fdir = new SusFdir(objects::SUS_9);
+ susHandlers[9]->setParent(objects::SUS_BOARD_ASS);
+ susHandlers[9]->setCustomFdir(fdir);
+
+ spiCookie = new SpiCookie(addresses::SUS_10, gpioIds::CS_SUS_10, spiDev, SUS::MAX_CMD_SIZE,
+ spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
+ susHandlers[10] = new SusHandler(objects::SUS_10, 10, objects::SPI_COM_IF, spiCookie);
+ fdir = new SusFdir(objects::SUS_10);
+ susHandlers[10]->setParent(objects::SUS_BOARD_ASS);
+ susHandlers[10]->setCustomFdir(fdir);
+
+ spiCookie = new SpiCookie(addresses::SUS_11, gpioIds::CS_SUS_11, spiDev, SUS::MAX_CMD_SIZE,
+ spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
+ susHandlers[11] = new SusHandler(objects::SUS_11, 11, objects::SPI_COM_IF, spiCookie);
+ fdir = new SusFdir(objects::SUS_11);
+ susHandlers[11]->setParent(objects::SUS_BOARD_ASS);
+ susHandlers[11]->setCustomFdir(fdir);
+
+ for (auto& sus : susHandlers) {
+ if (sus != nullptr) {
+#if OBSW_TEST_SUS == 1
+ sus->setStartUpImmediately();
+ sus->setToGoToNormalMode(true);
+#endif
+#if OBSW_DEBUG_SUS == 1
+ sus->enablePeriodicPrintout(true, 3);
+#endif
+ }
+ }
+ std::array susIds = {objects::SUS_0, objects::SUS_1, objects::SUS_2,
+ objects::SUS_3, objects::SUS_4, objects::SUS_5,
+ objects::SUS_6, objects::SUS_7, objects::SUS_8,
+ objects::SUS_9, objects::SUS_10, objects::SUS_11};
+ SusAssHelper susAssHelper = SusAssHelper(susIds);
+ auto susAss =
+ new SusAssembly(objects::SUS_BOARD_ASS, objects::NO_OBJECT, pwrSwitcher, susAssHelper);
+ static_cast(susAss);
+#endif /* OBSW_ADD_SUN_SENSORS == 1 */
+}
+
+void ObjectFactory::createRtdComponents(std::string spiDev, GpioIF* gpioComIF,
+ PowerSwitchIF* pwrSwitcher) {
+ using namespace gpio;
+ GpioCookie* rtdGpioCookie = new GpioCookie;
+
+ GpioCallback* gpioRtdIc0 = new GpioCallback("Chip select RTD IC0", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ rtdGpioCookie->addGpio(gpioIds::RTD_IC_3, gpioRtdIc0);
+ GpioCallback* gpioRtdIc1 = new GpioCallback("Chip select RTD IC1", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ rtdGpioCookie->addGpio(gpioIds::RTD_IC_4, gpioRtdIc1);
+ GpioCallback* gpioRtdIc2 = new GpioCallback("Chip select RTD IC2", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ rtdGpioCookie->addGpio(gpioIds::RTD_IC_5, gpioRtdIc2);
+ GpioCallback* gpioRtdIc3 = new GpioCallback("Chip select RTD IC3", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ rtdGpioCookie->addGpio(gpioIds::RTD_IC_6, gpioRtdIc3);
+ GpioCallback* gpioRtdIc4 = new GpioCallback("Chip select RTD IC4", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ rtdGpioCookie->addGpio(gpioIds::RTD_IC_7, gpioRtdIc4);
+ GpioCallback* gpioRtdIc5 = new GpioCallback("Chip select RTD IC5", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ rtdGpioCookie->addGpio(gpioIds::RTD_IC_8, gpioRtdIc5);
+ GpioCallback* gpioRtdIc6 = new GpioCallback("Chip select RTD IC6", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ rtdGpioCookie->addGpio(gpioIds::RTD_IC_9, gpioRtdIc6);
+ GpioCallback* gpioRtdIc7 = new GpioCallback("Chip select RTD IC7", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ rtdGpioCookie->addGpio(gpioIds::RTD_IC_10, gpioRtdIc7);
+ GpioCallback* gpioRtdIc8 = new GpioCallback("Chip select RTD IC8", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ rtdGpioCookie->addGpio(gpioIds::RTD_IC_11, gpioRtdIc8);
+ GpioCallback* gpioRtdIc9 = new GpioCallback("Chip select RTD IC9", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ rtdGpioCookie->addGpio(gpioIds::RTD_IC_12, gpioRtdIc9);
+ GpioCallback* gpioRtdIc10 = new GpioCallback("Chip select RTD IC10", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ rtdGpioCookie->addGpio(gpioIds::RTD_IC_13, gpioRtdIc10);
+ GpioCallback* gpioRtdIc11 = new GpioCallback("Chip select RTD IC11", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ rtdGpioCookie->addGpio(gpioIds::RTD_IC_14, gpioRtdIc11);
+ GpioCallback* gpioRtdIc12 = new GpioCallback("Chip select RTD IC12", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ rtdGpioCookie->addGpio(gpioIds::RTD_IC_15, gpioRtdIc12);
+ GpioCallback* gpioRtdIc13 = new GpioCallback("Chip select RTD IC13", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ rtdGpioCookie->addGpio(gpioIds::RTD_IC_16, gpioRtdIc13);
+ GpioCallback* gpioRtdIc14 = new GpioCallback("Chip select RTD IC14", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ rtdGpioCookie->addGpio(gpioIds::RTD_IC_17, gpioRtdIc14);
+ GpioCallback* gpioRtdIc15 = new GpioCallback("Chip select RTD IC15", Direction::OUT, Levels::HIGH,
+ &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
+ rtdGpioCookie->addGpio(gpioIds::RTD_IC_18, gpioRtdIc15);
+
+ gpioComIF->addGpios(rtdGpioCookie);
+
+#if OBSW_ADD_RTD_DEVICES == 1
+ static constexpr uint8_t NUMBER_RTDS = 16;
+ std::array, NUMBER_RTDS> cookieArgs = {{
+ {addresses::RTD_IC_3, gpioIds::RTD_IC_3},
+ {addresses::RTD_IC_4, gpioIds::RTD_IC_4},
+ {addresses::RTD_IC_5, gpioIds::RTD_IC_5},
+ {addresses::RTD_IC_6, gpioIds::RTD_IC_6},
+ {addresses::RTD_IC_7, gpioIds::RTD_IC_7},
+ {addresses::RTD_IC_8, gpioIds::RTD_IC_8},
+ {addresses::RTD_IC_9, gpioIds::RTD_IC_9},
+ {addresses::RTD_IC_10, gpioIds::RTD_IC_10},
+ {addresses::RTD_IC_11, gpioIds::RTD_IC_11},
+ {addresses::RTD_IC_12, gpioIds::RTD_IC_12},
+ {addresses::RTD_IC_13, gpioIds::RTD_IC_13},
+ {addresses::RTD_IC_14, gpioIds::RTD_IC_14},
+ {addresses::RTD_IC_15, gpioIds::RTD_IC_15},
+ {addresses::RTD_IC_16, gpioIds::RTD_IC_16},
+ {addresses::RTD_IC_17, gpioIds::RTD_IC_17},
+ {addresses::RTD_IC_18, gpioIds::RTD_IC_18},
+ }};
+ std::array rtdIds = {
+ objects::RTD_IC_3, objects::RTD_IC_4, objects::RTD_IC_5, objects::RTD_IC_6,
+ objects::RTD_IC_7, objects::RTD_IC_8, objects::RTD_IC_9, objects::RTD_IC_10,
+ objects::RTD_IC_11, objects::RTD_IC_12, objects::RTD_IC_13, objects::RTD_IC_14,
+ objects::RTD_IC_15, objects::RTD_IC_16, objects::RTD_IC_17, objects::RTD_IC_18};
+ std::array rtdCookies = {};
+ std::array rtds = {};
+ RtdFdir* rtdFdir = nullptr;
+ for (uint8_t idx = 0; idx < NUMBER_RTDS; idx++) {
+ rtdCookies[idx] =
+ new SpiCookie(cookieArgs[idx].first, cookieArgs[idx].second, spiDev,
+ Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
+ rtds[idx] = new Max31865PT1000Handler(rtdIds[idx], objects::SPI_COM_IF, rtdCookies[idx]);
+ rtds[idx]->setParent(objects::TCS_BOARD_ASS);
+ rtdFdir = new RtdFdir(rtdIds[idx]);
+ rtds[idx]->setCustomFdir(rtdFdir);
+ rtds[idx]->setDeviceIdx(idx + 3);
+ }
+
+#if OBSW_TEST_RTD == 1
+ for (auto& rtd : rtds) {
+ if (rtd != nullptr) {
+ rtd->setStartUpImmediately();
+ rtd->setInstantNormal(true);
+ }
+ }
+#endif // OBSW_TEST_RTD == 1
+ TcsBoardHelper helper(rtdIds);
+ TcsBoardAssembly* tcsBoardAss =
+ new TcsBoardAssembly(objects::TCS_BOARD_ASS, objects::NO_OBJECT, pwrSwitcher,
+ pcdu::Switches::PDU1_CH0_TCS_BOARD_3V3, helper);
+ static_cast(tcsBoardAss);
+#endif // OBSW_ADD_RTD_DEVICES == 1
+}
diff --git a/linux/ObjectFactory.h b/linux/ObjectFactory.h
new file mode 100644
index 00000000..d918115f
--- /dev/null
+++ b/linux/ObjectFactory.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#include
+
+class GpioIF;
+class SpiComIF;
+class PowerSwitchIF;
+
+namespace ObjectFactory {
+
+void createSunSensorComponents(GpioIF* gpioComIF, SpiComIF* spiComIF, PowerSwitchIF* pwrSwitcher,
+ std::string spiDev);
+void createRtdComponents(std::string spiDev, GpioIF* gpioComIF, PowerSwitchIF* pwrSwitcher);
+
+} // namespace ObjectFactory
diff --git a/linux/boardtest/SpiTestClass.cpp b/linux/boardtest/SpiTestClass.cpp
index 5287b6e9..d9eb6b5a 100644
--- a/linux/boardtest/SpiTestClass.cpp
+++ b/linux/boardtest/SpiTestClass.cpp
@@ -339,6 +339,8 @@ void SpiTestClass::performMax1227Test() {
std::string deviceName = "";
#elif defined(EGSE)
std::string deviceName = "";
+#elif defined(TE0720_1CFA)
+ std::string deviceName = "";
#endif
int fd = 0;
UnixFileGuard fileHelper(deviceName, &fd, O_RDWR, "SpiComIF::initializeInterface");
@@ -406,7 +408,7 @@ void SpiTestClass::max1227RadSensorTest(int fd) {
transfer(fd, gpioIds::CS_RAD_SENSOR);
usleep(65);
spiTransferStruct[0].len = 24;
- std::memcpy(sendBuffer.data(), sendBuffer.data() + 1, 24);
+ std::memmove(sendBuffer.data(), sendBuffer.data() + 1, 24);
transfer(fd, gpioIds::CS_RAD_SENSOR);
int16_t tempRaw = ((recvBuffer[22] & 0x0f) << 8) | recvBuffer[23];
float temp = max1227::getTemperature(tempRaw);
diff --git a/linux/boardtest/SpiTestClass.h b/linux/boardtest/SpiTestClass.h
index 15675f1a..dad42f4d 100644
--- a/linux/boardtest/SpiTestClass.h
+++ b/linux/boardtest/SpiTestClass.h
@@ -3,9 +3,14 @@
#include "OBSWConfig.h"
-#if defined(XIPHOS_Q7S)
+#ifdef XIPHOS_Q7S
#include "busConf.h"
#endif
+
+#ifdef RASPBERRY_PI
+#include
+#endif
+
#include
#include
#include
diff --git a/linux/callbacks/CMakeLists.txt b/linux/callbacks/CMakeLists.txt
new file mode 100644
index 00000000..89bb24bb
--- /dev/null
+++ b/linux/callbacks/CMakeLists.txt
@@ -0,0 +1,3 @@
+target_sources(${OBSW_NAME} PRIVATE
+ gpioCallbacks.cpp
+)
diff --git a/linux/callbacks/gpioCallbacks.cpp b/linux/callbacks/gpioCallbacks.cpp
new file mode 100644
index 00000000..969aada0
--- /dev/null
+++ b/linux/callbacks/gpioCallbacks.cpp
@@ -0,0 +1,431 @@
+#include "gpioCallbacks.h"
+
+#include "devices/gpioIds.h"
+#include "fsfw/serviceinterface/ServiceInterface.h"
+#include "fsfw_hal/common/gpio/GpioCookie.h"
+#include "fsfw_hal/common/gpio/GpioIF.h"
+
+void gpioCallbacks::spiCsDecoderCallback(gpioId_t gpioId, gpio::GpioOperation gpioOp,
+ gpio::Levels value, void* args) {
+ GpioIF* gpioIF = reinterpret_cast(args);
+ if (gpioIF == nullptr) {
+ sif::debug << "spiCsDecoderCallback: No gpioComIF specified. Call initSpiCsDecoder "
+ << "to specify gpioComIF" << std::endl;
+ return;
+ }
+
+ /* Reading is not supported by the callback function */
+ if (gpioOp == gpio::GpioOperation::READ) {
+ return;
+ }
+
+ if (value == gpio::Levels::HIGH) {
+ switch (gpioId) {
+ case (gpioIds::RTD_IC_3): {
+ disableDecoderTcsIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_4): {
+ disableDecoderTcsIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_5): {
+ disableDecoderTcsIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_6): {
+ disableDecoderTcsIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_7): {
+ disableDecoderTcsIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_8): {
+ disableDecoderTcsIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_9): {
+ disableDecoderTcsIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_10): {
+ disableDecoderTcsIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_11): {
+ disableDecoderTcsIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_12): {
+ disableDecoderTcsIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_13): {
+ disableDecoderTcsIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_14): {
+ disableDecoderTcsIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_15): {
+ disableDecoderTcsIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_16): {
+ disableDecoderTcsIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_17): {
+ disableDecoderTcsIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_18): {
+ disableDecoderTcsIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_SUS_0): {
+ disableDecoderInterfaceBoardIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_SUS_1): {
+ disableDecoderInterfaceBoardIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_SUS_2): {
+ disableDecoderInterfaceBoardIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_SUS_3): {
+ disableDecoderInterfaceBoardIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_SUS_4): {
+ disableDecoderInterfaceBoardIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_SUS_5): {
+ disableDecoderInterfaceBoardIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_SUS_6): {
+ disableDecoderInterfaceBoardIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_SUS_7): {
+ disableDecoderInterfaceBoardIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_SUS_8): {
+ disableDecoderInterfaceBoardIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_SUS_9): {
+ disableDecoderInterfaceBoardIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_SUS_10): {
+ disableDecoderInterfaceBoardIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_SUS_11): {
+ disableDecoderInterfaceBoardIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_RW1): {
+ disableRwDecoder(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_RW2): {
+ disableRwDecoder(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_RW3): {
+ disableRwDecoder(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_RW4): {
+ disableRwDecoder(gpioIF);
+ break;
+ }
+ default:
+ sif::debug << "spiCsDecoderCallback: Invalid gpio id " << gpioId << std::endl;
+ }
+ } else if (value == gpio::Levels::LOW) {
+ switch (gpioId) {
+ case (gpioIds::RTD_IC_3): {
+ selectY7(gpioIF);
+ enableDecoderTcsIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_4): {
+ selectY6(gpioIF);
+ enableDecoderTcsIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_5): {
+ selectY5(gpioIF);
+ enableDecoderTcsIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_6): {
+ selectY4(gpioIF);
+ enableDecoderTcsIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_7): {
+ selectY3(gpioIF);
+ enableDecoderTcsIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_8): {
+ selectY2(gpioIF);
+ enableDecoderTcsIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_9): {
+ selectY1(gpioIF);
+ enableDecoderTcsIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_10): {
+ selectY0(gpioIF);
+ enableDecoderTcsIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_11): {
+ selectY7(gpioIF);
+ enableDecoderTcsIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_12): {
+ selectY6(gpioIF);
+ enableDecoderTcsIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_13): {
+ selectY5(gpioIF);
+ enableDecoderTcsIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_14): {
+ selectY4(gpioIF);
+ enableDecoderTcsIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_15): {
+ selectY3(gpioIF);
+ enableDecoderTcsIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_16): {
+ selectY2(gpioIF);
+ enableDecoderTcsIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_17): {
+ selectY1(gpioIF);
+ enableDecoderTcsIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::RTD_IC_18): {
+ selectY0(gpioIF);
+ enableDecoderTcsIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_SUS_0): {
+ selectY0(gpioIF);
+ enableDecoderInterfaceBoardIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_SUS_1): {
+ selectY1(gpioIF);
+ enableDecoderInterfaceBoardIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_SUS_2): {
+ selectY2(gpioIF);
+ enableDecoderInterfaceBoardIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_SUS_3): {
+ selectY3(gpioIF);
+ enableDecoderInterfaceBoardIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_SUS_4): {
+ selectY4(gpioIF);
+ enableDecoderInterfaceBoardIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_SUS_5): {
+ selectY5(gpioIF);
+ enableDecoderInterfaceBoardIc1(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_SUS_6): {
+ selectY0(gpioIF);
+ enableDecoderInterfaceBoardIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_SUS_7): {
+ selectY1(gpioIF);
+ enableDecoderInterfaceBoardIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_SUS_8): {
+ selectY2(gpioIF);
+ enableDecoderInterfaceBoardIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_SUS_9): {
+ selectY3(gpioIF);
+ enableDecoderInterfaceBoardIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_SUS_10): {
+ selectY4(gpioIF);
+ enableDecoderInterfaceBoardIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_SUS_11): {
+ selectY5(gpioIF);
+ enableDecoderInterfaceBoardIc2(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_RW1): {
+ selectY0(gpioIF);
+ enableRwDecoder(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_RW2): {
+ selectY1(gpioIF);
+ enableRwDecoder(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_RW3): {
+ selectY2(gpioIF);
+ enableRwDecoder(gpioIF);
+ break;
+ }
+ case (gpioIds::CS_RW4): {
+ selectY3(gpioIF);
+ enableRwDecoder(gpioIF);
+ break;
+ }
+ default:
+ sif::debug << "spiCsDecoderCallback: Invalid gpio id " << gpioId << std::endl;
+ }
+ } else {
+ sif::debug << "spiCsDecoderCallback: Invalid value. Must be 0 or 1" << std::endl;
+ }
+}
+
+void gpioCallbacks::enableDecoderTcsIc1(GpioIF* gpioIF) {
+ gpioIF->pullLow(gpioIds::SPI_MUX_BIT_0);
+ gpioIF->pullHigh(gpioIds::SPI_MUX_BIT_1);
+ gpioIF->pullLow(gpioIds::SPI_MUX_BIT_2);
+}
+
+void gpioCallbacks::enableDecoderTcsIc2(GpioIF* gpioIF) {
+ gpioIF->pullHigh(gpioIds::SPI_MUX_BIT_2);
+ gpioIF->pullLow(gpioIds::SPI_MUX_BIT_0);
+ gpioIF->pullHigh(gpioIds::SPI_MUX_BIT_1);
+}
+
+void gpioCallbacks::enableDecoderInterfaceBoardIc1(GpioIF* gpioIF) {
+ gpioIF->pullHigh(gpioIds::SPI_MUX_BIT_0);
+ gpioIF->pullLow(gpioIds::SPI_MUX_BIT_1);
+ gpioIF->pullLow(gpioIds::SPI_MUX_BIT_2);
+}
+
+void gpioCallbacks::enableDecoderInterfaceBoardIc2(GpioIF* gpioIF) {
+ gpioIF->pullHigh(gpioIds::SPI_MUX_BIT_0);
+ gpioIF->pullLow(gpioIds::SPI_MUX_BIT_1);
+ gpioIF->pullHigh(gpioIds::SPI_MUX_BIT_2);
+}
+
+void gpioCallbacks::disableDecoderTcsIc1(GpioIF* gpioIF) {
+ gpioIF->pullHigh(gpioIds::SPI_MUX_BIT_0);
+ gpioIF->pullHigh(gpioIds::SPI_MUX_BIT_1);
+ gpioIF->pullLow(gpioIds::SPI_MUX_BIT_2);
+}
+
+void gpioCallbacks::disableDecoderTcsIc2(GpioIF* gpioIF) {
+ // DO NOT CHANGE THE ORDER HERE
+ gpioIF->pullHigh(gpioIds::SPI_MUX_BIT_0);
+ gpioIF->pullLow(gpioIds::SPI_MUX_BIT_2);
+ gpioIF->pullHigh(gpioIds::SPI_MUX_BIT_1);
+}
+
+void gpioCallbacks::disableDecoderInterfaceBoardIc1(GpioIF* gpioIF) {
+ gpioIF->pullHigh(gpioIds::SPI_MUX_BIT_0);
+ gpioIF->pullHigh(gpioIds::SPI_MUX_BIT_1);
+ gpioIF->pullLow(gpioIds::SPI_MUX_BIT_2);
+}
+
+void gpioCallbacks::disableDecoderInterfaceBoardIc2(GpioIF* gpioIF) {
+ gpioIF->pullHigh(gpioIds::SPI_MUX_BIT_0);
+ gpioIF->pullHigh(gpioIds::SPI_MUX_BIT_1);
+ gpioIF->pullLow(gpioIds::SPI_MUX_BIT_2);
+}
+
+void gpioCallbacks::enableRwDecoder(GpioIF* gpioIF) { gpioIF->pullHigh(gpioIds::EN_RW_CS); }
+
+void gpioCallbacks::disableRwDecoder(GpioIF* gpioIF) { gpioIF->pullLow(gpioIds::EN_RW_CS); }
+
+void gpioCallbacks::selectY0(GpioIF* gpioIF) {
+ gpioIF->pullLow(gpioIds::SPI_MUX_BIT_3);
+ gpioIF->pullLow(gpioIds::SPI_MUX_BIT_4);
+ gpioIF->pullLow(gpioIds::SPI_MUX_BIT_5);
+}
+
+void gpioCallbacks::selectY1(GpioIF* gpioIF) {
+ gpioIF->pullHigh(gpioIds::SPI_MUX_BIT_3);
+ gpioIF->pullLow(gpioIds::SPI_MUX_BIT_4);
+ gpioIF->pullLow(gpioIds::SPI_MUX_BIT_5);
+}
+
+void gpioCallbacks::selectY2(GpioIF* gpioIF) {
+ gpioIF->pullLow(gpioIds::SPI_MUX_BIT_3);
+ gpioIF->pullHigh(gpioIds::SPI_MUX_BIT_4);
+ gpioIF->pullLow(gpioIds::SPI_MUX_BIT_5);
+}
+
+void gpioCallbacks::selectY3(GpioIF* gpioIF) {
+ gpioIF->pullHigh(gpioIds::SPI_MUX_BIT_3);
+ gpioIF->pullHigh(gpioIds::SPI_MUX_BIT_4);
+ gpioIF->pullLow(gpioIds::SPI_MUX_BIT_5);
+}
+
+void gpioCallbacks::selectY4(GpioIF* gpioIF) {
+ gpioIF->pullLow(gpioIds::SPI_MUX_BIT_3);
+ gpioIF->pullLow(gpioIds::SPI_MUX_BIT_4);
+ gpioIF->pullHigh(gpioIds::SPI_MUX_BIT_5);
+}
+
+void gpioCallbacks::selectY5(GpioIF* gpioIF) {
+ gpioIF->pullHigh(gpioIds::SPI_MUX_BIT_3);
+ gpioIF->pullLow(gpioIds::SPI_MUX_BIT_4);
+ gpioIF->pullHigh(gpioIds::SPI_MUX_BIT_5);
+}
+
+void gpioCallbacks::selectY6(GpioIF* gpioIF) {
+ gpioIF->pullLow(gpioIds::SPI_MUX_BIT_3);
+ gpioIF->pullHigh(gpioIds::SPI_MUX_BIT_4);
+ gpioIF->pullHigh(gpioIds::SPI_MUX_BIT_5);
+}
+
+void gpioCallbacks::selectY7(GpioIF* gpioIF) {
+ gpioIF->pullHigh(gpioIds::SPI_MUX_BIT_3);
+ gpioIF->pullHigh(gpioIds::SPI_MUX_BIT_4);
+ gpioIF->pullHigh(gpioIds::SPI_MUX_BIT_5);
+}
+
+void gpioCallbacks::disableAllDecoder(GpioIF* gpioIF) {
+ gpioIF->pullLow(gpioIds::SPI_MUX_BIT_2);
+ gpioIF->pullLow(gpioIds::SPI_MUX_BIT_0);
+ gpioIF->pullLow(gpioIds::SPI_MUX_BIT_1);
+ gpioIF->pullLow(gpioIds::EN_RW_CS);
+}
diff --git a/bsp_q7s/callbacks/gpioCallbacks.h b/linux/callbacks/gpioCallbacks.h
similarity index 61%
rename from bsp_q7s/callbacks/gpioCallbacks.h
rename to linux/callbacks/gpioCallbacks.h
index 6b4e99bf..fca89603 100644
--- a/bsp_q7s/callbacks/gpioCallbacks.h
+++ b/linux/callbacks/gpioCallbacks.h
@@ -1,16 +1,10 @@
-#ifndef LINUX_GPIO_GPIOCALLBACKS_H_
-#define LINUX_GPIO_GPIOCALLBACKS_H_
+#pragma once
-#include
#include
-namespace gpioCallbacks {
+class GpioIF;
-/**
- * @brief This function initializes the GPIOs used to control the SN74LVC138APWR decoders on
- * the TCS Board and the interface board.
- */
-void initSpiCsDecoder(GpioIF* gpioComIF);
+namespace gpioCallbacks {
/**
* @brief This function implements the decoding to multiply gpios by using the decoder
@@ -23,51 +17,50 @@ void spiCsDecoderCallback(gpioId_t gpioId, gpio::GpioOperation gpioOp, gpio::Lev
* @brief This function sets mux bits 1-3 to a state which will only enable the decoder
* on the TCS board which is named to IC1 in the schematic.
*/
-void enableDecoderTcsIc1();
+void enableDecoderTcsIc1(GpioIF* gpioIF);
/**
* @brief This function sets mux bits 1-3 to a state which will only enable the decoder
* on the TCS board which is named to IC2 in the schematic.
*/
-void enableDecoderTcsIc2();
+void enableDecoderTcsIc2(GpioIF* gpioIF);
/**
* @brief This function sets mux bits 1-3 to a state which will only enable the decoder
* on the inteface board board which is named to IC21 in the schematic.
*/
-void enableDecoderInterfaceBoardIc1();
+void enableDecoderInterfaceBoardIc1(GpioIF* gpioIF);
/**
* @brief This function sets mux bits 1-3 to a state which will only enable the decoder
* on the inteface board board which is named to IC22 in the schematic.
*/
-void enableDecoderInterfaceBoardIc2();
+void enableDecoderInterfaceBoardIc2(GpioIF* gpioIF);
-void disableDecoderTcsIc1();
-void disableDecoderTcsIc2();
-void disableDecoderInterfaceBoardIc1();
-void disableDecoderInterfaceBoardIc2();
+void disableDecoderTcsIc1(GpioIF* gpioIF);
+void disableDecoderTcsIc2(GpioIF* gpioIF);
+void disableDecoderInterfaceBoardIc1(GpioIF* gpioIF);
+void disableDecoderInterfaceBoardIc2(GpioIF* gpioIF);
/**
* @brief Enables the reaction wheel chip select decoder (IC3).
*/
-void enableRwDecoder();
-void disableRwDecoder();
+void enableRwDecoder(GpioIF* gpioIF);
+void disableRwDecoder(GpioIF* gpioIF);
/**
* @brief This function disables all decoder.
*/
-void disableAllDecoder();
+void disableAllDecoder(GpioIF* gpioIF);
/** The following functions enable the appropriate channel of the currently enabled decoder */
-void selectY0();
-void selectY1();
-void selectY2();
-void selectY3();
-void selectY4();
-void selectY5();
-void selectY6();
-void selectY7();
-} // namespace gpioCallbacks
+void selectY0(GpioIF* gpioIF);
+void selectY1(GpioIF* gpioIF);
+void selectY2(GpioIF* gpioIF);
+void selectY3(GpioIF* gpioIF);
+void selectY4(GpioIF* gpioIF);
+void selectY5(GpioIF* gpioIF);
+void selectY6(GpioIF* gpioIF);
+void selectY7(GpioIF* gpioIF);
-#endif /* LINUX_GPIO_GPIOCALLBACKS_H_ */
+} // namespace gpioCallbacks
diff --git a/linux/csp/CspComIF.cpp b/linux/csp/CspComIF.cpp
index fa372d4d..9f346405 100644
--- a/linux/csp/CspComIF.cpp
+++ b/linux/csp/CspComIF.cpp
@@ -141,11 +141,12 @@ ReturnValue_t CspComIF::cspTransfer(uint8_t cspAddress, uint8_t cspPort, const u
int cmdLen, uint16_t querySize) {
uint32_t timeout_ms = 1000;
uint16_t bytesRead = 0;
- int32_t expectedSize = (int32_t)querySize;
+ int32_t expectedSize = static_cast(querySize);
vectorBufferIter iter = cspDeviceMap.find(cspAddress);
if (iter == cspDeviceMap.end()) {
sif::error << "CSP device with address " << cspAddress << " no found in"
<< " device map" << std::endl;
+ return RETURN_FAILED;
}
uint8_t* replyBuffer = iter->second.data();
diff --git a/linux/devices/CMakeLists.txt b/linux/devices/CMakeLists.txt
index 7d39837d..00d407e8 100644
--- a/linux/devices/CMakeLists.txt
+++ b/linux/devices/CMakeLists.txt
@@ -4,4 +4,5 @@ if(EIVE_BUILD_GPSD_GPS_HANDLER)
)
endif()
+add_subdirectory(ploc)
add_subdirectory(startracker)
diff --git a/linux/devices/GPSHyperionLinuxController.cpp b/linux/devices/GPSHyperionLinuxController.cpp
index 722eb8e0..20860211 100644
--- a/linux/devices/GPSHyperionLinuxController.cpp
+++ b/linux/devices/GPSHyperionLinuxController.cpp
@@ -3,19 +3,24 @@
#include "OBSWConfig.h"
#include "fsfw/datapool/PoolReadGuard.h"
#include "fsfw/timemanager/Clock.h"
+#include "linux/utility/utility.h"
+#include "mission/utility/compileTime.h"
#if FSFW_DEV_HYPERION_GPS_CREATE_NMEA_CSV == 1
#include
#include
#endif
#include
+#include
GPSHyperionLinuxController::GPSHyperionLinuxController(object_id_t objectId, object_id_t parentId,
bool debugHyperionGps)
: ExtendedControllerBase(objectId, objects::NO_OBJECT),
gpsSet(this),
myGpsmm(GPSD_SHARED_MEMORY, nullptr),
- debugHyperionGps(debugHyperionGps) {}
+ debugHyperionGps(debugHyperionGps) {
+ timeUpdateCd.resetTimer();
+}
GPSHyperionLinuxController::~GPSHyperionLinuxController() {}
@@ -29,6 +34,16 @@ LocalPoolDataSetBase *GPSHyperionLinuxController::getDataSetHandle(sid_t sid) {
ReturnValue_t GPSHyperionLinuxController::checkModeCommand(Mode_t mode, Submode_t submode,
uint32_t *msToReachTheMode) {
+ if (not modeCommanded) {
+ if (mode == MODE_ON or mode == MODE_OFF) {
+ // 5h time to reach fix
+ *msToReachTheMode = MAX_SECONDS_TO_REACH_FIX;
+ maxTimeToReachFix.resetTimer();
+ modeCommanded = true;
+ } else if (mode == MODE_NORMAL) {
+ return HasModesIF::INVALID_MODE;
+ }
+ }
return HasReturnvaluesIF::RETURN_OK;
}
@@ -66,9 +81,7 @@ ReturnValue_t GPSHyperionLinuxController::initializeLocalDataPool(
localDataPoolMap.emplace(GpsHyperion::SATS_IN_USE, new PoolEntry());
localDataPoolMap.emplace(GpsHyperion::SATS_IN_VIEW, new PoolEntry());
localDataPoolMap.emplace(GpsHyperion::FIX_MODE, new PoolEntry());
-#if OBSW_ENABLE_PERIODIC_HK == 1
- poolManager.subscribeForPeriodicPacket(gpsSet.getSid(), true, 2.0, false);
-#endif
+ poolManager.subscribeForPeriodicPacket(gpsSet.getSid(), false, 30.0, false);
return HasReturnvaluesIF::RETURN_OK;
}
@@ -104,17 +117,35 @@ void GPSHyperionLinuxController::readGpsDataFromGpsd() {
gps = myGpsmm.read();
if (gps == nullptr) {
sif::warning << "GPSHyperionHandler::readGpsDataFromGpsd: Reading GPS data failed" << std::endl;
+ return;
}
PoolReadGuard pg(&gpsSet);
if (pg.getReadResult() != HasReturnvaluesIF::RETURN_OK) {
#if FSFW_VERBOSE_LEVEL >= 1
sif::warning << "GPSHyperionHandler::readGpsDataFromGpsd: Reading dataset failed" << std::endl;
#endif
+ return;
}
+ bool validFix = false;
+ static_cast(validFix);
// 0: Not seen, 1: No fix, 2: 2D-Fix, 3: 3D-Fix
- gpsSet.fixMode.value = gps->fix.mode;
+ int newFixMode = gps->fix.mode;
+ if (newFixMode == 2 or newFixMode == 3) {
+ validFix = true;
+ }
+ if (gpsSet.fixMode.value != newFixMode) {
+ triggerEvent(GpsHyperion::GPS_FIX_CHANGE, gpsSet.fixMode.value, newFixMode);
+ }
+ gpsSet.fixMode.value = newFixMode;
if (gps->fix.mode == 0 or gps->fix.mode == 1) {
+ if (modeCommanded and maxTimeToReachFix.hasTimedOut()) {
+ // We are supposed to be on and functioning, but not fix was found
+ if (mode == MODE_ON or mode == MODE_NORMAL) {
+ mode = MODE_OFF;
+ }
+ modeCommanded = false;
+ }
gpsSet.setValidity(false, true);
} else if (gps->satellites_used > 0) {
gpsSet.setValidity(true, true);
@@ -153,6 +184,34 @@ void GPSHyperionLinuxController::readGpsDataFromGpsd() {
timeval time = {};
time.tv_sec = gpsSet.unixSeconds.value;
time.tv_usec = gps->fix.time.tv_nsec / 1000;
+ std::time_t t = std::time(nullptr);
+ if (time.tv_sec == t) {
+ timeIsConstantCounter++;
+ } else {
+ timeIsConstantCounter = 0;
+ }
+ if (timeInit and validFix) {
+ if (not utility::timeSanityCheck()) {
+#if OBSW_VERBOSE_LEVEL >= 1
+ time_t timeRaw = time.tv_sec;
+ std::tm *timeTm = std::gmtime(&timeRaw);
+ sif::info << "Setting invalid system time from GPS data directly: "
+ << std::put_time(timeTm, "%c %Z") << std::endl;
+#endif
+ // For some reason, the clock needs to be somewhat correct for NTP to work. Really dumb..
+ Clock::setClock(&time);
+ }
+ timeInit = false;
+ }
+ // If the received time does not change anymore for whatever reason, do not set it here
+ // to avoid stale times. Also, don't do it too often often to avoid jumping times
+ if (timeIsConstantCounter < 20 and timeUpdateCd.hasTimedOut()) {
+ // Update the system time here for now. NTP seems to be unable to do so for whatever reason.
+ // Further tests have shown that the time seems to be set by NTPD after some time..
+ // Clock::setClock(&time);
+ timeUpdateCd.resetTimer();
+ }
+
Clock::TimeOfDay_t timeOfDay = {};
Clock::convertTimevalToTimeOfDay(&time, &timeOfDay);
gpsSet.year = timeOfDay.year;
@@ -173,6 +232,9 @@ void GPSHyperionLinuxController::readGpsDataFromGpsd() {
std::cout << "Longitude: " << gps->fix.longitude << std::endl;
std::cout << "Altitude(MSL): " << gps->fix.altMSL << std::endl;
std::cout << "Speed(m/s): " << gps->fix.speed << std::endl;
+ std::time_t t = std::time(nullptr);
+ std::tm tm = *std::gmtime(&t);
+ std::cout << "C Time: " << std::put_time(&tm, "%c") << std::endl;
}
}
#endif
diff --git a/linux/devices/GPSHyperionLinuxController.h b/linux/devices/GPSHyperionLinuxController.h
index 3615cebd..dedd782c 100644
--- a/linux/devices/GPSHyperionLinuxController.h
+++ b/linux/devices/GPSHyperionLinuxController.h
@@ -1,6 +1,7 @@
#ifndef MISSION_DEVICES_GPSHYPERIONHANDLER_H_
#define MISSION_DEVICES_GPSHYPERIONHANDLER_H_
+#include "commonSubsystemIds.h"
#include "fsfw/FSFW.h"
#include "fsfw/controller/ExtendedControllerBase.h"
#include "fsfw/devicehandlers/DeviceHandlerBase.h"
@@ -21,6 +22,8 @@
*/
class GPSHyperionLinuxController : public ExtendedControllerBase {
public:
+ static constexpr uint32_t MAX_SECONDS_TO_REACH_FIX = 60 * 60 * 5;
+
GPSHyperionLinuxController(object_id_t objectId, object_id_t parentId,
bool debugHyperionGps = false);
virtual ~GPSHyperionLinuxController();
@@ -46,8 +49,13 @@ class GPSHyperionLinuxController : public ExtendedControllerBase {
private:
GpsPrimaryDataset gpsSet;
+ Countdown maxTimeToReachFix = Countdown(MAX_SECONDS_TO_REACH_FIX * 1000);
+ bool modeCommanded = true;
+ bool timeInit = true;
gpsmm myGpsmm;
bool debugHyperionGps = false;
+ uint32_t timeIsConstantCounter = 0;
+ Countdown timeUpdateCd = Countdown(60);
void readGpsDataFromGpsd();
};
diff --git a/linux/devices/devicedefinitions/MPSoCReturnValuesIF.h b/linux/devices/devicedefinitions/MPSoCReturnValuesIF.h
new file mode 100644
index 00000000..ac695ad8
--- /dev/null
+++ b/linux/devices/devicedefinitions/MPSoCReturnValuesIF.h
@@ -0,0 +1,32 @@
+#ifndef MPSOC_RETURN_VALUES_IF_H_
+#define MPSOC_RETURN_VALUES_IF_H_
+
+#include "fsfw/returnvalues/HasReturnvaluesIF.h"
+
+class MPSoCReturnValuesIF {
+ public:
+ static const uint8_t INTERFACE_ID = CLASS_ID::MPSOC_RETURN_VALUES_IF;
+
+ //! [EXPORT] : [COMMENT] Space Packet received from PLOC has invalid CRC
+ static const ReturnValue_t CRC_FAILURE = MAKE_RETURN_CODE(0xA0);
+ //! [EXPORT] : [COMMENT] Received ACK failure reply from PLOC
+ static const ReturnValue_t RECEIVED_ACK_FAILURE = MAKE_RETURN_CODE(0xA1);
+ //! [EXPORT] : [COMMENT] Received execution failure reply from PLOC
+ static const ReturnValue_t RECEIVED_EXE_FAILURE = MAKE_RETURN_CODE(0xA2);
+ //! [EXPORT] : [COMMENT] Received space packet with invalid APID from PLOC
+ static const ReturnValue_t INVALID_APID = MAKE_RETURN_CODE(0xA3);
+ //! [EXPORT] : [COMMENT] Received command with invalid length
+ static const ReturnValue_t INVALID_LENGTH = MAKE_RETURN_CODE(0xA4);
+ //! [EXPORT] : [COMMENT] Filename of file in OBC filesystem is too long
+ static const ReturnValue_t FILENAME_TOO_LONG = MAKE_RETURN_CODE(0xA5);
+ //! [EXPORT] : [COMMENT] MPSoC helper is currently executing a command
+ static const ReturnValue_t MPSOC_HELPER_EXECUTING = MAKE_RETURN_CODE(0xA6);
+ //! [EXPORT] : [COMMENT] Filename of MPSoC file is to long (max. 256 bytes)
+ static const ReturnValue_t MPSOC_FILENAME_TOO_LONG = MAKE_RETURN_CODE(0xA7);
+ //! [EXPORT] : [COMMENT] Command has invalid parameter
+ static const ReturnValue_t INVALID_PARAMETER = MAKE_RETURN_CODE(0xA8);
+ //! [EXPORT] : [COMMENT] Received command has file string with invalid length
+ static const ReturnValue_t NAME_TOO_LONG = MAKE_RETURN_CODE(0xA9);
+};
+
+#endif /* MPSOC_RETURN_VALUES_IF_H_ */
diff --git a/linux/devices/devicedefinitions/PlocMPSoCDefinitions.h b/linux/devices/devicedefinitions/PlocMPSoCDefinitions.h
new file mode 100644
index 00000000..fc7fa185
--- /dev/null
+++ b/linux/devices/devicedefinitions/PlocMPSoCDefinitions.h
@@ -0,0 +1,668 @@
+#ifndef MISSION_DEVICES_DEVICEDEFINITIONS_PLOCMPSOCDEFINITIONS_H_
+#define MISSION_DEVICES_DEVICEDEFINITIONS_PLOCMPSOCDEFINITIONS_H_
+
+#include "MPSoCReturnValuesIF.h"
+#include "OBSWConfig.h"
+#include "eive/definitions.h"
+#include "fsfw/globalfunctions/CRC.h"
+#include "fsfw/serialize/SerializeAdapter.h"
+#include "fsfw/tmtcpacket/SpacePacket.h"
+
+namespace mpsoc {
+
+static const DeviceCommandId_t NONE = 0;
+static const DeviceCommandId_t TC_MEM_WRITE = 1;
+static const DeviceCommandId_t TC_MEM_READ = 2;
+static const DeviceCommandId_t ACK_REPORT = 3;
+static const DeviceCommandId_t EXE_REPORT = 5;
+static const DeviceCommandId_t TM_MEMORY_READ_REPORT = 6;
+static const DeviceCommandId_t TC_FLASHFOPEN = 7;
+static const DeviceCommandId_t TC_FLASHFCLOSE = 8;
+static const DeviceCommandId_t TC_FLASHWRITE = 9;
+static const DeviceCommandId_t TC_FLASHDELETE = 10;
+static const DeviceCommandId_t TC_REPLAY_START = 11;
+static const DeviceCommandId_t TC_REPLAY_STOP = 12;
+static const DeviceCommandId_t TC_REPLAY_WRITE_SEQUENCE = 13;
+static const DeviceCommandId_t TC_DOWNLINK_PWR_ON = 14;
+static const DeviceCommandId_t TC_DOWNLINK_PWR_OFF = 15;
+static const DeviceCommandId_t TC_MODE_REPLAY = 16;
+static const DeviceCommandId_t TC_CAM_CMD_SEND = 17;
+static const DeviceCommandId_t TC_MODE_IDLE = 18;
+static const DeviceCommandId_t TM_CAM_CMD_RPT = 19;
+
+// Will reset the sequence count of the OBSW
+static const DeviceCommandId_t OBSW_RESET_SEQ_COUNT = 50;
+
+static const uint16_t SIZE_ACK_REPORT = 14;
+static const uint16_t SIZE_EXE_REPORT = 14;
+static const uint16_t SIZE_TM_MEM_READ_REPORT = 18;
+static const uint16_t SIZE_TM_CAM_CMD_RPT = 18;
+
+/**
+ * SpacePacket apids of PLOC telecommands and telemetry.
+ */
+namespace apid {
+static const uint16_t TC_REPLAY_START = 0x110;
+static const uint16_t TC_REPLAY_STOP = 0x111;
+static const uint16_t TC_REPLAY_WRITE_SEQUENCE = 0x112;
+static const uint16_t TC_DOWNLINK_PWR_ON = 0x113;
+static const uint16_t TC_MEM_WRITE = 0x114;
+static const uint16_t TC_MEM_READ = 0x115;
+static const uint16_t TC_FLASHWRITE = 0x117;
+static const uint16_t TC_FLASHFOPEN = 0x119;
+static const uint16_t TC_FLASHFCLOSE = 0x11A;
+static const uint16_t TC_FLASHDELETE = 0x11C;
+static const uint16_t TC_MODE_REPLAY = 0x11F;
+static const uint16_t TC_MODE_IDLE = 0x11E;
+static const uint16_t TC_DOWNLINK_PWR_OFF = 0x124;
+static const uint16_t TC_CAM_CMD_SEND = 0x12C;
+static const uint16_t TM_MEMORY_READ_REPORT = 0x404;
+static const uint16_t ACK_SUCCESS = 0x400;
+static const uint16_t ACK_FAILURE = 0x401;
+static const uint16_t EXE_SUCCESS = 0x402;
+static const uint16_t EXE_FAILURE = 0x403;
+static const uint16_t TM_CAM_CMD_RPT = 0x407;
+} // namespace apid
+
+/** Offset from first byte in space packet to first byte of data field */
+static const uint8_t DATA_FIELD_OFFSET = 6;
+static const size_t MEM_READ_RPT_LEN_OFFSET = 10;
+static const char NULL_TERMINATOR = '\0';
+static const uint8_t MIN_SPACE_PACKET_LENGTH = 7;
+static const uint8_t SPACE_PACKET_HEADER_SIZE = 6;
+
+/**
+ * The size of payload data which will be forwarded to the requesting object. e.g. PUS Service
+ * 8.
+ */
+static const uint8_t SIZE_MEM_READ_RPT_FIX = 6;
+
+static const size_t MAX_FILENAME_SIZE = 256;
+
+/**
+ * PLOC space packet length for fixed size packets. This is the size of the whole packet data
+ * field. For the length field in the space packet this size will be substracted by one.
+ */
+static const uint16_t LENGTH_TC_MEM_WRITE = 12;
+static const uint16_t LENGTH_TC_MEM_READ = 8;
+
+static const size_t MAX_REPLY_SIZE = SpacePacket::PACKET_MAX_SIZE * 3;
+static const size_t MAX_COMMAND_SIZE = SpacePacket::PACKET_MAX_SIZE;
+static const size_t MAX_DATA_SIZE = 1016;
+
+/**
+ * The replay write sequence command has a maximum delay for the execution report which amounts to
+ * 30 seconds. (80 cycles * 0.5 seconds = 40 seconds).
+ */
+static const uint16_t TC_WRITE_SEQ_EXECUTION_DELAY = 80;
+// Requires approx. 2 seconds for execution. 8 => 4 seconds
+static const uint16_t TC_DOWNLINK_PWR_ON_EXECUTION_DELAY = 8;
+
+/**
+ * @brief Abstract base class for TC space packet of MPSoC.
+ */
+class TcBase : public SpacePacket, public MPSoCReturnValuesIF {
+ public:
+ // Initial length field of space packet. Will always be updated when packet is created.
+ static const uint16_t INIT_LENGTH = 1;
+
+ /**
+ * @brief Constructor
+ *
+ * @param sequenceCount Sequence count of space packet which will be incremented with each
+ * sent and received packets.
+ */
+ TcBase(uint16_t apid, uint16_t sequenceCount)
+ : SpacePacket(INIT_LENGTH, true, apid, sequenceCount) {}
+
+ /**
+ * @brief Function to initialize the space packet
+ *
+ * @param commandData Pointer to command specific data
+ * @param commandDataLen Length of command data
+ *
+ * @return RETURN_OK if packet creation was successful, otherwise error return value
+ */
+ virtual ReturnValue_t createPacket(const uint8_t* commandData, size_t commandDataLen) {
+ ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
+ result = initPacket(commandData, commandDataLen);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ result = addCrc();
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ return result;
+ }
+
+ protected:
+ /**
+ * @brief Must be overwritten by the child class to define the command specific parameters
+ *
+ * @param commandData Pointer to received command data
+ * @param commandDataLen Length of received command data
+ */
+ virtual ReturnValue_t initPacket(const uint8_t* commandData, size_t commandDataLen) {
+ return HasReturnvaluesIF::RETURN_OK;
+ }
+
+ /**
+ * @brief Calculates and adds the CRC
+ */
+ ReturnValue_t addCrc() {
+ ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
+ size_t serializedSize = 0;
+ uint32_t full_size = getFullSize();
+ uint16_t crc = CRC::crc16ccitt(getWholeData(), full_size - CRC_SIZE);
+ result = SerializeAdapter::serialize(
+ &crc, this->localData.byteStream + full_size - CRC_SIZE, &serializedSize, sizeof(crc),
+ SerializeIF::Endianness::BIG);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ sif::debug << "TcBase::addCrc: Failed to serialize crc field" << std::endl;
+ }
+ return result;
+ }
+};
+
+/**
+ * @brief Class for handling tm replies of the PLOC MPSoC.
+ */
+class TmPacket : public SpacePacket, public MPSoCReturnValuesIF {
+ public:
+ /**
+ * @brief Constructor creates idle packet and sets length field to maximum allowed size.
+ */
+ TmPacket() : SpacePacket(PACKET_MAX_SIZE) {}
+
+ ReturnValue_t checkCrc() {
+ uint8_t* crcPtr = this->getPacketData() + this->getPacketDataLength() - 1;
+ uint16_t receivedCrc = *(crcPtr) << 8 | *(crcPtr + 1);
+ uint16_t recalculatedCrc =
+ CRC::crc16ccitt(this->localData.byteStream, this->getFullSize() - CRC_SIZE);
+ if (recalculatedCrc != receivedCrc) {
+ return CRC_FAILURE;
+ }
+ return HasReturnvaluesIF::RETURN_OK;
+ }
+};
+
+/**
+ * @brief This class helps to build the memory read command for the PLOC.
+ */
+class TcMemRead : public TcBase {
+ public:
+ /**
+ * @brief Constructor
+ */
+ TcMemRead(uint16_t sequenceCount) : TcBase(apid::TC_MEM_READ, sequenceCount) {
+ this->setPacketDataLength(PACKET_LENGTH);
+ }
+
+ uint16_t getMemLen() const { return memLen; }
+
+ protected:
+ ReturnValue_t initPacket(const uint8_t* commandData, size_t commandDataLen) {
+ ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
+ result = lengthCheck(commandDataLen);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ std::memcpy(this->localData.fields.buffer, commandData, MEM_ADDRESS_SIZE);
+ std::memcpy(this->localData.fields.buffer + MEM_ADDRESS_SIZE, commandData + MEM_ADDRESS_SIZE,
+ MEM_LEN_SIZE);
+ size_t size = sizeof(memLen);
+ const uint8_t* memLenPtr = commandData + MEM_ADDRESS_SIZE;
+ result =
+ SerializeAdapter::deSerialize(&memLen, &memLenPtr, &size, SerializeIF::Endianness::BIG);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ return result;
+ }
+
+ private:
+ static const size_t COMMAND_LENGTH = 6;
+ static const size_t MEM_ADDRESS_SIZE = 4;
+ static const size_t MEM_LEN_SIZE = 2;
+ static const uint16_t PACKET_LENGTH = 7;
+
+ uint16_t memLen = 0;
+
+ ReturnValue_t lengthCheck(size_t commandDataLen) {
+ if (commandDataLen != COMMAND_LENGTH) {
+ return INVALID_LENGTH;
+ }
+ return HasReturnvaluesIF::RETURN_OK;
+ }
+};
+
+/**
+ * @brief This class helps to generate the space packet to write data to a memory address within
+ * the PLOC.
+ */
+class TcMemWrite : public TcBase {
+ public:
+ /**
+ * @brief Constructor
+ */
+ TcMemWrite(uint16_t sequenceCount) : TcBase(apid::TC_MEM_WRITE, sequenceCount) {}
+
+ protected:
+ ReturnValue_t initPacket(const uint8_t* commandData, size_t commandDataLen) {
+ ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
+ result = lengthCheck(commandDataLen);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ std::memcpy(this->localData.fields.buffer, commandData, commandDataLen);
+ uint16_t memLen =
+ *(commandData + MEM_ADDRESS_SIZE) << 8 | *(commandData + MEM_ADDRESS_SIZE + 1);
+ this->setPacketDataLength(memLen * 4 + FIX_LENGTH - 1);
+ return result;
+ }
+
+ private:
+ // Min length consists of 4 byte address, 2 byte mem length field, 4 byte data (1 word)
+ static const size_t MIN_COMMAND_DATA_LENGTH = 10;
+ static const size_t MEM_ADDRESS_SIZE = 4;
+ static const size_t FIX_LENGTH = 8;
+
+ ReturnValue_t lengthCheck(size_t commandDataLen) {
+ if (commandDataLen < MIN_COMMAND_DATA_LENGTH) {
+ sif::warning << "TcMemWrite: Command has invalid length " << commandDataLen << std::endl;
+ return INVALID_LENGTH;
+ }
+ return HasReturnvaluesIF::RETURN_OK;
+ }
+};
+
+/**
+ * @brief Class to help creation of flash fopen command.
+ */
+class FlashFopen : public TcBase {
+ public:
+ FlashFopen(uint16_t sequenceCount) : TcBase(apid::TC_FLASHFOPEN, sequenceCount) {}
+
+ static const char APPEND = 'a';
+ static const char WRITE = 'w';
+ static const char READ = 'r';
+
+ ReturnValue_t createPacket(std::string filename, char accessMode_) {
+ accessMode = accessMode_;
+ ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
+ size_t nameSize = filename.size();
+ std::memcpy(this->getPacketData(), filename.c_str(), nameSize);
+ *(this->getPacketData() + nameSize) = NULL_TERMINATOR;
+ std::memcpy(this->getPacketData() + nameSize + sizeof(NULL_TERMINATOR), &accessMode,
+ sizeof(accessMode));
+ this->setPacketDataLength(nameSize + sizeof(NULL_TERMINATOR) + sizeof(accessMode) + CRC_SIZE -
+ 1);
+ result = addCrc();
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ return result;
+ }
+
+ private:
+ char accessMode = APPEND;
+};
+
+/**
+ * @brief Class to help creation of flash fclose command.
+ */
+class FlashFclose : public TcBase {
+ public:
+ FlashFclose(uint16_t sequenceCount) : TcBase(apid::TC_FLASHFCLOSE, sequenceCount) {}
+
+ ReturnValue_t createPacket(std::string filename) {
+ ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
+ size_t nameSize = filename.size();
+ std::memcpy(this->getPacketData(), filename.c_str(), nameSize);
+ *(this->getPacketData() + nameSize) = NULL_TERMINATOR;
+ this->setPacketDataLength(nameSize + sizeof(NULL_TERMINATOR) + CRC_SIZE - 1);
+ result = addCrc();
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ return result;
+ }
+};
+
+/**
+ * @brief Class to build flash write space packet.
+ */
+class TcFlashWrite : public TcBase {
+ public:
+ TcFlashWrite(uint16_t sequenceCount) : TcBase(apid::TC_FLASHWRITE, sequenceCount) {}
+
+ ReturnValue_t createPacket(const uint8_t* writeData, uint32_t writeLen_) {
+ ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
+ writeLen = writeLen_;
+ if (writeLen > MAX_DATA_SIZE) {
+ sif::debug << "FlashWrite::createPacket: Command data too big" << std::endl;
+ return HasReturnvaluesIF::RETURN_FAILED;
+ }
+ size_t serializedSize = 0;
+ result =
+ SerializeAdapter::serialize(&writeLen, this->getPacketData(), &serializedSize,
+ sizeof(writeLen), SerializeIF::Endianness::BIG);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ std::memcpy(this->getPacketData() + sizeof(writeLen), writeData, writeLen);
+ this->setPacketDataLength(static_cast(writeLen + CRC_SIZE - 1));
+ result = addCrc();
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ return HasReturnvaluesIF::RETURN_OK;
+ }
+
+ private:
+ uint32_t writeLen = 0;
+};
+
+/**
+ * @brief Class to help creation of flash delete command.
+ */
+class TcFlashDelete : public TcBase {
+ public:
+ TcFlashDelete(uint16_t sequenceCount) : TcBase(apid::TC_FLASHDELETE, sequenceCount) {}
+
+ ReturnValue_t createPacket(std::string filename) {
+ ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
+ size_t nameSize = filename.size();
+ std::memcpy(this->getPacketData(), filename.c_str(), nameSize);
+ *(this->getPacketData() + nameSize) = NULL_TERMINATOR;
+ this->setPacketDataLength(nameSize + sizeof(NULL_TERMINATOR) + CRC_SIZE - 1);
+ result = addCrc();
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ return result;
+ }
+};
+
+/**
+ * @brief Class to build replay stop space packet.
+ */
+class TcReplayStop : public TcBase {
+ public:
+ TcReplayStop(uint16_t sequenceCount) : TcBase(apid::TC_REPLAY_STOP, sequenceCount) {}
+
+ ReturnValue_t createPacket() {
+ ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
+ result = addCrc();
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ this->setPacketDataLength(static_cast(CRC_SIZE - 1));
+ return HasReturnvaluesIF::RETURN_OK;
+ }
+};
+
+/**
+ * @brief This class helps to build the replay start command.
+ */
+class TcReplayStart : public TcBase {
+ public:
+ /**
+ * @brief Constructor
+ */
+ TcReplayStart(uint16_t sequenceCount) : TcBase(apid::TC_REPLAY_START, sequenceCount) {}
+
+ protected:
+ ReturnValue_t initPacket(const uint8_t* commandData, size_t commandDataLen) {
+ ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
+ result = lengthCheck(commandDataLen);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ result = checkData(*commandData);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ std::memcpy(this->localData.fields.buffer, commandData, commandDataLen);
+ this->setPacketDataLength(commandDataLen + CRC_SIZE - 1);
+ return result;
+ }
+
+ private:
+ static const size_t COMMAND_DATA_LENGTH = 1;
+ static const uint8_t REPEATING = 0;
+ static const uint8_t ONCE = 1;
+
+ ReturnValue_t lengthCheck(size_t commandDataLen) {
+ if (commandDataLen != COMMAND_DATA_LENGTH) {
+ sif::warning << "TcReplayStart: Command has invalid length " << commandDataLen << std::endl;
+ return INVALID_LENGTH;
+ }
+ return HasReturnvaluesIF::RETURN_OK;
+ }
+
+ ReturnValue_t checkData(uint8_t replay) {
+ if (replay != REPEATING && replay != ONCE) {
+ sif::warning << "TcReplayStart::checkData: Invalid replay value" << std::endl;
+ return INVALID_PARAMETER;
+ }
+ return HasReturnvaluesIF::RETURN_OK;
+ }
+};
+
+/**
+ * @brief This class helps to build downlink power on command.
+ */
+class TcDownlinkPwrOn : public TcBase {
+ public:
+ /**
+ * @brief Constructor
+ */
+ TcDownlinkPwrOn(uint16_t sequenceCount) : TcBase(apid::TC_DOWNLINK_PWR_ON, sequenceCount) {}
+
+ protected:
+ ReturnValue_t initPacket(const uint8_t* commandData, size_t commandDataLen) {
+ ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
+ result = lengthCheck(commandDataLen);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ result = modeCheck(*commandData);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ result = laneRateCheck(*(commandData + 1));
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ std::memcpy(this->localData.fields.buffer, commandData, commandDataLen);
+ std::memcpy(this->localData.fields.buffer + commandDataLen, &MAX_AMPLITUDE,
+ sizeof(MAX_AMPLITUDE));
+ this->setPacketDataLength(commandDataLen + sizeof(MAX_AMPLITUDE) + CRC_SIZE - 1);
+ return result;
+ }
+
+ private:
+ static const uint8_t INTERFACE_ID = CLASS_ID::DWLPWRON_CMD;
+
+ //! [EXPORT] : [COMMENT] Received command has invalid JESD mode (valid modes are 0 - 5)
+ static const ReturnValue_t INVALID_MODE = MAKE_RETURN_CODE(0xE0);
+ //! [EXPORT] : [COMMENT] Received command has invalid lane rate (valid lane rate are 0 - 9)
+ static const ReturnValue_t INVALID_LANE_RATE = MAKE_RETURN_CODE(0xE1);
+
+ static const size_t COMMAND_DATA_LENGTH = 2;
+ static const uint8_t MAX_MODE = 5;
+ static const uint8_t MAX_LANE_RATE = 9;
+ static const uint16_t MAX_AMPLITUDE = 0;
+
+ ReturnValue_t lengthCheck(size_t commandDataLen) {
+ if (commandDataLen != COMMAND_DATA_LENGTH) {
+ sif::warning << "TcDownlinkPwrOn: Command has invalid length " << commandDataLen << std::endl;
+ return INVALID_LENGTH;
+ }
+ return HasReturnvaluesIF::RETURN_OK;
+ }
+
+ ReturnValue_t modeCheck(uint8_t mode) {
+ if (mode > MAX_MODE) {
+ sif::warning << "TcDwonlinkPwrOn::modeCheck: Invalid JESD mode" << std::endl;
+ return INVALID_MODE;
+ }
+ return HasReturnvaluesIF::RETURN_OK;
+ }
+
+ ReturnValue_t laneRateCheck(uint8_t laneRate) {
+ if (laneRate > MAX_LANE_RATE) {
+ sif::warning << "TcReplayStart::laneRateCheck: Invalid lane rate" << std::endl;
+ return INVALID_LANE_RATE;
+ }
+ return HasReturnvaluesIF::RETURN_OK;
+ }
+};
+
+/**
+ * @brief Class to build replay stop space packet.
+ */
+class TcDownlinkPwrOff : public TcBase {
+ public:
+ TcDownlinkPwrOff(uint16_t sequenceCount) : TcBase(apid::TC_DOWNLINK_PWR_OFF, sequenceCount) {}
+
+ ReturnValue_t createPacket() {
+ ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
+ result = addCrc();
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ this->setPacketDataLength(static_cast(CRC_SIZE - 1));
+ return HasReturnvaluesIF::RETURN_OK;
+ }
+};
+
+/**
+ * @brief This class helps to build the replay start command.
+ */
+class TcReplayWriteSeq : public TcBase {
+ public:
+ /**
+ * @brief Constructor
+ */
+ TcReplayWriteSeq(uint16_t sequenceCount)
+ : TcBase(apid::TC_REPLAY_WRITE_SEQUENCE, sequenceCount) {}
+
+ protected:
+ ReturnValue_t initPacket(const uint8_t* commandData, size_t commandDataLen) {
+ ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
+ result = lengthCheck(commandDataLen);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ std::memcpy(this->localData.fields.buffer, commandData, commandDataLen);
+ *(this->localData.fields.buffer + commandDataLen) = NULL_TERMINATOR;
+ this->setPacketDataLength(commandDataLen + sizeof(NULL_TERMINATOR) + CRC_SIZE - 1);
+ return result;
+ }
+
+ private:
+ static const size_t USE_DECODING_LENGTH = 1;
+
+ ReturnValue_t lengthCheck(size_t commandDataLen) {
+ if (commandDataLen > USE_DECODING_LENGTH + MAX_FILENAME_SIZE) {
+ sif::warning << "TcReplayWriteSeq: Command has invalid length " << commandDataLen
+ << std::endl;
+ return INVALID_LENGTH;
+ }
+ return HasReturnvaluesIF::RETURN_OK;
+ }
+};
+
+class FlashWritePusCmd : public MPSoCReturnValuesIF {
+ public:
+ FlashWritePusCmd(){};
+
+ ReturnValue_t extractFields(const uint8_t* commandData, size_t commandDataLen) {
+ if (commandDataLen > (config::MAX_PATH_SIZE + config::MAX_FILENAME_SIZE + MAX_FILENAME_SIZE)) {
+ return INVALID_LENGTH;
+ }
+ obcFile = std::string(reinterpret_cast(commandData));
+ if (obcFile.size() > (config::MAX_PATH_SIZE + config::MAX_FILENAME_SIZE)) {
+ return FILENAME_TOO_LONG;
+ }
+ mpsocFile = std::string(
+ reinterpret_cast(commandData + obcFile.size() + SIZE_NULL_TERMINATOR));
+ if (mpsocFile.size() > MAX_FILENAME_SIZE) {
+ return MPSOC_FILENAME_TOO_LONG;
+ }
+ return HasReturnvaluesIF::RETURN_OK;
+ }
+
+ std::string getObcFile() { return obcFile; }
+
+ std::string getMPSoCFile() { return mpsocFile; }
+
+ private:
+ static const size_t SIZE_NULL_TERMINATOR = 1;
+ std::string obcFile = "";
+ std::string mpsocFile = "";
+};
+
+/**
+ * @brief Class to build replay stop space packet.
+ */
+class TcModeReplay : public TcBase {
+ public:
+ TcModeReplay(uint16_t sequenceCount) : TcBase(apid::TC_MODE_REPLAY, sequenceCount) {}
+
+ ReturnValue_t createPacket() {
+ ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
+ result = addCrc();
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ this->setPacketDataLength(static_cast(CRC_SIZE - 1));
+ return HasReturnvaluesIF::RETURN_OK;
+ }
+};
+
+/**
+ * @brief Class to build mode idle command
+ */
+class TcModeIdle : public TcBase {
+ public:
+ TcModeIdle(uint16_t sequenceCount) : TcBase(apid::TC_MODE_IDLE, sequenceCount) {}
+
+ ReturnValue_t createPacket() {
+ ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
+ result = addCrc();
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ this->setPacketDataLength(static_cast(CRC_SIZE - 1));
+ return HasReturnvaluesIF::RETURN_OK;
+ }
+};
+
+class TcCamcmdSend : public TcBase {
+public:
+ TcCamcmdSend(uint16_t sequenceCount) : TcBase(apid::TC_CAM_CMD_SEND, sequenceCount) {}
+
+protected:
+ ReturnValue_t initPacket(const uint8_t* commandData, size_t commandDataLen) {
+ if (commandDataLen > MAX_DATA_LENGTH) {
+ return INVALID_LENGTH;
+ }
+ std::memcpy(this->getPacketData(), commandData, commandDataLen);
+ *(this->getPacketData() + commandDataLen) = CARRIAGE_RETURN;
+ uint16_t trueLength = commandDataLen + sizeof(CARRIAGE_RETURN) + CRC_SIZE;
+ this->setPacketDataLength(trueLength - 1);
+ return HasReturnvaluesIF::RETURN_OK;
+ }
+private:
+ static const uint8_t MAX_DATA_LENGTH = 10;
+ static const uint8_t CARRIAGE_RETURN = 0xD;
+
+};
+
+} // namespace mpsoc
+
+#endif /* MISSION_DEVICES_DEVICEDEFINITIONS_PLOCMPSOCDEFINITIONS_H_ */
diff --git a/bsp_q7s/devices/devicedefinitions/PlocMemDumpDefinitions.h b/linux/devices/devicedefinitions/PlocMemDumpDefinitions.h
similarity index 100%
rename from bsp_q7s/devices/devicedefinitions/PlocMemDumpDefinitions.h
rename to linux/devices/devicedefinitions/PlocMemDumpDefinitions.h
diff --git a/bsp_q7s/devices/devicedefinitions/PlocSupervisorDefinitions.h b/linux/devices/devicedefinitions/PlocSupervisorDefinitions.h
similarity index 99%
rename from bsp_q7s/devices/devicedefinitions/PlocSupervisorDefinitions.h
rename to linux/devices/devicedefinitions/PlocSupervisorDefinitions.h
index 3fc21441..58166e98 100644
--- a/bsp_q7s/devices/devicedefinitions/PlocSupervisorDefinitions.h
+++ b/linux/devices/devicedefinitions/PlocSupervisorDefinitions.h
@@ -8,7 +8,7 @@
#include
#include
-namespace PLOC_SPV {
+namespace supv {
/** Command IDs */
static const DeviceCommandId_t NONE = 0;
@@ -1541,6 +1541,6 @@ class LatchupStatusReport : public StaticLocalDataSet {
lp_var_t isSet =
lp_var_t(sid.objectId, PoolIds::LATCHUP_RPT_TIME_IS_SET, this);
};
-} // namespace PLOC_SPV
+} // namespace supv
#endif /* MISSION_DEVICES_DEVICEDEFINITIONS_PLOCSVPDEFINITIONS_H_ */
diff --git a/bsp_q7s/devices/CMakeLists.txt b/linux/devices/ploc/CMakeLists.txt
similarity index 68%
rename from bsp_q7s/devices/CMakeLists.txt
rename to linux/devices/ploc/CMakeLists.txt
index e0f6ee2f..2d1e1998 100644
--- a/bsp_q7s/devices/CMakeLists.txt
+++ b/linux/devices/ploc/CMakeLists.txt
@@ -2,4 +2,6 @@ target_sources(${OBSW_NAME} PRIVATE
PlocSupervisorHandler.cpp
PlocUpdater.cpp
PlocMemoryDumper.cpp
-)
\ No newline at end of file
+ PlocMPSoCHandler.cpp
+ PlocMPSoCHelper.cpp
+)
diff --git a/linux/devices/ploc/PlocMPSoCHandler.cpp b/linux/devices/ploc/PlocMPSoCHandler.cpp
new file mode 100644
index 00000000..07a658bf
--- /dev/null
+++ b/linux/devices/ploc/PlocMPSoCHandler.cpp
@@ -0,0 +1,976 @@
+#include "PlocMPSoCHandler.h"
+
+#include "OBSWConfig.h"
+#include "fsfw/datapool/PoolReadGuard.h"
+#include "fsfw/globalfunctions/CRC.h"
+#include "linux/devices/devicedefinitions/PlocSupervisorDefinitions.h"
+
+PlocMPSoCHandler::PlocMPSoCHandler(object_id_t objectId, object_id_t uartComIFid,
+ CookieIF* comCookie, PlocMPSoCHelper* plocMPSoCHelper,
+ Gpio uartIsolatorSwitch, object_id_t supervisorHandler)
+ : DeviceHandlerBase(objectId, uartComIFid, comCookie),
+ plocMPSoCHelper(plocMPSoCHelper),
+ uartIsolatorSwitch(uartIsolatorSwitch),
+ supervisorHandler(supervisorHandler),
+ commandActionHelper(this) {
+ if (comCookie == nullptr) {
+ sif::error << "PlocMPSoCHandler: Invalid communication cookie" << std::endl;
+ }
+ eventQueue = QueueFactory::instance()->createMessageQueue(EventMessage::EVENT_MESSAGE_SIZE * 5);
+ commandActionHelperQueue =
+ QueueFactory::instance()->createMessageQueue(EventMessage::EVENT_MESSAGE_SIZE * 5);
+}
+
+PlocMPSoCHandler::~PlocMPSoCHandler() {}
+
+ReturnValue_t PlocMPSoCHandler::initialize() {
+ ReturnValue_t result = RETURN_OK;
+ result = DeviceHandlerBase::initialize();
+ if (result != RETURN_OK) {
+ return result;
+ }
+ uartComIf = dynamic_cast(communicationInterface);
+ if (uartComIf == nullptr) {
+ sif::warning << "PlocMPSoCHandler::initialize: Invalid uart com if" << std::endl;
+ return ObjectManagerIF::CHILD_INIT_FAILED;
+ }
+
+ EventManagerIF* manager = ObjectManager::instance()->get(objects::EVENT_MANAGER);
+ if (manager == nullptr) {
+#if FSFW_CPP_OSTREAM_ENABLED == 1
+ sif::error << "PlocMPSoCHandler::initialize: Invalid event manager" << std::endl;
+#endif
+ return ObjectManagerIF::CHILD_INIT_FAILED;
+ ;
+ }
+ result = manager->registerListener(eventQueue->getId());
+ if (result != RETURN_OK) {
+ return result;
+ }
+ result = manager->subscribeToEventRange(
+ eventQueue->getId(), event::getEventId(PlocMPSoCHelper::MPSOC_FLASH_WRITE_FAILED),
+ event::getEventId(PlocMPSoCHelper::MPSOC_FLASH_WRITE_SUCCESSFUL));
+ if (result != RETURN_OK) {
+#if FSFW_CPP_OSTREAM_ENABLED == 1
+ sif::warning << "PlocMPSoCHandler::initialize: Failed to subscribe to events from "
+ " ploc mpsoc helper"
+ << std::endl;
+#endif
+ return ObjectManagerIF::CHILD_INIT_FAILED;
+ }
+
+ result = plocMPSoCHelper->setComIF(communicationInterface);
+ if (result != RETURN_OK) {
+ return ObjectManagerIF::CHILD_INIT_FAILED;
+ }
+ plocMPSoCHelper->setComCookie(comCookie);
+ plocMPSoCHelper->setSequenceCount(&sequenceCount);
+ result = commandActionHelper.initialize();
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return ObjectManagerIF::CHILD_INIT_FAILED;
+ }
+ return result;
+}
+
+void PlocMPSoCHandler::performOperationHook() {
+ EventMessage event;
+ for (ReturnValue_t result = eventQueue->receiveMessage(&event); result == RETURN_OK;
+ result = eventQueue->receiveMessage(&event)) {
+ switch (event.getMessageId()) {
+ case EventMessage::EVENT_MESSAGE:
+ handleEvent(&event);
+ break;
+ default:
+ sif::debug << "PlocMPSoCHandler::performOperationHook: Did not subscribe to this event"
+ << " message" << std::endl;
+ break;
+ }
+ }
+ CommandMessage message;
+ for (ReturnValue_t result = commandActionHelperQueue->receiveMessage(&message);
+ result == RETURN_OK; result = commandActionHelperQueue->receiveMessage(&message)) {
+ result = commandActionHelper.handleReply(&message);
+ if (result == RETURN_OK) {
+ continue;
+ }
+ }
+}
+
+ReturnValue_t PlocMPSoCHandler::executeAction(ActionId_t actionId, MessageQueueId_t commandedBy,
+ const uint8_t* data, size_t size) {
+ ReturnValue_t result = RETURN_OK;
+
+ if (plocMPSoCHelperExecuting) {
+ return MPSoCReturnValuesIF::MPSOC_HELPER_EXECUTING;
+ }
+
+ switch (actionId) {
+ case mpsoc::TC_FLASHWRITE: {
+ if (size > config::MAX_PATH_SIZE + config::MAX_FILENAME_SIZE) {
+ return MPSoCReturnValuesIF::FILENAME_TOO_LONG;
+ }
+ mpsoc::FlashWritePusCmd flashWritePusCmd;
+ result = flashWritePusCmd.extractFields(data, size);
+ if (result != RETURN_OK) {
+ return result;
+ }
+ result = plocMPSoCHelper->startFlashWrite(flashWritePusCmd.getObcFile(),
+ flashWritePusCmd.getMPSoCFile());
+ if (result != RETURN_OK) {
+ return result;
+ }
+ plocMPSoCHelperExecuting = true;
+ return EXECUTION_FINISHED;
+ }
+ case (mpsoc::OBSW_RESET_SEQ_COUNT): {
+ sequenceCount = 0;
+ return EXECUTION_FINISHED;
+ }
+ default:
+ break;
+ }
+ return DeviceHandlerBase::executeAction(actionId, commandedBy, data, size);
+}
+
+void PlocMPSoCHandler::doStartUp() {
+#ifdef XIPHOS_Q7S
+ switch (powerState) {
+ case PowerState::OFF:
+ commandActionHelper.commandAction(supervisorHandler, supv::START_MPSOC);
+ powerState = PowerState::BOOTING;
+ break;
+ case PowerState::ON:
+ setMode(_MODE_TO_ON);
+ uartIsolatorSwitch.pullHigh();
+ break;
+ default:
+ break;
+ }
+#else
+ setMode(_MODE_TO_ON);
+#endif /* XIPHOS_Q7S */
+}
+
+void PlocMPSoCHandler::doShutDown() {
+ switch (powerState) {
+ case PowerState::ON:
+ uartIsolatorSwitch.pullLow();
+ commandActionHelper.commandAction(supervisorHandler, supv::SHUTDOWN_MPSOC);
+ powerState = PowerState::SHUTDOWN;
+ break;
+ case PowerState::OFF:
+ setMode(_MODE_POWER_DOWN);
+ break;
+ default:
+ break;
+ }
+}
+
+ReturnValue_t PlocMPSoCHandler::buildNormalDeviceCommand(DeviceCommandId_t* id) {
+ return NOTHING_TO_SEND;
+}
+
+ReturnValue_t PlocMPSoCHandler::buildTransitionDeviceCommand(DeviceCommandId_t* id) {
+ return NOTHING_TO_SEND;
+}
+
+ReturnValue_t PlocMPSoCHandler::buildCommandFromCommand(DeviceCommandId_t deviceCommand,
+ const uint8_t* commandData,
+ size_t commandDataLen) {
+ ReturnValue_t result = RETURN_OK;
+ switch (deviceCommand) {
+ case (mpsoc::TC_MEM_WRITE): {
+ result = prepareTcMemWrite(commandData, commandDataLen);
+ break;
+ }
+ case (mpsoc::TC_MEM_READ): {
+ result = prepareTcMemRead(commandData, commandDataLen);
+ break;
+ }
+ case (mpsoc::TC_FLASHDELETE): {
+ result = prepareTcFlashDelete(commandData, commandDataLen);
+ break;
+ }
+ case (mpsoc::TC_REPLAY_START): {
+ result = prepareTcReplayStart(commandData, commandDataLen);
+ break;
+ }
+ case (mpsoc::TC_REPLAY_STOP): {
+ result = prepareTcReplayStop();
+ break;
+ }
+ case (mpsoc::TC_DOWNLINK_PWR_ON): {
+ result = prepareTcDownlinkPwrOn(commandData, commandDataLen);
+ break;
+ }
+ case (mpsoc::TC_DOWNLINK_PWR_OFF): {
+ result = prepareTcDownlinkPwrOff();
+ break;
+ }
+ case (mpsoc::TC_REPLAY_WRITE_SEQUENCE): {
+ result = prepareTcReplayWriteSequence(commandData, commandDataLen);
+ break;
+ }
+ case (mpsoc::TC_MODE_REPLAY): {
+ result = prepareTcModeReplay();
+ break;
+ }
+ case (mpsoc::TC_MODE_IDLE): {
+ result = prepareTcModeIdle();
+ break;
+ }
+ case (mpsoc::TC_CAM_CMD_SEND): {
+ result = prepareTcCamCmdSend(commandData, commandDataLen);
+ break;
+ }
+ default:
+ sif::debug << "PlocMPSoCHandler::buildCommandFromCommand: Command not implemented"
+ << std::endl;
+ result = DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED;
+ break;
+ }
+
+ if (result == RETURN_OK) {
+ /**
+ * Flushing the receive buffer to make sure there are no data left from a faulty reply.
+ */
+ uartComIf->flushUartRxBuffer(comCookie);
+ }
+
+ return result;
+}
+
+void PlocMPSoCHandler::fillCommandAndReplyMap() {
+ this->insertInCommandMap(mpsoc::TC_MEM_WRITE);
+ this->insertInCommandMap(mpsoc::TC_MEM_READ);
+ this->insertInCommandMap(mpsoc::TC_FLASHDELETE);
+ this->insertInCommandMap(mpsoc::TC_REPLAY_START);
+ this->insertInCommandMap(mpsoc::TC_REPLAY_STOP);
+ this->insertInCommandMap(mpsoc::TC_DOWNLINK_PWR_ON);
+ this->insertInCommandMap(mpsoc::TC_DOWNLINK_PWR_OFF);
+ this->insertInCommandMap(mpsoc::TC_REPLAY_WRITE_SEQUENCE);
+ this->insertInCommandMap(mpsoc::TC_MODE_REPLAY);
+ this->insertInCommandMap(mpsoc::TC_MODE_IDLE);
+ this->insertInCommandMap(mpsoc::TC_CAM_CMD_SEND);
+ this->insertInReplyMap(mpsoc::ACK_REPORT, 3, nullptr, mpsoc::SIZE_ACK_REPORT);
+ this->insertInReplyMap(mpsoc::EXE_REPORT, 3, nullptr, mpsoc::SIZE_EXE_REPORT);
+ this->insertInReplyMap(mpsoc::TM_MEMORY_READ_REPORT, 2, nullptr, mpsoc::SIZE_TM_MEM_READ_REPORT);
+ this->insertInReplyMap(mpsoc::TM_CAM_CMD_RPT, 2, nullptr, SpacePacket::PACKET_MAX_SIZE);
+}
+
+ReturnValue_t PlocMPSoCHandler::scanForReply(const uint8_t* start, size_t remainingSize,
+ DeviceCommandId_t* foundId, size_t* foundLen) {
+ ReturnValue_t result = RETURN_OK;
+
+ SpacePacket spacePacket;
+ std::memcpy(spacePacket.getWholeData(), start, remainingSize);
+ uint16_t apid = spacePacket.getAPID();
+
+ switch (apid) {
+ case (mpsoc::apid::ACK_SUCCESS):
+ *foundLen = mpsoc::SIZE_ACK_REPORT;
+ *foundId = mpsoc::ACK_REPORT;
+ break;
+ case (mpsoc::apid::ACK_FAILURE):
+ *foundLen = mpsoc::SIZE_ACK_REPORT;
+ *foundId = mpsoc::ACK_REPORT;
+ break;
+ case (mpsoc::apid::TM_MEMORY_READ_REPORT):
+ *foundLen = tmMemReadReport.rememberRequestedSize;
+ *foundId = mpsoc::TM_MEMORY_READ_REPORT;
+ break;
+ case (mpsoc::apid::TM_CAM_CMD_RPT):
+ *foundLen = spacePacket.getFullSize();
+ tmCamCmdRpt.rememberSpacePacketSize = *foundLen;
+ *foundId = mpsoc::TM_CAM_CMD_RPT;
+ break;
+ case (mpsoc::apid::EXE_SUCCESS):
+ *foundLen = mpsoc::SIZE_EXE_REPORT;
+ *foundId = mpsoc::EXE_REPORT;
+ break;
+ case (mpsoc::apid::EXE_FAILURE):
+ *foundLen = mpsoc::SIZE_EXE_REPORT;
+ *foundId = mpsoc::EXE_REPORT;
+ break;
+ default: {
+ sif::debug << "PlocMPSoCHandler::scanForReply: Reply has invalid apid" << std::endl;
+ *foundLen = remainingSize;
+ return MPSoCReturnValuesIF::INVALID_APID;
+ }
+ }
+
+ sequenceCount++;
+ uint16_t recvSeqCnt = (*(start + 2) << 8 | *(start + 3)) & PACKET_SEQUENCE_COUNT_MASK;
+ if (recvSeqCnt != sequenceCount) {
+ triggerEvent(MPSOC_HANDLER_SEQ_CNT_MISMATCH, sequenceCount, recvSeqCnt);
+ sequenceCount = recvSeqCnt;
+ }
+ return result;
+}
+
+ReturnValue_t PlocMPSoCHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8_t* packet) {
+ ReturnValue_t result = RETURN_OK;
+
+ switch (id) {
+ case mpsoc::ACK_REPORT: {
+ result = handleAckReport(packet);
+ break;
+ }
+ case (mpsoc::TM_MEMORY_READ_REPORT): {
+ result = handleMemoryReadReport(packet);
+ break;
+ }
+ case (mpsoc::TM_CAM_CMD_RPT): {
+ result = handleCamCmdRpt(packet);
+ break;
+ }
+ case (mpsoc::EXE_REPORT): {
+ result = handleExecutionReport(packet);
+ break;
+ }
+ default: {
+ sif::debug << "PlocMPSoCHandler::interpretDeviceReply: Unknown device reply id" << std::endl;
+ return DeviceHandlerIF::UNKNOWN_DEVICE_REPLY;
+ }
+ }
+
+ return result;
+}
+
+void PlocMPSoCHandler::setNormalDatapoolEntriesInvalid() {}
+
+uint32_t PlocMPSoCHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return 5000; }
+
+ReturnValue_t PlocMPSoCHandler::initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
+ LocalDataPoolManager& poolManager) {
+ return HasReturnvaluesIF::RETURN_OK;
+}
+
+void PlocMPSoCHandler::handleEvent(EventMessage* eventMessage) {
+ object_id_t objectId = eventMessage->getReporter();
+ switch (objectId) {
+ case objects::PLOC_MPSOC_HELPER: {
+ plocMPSoCHelperExecuting = false;
+ break;
+ }
+ default:
+ sif::debug << "PlocMPSoCHandler::handleEvent: Did not subscribe to this event" << std::endl;
+ break;
+ }
+}
+
+ReturnValue_t PlocMPSoCHandler::prepareTcMemWrite(const uint8_t* commandData,
+ size_t commandDataLen) {
+ ReturnValue_t result = RETURN_OK;
+ sequenceCount++;
+ mpsoc::TcMemWrite tcMemWrite(sequenceCount);
+ result = tcMemWrite.createPacket(commandData, commandDataLen);
+ if (result != RETURN_OK) {
+ sequenceCount--;
+ return result;
+ }
+ copyToCommandBuffer(&tcMemWrite);
+ return RETURN_OK;
+}
+
+ReturnValue_t PlocMPSoCHandler::prepareTcMemRead(const uint8_t* commandData,
+ size_t commandDataLen) {
+ ReturnValue_t result = RETURN_OK;
+ sequenceCount++;
+ mpsoc::TcMemRead tcMemRead(sequenceCount);
+ result = tcMemRead.createPacket(commandData, commandDataLen);
+ if (result != RETURN_OK) {
+ sequenceCount--;
+ return result;
+ }
+ copyToCommandBuffer(&tcMemRead);
+ tmMemReadReport.rememberRequestedSize = tcMemRead.getMemLen() * 4 + TmMemReadReport::FIX_SIZE;
+ return RETURN_OK;
+}
+
+ReturnValue_t PlocMPSoCHandler::prepareTcFlashDelete(const uint8_t* commandData,
+ size_t commandDataLen) {
+ if (commandDataLen > config::MAX_PATH_SIZE + config::MAX_FILENAME_SIZE) {
+ return MPSoCReturnValuesIF::NAME_TOO_LONG;
+ }
+ ReturnValue_t result = RETURN_OK;
+ sequenceCount++;
+ mpsoc::TcFlashDelete tcFlashDelete(sequenceCount);
+ result = tcFlashDelete.createPacket(
+ std::string(reinterpret_cast(commandData), commandDataLen));
+ if (result != RETURN_OK) {
+ sequenceCount--;
+ return result;
+ }
+ copyToCommandBuffer(&tcFlashDelete);
+ return RETURN_OK;
+}
+
+ReturnValue_t PlocMPSoCHandler::prepareTcReplayStart(const uint8_t* commandData,
+ size_t commandDataLen) {
+ ReturnValue_t result = RETURN_OK;
+ sequenceCount++;
+ mpsoc::TcReplayStart tcReplayStart(sequenceCount);
+ result = tcReplayStart.createPacket(commandData, commandDataLen);
+ if (result != RETURN_OK) {
+ sequenceCount--;
+ return result;
+ }
+ copyToCommandBuffer(&tcReplayStart);
+ return RETURN_OK;
+}
+
+ReturnValue_t PlocMPSoCHandler::prepareTcReplayStop() {
+ ReturnValue_t result = RETURN_OK;
+ sequenceCount++;
+ mpsoc::TcReplayStop tcReplayStop(sequenceCount);
+ result = tcReplayStop.createPacket();
+ if (result != RETURN_OK) {
+ sequenceCount--;
+ return result;
+ }
+ copyToCommandBuffer(&tcReplayStop);
+ return RETURN_OK;
+}
+
+ReturnValue_t PlocMPSoCHandler::prepareTcDownlinkPwrOn(const uint8_t* commandData,
+ size_t commandDataLen) {
+ ReturnValue_t result = RETURN_OK;
+ sequenceCount++;
+ mpsoc::TcDownlinkPwrOn tcDownlinkPwrOn(sequenceCount);
+ result = tcDownlinkPwrOn.createPacket(commandData, commandDataLen);
+ if (result != RETURN_OK) {
+ sequenceCount--;
+ return result;
+ }
+ copyToCommandBuffer(&tcDownlinkPwrOn);
+ return RETURN_OK;
+}
+
+ReturnValue_t PlocMPSoCHandler::prepareTcDownlinkPwrOff() {
+ ReturnValue_t result = RETURN_OK;
+ sequenceCount++;
+ mpsoc::TcDownlinkPwrOff tcDownlinkPwrOff(sequenceCount);
+ result = tcDownlinkPwrOff.createPacket();
+ if (result != RETURN_OK) {
+ sequenceCount--;
+ return result;
+ }
+ copyToCommandBuffer(&tcDownlinkPwrOff);
+ return RETURN_OK;
+}
+
+ReturnValue_t PlocMPSoCHandler::prepareTcReplayWriteSequence(const uint8_t* commandData,
+ size_t commandDataLen) {
+ ReturnValue_t result = RETURN_OK;
+ sequenceCount++;
+ mpsoc::TcReplayWriteSeq tcReplayWriteSeq(sequenceCount);
+ result = tcReplayWriteSeq.createPacket(commandData, commandDataLen);
+ if (result != RETURN_OK) {
+ sequenceCount--;
+ return result;
+ }
+ copyToCommandBuffer(&tcReplayWriteSeq);
+ return RETURN_OK;
+}
+
+ReturnValue_t PlocMPSoCHandler::prepareTcModeReplay() {
+ ReturnValue_t result = RETURN_OK;
+ sequenceCount++;
+ mpsoc::TcModeReplay tcModeReplay(sequenceCount);
+ result = tcModeReplay.createPacket();
+ if (result != RETURN_OK) {
+ sequenceCount--;
+ return result;
+ }
+ memcpy(commandBuffer, tcModeReplay.getWholeData(), tcModeReplay.getFullSize());
+ rawPacket = commandBuffer;
+ rawPacketLen = tcModeReplay.getFullSize();
+ nextReplyId = mpsoc::ACK_REPORT;
+ return RETURN_OK;
+}
+
+ReturnValue_t PlocMPSoCHandler::prepareTcModeIdle() {
+ ReturnValue_t result = RETURN_OK;
+ sequenceCount++;
+ mpsoc::TcModeIdle tcModeIdle(sequenceCount);
+ result = tcModeIdle.createPacket();
+ if (result != RETURN_OK) {
+ sequenceCount--;
+ return result;
+ }
+ memcpy(commandBuffer, tcModeIdle.getWholeData(), tcModeIdle.getFullSize());
+ rawPacket = commandBuffer;
+ rawPacketLen = tcModeIdle.getFullSize();
+ nextReplyId = mpsoc::ACK_REPORT;
+ return RETURN_OK;
+}
+
+ReturnValue_t PlocMPSoCHandler::prepareTcCamCmdSend(const uint8_t* commandData,
+ size_t commandDataLen) {
+ ReturnValue_t result = RETURN_OK;
+ sequenceCount++;
+ mpsoc::TcCamcmdSend tcCamCmdSend(sequenceCount);
+ result = tcCamCmdSend.createPacket(commandData, commandDataLen);
+ if (result != RETURN_OK) {
+ sequenceCount--;
+ return result;
+ }
+ copyToCommandBuffer(&tcCamCmdSend);
+ nextReplyId = mpsoc::TM_CAM_CMD_RPT;
+ return RETURN_OK;
+}
+
+void PlocMPSoCHandler::copyToCommandBuffer(mpsoc::TcBase* tc) {
+ if (tc == nullptr) {
+ sif::debug << "PlocMPSoCHandler::copyToCommandBuffer: Invalid TC" << std::endl;
+ }
+ memcpy(commandBuffer, tc->getWholeData(), tc->getFullSize());
+ rawPacket = commandBuffer;
+ rawPacketLen = tc->getFullSize();
+ nextReplyId = mpsoc::ACK_REPORT;
+}
+
+ReturnValue_t PlocMPSoCHandler::verifyPacket(const uint8_t* start, size_t foundLen) {
+ uint16_t receivedCrc = *(start + foundLen - 2) << 8 | *(start + foundLen - 1);
+ uint16_t recalculatedCrc = CRC::crc16ccitt(start, foundLen - 2);
+ if (receivedCrc != recalculatedCrc) {
+ return MPSoCReturnValuesIF::CRC_FAILURE;
+ }
+ return RETURN_OK;
+}
+
+ReturnValue_t PlocMPSoCHandler::handleAckReport(const uint8_t* data) {
+ ReturnValue_t result = RETURN_OK;
+
+ result = verifyPacket(data, mpsoc::SIZE_ACK_REPORT);
+ if (result == MPSoCReturnValuesIF::CRC_FAILURE) {
+ sif::warning << "PlocMPSoCHandler::handleAckReport: CRC failure" << std::endl;
+ nextReplyId = mpsoc::NONE;
+ replyRawReplyIfnotWiretapped(data, mpsoc::SIZE_ACK_REPORT);
+ triggerEvent(MPSOC_HANDLER_CRC_FAILURE);
+ sendFailureReport(mpsoc::ACK_REPORT, MPSoCReturnValuesIF::CRC_FAILURE);
+ disableAllReplies();
+ return IGNORE_REPLY_DATA;
+ }
+
+ uint16_t apid = (*(data) << 8 | *(data + 1)) & APID_MASK;
+
+ switch (apid) {
+ case mpsoc::apid::ACK_FAILURE: {
+ // TODO: Interpretation of status field in acknowledgment report
+ sif::debug << "PlocMPSoCHandler::handleAckReport: Received Ack failure report" << std::endl;
+ DeviceCommandId_t commandId = getPendingCommand();
+ uint16_t status = getStatus(data);
+ if (commandId != DeviceHandlerIF::NO_COMMAND_ID) {
+ triggerEvent(ACK_FAILURE, commandId, status);
+ }
+ sendFailureReport(mpsoc::ACK_REPORT, MPSoCReturnValuesIF::RECEIVED_ACK_FAILURE);
+ disableAllReplies();
+ nextReplyId = mpsoc::NONE;
+ result = IGNORE_REPLY_DATA;
+ break;
+ }
+ case mpsoc::apid::ACK_SUCCESS: {
+ setNextReplyId();
+ break;
+ }
+ default: {
+ sif::debug << "PlocMPSoCHandler::handleAckReport: Invalid APID in Ack report" << std::endl;
+ result = RETURN_FAILED;
+ break;
+ }
+ }
+
+ return result;
+}
+
+ReturnValue_t PlocMPSoCHandler::handleExecutionReport(const uint8_t* data) {
+ ReturnValue_t result = RETURN_OK;
+
+ result = verifyPacket(data, mpsoc::SIZE_EXE_REPORT);
+ if (result == MPSoCReturnValuesIF::CRC_FAILURE) {
+ sif::warning << "PlocMPSoCHandler::handleExecutionReport: CRC failure" << std::endl;
+ nextReplyId = mpsoc::NONE;
+ return result;
+ }
+
+ uint16_t apid = (*(data) << 8 | *(data + 1)) & APID_MASK;
+
+ switch (apid) {
+ case (mpsoc::apid::EXE_SUCCESS): {
+ break;
+ }
+ case (mpsoc::apid::EXE_FAILURE): {
+ // TODO: Interpretation of status field in execution report
+ sif::warning << "PlocMPSoCHandler::handleExecutionReport: Received execution failure report"
+ << std::endl;
+ DeviceCommandId_t commandId = getPendingCommand();
+ if (commandId != DeviceHandlerIF::NO_COMMAND_ID) {
+ uint16_t status = getStatus(data);
+ triggerEvent(EXE_FAILURE, commandId, status);
+ } else {
+ sif::debug << "PlocMPSoCHandler::handleExecutionReport: Unknown command id" << std::endl;
+ }
+ printStatus(data);
+ sendFailureReport(mpsoc::EXE_REPORT, MPSoCReturnValuesIF::RECEIVED_EXE_FAILURE);
+ disableExeReportReply();
+ result = IGNORE_REPLY_DATA;
+ break;
+ }
+ default: {
+ sif::warning << "PlocMPSoCHandler::handleExecutionReport: Unknown APID" << std::endl;
+ result = RETURN_FAILED;
+ break;
+ }
+ }
+ nextReplyId = mpsoc::NONE;
+ return result;
+}
+
+ReturnValue_t PlocMPSoCHandler::handleMemoryReadReport(const uint8_t* data) {
+ ReturnValue_t result = RETURN_OK;
+ result = verifyPacket(data, tmMemReadReport.rememberRequestedSize);
+ if (result == MPSoCReturnValuesIF::CRC_FAILURE) {
+ sif::warning << "PlocMPSoCHandler::handleMemoryReadReport: Memory read report has invalid crc"
+ << std::endl;
+ }
+ uint16_t memLen =
+ *(data + mpsoc::MEM_READ_RPT_LEN_OFFSET) << 8 | *(data + mpsoc::MEM_READ_RPT_LEN_OFFSET + 1);
+ /** Send data to commanding queue */
+ handleDeviceTM(data + mpsoc::DATA_FIELD_OFFSET, mpsoc::SIZE_MEM_READ_RPT_FIX + memLen * 4,
+ mpsoc::TM_MEMORY_READ_REPORT);
+ nextReplyId = mpsoc::EXE_REPORT;
+ return result;
+}
+
+ReturnValue_t PlocMPSoCHandler::handleCamCmdRpt(const uint8_t* data) {
+ ReturnValue_t result = RETURN_OK;
+ SpacePacket packet;
+ std::memcpy(packet.getWholeData(), data, tmCamCmdRpt.rememberSpacePacketSize);
+ result = verifyPacket(data, tmCamCmdRpt.rememberSpacePacketSize);
+ if (result == MPSoCReturnValuesIF::CRC_FAILURE) {
+ sif::warning << "PlocMPSoCHandler::handleCamCmdRpt: CRC failure" << std::endl;
+ }
+ const uint8_t* dataFieldPtr = data + mpsoc::SPACE_PACKET_HEADER_SIZE;
+ std::string camCmdRptMsg(reinterpret_cast(
+ dataFieldPtr), tmCamCmdRpt.rememberSpacePacketSize - mpsoc::SPACE_PACKET_HEADER_SIZE - 3);
+ uint8_t ackValue = *(packet.getPacketData() + packet.getPacketDataLength() - 2);
+ sif::info << "CamCmdRpt message: " << camCmdRptMsg << std::endl;
+ sif::info << "CamCmdRpt Ack value: 0x" << std::hex << static_cast(ackValue)
+ << std::endl;
+ handleDeviceTM(packet.getPacketData(), packet.getPacketDataLength() - 1, mpsoc::TM_CAM_CMD_RPT);
+ return result;
+}
+
+ReturnValue_t PlocMPSoCHandler::enableReplyInReplyMap(DeviceCommandMap::iterator command,
+ uint8_t expectedReplies, bool useAlternateId,
+ DeviceCommandId_t alternateReplyID) {
+ ReturnValue_t result = RETURN_OK;
+
+ uint8_t enabledReplies = 0;
+
+ switch (command->first) {
+ case mpsoc::TC_MEM_WRITE:
+ case mpsoc::TC_FLASHDELETE:
+ case mpsoc::TC_REPLAY_START:
+ case mpsoc::TC_REPLAY_STOP:
+ case mpsoc::TC_DOWNLINK_PWR_ON:
+ case mpsoc::TC_DOWNLINK_PWR_OFF:
+ case mpsoc::TC_REPLAY_WRITE_SEQUENCE:
+ case mpsoc::TC_MODE_REPLAY:
+ case mpsoc::TC_MODE_IDLE:
+ enabledReplies = 2;
+ break;
+ case mpsoc::TC_MEM_READ: {
+ enabledReplies = 3;
+ result = DeviceHandlerBase::enableReplyInReplyMap(command, enabledReplies, true,
+ mpsoc::TM_MEMORY_READ_REPORT);
+ if (result != RETURN_OK) {
+ sif::debug << "PlocMPSoCHandler::enableReplyInReplyMap: Reply with id "
+ << mpsoc::TM_MEMORY_READ_REPORT << " not in replyMap" << std::endl;
+ return result;
+ }
+ break;
+ }
+ case mpsoc::TC_CAM_CMD_SEND: {
+ enabledReplies = 3;
+ result = DeviceHandlerBase::enableReplyInReplyMap(command, enabledReplies, true,
+ mpsoc::TM_CAM_CMD_RPT);
+ if (result != RETURN_OK) {
+ sif::debug << "PlocMPSoCHandler::enableReplyInReplyMap: Reply with id "
+ << mpsoc::TM_CAM_CMD_RPT << " not in replyMap" << std::endl;
+ return result;
+ }
+ break;
+ }
+ case mpsoc::OBSW_RESET_SEQ_COUNT:
+ break;
+ default:
+ sif::debug << "PlocMPSoCHandler::enableReplyInReplyMap: Unknown command id" << std::endl;
+ break;
+ }
+
+ /**
+ * Every command causes at least one acknowledgment and one execution report. Therefore both
+ * replies will be enabled here.
+ */
+ result =
+ DeviceHandlerBase::enableReplyInReplyMap(command, enabledReplies, true, mpsoc::ACK_REPORT);
+ if (result != RETURN_OK) {
+ sif::debug << "PlocMPSoCHandler::enableReplyInReplyMap: Reply with id " << mpsoc::ACK_REPORT
+ << " not in replyMap" << std::endl;
+ }
+
+ result =
+ DeviceHandlerBase::enableReplyInReplyMap(command, enabledReplies, true, mpsoc::EXE_REPORT);
+ if (result != RETURN_OK) {
+ sif::debug << "PlocMPSoCHandler::enableReplyInReplyMap: Reply with id " << mpsoc::EXE_REPORT
+ << " not in replyMap" << std::endl;
+ }
+
+ switch (command->first) {
+ case mpsoc::TC_REPLAY_WRITE_SEQUENCE: {
+ DeviceReplyIter iter = deviceReplyMap.find(mpsoc::EXE_REPORT);
+ // Overwrite delay cycles because replay write sequence command can required up to
+ // 30 seconds for execution
+ iter->second.delayCycles = mpsoc::TC_WRITE_SEQ_EXECUTION_DELAY;
+ break;
+ }
+ case mpsoc::TC_DOWNLINK_PWR_ON: {
+ DeviceReplyIter iter = deviceReplyMap.find(mpsoc::EXE_REPORT);
+ //
+ iter->second.delayCycles = mpsoc::TC_DOWNLINK_PWR_ON;
+ break;
+ }
+ default:
+ break;
+ }
+
+ return RETURN_OK;
+}
+
+void PlocMPSoCHandler::setNextReplyId() {
+ switch (getPendingCommand()) {
+ case mpsoc::TC_MEM_READ:
+ nextReplyId = mpsoc::TM_MEMORY_READ_REPORT;
+ break;
+ default:
+ /* If no telemetry is expected the next reply is always the execution report */
+ nextReplyId = mpsoc::EXE_REPORT;
+ break;
+ }
+}
+size_t PlocMPSoCHandler::getNextReplyLength(DeviceCommandId_t commandId) {
+ size_t replyLen = 0;
+
+ if (nextReplyId == mpsoc::NONE) {
+ return replyLen;
+ }
+
+ DeviceReplyIter iter = deviceReplyMap.find(nextReplyId);
+
+ if (iter != deviceReplyMap.end()) {
+ if (iter->second.delayCycles == 0) {
+ /* Reply inactive */
+ return replyLen;
+ }
+ switch (nextReplyId) {
+ case mpsoc::TM_MEMORY_READ_REPORT: {
+ replyLen = tmMemReadReport.rememberRequestedSize;
+ break;
+ }
+ case mpsoc::TM_CAM_CMD_RPT:
+ // Read acknowledgment, camera and execution report in one go because length of camera
+ // report is not fixed
+ replyLen = SpacePacket::PACKET_MAX_SIZE;
+ break;
+ default: {
+ replyLen = iter->second.replyLen;
+ break;
+ }
+ }
+ } else {
+ sif::debug << "PlocMPSoCHandler::getNextReplyLength: No entry for reply with reply id "
+ << std::hex << nextReplyId << " in deviceReplyMap" << std::endl;
+ }
+
+ return replyLen;
+}
+
+MessageQueueIF* PlocMPSoCHandler::getCommandQueuePtr() { return commandActionHelperQueue; }
+
+void PlocMPSoCHandler::stepSuccessfulReceived(ActionId_t actionId, uint8_t step) { return; }
+
+void PlocMPSoCHandler::stepFailedReceived(ActionId_t actionId, uint8_t step,
+ ReturnValue_t returnCode) {
+ switch (actionId) {
+ case supv::START_MPSOC:
+ sif::warning << "PlocMPSoCHandler::stepFailedReceived: Failed to start MPSoC" << std::endl;
+ powerState = PowerState::OFF;
+ break;
+ case supv::SHUTDOWN_MPSOC:
+ triggerEvent(MPSOC_SHUTDOWN_FAILED);
+ sif::warning << "PlocMPSoCHandler::stepFailedReceived: Failed to shutdown MPSoC" << std::endl;
+ // TODO: Setting state to on or off here?
+ powerState = PowerState::ON;
+ break;
+ default:
+ sif::debug << "PlocMPSoCHandler::stepFailedReceived: Received unexpected action reply"
+ << std::endl;
+ break;
+ }
+}
+
+void PlocMPSoCHandler::dataReceived(ActionId_t actionId, const uint8_t* data, uint32_t size) {
+ return;
+}
+
+void PlocMPSoCHandler::completionSuccessfulReceived(ActionId_t actionId) {
+ if (actionId != supv::EXE_REPORT) {
+ sif::debug << "PlocMPSoCHandler::completionSuccessfulReceived: Did not expect this action "
+ << "ID" << std::endl;
+ return;
+ }
+ switch (powerState) {
+ case PowerState::BOOTING: {
+ powerState = PowerState::ON;
+ break;
+ }
+ case PowerState::SHUTDOWN: {
+ powerState = PowerState::OFF;
+ break;
+ }
+ default: {
+ break;
+ }
+ }
+}
+
+void PlocMPSoCHandler::completionFailedReceived(ActionId_t actionId, ReturnValue_t returnCode) {
+ handleActionCommandFailure(actionId);
+}
+
+void PlocMPSoCHandler::handleDeviceTM(const uint8_t* data, size_t dataSize,
+ DeviceCommandId_t replyId) {
+ ReturnValue_t result = RETURN_OK;
+
+ if (wiretappingMode == RAW) {
+ /* Data already sent in doGetRead() */
+ return;
+ }
+
+ DeviceReplyMap::iterator iter = deviceReplyMap.find(replyId);
+ if (iter == deviceReplyMap.end()) {
+ sif::debug << "PlocMPSoCHandler::handleDeviceTM: Unknown reply id" << std::endl;
+ return;
+ }
+ MessageQueueId_t queueId = iter->second.command->second.sendReplyTo;
+
+ if (queueId == NO_COMMANDER) {
+ return;
+ }
+
+ result = actionHelper.reportData(queueId, replyId, data, dataSize);
+ if (result != RETURN_OK) {
+ sif::debug << "PlocMPSoCHandler::handleDeviceTM: Failed to report data" << std::endl;
+ }
+}
+
+void PlocMPSoCHandler::disableAllReplies() {
+ DeviceReplyMap::iterator iter;
+
+ /* Disable ack reply */
+ iter = deviceReplyMap.find(mpsoc::ACK_REPORT);
+ DeviceReplyInfo* info = &(iter->second);
+ info->delayCycles = 0;
+ info->command = deviceCommandMap.end();
+
+ DeviceCommandId_t commandId = getPendingCommand();
+
+ /* If the command expects a telemetry packet the appropriate tm reply will be disabled here */
+ switch (commandId) {
+ case mpsoc::TC_MEM_WRITE:
+ break;
+ case mpsoc::TC_MEM_READ: {
+ iter = deviceReplyMap.find(mpsoc::TM_MEMORY_READ_REPORT);
+ info = &(iter->second);
+ info->delayCycles = 0;
+ info->command = deviceCommandMap.end();
+ break;
+ }
+ default: {
+ sif::debug << "PlocMPSoCHandler::disableAllReplies: Unknown command id" << commandId
+ << std::endl;
+ break;
+ }
+ }
+
+ /* We always need to disable the execution report reply here */
+ disableExeReportReply();
+ nextReplyId = mpsoc::NONE;
+}
+
+void PlocMPSoCHandler::sendFailureReport(DeviceCommandId_t replyId, ReturnValue_t status) {
+ DeviceReplyIter iter = deviceReplyMap.find(replyId);
+ if (iter == deviceReplyMap.end()) {
+ sif::debug << "PlocMPSoCHandler::sendFailureReport: Reply not in reply map" << std::endl;
+ return;
+ }
+ DeviceCommandInfo* info = &(iter->second.command->second);
+ if (info == nullptr) {
+ sif::debug << "PlocMPSoCHandler::sendFailureReport: Reply has no active command" << std::endl;
+ return;
+ }
+ if (info->sendReplyTo != NO_COMMANDER) {
+ actionHelper.finish(false, info->sendReplyTo, iter->first, status);
+ }
+ info->isExecuting = false;
+}
+
+void PlocMPSoCHandler::disableExeReportReply() {
+ DeviceReplyIter iter = deviceReplyMap.find(mpsoc::EXE_REPORT);
+ DeviceReplyInfo* info = &(iter->second);
+ info->delayCycles = 0;
+ info->command = deviceCommandMap.end();
+ /* Expected replies is set to one here. The value will be set to 0 in replyToReply() */
+ info->command->second.expectedReplies = 0;
+}
+
+void PlocMPSoCHandler::printStatus(const uint8_t* data) {
+ uint16_t status = *(data + STATUS_OFFSET) << 8 | *(data + STATUS_OFFSET + 1);
+ sif::info << "Verification report status: 0x" << std::hex << status << std::endl;
+}
+
+uint16_t PlocMPSoCHandler::getStatus(const uint8_t* data) {
+ return *(data + STATUS_OFFSET) << 8 | *(data + STATUS_OFFSET + 1);
+}
+
+void PlocMPSoCHandler::handleActionCommandFailure(ActionId_t actionId) {
+ switch (actionId) {
+ case supv::ACK_REPORT:
+ case supv::EXE_REPORT:
+ break;
+ default:
+ sif::debug << "PlocMPSoCHandler::handleActionCommandFailure: Did not expect this action ID "
+ << std::endl;
+ return;
+ }
+ switch (powerState) {
+ case PowerState::BOOTING: {
+ sif::warning << "PlocMPSoCHandler::handleActionCommandFailure: Failed to boot MPSoC"
+ << std::endl;
+ powerState = PowerState::OFF;
+ break;
+ }
+ case PowerState::SHUTDOWN: {
+ sif::warning << "PlocMPSoCHandler::handleActionCommandFailure: Failed to shutdown MPSoC"
+ << std::endl;
+ powerState = PowerState::ON;
+ break;
+ }
+ default:
+ break;
+ }
+ return;
+}
diff --git a/linux/devices/ploc/PlocMPSoCHandler.h b/linux/devices/ploc/PlocMPSoCHandler.h
new file mode 100644
index 00000000..c4af88d5
--- /dev/null
+++ b/linux/devices/ploc/PlocMPSoCHandler.h
@@ -0,0 +1,262 @@
+#ifndef BSP_Q7S_DEVICES_PLOC_PLOCMPSOCHANDLER_H_
+#define BSP_Q7S_DEVICES_PLOC_PLOCMPSOCHANDLER_H_
+
+#include
+
+#include "PlocMPSoCHelper.h"
+#include "fsfw/tmtcpacket/SpacePacket.h"
+#include "fsfw/action/CommandActionHelper.h"
+#include "fsfw/action/CommandsActionsIF.h"
+#include "fsfw/devicehandlers/DeviceHandlerBase.h"
+#include "fsfw/ipc/QueueFactory.h"
+#include "fsfw/tmtcservices/SourceSequenceCounter.h"
+#include "fsfw_hal/linux/gpio/Gpio.h"
+#include "fsfw_hal/linux/uart/UartComIF.h"
+#include "linux/devices/devicedefinitions/MPSoCReturnValuesIF.h"
+#include "linux/devices/devicedefinitions/PlocMPSoCDefinitions.h"
+
+/**
+ * @brief This is the device handler for the MPSoC of the payload computer.
+ *
+ * @details The PLOC uses the space packet protocol for communication. Each command will be
+ * answered with at least one acknowledgment and one execution report.
+ * Flight manual:
+ * https://egit.irs.uni-stuttgart.de/redmine/projects/eive-flight-manual/wiki/PLOC_MPSoC ICD:
+ * https://eive-cloud.irs.uni-stuttgart.de/index.php/apps/files/?dir=/EIVE_TAS-ILH-IRS/ICD-PLOC/ILH&fileid=1030263
+ *
+ * @note The sequence count in the space packets must be incremented with each received and sent
+ * packet otherwise the MPSoC will reply with an acknowledgment failure report.
+ *
+ * @author J. Meier
+ */
+class PlocMPSoCHandler : public DeviceHandlerBase, public CommandsActionsIF {
+ public:
+ /**
+ * @brief Constructor
+ *
+ * @param ojectId Object ID of the MPSoC handler
+ * @param uartcomIFid Object ID of the UART communication interface
+ * @param comCookie UART communication cookie
+ * @param plocMPSoCHelper Pointer to MPSoC helper object
+ * @param uartIsolatorSwitch Gpio object representing the GPIO connected to the UART isolator
+ * module in the programmable logic
+ * @param supervisorHandler Object ID of the supervisor handler
+ */
+ PlocMPSoCHandler(object_id_t objectId, object_id_t uartComIFid, CookieIF* comCookie,
+ PlocMPSoCHelper* plocMPSoCHelper, Gpio uartIsolatorSwitch,
+ object_id_t supervisorHandler);
+ virtual ~PlocMPSoCHandler();
+ virtual ReturnValue_t initialize() override;
+ ReturnValue_t executeAction(ActionId_t actionId, MessageQueueId_t commandedBy,
+ const uint8_t* data, size_t size) override;
+ void performOperationHook() override;
+ MessageQueueIF* getCommandQueuePtr() override;
+ void stepSuccessfulReceived(ActionId_t actionId, uint8_t step) override;
+ void stepFailedReceived(ActionId_t actionId, uint8_t step, ReturnValue_t returnCode) override;
+ void dataReceived(ActionId_t actionId, const uint8_t* data, uint32_t size) override;
+ void completionSuccessfulReceived(ActionId_t actionId) override;
+ void completionFailedReceived(ActionId_t actionId, ReturnValue_t returnCode) override;
+
+ protected:
+ void doStartUp() override;
+ void doShutDown() override;
+ ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t* id) override;
+ ReturnValue_t buildTransitionDeviceCommand(DeviceCommandId_t* id) override;
+ void fillCommandAndReplyMap() override;
+ ReturnValue_t buildCommandFromCommand(DeviceCommandId_t deviceCommand, const uint8_t* commandData,
+ size_t commandDataLen) override;
+ ReturnValue_t scanForReply(const uint8_t* start, size_t remainingSize, DeviceCommandId_t* foundId,
+ size_t* foundLen) override;
+ ReturnValue_t interpretDeviceReply(DeviceCommandId_t id, const uint8_t* packet) override;
+ void setNormalDatapoolEntriesInvalid() override;
+ uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override;
+ ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
+ LocalDataPoolManager& poolManager) override;
+ ReturnValue_t enableReplyInReplyMap(DeviceCommandMap::iterator command,
+ uint8_t expectedReplies = 1, bool useAlternateId = false,
+ DeviceCommandId_t alternateReplyID = 0) override;
+ size_t getNextReplyLength(DeviceCommandId_t deviceCommand) override;
+
+ private:
+ static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::PLOC_MPSOC_HANDLER;
+
+ //! [EXPORT] : [COMMENT] PLOC crc failure in telemetry packet
+ static const Event MEMORY_READ_RPT_CRC_FAILURE = MAKE_EVENT(1, severity::LOW);
+ //! [EXPORT] : [COMMENT] PLOC receive acknowledgment failure report
+ //! P1: Command Id which leads the acknowledgment failure report
+ //! P2: The status field inserted by the MPSoC into the data field
+ static const Event ACK_FAILURE = MAKE_EVENT(2, severity::LOW);
+ //! [EXPORT] : [COMMENT] PLOC receive execution failure report
+ //! P1: Command Id which leads the execution failure report
+ //! P2: The status field inserted by the MPSoC into the data field
+ static const Event EXE_FAILURE = MAKE_EVENT(3, severity::LOW);
+ //! [EXPORT] : [COMMENT] PLOC reply has invalid crc
+ static const Event MPSOC_HANDLER_CRC_FAILURE = MAKE_EVENT(4, severity::LOW);
+ //! [EXPORT] : [COMMENT] Packet sequence count in received space packet does not match expected
+ //! count P1: Expected sequence count P2: Received sequence count
+ static const Event MPSOC_HANDLER_SEQ_CNT_MISMATCH = MAKE_EVENT(5, severity::LOW);
+ //! [EXPORT] : [COMMENT] Supervisor fails to shutdown MPSoC. Requires to power off the PLOC and
+ //! thus also to shutdown the supervisor.
+ static const Event MPSOC_SHUTDOWN_FAILED = MAKE_EVENT(6, severity::HIGH);
+
+ static const uint16_t APID_MASK = 0x7FF;
+ static const uint16_t PACKET_SEQUENCE_COUNT_MASK = 0x3FFF;
+ static const uint8_t STATUS_OFFSET = 10;
+
+ MessageQueueIF* eventQueue = nullptr;
+ MessageQueueIF* commandActionHelperQueue = nullptr;
+
+ SourceSequenceCounter sequenceCount;
+
+ uint8_t commandBuffer[mpsoc::MAX_COMMAND_SIZE];
+
+ /**
+ * This variable is used to store the id of the next reply to receive. This is necessary
+ * because the PLOC sends as reply to each command at least one acknowledgment and execution
+ * report.
+ */
+ DeviceCommandId_t nextReplyId = mpsoc::NONE;
+
+ UartComIF* uartComIf = nullptr;
+
+ PlocMPSoCHelper* plocMPSoCHelper = nullptr;
+ Gpio uartIsolatorSwitch;
+ object_id_t supervisorHandler = 0;
+ CommandActionHelper commandActionHelper;
+
+ // Used to block incoming commands when MPSoC helper class is currently executing a command
+ bool plocMPSoCHelperExecuting = false;
+
+ struct TmMemReadReport {
+ static const uint8_t FIX_SIZE = 14;
+ size_t rememberRequestedSize = 0;
+ };
+
+ TmMemReadReport tmMemReadReport;
+
+ struct TmCamCmdRpt {
+ size_t rememberSpacePacketSize = 0;
+ };
+
+ TmCamCmdRpt tmCamCmdRpt;
+
+ struct TelemetryBuffer {
+ uint16_t length = 0;
+ uint8_t buffer[SpacePacket::PACKET_MAX_SIZE];
+ };
+
+ TelemetryBuffer tmBuffer;
+
+ enum class PowerState { OFF, BOOTING, SHUTDOWN, ON };
+
+ PowerState powerState = PowerState::OFF;
+
+ /**
+ * @brief Handles events received from the PLOC MPSoC helper
+ */
+ void handleEvent(EventMessage* eventMessage);
+
+ ReturnValue_t prepareTcMemWrite(const uint8_t* commandData, size_t commandDataLen);
+ ReturnValue_t prepareTcMemRead(const uint8_t* commandData, size_t commandDataLen);
+ ReturnValue_t prepareTcFlashDelete(const uint8_t* commandData, size_t commandDataLen);
+ ReturnValue_t prepareTcReplayStart(const uint8_t* commandData, size_t commandDataLen);
+ ReturnValue_t prepareTcReplayStop();
+ ReturnValue_t prepareTcDownlinkPwrOn(const uint8_t* commandData, size_t commandDataLen);
+ ReturnValue_t prepareTcDownlinkPwrOff();
+ ReturnValue_t prepareTcReplayWriteSequence(const uint8_t* commandData, size_t commandDataLen);
+ ReturnValue_t prepareTcCamCmdSend(const uint8_t* commandData, size_t commandDataLen);
+ ReturnValue_t prepareTcModeIdle();
+ /**
+ * @brief Copies space packet into command buffer
+ */
+ void copyToCommandBuffer(mpsoc::TcBase* tc);
+
+ /**
+ * @brief This function checks the crc of the received PLOC reply.
+ *
+ * @param start Pointer to the first byte of the reply.
+ * @param foundLen Pointer to the length of the whole packet.
+ *
+ * @return RETURN_OK if CRC is ok, otherwise CRC_FAILURE.
+ */
+ ReturnValue_t verifyPacket(const uint8_t* start, size_t foundLen);
+
+ /**
+ * @brief This function handles the acknowledgment report.
+ *
+ * @param data Pointer to the data holding the acknowledgment report.
+ *
+ * @return RETURN_OK if successful, otherwise an error code.
+ */
+ ReturnValue_t handleAckReport(const uint8_t* data);
+
+ /**
+ * @brief This function handles the data of a execution report.
+ *
+ * @param data Pointer to the received data packet.
+ *
+ * @return RETURN_OK if successful, otherwise an error code.
+ */
+ ReturnValue_t handleExecutionReport(const uint8_t* data);
+
+ /**
+ * @brief This function handles the memory read report.
+ *
+ * @param data Pointer to the data buffer holding the memory read report.
+ *
+ * @return RETURN_OK if successful, otherwise an error code.
+ */
+ ReturnValue_t handleMemoryReadReport(const uint8_t* data);
+
+ ReturnValue_t handleCamCmdRpt(const uint8_t* data);
+
+ /**
+ * @brief Depending on the current active command, this function sets the reply id of the
+ * next reply after a successful acknowledgment report has been received. This is
+ * required by the function getNextReplyLength() to identify the length of the next
+ * reply to read.
+ */
+ void setNextReplyId();
+
+ /**
+ * @brief This function handles action message replies in case the telemetry has been
+ * requested by another object.
+ *
+ * @param data Pointer to the telemetry data.
+ * @param dataSize Size of telemetry in bytes.
+ * @param replyId Id of the reply. This will be added to the ActionMessage.
+ */
+ void handleDeviceTM(const uint8_t* data, size_t dataSize, DeviceCommandId_t replyId);
+
+ /**
+ * @brief In case an acknowledgment failure reply has been received this function disables
+ * all previously enabled commands and resets the exepected replies variable of an
+ * active command.
+ */
+ void disableAllReplies();
+
+ /**
+ * @brief This function sends a failure report if the active action was commanded by an other
+ * object.
+ *
+ * @param replyId The id of the reply which signals a failure.
+ * @param status A status byte which gives information about the failure type.
+ */
+ void sendFailureReport(DeviceCommandId_t replyId, ReturnValue_t status);
+
+ /**
+ * @brief This function disables the execution report reply. Within this function also the
+ * the variable expectedReplies of an active command will be set to 0.
+ */
+ void disableExeReportReply();
+
+ void printStatus(const uint8_t* data);
+
+ ReturnValue_t prepareTcModeReplay();
+
+ uint16_t getStatus(const uint8_t* data);
+
+ void handleActionCommandFailure(ActionId_t actionId);
+};
+
+#endif /* BSP_Q7S_DEVICES_PLOC_PLOCMPSOCHANDLER_H_ */
diff --git a/linux/devices/ploc/PlocMPSoCHelper.cpp b/linux/devices/ploc/PlocMPSoCHelper.cpp
new file mode 100644
index 00000000..e940e8f3
--- /dev/null
+++ b/linux/devices/ploc/PlocMPSoCHelper.cpp
@@ -0,0 +1,321 @@
+#include "PlocMPSoCHelper.h"
+
+#include
+#include
+
+#include "OBSWConfig.h"
+#ifdef XIPHOS_Q7S
+#include "bsp_q7s/memory/FilesystemHelper.h"
+#endif
+
+#include "mission/utility/Timestamp.h"
+
+PlocMPSoCHelper::PlocMPSoCHelper(object_id_t objectId) : SystemObject(objectId) {}
+
+PlocMPSoCHelper::~PlocMPSoCHelper() {}
+
+ReturnValue_t PlocMPSoCHelper::initialize() {
+#ifdef XIPHOS_Q7S
+ sdcMan = SdCardManager::instance();
+ if (sdcMan == nullptr) {
+ sif::warning << "PlocMPSoCHelper::initialize: Invalid SD Card Manager" << std::endl;
+ return RETURN_FAILED;
+ }
+#endif
+ return RETURN_OK;
+}
+
+ReturnValue_t PlocMPSoCHelper::performOperation(uint8_t operationCode) {
+ ReturnValue_t result = RETURN_OK;
+ semaphore.acquire();
+ while (true) {
+ switch (internalState) {
+ case InternalState::IDLE: {
+ semaphore.acquire();
+ break;
+ }
+ case InternalState::FLASH_WRITE: {
+ result = performFlashWrite();
+ if (result == RETURN_OK) {
+ triggerEvent(MPSOC_FLASH_WRITE_SUCCESSFUL);
+ } else {
+ triggerEvent(MPSOC_FLASH_WRITE_FAILED);
+ }
+ internalState = InternalState::IDLE;
+ break;
+ }
+ default:
+ sif::debug << "PlocMPSoCHelper::performOperation: Invalid state" << std::endl;
+ break;
+ }
+ }
+}
+
+ReturnValue_t PlocMPSoCHelper::setComIF(DeviceCommunicationIF* communicationInterface_) {
+ uartComIF = dynamic_cast(communicationInterface_);
+ if (uartComIF == nullptr) {
+ sif::warning << "PlocMPSoCHelper::initialize: Invalid uart com if" << std::endl;
+ return RETURN_FAILED;
+ }
+ return RETURN_OK;
+}
+
+void PlocMPSoCHelper::setComCookie(CookieIF* comCookie_) { comCookie = comCookie_; }
+
+void PlocMPSoCHelper::setSequenceCount(SourceSequenceCounter* sequenceCount_) {
+ sequenceCount = sequenceCount_;
+}
+
+ReturnValue_t PlocMPSoCHelper::startFlashWrite(std::string obcFile, std::string mpsocFile) {
+ ReturnValue_t result = RETURN_OK;
+#ifdef XIPHOS_Q7S
+ result = FilesystemHelper::checkPath(obcFile);
+ if (result != RETURN_OK) {
+ return result;
+ }
+ result = FilesystemHelper::fileExists(mpsocFile);
+ if (result != RETURN_OK) {
+ return result;
+ }
+#endif
+#ifdef TE0720_1CFA
+ if (not std::filesystem::exists(obcFile)) {
+ sif::warning << "PlocMPSoCHelper::startFlashWrite: File " << obcFile << "does not exist"
+ << std::endl;
+ return RETURN_FAILED;
+ }
+#endif
+
+ flashWrite.obcFile = obcFile;
+ flashWrite.mpsocFile = mpsocFile;
+ internalState = InternalState::FLASH_WRITE;
+ result = resetHelper();
+ if (result != RETURN_OK) {
+ return result;
+ }
+ return result;
+}
+
+ReturnValue_t PlocMPSoCHelper::resetHelper() {
+ ReturnValue_t result = RETURN_OK;
+ semaphore.release();
+ terminate = false;
+ result = uartComIF->flushUartRxBuffer(comCookie);
+ return result;
+}
+
+void PlocMPSoCHelper::stopProcess() { terminate = true; }
+
+ReturnValue_t PlocMPSoCHelper::performFlashWrite() {
+ ReturnValue_t result = RETURN_OK;
+ result = flashfopen();
+ if (result != RETURN_OK) {
+ return result;
+ }
+ uint8_t tempData[mpsoc::MAX_DATA_SIZE];
+ std::ifstream file(flashWrite.obcFile, std::ifstream::binary);
+ // Set position of next character to end of file input stream
+ file.seekg(0, file.end);
+ // tellg returns position of character in input stream
+ size_t remainingSize = file.tellg();
+ size_t dataLength = 0;
+ size_t bytesRead = 0;
+ while (remainingSize > 0) {
+ if (terminate) {
+ return RETURN_OK;
+ }
+ if (remainingSize > mpsoc::MAX_DATA_SIZE) {
+ dataLength = mpsoc::MAX_DATA_SIZE;
+ } else {
+ dataLength = remainingSize;
+ }
+ if (file.is_open()) {
+ file.seekg(bytesRead, file.beg);
+ file.read(reinterpret_cast(tempData), dataLength);
+ bytesRead += dataLength;
+ remainingSize -= dataLength;
+ } else {
+ return FILE_CLOSED_ACCIDENTALLY;
+ }
+ (*sequenceCount)++;
+ mpsoc::TcFlashWrite tc(*sequenceCount);
+ tc.createPacket(tempData, dataLength);
+ result = handlePacketTransmission(tc);
+ if (result != RETURN_OK) {
+ return result;
+ }
+ }
+ result = flashfclose();
+ if (result != RETURN_OK) {
+ return result;
+ }
+ return result;
+}
+
+ReturnValue_t PlocMPSoCHelper::flashfopen() {
+ ReturnValue_t result = RETURN_OK;
+ (*sequenceCount)++;
+ mpsoc::FlashFopen flashFopen(*sequenceCount);
+ result = flashFopen.createPacket(flashWrite.mpsocFile, mpsoc::FlashFopen::APPEND);
+ if (result != RETURN_OK) {
+ return result;
+ }
+ result = handlePacketTransmission(flashFopen);
+ if (result != RETURN_OK) {
+ return result;
+ }
+ return RETURN_OK;
+}
+
+ReturnValue_t PlocMPSoCHelper::flashfclose() {
+ ReturnValue_t result = RETURN_OK;
+ (*sequenceCount)++;
+ mpsoc::FlashFclose flashFclose(*sequenceCount);
+ result = flashFclose.createPacket(flashWrite.mpsocFile);
+ if (result != RETURN_OK) {
+ return result;
+ }
+ result = handlePacketTransmission(flashFclose);
+ if (result != RETURN_OK) {
+ return result;
+ }
+ return RETURN_OK;
+}
+
+ReturnValue_t PlocMPSoCHelper::handlePacketTransmission(mpsoc::TcBase& tc) {
+ ReturnValue_t result = RETURN_OK;
+ result = sendCommand(tc);
+ if (result != RETURN_OK) {
+ return result;
+ }
+ result = handleAck();
+ if (result != RETURN_OK) {
+ return result;
+ }
+ result = handleExe();
+ if (result != RETURN_OK) {
+ return result;
+ }
+ return RETURN_OK;
+}
+
+ReturnValue_t PlocMPSoCHelper::sendCommand(mpsoc::TcBase& tc) {
+ ReturnValue_t result = RETURN_OK;
+ result = uartComIF->sendMessage(comCookie, tc.getWholeData(), tc.getFullSize());
+ if (result != RETURN_OK) {
+ sif::warning << "PlocMPSoCHelper::sendCommand: Failed to send command" << std::endl;
+ triggerEvent(SENDING_COMMAND_FAILED, result, static_cast(internalState));
+ return result;
+ }
+ return result;
+}
+
+ReturnValue_t PlocMPSoCHelper::handleAck() {
+ ReturnValue_t result = RETURN_OK;
+ mpsoc::TmPacket tmPacket;
+ result = handleTmReception(&tmPacket, mpsoc::SIZE_ACK_REPORT);
+ if (result != RETURN_OK) {
+ return result;
+ }
+ uint16_t apid = tmPacket.getAPID();
+ if (apid != mpsoc::apid::ACK_SUCCESS) {
+ handleAckApidFailure(apid);
+ return RETURN_FAILED;
+ }
+ return RETURN_OK;
+}
+
+void PlocMPSoCHelper::handleAckApidFailure(uint16_t apid) {
+ if (apid == mpsoc::apid::ACK_FAILURE) {
+ triggerEvent(ACK_FAILURE_REPORT, static_cast(internalState));
+ sif::warning << "PlocMPSoCHelper::handleAckApidFailure: Received acknowledgement failure "
+ << "report" << std::endl;
+ } else {
+ triggerEvent(ACK_INVALID_APID, apid, static_cast(internalState));
+ sif::warning << "PlocMPSoCHelper::handleAckApidFailure: Expected acknowledgement report "
+ << "but received space packet with apid " << std::hex << apid << std::endl;
+ }
+}
+
+ReturnValue_t PlocMPSoCHelper::handleExe() {
+ ReturnValue_t result = RETURN_OK;
+ mpsoc::TmPacket tmPacket;
+ result = handleTmReception(&tmPacket, mpsoc::SIZE_EXE_REPORT);
+ if (result != RETURN_OK) {
+ return result;
+ }
+ uint16_t apid = tmPacket.getAPID();
+ if (apid != mpsoc::apid::EXE_SUCCESS) {
+ handleExeApidFailure(apid);
+ return RETURN_FAILED;
+ }
+ return RETURN_OK;
+}
+
+void PlocMPSoCHelper::handleExeApidFailure(uint16_t apid) {
+ if (apid == mpsoc::apid::EXE_FAILURE) {
+ triggerEvent(EXE_FAILURE_REPORT, static_cast(internalState));
+ sif::warning << "PlocMPSoCHelper::handleExeApidFailure: Received execution failure "
+ << "report" << std::endl;
+ } else {
+ triggerEvent(EXE_INVALID_APID, apid, static_cast(internalState));
+ sif::warning << "PlocMPSoCHelper::handleExeApidFailure: Expected execution report "
+ << "but received space packet with apid " << std::hex << apid << std::endl;
+ }
+}
+
+ReturnValue_t PlocMPSoCHelper::handleTmReception(mpsoc::TmPacket* tmPacket, size_t remainingBytes) {
+ ReturnValue_t result = RETURN_OK;
+ size_t readBytes = 0;
+ size_t currentBytes = 0;
+ for (int retries = 0; retries < RETRIES; retries++) {
+ result = receive(tmPacket->getWholeData() + readBytes, ¤tBytes, remainingBytes);
+ if (result != RETURN_OK) {
+ return result;
+ }
+ readBytes += currentBytes;
+ remainingBytes = remainingBytes - currentBytes;
+ if (remainingBytes == 0) {
+ break;
+ }
+ }
+ if (remainingBytes != 0) {
+ sif::warning << "PlocMPSoCHelper::handleTmReception: Failed to receive reply" << std::endl;
+ triggerEvent(MISSING_EXE, remainingBytes, static_cast(internalState));
+ return RETURN_FAILED;
+ }
+ result = tmPacket->checkCrc();
+ if (result != RETURN_OK) {
+ sif::warning << "PlocMPSoCHelper::handleTmReception: CRC check failed" << std::endl;
+ return result;
+ }
+ (*sequenceCount)++;
+ uint16_t recvSeqCnt = tmPacket->getPacketSequenceCount();
+ if (recvSeqCnt != *sequenceCount) {
+ triggerEvent(MPSOC_HELPER_SEQ_CNT_MISMATCH, *sequenceCount, recvSeqCnt);
+ *sequenceCount = recvSeqCnt;
+ }
+ return result;
+}
+
+ReturnValue_t PlocMPSoCHelper::receive(uint8_t* data, size_t* readBytes, size_t requestBytes) {
+ ReturnValue_t result = RETURN_OK;
+ uint8_t* buffer = nullptr;
+ result = uartComIF->requestReceiveMessage(comCookie, requestBytes);
+ if (result != RETURN_OK) {
+ sif::warning << "PlocMPSoCHelper::receive: Failed to request reply" << std::endl;
+ triggerEvent(MPSOC_HELPER_REQUESTING_REPLY_FAILED, result,
+ static_cast(static_cast(internalState)));
+ return RETURN_FAILED;
+ }
+ result = uartComIF->readReceivedMessage(comCookie, &buffer, readBytes);
+ if (result != RETURN_OK) {
+ sif::warning << "PlocMPSoCHelper::receive: Failed to read received message" << std::endl;
+ triggerEvent(MPSOC_HELPER_READING_REPLY_FAILED, result, static_cast(internalState));
+ return RETURN_FAILED;
+ }
+ if (*readBytes > 0) {
+ std::memcpy(data, buffer, *readBytes);
+ }
+ return result;
+}
diff --git a/linux/devices/ploc/PlocMPSoCHelper.h b/linux/devices/ploc/PlocMPSoCHelper.h
new file mode 100644
index 00000000..4cb882c7
--- /dev/null
+++ b/linux/devices/ploc/PlocMPSoCHelper.h
@@ -0,0 +1,153 @@
+#ifndef BSP_Q7S_DEVICES_PLOCMPSOCHELPER_H_
+#define BSP_Q7S_DEVICES_PLOCMPSOCHELPER_H_
+
+#include
+
+#include "fsfw/devicehandlers/CookieIF.h"
+#include "fsfw/objectmanager/SystemObject.h"
+#include "fsfw/osal/linux/BinarySemaphore.h"
+#include "fsfw/returnvalues/HasReturnvaluesIF.h"
+#include "fsfw/tasks/ExecutableObjectIF.h"
+#include "fsfw/tmtcservices/SourceSequenceCounter.h"
+#include "fsfw_hal/linux/uart/UartComIF.h"
+#include "linux/devices/devicedefinitions/PlocMPSoCDefinitions.h"
+#ifdef XIPHOS_Q7S
+#include "bsp_q7s/memory/SdCardManager.h"
+#endif
+
+/**
+ * @brief Helper class for MPSoC of PLOC intended to accelerate large data transfers between
+ * MPSoC and OBC.
+ * @author J. Meier
+ */
+class PlocMPSoCHelper : public SystemObject, public ExecutableObjectIF, public HasReturnvaluesIF {
+ public:
+ static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::PLOC_MPSOC_HELPER;
+
+ //! [EXPORT] : [COMMENT] Flash write fails
+ static const Event MPSOC_FLASH_WRITE_FAILED = MAKE_EVENT(0, severity::LOW);
+ //! [EXPORT] : [COMMENT] Flash write successful
+ static const Event MPSOC_FLASH_WRITE_SUCCESSFUL = MAKE_EVENT(1, severity::LOW);
+ //! [EXPORT] : [COMMENT] Communication interface returned failure when trying to send the command
+ //! ot the PLOC
+ //! P1: Return value returned by the communication interface sendMessage function
+ //! P2: Internal state of MPSoC helper
+ static const Event SENDING_COMMAND_FAILED = MAKE_EVENT(2, severity::LOW);
+ //! [EXPORT] : [COMMENT] Request receive message of communication interface failed
+ //! P1: Return value returned by the communication interface requestReceiveMessage function
+ //! P2: Internal state of MPSoC helper
+ static const Event MPSOC_HELPER_REQUESTING_REPLY_FAILED = MAKE_EVENT(3, severity::LOW);
+ //! [EXPORT] : [COMMENT] Reading receive message of communication interface failed
+ //! P1: Return value returned by the communication interface readingReceivedMessage function
+ //! P2: Internal state of MPSoC helper
+ static const Event MPSOC_HELPER_READING_REPLY_FAILED = MAKE_EVENT(4, severity::LOW);
+ //! [EXPORT] : [COMMENT] Did not receive acknowledgement report
+ //! P1: Number of bytes missing
+ //! P2: Internal state of MPSoC helper
+ static const Event MISSING_ACK = MAKE_EVENT(5, severity::LOW);
+ //! [EXPORT] : [COMMENT] Did not receive execution report
+ //! P1: Number of bytes missing
+ //! P2: Internal state of MPSoC helper
+ static const Event MISSING_EXE = MAKE_EVENT(6, severity::LOW);
+ //! [EXPORT] : [COMMENT] Received acknowledgement failure report
+ //! P1: Internal state of MPSoC
+ static const Event ACK_FAILURE_REPORT = MAKE_EVENT(7, severity::LOW);
+ //! [EXPORT] : [COMMENT] Received execution failure report
+ //! P1: Internal state of MPSoC
+ static const Event EXE_FAILURE_REPORT = MAKE_EVENT(8, severity::LOW);
+ //! [EXPORT] : [COMMENT] Expected acknowledgement report but received space packet with other apid
+ //! P1: Apid of received space packet
+ //! P2: Internal state of MPSoC
+ static const Event ACK_INVALID_APID = MAKE_EVENT(9, severity::LOW);
+ //! [EXPORT] : [COMMENT] Expected execution report but received space packet with other apid
+ //! P1: Apid of received space packet
+ //! P2: Internal state of MPSoC
+ static const Event EXE_INVALID_APID = MAKE_EVENT(10, severity::LOW);
+ //! [EXPORT] : [COMMENT] Received sequence count does not match expected sequence count
+ //! P1: Expected sequence count
+ //! P2: Received sequence count
+ static const Event MPSOC_HELPER_SEQ_CNT_MISMATCH = MAKE_EVENT(11, severity::LOW);
+
+ PlocMPSoCHelper(object_id_t objectId);
+ virtual ~PlocMPSoCHelper();
+
+ ReturnValue_t initialize() override;
+ ReturnValue_t performOperation(uint8_t operationCode = 0) override;
+
+ ReturnValue_t setComIF(DeviceCommunicationIF* communicationInterface_);
+ void setComCookie(CookieIF* comCookie_);
+
+ /**
+ * @brief Starts flash write sequence
+ *
+ * @param obcFile File where to read from the data
+ * @param mpsocFile The file of the MPSoC where should be written to
+ *
+ * @return RETURN_OK if successful, otherwise error return value
+ */
+ ReturnValue_t startFlashWrite(std::string obcFile, std::string mpsocFile);
+
+ /**
+ * @brief Can be used to interrupt a running data transfer.
+ */
+ void stopProcess();
+
+ /**
+ * @brief Sets the sequence count object responsible for the sequence count handling
+ */
+ void setSequenceCount(SourceSequenceCounter* sequenceCount_);
+
+ private:
+ static const uint8_t INTERFACE_ID = CLASS_ID::PLOC_MPSOC_HELPER;
+
+ //! [EXPORT] : [COMMENT] File accidentally close
+ static const ReturnValue_t FILE_CLOSED_ACCIDENTALLY = MAKE_RETURN_CODE(0xA0);
+
+ // Maximum number of times the communication interface retries polling data from the reply
+ // buffer
+ static const int RETRIES = 10000;
+
+ struct FlashWrite {
+ std::string obcFile;
+ std::string mpsocFile;
+ };
+
+ struct FlashWrite flashWrite;
+
+ enum class InternalState { IDLE, FLASH_WRITE, FLASH_READ };
+
+ InternalState internalState = InternalState::IDLE;
+
+ BinarySemaphore semaphore;
+#ifdef XIPHOS_Q7S
+ SdCardManager* sdcMan = nullptr;
+#endif
+ uint8_t commandBuffer[mpsoc::MAX_COMMAND_SIZE];
+
+ bool terminate = false;
+
+ /**
+ * Communication interface of MPSoC responsible for low level access. Must be set by the
+ * MPSoC Handler.
+ */
+ UartComIF* uartComIF = nullptr;
+ // Communication cookie. Must be set by the MPSoC Handler
+ CookieIF* comCookie = nullptr;
+ // Sequence count, must be set by Ploc MPSoC Handler
+ SourceSequenceCounter* sequenceCount;
+
+ ReturnValue_t resetHelper();
+ ReturnValue_t performFlashWrite();
+ ReturnValue_t flashfopen();
+ ReturnValue_t flashfclose();
+ ReturnValue_t handlePacketTransmission(mpsoc::TcBase& tc);
+ ReturnValue_t sendCommand(mpsoc::TcBase& tc);
+ ReturnValue_t receive(uint8_t* data, size_t* readBytes, size_t requestBytes);
+ ReturnValue_t handleAck();
+ ReturnValue_t handleExe();
+ void handleAckApidFailure(uint16_t apid);
+ void handleExeApidFailure(uint16_t apid);
+ ReturnValue_t handleTmReception(mpsoc::TmPacket* tmPacket, size_t remainingBytes);
+};
+
+#endif /* BSP_Q7S_DEVICES_PLOCMPSOCHELPER_H_ */
diff --git a/bsp_q7s/devices/PlocMemoryDumper.cpp b/linux/devices/ploc/PlocMemoryDumper.cpp
similarity index 95%
rename from bsp_q7s/devices/PlocMemoryDumper.cpp
rename to linux/devices/ploc/PlocMemoryDumper.cpp
index 1d5dce85..a73a2606 100644
--- a/bsp_q7s/devices/PlocMemoryDumper.cpp
+++ b/linux/devices/ploc/PlocMemoryDumper.cpp
@@ -105,10 +105,10 @@ void PlocMemoryDumper::doStateMachine() {
case State::IDLE:
break;
case State::COMMAND_FIRST_MRAM_DUMP:
- commandNextMramDump(PLOC_SPV::FIRST_MRAM_DUMP);
+ commandNextMramDump(supv::FIRST_MRAM_DUMP);
break;
case State::COMMAND_CONSECUTIVE_MRAM_DUMP:
- commandNextMramDump(PLOC_SPV::CONSECUTIVE_MRAM_DUMP);
+ commandNextMramDump(supv::CONSECUTIVE_MRAM_DUMP);
break;
case State::EXECUTING_MRAM_DUMP:
break;
@@ -127,8 +127,8 @@ void PlocMemoryDumper::dataReceived(ActionId_t actionId, const uint8_t* data, ui
void PlocMemoryDumper::completionSuccessfulReceived(ActionId_t actionId) {
switch (pendingCommand) {
- case (PLOC_SPV::FIRST_MRAM_DUMP):
- case (PLOC_SPV::CONSECUTIVE_MRAM_DUMP):
+ case (supv::FIRST_MRAM_DUMP):
+ case (supv::CONSECUTIVE_MRAM_DUMP):
if (mram.endAddress == mram.startAddress) {
triggerEvent(MRAM_DUMP_FINISHED);
state = State::IDLE;
@@ -146,8 +146,8 @@ void PlocMemoryDumper::completionSuccessfulReceived(ActionId_t actionId) {
void PlocMemoryDumper::completionFailedReceived(ActionId_t actionId, ReturnValue_t returnCode) {
switch (pendingCommand) {
- case (PLOC_SPV::FIRST_MRAM_DUMP):
- case (PLOC_SPV::CONSECUTIVE_MRAM_DUMP):
+ case (supv::FIRST_MRAM_DUMP):
+ case (supv::CONSECUTIVE_MRAM_DUMP):
triggerEvent(MRAM_DUMP_FAILED, mram.lastStartAddress);
break;
default:
diff --git a/bsp_q7s/devices/PlocMemoryDumper.h b/linux/devices/ploc/PlocMemoryDumper.h
similarity index 96%
rename from bsp_q7s/devices/PlocMemoryDumper.h
rename to linux/devices/ploc/PlocMemoryDumper.h
index 2ee26824..559e7ec8 100644
--- a/bsp_q7s/devices/PlocMemoryDumper.h
+++ b/linux/devices/ploc/PlocMemoryDumper.h
@@ -1,8 +1,8 @@
#ifndef MISSION_DEVICES_PLOCMEMORYDUMPER_H_
#define MISSION_DEVICES_PLOCMEMORYDUMPER_H_
-#include
-#include
+#include
+#include
#include "OBSWConfig.h"
#include "bsp_q7s/memory/SdCardManager.h"
diff --git a/bsp_q7s/devices/PlocSupervisorHandler.cpp b/linux/devices/ploc/PlocSupervisorHandler.cpp
similarity index 69%
rename from bsp_q7s/devices/PlocSupervisorHandler.cpp
rename to linux/devices/ploc/PlocSupervisorHandler.cpp
index a56c9e1c..5065c7dd 100644
--- a/bsp_q7s/devices/PlocSupervisorHandler.cpp
+++ b/linux/devices/ploc/PlocSupervisorHandler.cpp
@@ -12,11 +12,14 @@
#include "OBSWConfig.h"
PlocSupervisorHandler::PlocSupervisorHandler(object_id_t objectId, object_id_t uartComIFid,
- CookieIF* comCookie)
+ CookieIF* comCookie, Gpio uartIsolatorSwitch,
+ power::Switch_t powerSwitch)
: DeviceHandlerBase(objectId, uartComIFid, comCookie),
+ uartIsolatorSwitch(uartIsolatorSwitch),
hkset(this),
bootStatusReport(this),
- latchupStatusReport(this) {
+ latchupStatusReport(this),
+ powerSwitch(powerSwitch) {
if (comCookie == NULL) {
sif::error << "PlocSupervisorHandler: Invalid com cookie" << std::endl;
}
@@ -33,25 +36,23 @@ ReturnValue_t PlocSupervisorHandler::initialize() {
uartComIf = dynamic_cast(communicationInterface);
if (uartComIf == nullptr) {
sif::warning << "PlocSupervisorHandler::initialize: Invalid uart com if" << std::endl;
- return INVALID_UART_COM_IF;
+ return ObjectManagerIF::CHILD_INIT_FAILED;
}
-
-#if BOARD_TE0720 == 0
+#ifdef TE0720_1CFA
sdcMan = SdCardManager::instance();
#endif /* BOARD_TE0720 == 0 */
-
return result;
}
void PlocSupervisorHandler::doStartUp() {
-#if OBSW_SWITCH_TO_NORMAL_MODE_AFTER_STARTUP == 1
- setMode(MODE_NORMAL);
-#else
setMode(_MODE_TO_ON);
-#endif
+ uartIsolatorSwitch.pullHigh();
}
-void PlocSupervisorHandler::doShutDown() { setMode(_MODE_POWER_DOWN); }
+void PlocSupervisorHandler::doShutDown() {
+ setMode(_MODE_POWER_DOWN);
+ uartIsolatorSwitch.pullLow();
+}
ReturnValue_t PlocSupervisorHandler::buildNormalDeviceCommand(DeviceCommandId_t* id) {
return NOTHING_TO_SEND;
@@ -66,196 +67,196 @@ ReturnValue_t PlocSupervisorHandler::buildCommandFromCommand(DeviceCommandId_t d
size_t commandDataLen) {
ReturnValue_t result = RETURN_FAILED;
switch (deviceCommand) {
- case (PLOC_SPV::GET_HK_REPORT): {
- prepareEmptyCmd(PLOC_SPV::APID_GET_HK_REPORT);
+ case (supv::GET_HK_REPORT): {
+ prepareEmptyCmd(supv::APID_GET_HK_REPORT);
result = RETURN_OK;
break;
}
- case (PLOC_SPV::RESTART_MPSOC): {
- prepareEmptyCmd(PLOC_SPV::APID_RESTART_MPSOC);
+ case (supv::RESTART_MPSOC): {
+ prepareEmptyCmd(supv::APID_RESTART_MPSOC);
result = RETURN_OK;
break;
}
- case (PLOC_SPV::START_MPSOC): {
- prepareEmptyCmd(PLOC_SPV::APID_START_MPSOC);
+ case (supv::START_MPSOC): {
+ prepareEmptyCmd(supv::APID_START_MPSOC);
result = RETURN_OK;
break;
}
- case (PLOC_SPV::SHUTDOWN_MPSOC): {
- prepareEmptyCmd(PLOC_SPV::APID_SHUTWOWN_MPSOC);
+ case (supv::SHUTDOWN_MPSOC): {
+ prepareEmptyCmd(supv::APID_SHUTWOWN_MPSOC);
result = RETURN_OK;
break;
}
- case (PLOC_SPV::SEL_MPSOC_BOOT_IMAGE): {
+ case (supv::SEL_MPSOC_BOOT_IMAGE): {
prepareSelBootImageCmd(commandData);
result = RETURN_OK;
break;
}
- case (PLOC_SPV::RESET_MPSOC): {
- prepareEmptyCmd(PLOC_SPV::APID_RESET_MPSOC);
+ case (supv::RESET_MPSOC): {
+ prepareEmptyCmd(supv::APID_RESET_MPSOC);
result = RETURN_OK;
break;
}
- case (PLOC_SPV::SET_TIME_REF): {
+ case (supv::SET_TIME_REF): {
result = prepareSetTimeRefCmd();
break;
}
- case (PLOC_SPV::SET_BOOT_TIMEOUT): {
+ case (supv::SET_BOOT_TIMEOUT): {
prepareSetBootTimeoutCmd(commandData);
result = RETURN_OK;
break;
}
- case (PLOC_SPV::SET_MAX_RESTART_TRIES): {
+ case (supv::SET_MAX_RESTART_TRIES): {
prepareRestartTriesCmd(commandData);
result = RETURN_OK;
break;
}
- case (PLOC_SPV::DISABLE_PERIOIC_HK_TRANSMISSION): {
+ case (supv::DISABLE_PERIOIC_HK_TRANSMISSION): {
prepareDisableHk();
result = RETURN_OK;
break;
}
- case (PLOC_SPV::GET_BOOT_STATUS_REPORT): {
- prepareEmptyCmd(PLOC_SPV::APID_GET_BOOT_STATUS_RPT);
+ case (supv::GET_BOOT_STATUS_REPORT): {
+ prepareEmptyCmd(supv::APID_GET_BOOT_STATUS_RPT);
result = RETURN_OK;
break;
}
- case (PLOC_SPV::WATCHDOGS_ENABLE): {
+ case (supv::WATCHDOGS_ENABLE): {
prepareWatchdogsEnableCmd(commandData);
result = RETURN_OK;
break;
}
- case (PLOC_SPV::WATCHDOGS_CONFIG_TIMEOUT): {
+ case (supv::WATCHDOGS_CONFIG_TIMEOUT): {
result = prepareWatchdogsConfigTimeoutCmd(commandData);
break;
}
- case (PLOC_SPV::ENABLE_LATCHUP_ALERT): {
+ case (supv::ENABLE_LATCHUP_ALERT): {
result = prepareLatchupConfigCmd(commandData, deviceCommand);
break;
}
- case (PLOC_SPV::DISABLE_LATCHUP_ALERT): {
+ case (supv::DISABLE_LATCHUP_ALERT): {
result = prepareLatchupConfigCmd(commandData, deviceCommand);
break;
}
- case (PLOC_SPV::AUTO_CALIBRATE_ALERT): {
+ case (supv::AUTO_CALIBRATE_ALERT): {
result = prepareAutoCalibrateAlertCmd(commandData);
break;
}
- case (PLOC_SPV::SET_ALERT_LIMIT): {
+ case (supv::SET_ALERT_LIMIT): {
result = prepareSetAlertLimitCmd(commandData);
break;
}
- case (PLOC_SPV::SET_ALERT_IRQ_FILTER): {
+ case (supv::SET_ALERT_IRQ_FILTER): {
result = prepareSetAlertIrqFilterCmd(commandData);
break;
}
- case (PLOC_SPV::SET_ADC_SWEEP_PERIOD): {
+ case (supv::SET_ADC_SWEEP_PERIOD): {
result = prepareSetAdcSweetPeriodCmd(commandData);
break;
}
- case (PLOC_SPV::SET_ADC_ENABLED_CHANNELS): {
+ case (supv::SET_ADC_ENABLED_CHANNELS): {
prepareSetAdcEnabledChannelsCmd(commandData);
result = RETURN_OK;
break;
}
- case (PLOC_SPV::SET_ADC_WINDOW_AND_STRIDE): {
+ case (supv::SET_ADC_WINDOW_AND_STRIDE): {
prepareSetAdcWindowAndStrideCmd(commandData);
result = RETURN_OK;
break;
}
- case (PLOC_SPV::SET_ADC_THRESHOLD): {
+ case (supv::SET_ADC_THRESHOLD): {
prepareSetAdcThresholdCmd(commandData);
result = RETURN_OK;
break;
}
- case (PLOC_SPV::GET_LATCHUP_STATUS_REPORT): {
- prepareEmptyCmd(PLOC_SPV::APID_GET_LATCHUP_STATUS_REPORT);
+ case (supv::GET_LATCHUP_STATUS_REPORT): {
+ prepareEmptyCmd(supv::APID_GET_LATCHUP_STATUS_REPORT);
result = RETURN_OK;
break;
}
- case (PLOC_SPV::COPY_ADC_DATA_TO_MRAM): {
- prepareEmptyCmd(PLOC_SPV::APID_COPY_ADC_DATA_TO_MRAM);
+ case (supv::COPY_ADC_DATA_TO_MRAM): {
+ prepareEmptyCmd(supv::APID_COPY_ADC_DATA_TO_MRAM);
result = RETURN_OK;
break;
}
- case (PLOC_SPV::ENABLE_NVMS): {
+ case (supv::ENABLE_NVMS): {
prepareEnableNvmsCmd(commandData);
result = RETURN_OK;
break;
}
- case (PLOC_SPV::SELECT_NVM): {
+ case (supv::SELECT_NVM): {
prepareSelectNvmCmd(commandData);
result = RETURN_OK;
break;
}
- case (PLOC_SPV::RUN_AUTO_EM_TESTS): {
+ case (supv::RUN_AUTO_EM_TESTS): {
result = prepareRunAutoEmTest(commandData);
break;
}
- case (PLOC_SPV::WIPE_MRAM): {
+ case (supv::WIPE_MRAM): {
result = prepareWipeMramCmd(commandData);
break;
}
- case (PLOC_SPV::FIRST_MRAM_DUMP):
- case (PLOC_SPV::CONSECUTIVE_MRAM_DUMP):
+ case (supv::FIRST_MRAM_DUMP):
+ case (supv::CONSECUTIVE_MRAM_DUMP):
result = prepareDumpMramCmd(commandData);
break;
- case (PLOC_SPV::PRINT_CPU_STATS): {
+ case (supv::PRINT_CPU_STATS): {
preparePrintCpuStatsCmd(commandData);
result = RETURN_OK;
break;
}
- case (PLOC_SPV::SET_DBG_VERBOSITY): {
+ case (supv::SET_DBG_VERBOSITY): {
prepareSetDbgVerbosityCmd(commandData);
result = RETURN_OK;
break;
}
- case (PLOC_SPV::CAN_LOOPBACK_TEST): {
- prepareEmptyCmd(PLOC_SPV::APID_CAN_LOOPBACK_TEST);
+ case (supv::CAN_LOOPBACK_TEST): {
+ prepareEmptyCmd(supv::APID_CAN_LOOPBACK_TEST);
result = RETURN_OK;
break;
}
- case (PLOC_SPV::SET_GPIO): {
+ case (supv::SET_GPIO): {
prepareSetGpioCmd(commandData);
result = RETURN_OK;
break;
}
- case (PLOC_SPV::READ_GPIO): {
+ case (supv::READ_GPIO): {
prepareReadGpioCmd(commandData);
result = RETURN_OK;
break;
}
- case (PLOC_SPV::RESTART_SUPERVISOR): {
- prepareEmptyCmd(PLOC_SPV::APID_RESTART_SUPERVISOR);
+ case (supv::RESTART_SUPERVISOR): {
+ prepareEmptyCmd(supv::APID_RESTART_SUPERVISOR);
result = RETURN_OK;
break;
}
- case (PLOC_SPV::FACTORY_RESET_CLEAR_ALL): {
- PLOC_SPV::FactoryReset packet(PLOC_SPV::FactoryReset::Op::CLEAR_ALL);
+ case (supv::FACTORY_RESET_CLEAR_ALL): {
+ supv::FactoryReset packet(supv::FactoryReset::Op::CLEAR_ALL);
packetToOutBuffer(packet.getWholeData(), packet.getFullSize());
result = RETURN_OK;
break;
}
- case (PLOC_SPV::FACTORY_RESET_CLEAR_MIRROR): {
- PLOC_SPV::FactoryReset packet(PLOC_SPV::FactoryReset::Op::MIRROR_ENTRIES);
+ case (supv::FACTORY_RESET_CLEAR_MIRROR): {
+ supv::FactoryReset packet(supv::FactoryReset::Op::MIRROR_ENTRIES);
packetToOutBuffer(packet.getWholeData(), packet.getFullSize());
result = RETURN_OK;
break;
}
- case (PLOC_SPV::FACTORY_RESET_CLEAR_CIRCULAR): {
- PLOC_SPV::FactoryReset packet(PLOC_SPV::FactoryReset::Op::CIRCULAR_ENTRIES);
+ case (supv::FACTORY_RESET_CLEAR_CIRCULAR): {
+ supv::FactoryReset packet(supv::FactoryReset::Op::CIRCULAR_ENTRIES);
packetToOutBuffer(packet.getWholeData(), packet.getFullSize());
result = RETURN_OK;
break;
}
- case (PLOC_SPV::UPDATE_AVAILABLE):
- case (PLOC_SPV::UPDATE_IMAGE_DATA):
- case (PLOC_SPV::UPDATE_VERIFY):
+ case (supv::UPDATE_AVAILABLE):
+ case (supv::UPDATE_IMAGE_DATA):
+ case (supv::UPDATE_VERIFY):
// Simply forward data from PLOC Updater to supervisor
std::memcpy(commandBuffer, commandData, commandDataLen);
rawPacket = commandBuffer;
rawPacketLen = commandDataLen;
- nextReplyId = PLOC_SPV::ACK_REPORT;
+ nextReplyId = supv::ACK_REPORT;
result = RETURN_OK;
break;
default:
@@ -276,64 +277,64 @@ ReturnValue_t PlocSupervisorHandler::buildCommandFromCommand(DeviceCommandId_t d
}
void PlocSupervisorHandler::fillCommandAndReplyMap() {
- this->insertInCommandMap(PLOC_SPV::GET_HK_REPORT);
- this->insertInCommandMap(PLOC_SPV::RESTART_MPSOC);
- this->insertInCommandMap(PLOC_SPV::START_MPSOC);
- this->insertInCommandMap(PLOC_SPV::SHUTDOWN_MPSOC);
- this->insertInCommandMap(PLOC_SPV::SEL_MPSOC_BOOT_IMAGE);
- this->insertInCommandMap(PLOC_SPV::SET_BOOT_TIMEOUT);
- this->insertInCommandMap(PLOC_SPV::SET_MAX_RESTART_TRIES);
- this->insertInCommandMap(PLOC_SPV::RESET_MPSOC);
- this->insertInCommandMap(PLOC_SPV::SET_TIME_REF);
- this->insertInCommandMap(PLOC_SPV::DISABLE_PERIOIC_HK_TRANSMISSION);
- this->insertInCommandMap(PLOC_SPV::GET_BOOT_STATUS_REPORT);
- this->insertInCommandMap(PLOC_SPV::UPDATE_AVAILABLE);
- this->insertInCommandMap(PLOC_SPV::UPDATE_VERIFY);
- this->insertInCommandMap(PLOC_SPV::UPDATE_IMAGE_DATA);
- this->insertInCommandMap(PLOC_SPV::WATCHDOGS_ENABLE);
- this->insertInCommandMap(PLOC_SPV::WATCHDOGS_CONFIG_TIMEOUT);
- this->insertInCommandMap(PLOC_SPV::ENABLE_LATCHUP_ALERT);
- this->insertInCommandMap(PLOC_SPV::DISABLE_LATCHUP_ALERT);
- this->insertInCommandMap(PLOC_SPV::AUTO_CALIBRATE_ALERT);
- this->insertInCommandMap(PLOC_SPV::SET_ALERT_LIMIT);
- this->insertInCommandMap(PLOC_SPV::SET_ALERT_IRQ_FILTER);
- this->insertInCommandMap(PLOC_SPV::SET_ADC_SWEEP_PERIOD);
- this->insertInCommandMap(PLOC_SPV::SET_ADC_ENABLED_CHANNELS);
- this->insertInCommandMap(PLOC_SPV::SET_ADC_WINDOW_AND_STRIDE);
- this->insertInCommandMap(PLOC_SPV::SET_ADC_THRESHOLD);
- this->insertInCommandMap(PLOC_SPV::GET_LATCHUP_STATUS_REPORT);
- this->insertInCommandMap(PLOC_SPV::COPY_ADC_DATA_TO_MRAM);
- this->insertInCommandMap(PLOC_SPV::ENABLE_NVMS);
- this->insertInCommandMap(PLOC_SPV::SELECT_NVM);
- this->insertInCommandMap(PLOC_SPV::RUN_AUTO_EM_TESTS);
- this->insertInCommandMap(PLOC_SPV::WIPE_MRAM);
- this->insertInCommandMap(PLOC_SPV::PRINT_CPU_STATS);
- this->insertInCommandMap(PLOC_SPV::SET_DBG_VERBOSITY);
- this->insertInCommandMap(PLOC_SPV::SET_GPIO);
- this->insertInCommandMap(PLOC_SPV::READ_GPIO);
- this->insertInCommandMap(PLOC_SPV::RESTART_SUPERVISOR);
- this->insertInCommandMap(PLOC_SPV::FACTORY_RESET_CLEAR_ALL);
- this->insertInCommandMap(PLOC_SPV::FACTORY_RESET_CLEAR_MIRROR);
- this->insertInCommandMap(PLOC_SPV::FACTORY_RESET_CLEAR_CIRCULAR);
- this->insertInCommandMap(PLOC_SPV::CAN_LOOPBACK_TEST);
- this->insertInCommandAndReplyMap(PLOC_SPV::FIRST_MRAM_DUMP, 3);
- this->insertInCommandAndReplyMap(PLOC_SPV::CONSECUTIVE_MRAM_DUMP, 3);
- this->insertInReplyMap(PLOC_SPV::ACK_REPORT, 3, nullptr, PLOC_SPV::SIZE_ACK_REPORT);
- this->insertInReplyMap(PLOC_SPV::EXE_REPORT, 3, nullptr, PLOC_SPV::SIZE_EXE_REPORT);
- this->insertInReplyMap(PLOC_SPV::HK_REPORT, 3, &hkset, PLOC_SPV::SIZE_HK_REPORT);
- this->insertInReplyMap(PLOC_SPV::BOOT_STATUS_REPORT, 3, &bootStatusReport,
- PLOC_SPV::SIZE_BOOT_STATUS_REPORT);
- this->insertInReplyMap(PLOC_SPV::LATCHUP_REPORT, 3, &latchupStatusReport,
- PLOC_SPV::SIZE_LATCHUP_STATUS_REPORT);
+ this->insertInCommandMap(supv::GET_HK_REPORT);
+ this->insertInCommandMap(supv::RESTART_MPSOC);
+ this->insertInCommandMap(supv::START_MPSOC);
+ this->insertInCommandMap(supv::SHUTDOWN_MPSOC);
+ this->insertInCommandMap(supv::SEL_MPSOC_BOOT_IMAGE);
+ this->insertInCommandMap(supv::SET_BOOT_TIMEOUT);
+ this->insertInCommandMap(supv::SET_MAX_RESTART_TRIES);
+ this->insertInCommandMap(supv::RESET_MPSOC);
+ this->insertInCommandMap(supv::SET_TIME_REF);
+ this->insertInCommandMap(supv::DISABLE_PERIOIC_HK_TRANSMISSION);
+ this->insertInCommandMap(supv::GET_BOOT_STATUS_REPORT);
+ this->insertInCommandMap(supv::UPDATE_AVAILABLE);
+ this->insertInCommandMap(supv::UPDATE_VERIFY);
+ this->insertInCommandMap(supv::UPDATE_IMAGE_DATA);
+ this->insertInCommandMap(supv::WATCHDOGS_ENABLE);
+ this->insertInCommandMap(supv::WATCHDOGS_CONFIG_TIMEOUT);
+ this->insertInCommandMap(supv::ENABLE_LATCHUP_ALERT);
+ this->insertInCommandMap(supv::DISABLE_LATCHUP_ALERT);
+ this->insertInCommandMap(supv::AUTO_CALIBRATE_ALERT);
+ this->insertInCommandMap(supv::SET_ALERT_LIMIT);
+ this->insertInCommandMap(supv::SET_ALERT_IRQ_FILTER);
+ this->insertInCommandMap(supv::SET_ADC_SWEEP_PERIOD);
+ this->insertInCommandMap(supv::SET_ADC_ENABLED_CHANNELS);
+ this->insertInCommandMap(supv::SET_ADC_WINDOW_AND_STRIDE);
+ this->insertInCommandMap(supv::SET_ADC_THRESHOLD);
+ this->insertInCommandMap(supv::GET_LATCHUP_STATUS_REPORT);
+ this->insertInCommandMap(supv::COPY_ADC_DATA_TO_MRAM);
+ this->insertInCommandMap(supv::ENABLE_NVMS);
+ this->insertInCommandMap(supv::SELECT_NVM);
+ this->insertInCommandMap(supv::RUN_AUTO_EM_TESTS);
+ this->insertInCommandMap(supv::WIPE_MRAM);
+ this->insertInCommandMap(supv::PRINT_CPU_STATS);
+ this->insertInCommandMap(supv::SET_DBG_VERBOSITY);
+ this->insertInCommandMap(supv::SET_GPIO);
+ this->insertInCommandMap(supv::READ_GPIO);
+ this->insertInCommandMap(supv::RESTART_SUPERVISOR);
+ this->insertInCommandMap(supv::FACTORY_RESET_CLEAR_ALL);
+ this->insertInCommandMap(supv::FACTORY_RESET_CLEAR_MIRROR);
+ this->insertInCommandMap(supv::FACTORY_RESET_CLEAR_CIRCULAR);
+ this->insertInCommandMap(supv::CAN_LOOPBACK_TEST);
+ this->insertInCommandAndReplyMap(supv::FIRST_MRAM_DUMP, 3);
+ this->insertInCommandAndReplyMap(supv::CONSECUTIVE_MRAM_DUMP, 3);
+ this->insertInReplyMap(supv::ACK_REPORT, 3, nullptr, supv::SIZE_ACK_REPORT);
+ this->insertInReplyMap(supv::EXE_REPORT, 3, nullptr, supv::SIZE_EXE_REPORT);
+ this->insertInReplyMap(supv::HK_REPORT, 3, &hkset, supv::SIZE_HK_REPORT);
+ this->insertInReplyMap(supv::BOOT_STATUS_REPORT, 3, &bootStatusReport,
+ supv::SIZE_BOOT_STATUS_REPORT);
+ this->insertInReplyMap(supv::LATCHUP_REPORT, 3, &latchupStatusReport,
+ supv::SIZE_LATCHUP_STATUS_REPORT);
}
ReturnValue_t PlocSupervisorHandler::scanForReply(const uint8_t* start, size_t remainingSize,
DeviceCommandId_t* foundId, size_t* foundLen) {
- if (nextReplyId == PLOC_SPV::FIRST_MRAM_DUMP) {
- *foundId = PLOC_SPV::FIRST_MRAM_DUMP;
+ if (nextReplyId == supv::FIRST_MRAM_DUMP) {
+ *foundId = supv::FIRST_MRAM_DUMP;
return parseMramPackets(start, remainingSize, foundLen);
- } else if (nextReplyId == PLOC_SPV::CONSECUTIVE_MRAM_DUMP) {
- *foundId = PLOC_SPV::CONSECUTIVE_MRAM_DUMP;
+ } else if (nextReplyId == supv::CONSECUTIVE_MRAM_DUMP) {
+ *foundId = supv::CONSECUTIVE_MRAM_DUMP;
return parseMramPackets(start, remainingSize, foundLen);
}
@@ -342,33 +343,33 @@ ReturnValue_t PlocSupervisorHandler::scanForReply(const uint8_t* start, size_t r
uint16_t apid = (*(start) << 8 | *(start + 1)) & APID_MASK;
switch (apid) {
- case (PLOC_SPV::APID_ACK_SUCCESS):
- *foundLen = PLOC_SPV::SIZE_ACK_REPORT;
- *foundId = PLOC_SPV::ACK_REPORT;
+ case (supv::APID_ACK_SUCCESS):
+ *foundLen = supv::SIZE_ACK_REPORT;
+ *foundId = supv::ACK_REPORT;
break;
- case (PLOC_SPV::APID_ACK_FAILURE):
- *foundLen = PLOC_SPV::SIZE_ACK_REPORT;
- *foundId = PLOC_SPV::ACK_REPORT;
+ case (supv::APID_ACK_FAILURE):
+ *foundLen = supv::SIZE_ACK_REPORT;
+ *foundId = supv::ACK_REPORT;
break;
- case (PLOC_SPV::APID_HK_REPORT):
- *foundLen = PLOC_SPV::SIZE_HK_REPORT;
- *foundId = PLOC_SPV::HK_REPORT;
+ case (supv::APID_HK_REPORT):
+ *foundLen = supv::SIZE_HK_REPORT;
+ *foundId = supv::HK_REPORT;
break;
- case (PLOC_SPV::APID_BOOT_STATUS_REPORT):
- *foundLen = PLOC_SPV::SIZE_BOOT_STATUS_REPORT;
- *foundId = PLOC_SPV::BOOT_STATUS_REPORT;
+ case (supv::APID_BOOT_STATUS_REPORT):
+ *foundLen = supv::SIZE_BOOT_STATUS_REPORT;
+ *foundId = supv::BOOT_STATUS_REPORT;
break;
- case (PLOC_SPV::APID_LATCHUP_STATUS_REPORT):
- *foundLen = PLOC_SPV::SIZE_LATCHUP_STATUS_REPORT;
- *foundId = PLOC_SPV::LATCHUP_REPORT;
+ case (supv::APID_LATCHUP_STATUS_REPORT):
+ *foundLen = supv::SIZE_LATCHUP_STATUS_REPORT;
+ *foundId = supv::LATCHUP_REPORT;
break;
- case (PLOC_SPV::APID_EXE_SUCCESS):
- *foundLen = PLOC_SPV::SIZE_EXE_REPORT;
- *foundId = PLOC_SPV::EXE_REPORT;
+ case (supv::APID_EXE_SUCCESS):
+ *foundLen = supv::SIZE_EXE_REPORT;
+ *foundId = supv::EXE_REPORT;
break;
- case (PLOC_SPV::APID_EXE_FAILURE):
- *foundLen = PLOC_SPV::SIZE_EXE_REPORT;
- *foundId = PLOC_SPV::EXE_REPORT;
+ case (supv::APID_EXE_FAILURE):
+ *foundLen = supv::SIZE_EXE_REPORT;
+ *foundId = supv::EXE_REPORT;
break;
default: {
sif::debug << "PlocSupervisorHandler::scanForReply: Reply has invalid apid" << std::endl;
@@ -380,32 +381,42 @@ ReturnValue_t PlocSupervisorHandler::scanForReply(const uint8_t* start, size_t r
return result;
}
+ReturnValue_t PlocSupervisorHandler::getSwitches(const uint8_t** switches,
+ uint8_t* numberOfSwitches) {
+ if (powerSwitch == power::NO_SWITCH) {
+ return DeviceHandlerBase::NO_SWITCH;
+ }
+ *numberOfSwitches = 1;
+ *switches = &powerSwitch;
+ return RETURN_OK;
+}
+
ReturnValue_t PlocSupervisorHandler::interpretDeviceReply(DeviceCommandId_t id,
const uint8_t* packet) {
ReturnValue_t result = RETURN_OK;
switch (id) {
- case PLOC_SPV::ACK_REPORT: {
+ case supv::ACK_REPORT: {
result = handleAckReport(packet);
break;
}
- case (PLOC_SPV::HK_REPORT): {
+ case (supv::HK_REPORT): {
result = handleHkReport(packet);
break;
}
- case (PLOC_SPV::BOOT_STATUS_REPORT): {
+ case (supv::BOOT_STATUS_REPORT): {
result = handleBootStatusReport(packet);
break;
}
- case (PLOC_SPV::LATCHUP_REPORT): {
+ case (supv::LATCHUP_REPORT): {
result = handleLatchupStatusReport(packet);
break;
}
- case (PLOC_SPV::FIRST_MRAM_DUMP):
- case (PLOC_SPV::CONSECUTIVE_MRAM_DUMP):
+ case (supv::FIRST_MRAM_DUMP):
+ case (supv::CONSECUTIVE_MRAM_DUMP):
result = handleMramDumpPacket(id);
break;
- case (PLOC_SPV::EXE_REPORT): {
+ case (supv::EXE_REPORT): {
result = handleExecutionReport(packet);
break;
}
@@ -425,44 +436,44 @@ uint32_t PlocSupervisorHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t mod
ReturnValue_t PlocSupervisorHandler::initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
LocalDataPoolManager& poolManager) {
- localDataPoolMap.emplace(PLOC_SPV::NUM_TMS, new PoolEntry({0}));
- localDataPoolMap.emplace(PLOC_SPV::TEMP_PS, new PoolEntry({0}));
- localDataPoolMap.emplace(PLOC_SPV::TEMP_PL, new PoolEntry({0}));
- localDataPoolMap.emplace(PLOC_SPV::SOC_STATE, new PoolEntry({0}));
- localDataPoolMap.emplace(PLOC_SPV::NVM0_1_STATE, new PoolEntry({0}));
- localDataPoolMap.emplace(PLOC_SPV::NVM3_STATE, new PoolEntry({0}));
- localDataPoolMap.emplace(PLOC_SPV::MISSION_IO_STATE, new PoolEntry({0}));
- localDataPoolMap.emplace(PLOC_SPV::FMC_STATE, new PoolEntry({0}));
- localDataPoolMap.emplace(PLOC_SPV::NUM_TCS, new PoolEntry({0}));
- localDataPoolMap.emplace(PLOC_SPV::UPTIME, new PoolEntry({0}));
- localDataPoolMap.emplace(PLOC_SPV::CPULOAD, new PoolEntry({0}));
- localDataPoolMap.emplace(PLOC_SPV::AVAILABLEHEAP, new PoolEntry({0}));
+ localDataPoolMap.emplace(supv::NUM_TMS, new PoolEntry({0}));
+ localDataPoolMap.emplace(supv::TEMP_PS, new PoolEntry({0}));
+ localDataPoolMap.emplace(supv::TEMP_PL, new PoolEntry({0}));
+ localDataPoolMap.emplace(supv::SOC_STATE, new PoolEntry({0}));
+ localDataPoolMap.emplace(supv::NVM0_1_STATE, new PoolEntry({0}));
+ localDataPoolMap.emplace(supv::NVM3_STATE, new PoolEntry({0}));
+ localDataPoolMap.emplace(supv::MISSION_IO_STATE, new PoolEntry({0}));
+ localDataPoolMap.emplace(supv::FMC_STATE, new PoolEntry({0}));
+ localDataPoolMap.emplace(supv::NUM_TCS, new PoolEntry({0}));
+ localDataPoolMap.emplace(supv::UPTIME, new PoolEntry({0}));
+ localDataPoolMap.emplace(supv::CPULOAD, new PoolEntry({0}));
+ localDataPoolMap.emplace(supv::AVAILABLEHEAP, new PoolEntry({0}));
- localDataPoolMap.emplace(PLOC_SPV::BOOT_SIGNAL, new PoolEntry({0}));
- localDataPoolMap.emplace(PLOC_SPV::RESET_COUNTER, new PoolEntry({0}));
- localDataPoolMap.emplace(PLOC_SPV::BOOT_AFTER_MS, new PoolEntry({0}));
- localDataPoolMap.emplace(PLOC_SPV::BOOT_TIMEOUT_MS, new PoolEntry({0}));
- localDataPoolMap.emplace(PLOC_SPV::ACTIVE_NVM, new PoolEntry({0}));
- localDataPoolMap.emplace(PLOC_SPV::BP0_STATE, new PoolEntry({0}));
- localDataPoolMap.emplace(PLOC_SPV::BP1_STATE, new PoolEntry