diff --git a/CMakeLists.txt b/CMakeLists.txt
index 17796924..baf78050 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -14,7 +14,7 @@ cmake_minimum_required(VERSION 3.13)
set(CMAKE_SCRIPT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
if(TGT_BSP MATCHES "arm/q7s")
- option(EIVE_BUILD_WATCHDOG "Compile the OBSW watchdog insted" OFF)
+ option(EIVE_BUILD_WATCHDOG "Compile the OBSW watchdog instead" OFF)
option(BUILD_Q7S_SIMPLE_MODE OFF "Simple mode with a minimal main function")
endif()
@@ -104,7 +104,7 @@ 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/beagleboneblack" OR TGT_BSP MATCHES "arm/egse"
)
set(FSFW_CONFIG_PATH "linux/fsfwconfig")
if(NOT BUILD_Q7S_SIMPLE_MODE)
@@ -114,11 +114,17 @@ if(TGT_BSP)
endif()
endif()
- if(TGT_BSP MATCHES "arm/raspberrypi")
+ if(TGT_BSP MATCHES "arm/raspberrypi" )
# Used by configure file
set(RASPBERRY_PI ON)
set(FSFW_HAL_ADD_RASPBERRY_PI ON)
endif()
+
+ if(TGT_BSP MATCHES "arm/egse")
+ # Used by configure file
+ set(EGSE ON)
+ set(FSFW_HAL_LINUX_ADD_LIBGPIOD OFF)
+ endif()
if(TGT_BSP MATCHES "arm/beagleboneblack")
# Used by configure file
@@ -146,7 +152,7 @@ if(NOT EIVE_BUILD_WATCHDOG)
configure_file(${FSFW_CONFIG_PATH}/OBSWConfig.h.in OBSWConfig.h)
if(TGT_BSP MATCHES "arm/q7s")
configure_file(${BSP_PATH}/boardconfig/q7sConfig.h.in q7sConfig.h)
- elseif(TGT_BSP MATCHES "arm/raspberrypi")
+ elseif(TGT_BSP MATCHES "arm/raspberrypi" OR TGT_BSP MATCHES "arm/egse")
configure_file(${BSP_PATH}/boardconfig/rpiConfig.h.in rpiConfig.h)
endif()
endif()
@@ -258,6 +264,12 @@ target_link_libraries(${TARGET_NAME} PRIVATE
${LIB_CXX_FS}
)
+if(TGT_BSP MATCHES "arm/egse")
+target_link_libraries(${TARGET_NAME} PRIVATE
+ ${LIB_ARCSEC}
+ )
+endif()
+
# Add include paths for all sources.
target_include_directories(${TARGET_NAME} PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
@@ -266,7 +278,7 @@ target_include_directories(${TARGET_NAME} PRIVATE
${LIB_ARCSEC_PATH}
)
-if(TGT_BSP MATCHES "arm/q7s")
+if(TGT_BSP MATCHES "arm/q7s" OR TGT_BSP MATCHES "arm/egse")
target_include_directories(${TARGET_NAME} PRIVATE
${ARCSEC_LIB_PATH}
)
diff --git a/README.md b/README.md
index 7d27b092..34f31da7 100644
--- a/README.md
+++ b/README.md
@@ -19,8 +19,9 @@
12. [Static Code Analysis](#static-code-analysis)
13. [Eclipse](#eclipse)
14. [Running the OBSW on a Raspberry Pi](#rpi)
-15. [FSFW](#fsfw)
-16. [Coding Style](#coding-style)
+15. [Manually preparing sysroots to compile gpsd](#gpsd)
+16. [FSFW](#fsfw)
+17. [Coding Style](#coding-style)
# General information
@@ -1133,6 +1134,9 @@ sudo apt-get install gpiod libgpiod-dev
to install the required GPIO libraries before cloning the system root folder.
+# Manually preparing sysroots to compile gpsd
+Copy all header files from [here](https://eive-cloud.irs.uni-stuttgart.de/index.php/apps/files/?dir=/EIVE_IRS/Software/gpsd&fileid=1189985) to the /usr/include directory and all static libraries to /usr/lib.
+
# Flight Software Framework (FSFW)
An EIVE fork of the FSFW is submodules into this repository.
diff --git a/bsp_egse/CMakeLists.txt b/bsp_egse/CMakeLists.txt
new file mode 100644
index 00000000..a8bf5c4f
--- /dev/null
+++ b/bsp_egse/CMakeLists.txt
@@ -0,0 +1,7 @@
+target_sources(${TARGET_NAME} PUBLIC
+ InitMission.cpp
+ main.cpp
+ ObjectFactory.cpp
+)
+
+add_subdirectory(boardconfig)
diff --git a/bsp_egse/InitMission.cpp b/bsp_egse/InitMission.cpp
new file mode 100644
index 00000000..920c066d
--- /dev/null
+++ b/bsp_egse/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(
+ "STAR_TRACKER_PST", 70, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 0.5, missedDeadlineFunc);
+ result = pst::pstUart(pst);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ sif::error << "InitMission::initTasks: Creating PST failed!" << std::endl;
+ }
+ pstTasks.push_back(pst);
+
+ PeriodicTaskIF* strHelperTask = factory->createPeriodicTask(
+ "STR_HELPER", 20, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.2, missedDeadlineFunc);
+ result = strHelperTask->addComponent(objects::STR_HELPER);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ initmission::printAddObjectError("STR_HELPER", objects::STR_HELPER);
+ }
+ pstTasks.push_back(strHelperTask);
+
+ 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_egse/InitMission.h b/bsp_egse/InitMission.h
new file mode 100644
index 00000000..c3ba58ec
--- /dev/null
+++ b/bsp_egse/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_egse/ObjectFactory.cpp b/bsp_egse/ObjectFactory.cpp
new file mode 100644
index 00000000..7ccec79c
--- /dev/null
+++ b/bsp_egse/ObjectFactory.cpp
@@ -0,0 +1,51 @@
+#include "ObjectFactory.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "OBSWConfig.h"
+#include "busConf.h"
+#include "fsfw/datapoollocal/LocalDataPoolManager.h"
+#include "fsfw/tmtcpacket/pus/tm.h"
+#include "fsfw/tmtcservices/CommandingServiceBase.h"
+#include "fsfw/tmtcservices/PusServiceBase.h"
+#include "linux/devices/devicedefinitions/StarTrackerDefinitions.h"
+#include "linux/devices/startracker/StarTrackerHandler.h"
+#include "mission/core/GenericFactory.h"
+#include "mission/utility/TmFunnel.h"
+#include "objects/systemObjectList.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();
+
+ UartCookie* starTrackerCookie =
+ new UartCookie(objects::STAR_TRACKER, egse::STAR_TRACKER_UART, UartModes::NON_CANONICAL,
+ uart::STAR_TRACKER_BAUD, StarTracker::MAX_FRAME_SIZE * 2 + 2);
+ new UartComIF(objects::UART_COM_IF);
+ starTrackerCookie->setNoFixedSizeReply();
+ StrHelper* strHelper = new StrHelper(objects::STR_HELPER);
+ StarTrackerHandler* starTrackerHandler = new StarTrackerHandler(
+ objects::STAR_TRACKER, objects::UART_COM_IF, starTrackerCookie, strHelper);
+ starTrackerHandler->setStartUpImmediately();
+}
diff --git a/bsp_egse/ObjectFactory.h b/bsp_egse/ObjectFactory.h
new file mode 100644
index 00000000..b24dd321
--- /dev/null
+++ b/bsp_egse/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_egse/boardconfig/CMakeLists.txt b/bsp_egse/boardconfig/CMakeLists.txt
new file mode 100644
index 00000000..67fbaf88
--- /dev/null
+++ b/bsp_egse/boardconfig/CMakeLists.txt
@@ -0,0 +1,7 @@
+target_sources(${TARGET_NAME} PRIVATE
+ print.c
+)
+
+target_include_directories(${TARGET_NAME} PUBLIC
+ ${CMAKE_CURRENT_SOURCE_DIR}
+)
diff --git a/bsp_egse/boardconfig/busConf.h b/bsp_egse/boardconfig/busConf.h
new file mode 100644
index 00000000..4df55edc
--- /dev/null
+++ b/bsp_egse/boardconfig/busConf.h
@@ -0,0 +1,8 @@
+#ifndef BSP_EGSE_BOARDCONFIG_BUSCONF_H_
+#define BSP_EGSE_BOARDCONFIG_BUSCONF_H_
+
+namespace egse {
+static constexpr char STAR_TRACKER_UART[] = "/dev/serial0";
+}
+
+#endif /* BSP_EGSE_BOARDCONFIG_BUSCONF_H_ */
diff --git a/bsp_egse/boardconfig/etl_profile.h b/bsp_egse/boardconfig/etl_profile.h
new file mode 100644
index 00000000..54aca344
--- /dev/null
+++ b/bsp_egse/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_egse/boardconfig/gcov.h b/bsp_egse/boardconfig/gcov.h
new file mode 100644
index 00000000..80acdd86
--- /dev/null
+++ b/bsp_egse/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_egse/boardconfig/print.c b/bsp_egse/boardconfig/print.c
new file mode 100644
index 00000000..5b3a0f91
--- /dev/null
+++ b/bsp_egse/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_egse/boardconfig/print.h b/bsp_egse/boardconfig/print.h
new file mode 100644
index 00000000..8e7e2e5d
--- /dev/null
+++ b/bsp_egse/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_egse/boardconfig/rpiConfig.h.in b/bsp_egse/boardconfig/rpiConfig.h.in
new file mode 100644
index 00000000..af4f0dd2
--- /dev/null
+++ b/bsp_egse/boardconfig/rpiConfig.h.in
@@ -0,0 +1,6 @@
+#ifndef BSP_RPI_BOARDCONFIG_RPI_CONFIG_H_
+#define BSP_RPI_BOARDCONFIG_RPI_CONFIG_H_
+
+#include
+
+#endif /* BSP_RPI_BOARDCONFIG_RPI_CONFIG_H_ */
diff --git a/bsp_egse/main.cpp b/bsp_egse/main.cpp
new file mode 100644
index 00000000..4c77bbce
--- /dev/null
+++ b/bsp_egse/main.cpp
@@ -0,0 +1,28 @@
+#include
+
+#include "InitMission.h"
+#include "OBSWConfig.h"
+#include "OBSWVersion.h"
+#include "fsfw/FSFWVersion.h"
+#include "fsfw/tasks/TaskFactory.h"
+
+/**
+ * @brief This is the main program and entry point for the egse (raspberry pi 4)
+ * @return
+ */
+int main(void) {
+ std::cout << "-- EIVE OBSW --" << std::endl;
+ std::cout << "-- Compiled for EGSE from Arcsec"
+ << " --" << std::endl;
+ std::cout << "-- OBSW " << SW_NAME << " v" << SW_VERSION << "." << SW_SUBVERSION << "."
+ << SW_REVISION << ", FSFW v" << FSFW_VERSION << "." << FSFW_SUBVERSION << FSFW_REVISION
+ << "--" << std::endl;
+ std::cout << "-- " << __DATE__ << " " << __TIME__ << " --" << std::endl;
+
+ initmission::initMission();
+
+ for (;;) {
+ /* Suspend main thread by sleeping it. */
+ TaskFactory::delayTask(5000);
+ }
+}
diff --git a/bsp_linux_board/InitMission.cpp b/bsp_linux_board/InitMission.cpp
index 86d5fb4b..63e06997 100644
--- a/bsp_linux_board/InitMission.cpp
+++ b/bsp_linux_board/InitMission.cpp
@@ -64,17 +64,17 @@ void initmission::initTasks() {
}
/* UDP bridge */
- PeriodicTaskIF* udpBridgeTask = factory->createPeriodicTask(
- "UDP_UNIX_BRIDGE", 50, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.2, missedDeadlineFunc);
- result = udpBridgeTask->addComponent(objects::TMTC_BRIDGE);
+ 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 UDP Unix Bridge failed" << std::endl;
+ sif::error << "Add component TMTC Bridge failed" << std::endl;
}
- PeriodicTaskIF* udpPollingTask = factory->createPeriodicTask(
- "UDP_POLLING", 80, PeriodicTaskIF::MINIMUM_STACK_SIZE, 2.0, missedDeadlineFunc);
- result = udpPollingTask->addComponent(objects::TMTC_POLLING_TASK);
+ 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 UDP Polling failed" << std::endl;
+ sif::error << "Add component TMTC Polling failed" << std::endl;
}
/* PUS Services */
@@ -100,8 +100,8 @@ void initmission::initTasks() {
sif::info << "Starting tasks.." << std::endl;
tmTcDistributor->startTask();
- udpBridgeTask->startTask();
- udpPollingTask->startTask();
+ tmtcBridgeTask->startTask();
+ tmtcPollingTask->startTask();
taskStarter(pusTasks, "PUS Tasks");
#if OBSW_ADD_TEST_CODE == 1
diff --git a/bsp_linux_board/boardconfig/print.c b/bsp_linux_board/boardconfig/print.c
index 3aba2d73..c2b2e15d 100644
--- a/bsp_linux_board/boardconfig/print.c
+++ b/bsp_linux_board/boardconfig/print.c
@@ -1,4 +1,4 @@
-#include
+#include
#include
void printChar(const char* character, bool errStream) {
diff --git a/bsp_q7s/boardconfig/busConf.h b/bsp_q7s/boardconfig/busConf.h
index e6e399cb..2083ac6b 100644
--- a/bsp_q7s/boardconfig/busConf.h
+++ b/bsp_q7s/boardconfig/busConf.h
@@ -3,16 +3,16 @@
namespace q7s {
-static constexpr char SPI_DEFAULT_DEV[] = "/dev/spidev2.0";
-static constexpr char SPI_RW_DEV[] = "/dev/spidev3.0";
+static constexpr char SPI_DEFAULT_DEV[] = "/dev/spi-main";
+static constexpr char SPI_RW_DEV[] = "/dev/spi-rw";
-static constexpr char I2C_DEFAULT_DEV[] = "/dev/i2c-0";
+static constexpr char I2C_DEFAULT_DEV[] = "/dev/i2c-eive";
-static constexpr char UART_GNSS_DEV[] = "/dev/ttyUL0";
-static constexpr char UART_PLOC_MPSOC_DEV[] = "/dev/ttyUL2";
-static constexpr char UART_PLOC_SUPERVSIOR_DEV[] = "/dev/ttyUL3";
-static constexpr char UART_SYRLINKS_DEV[] = "/dev/ttyUL4";
-static constexpr char UART_STAR_TRACKER_DEV[] = "/dev/ttyUL7";
+static constexpr char UART_GNSS_DEV[] = "/dev/ul-gps";
+static constexpr char UART_PLOC_MPSOC_DEV[] = "/dev/ul-plmpsoc";
+static constexpr char UART_PLOC_SUPERVSIOR_DEV[] = "/dev/ul-plsv";
+static constexpr char UART_SYRLINKS_DEV[] = "/dev/ul-syrlinks";
+static constexpr char UART_STAR_TRACKER_DEV[] = "/dev/ul-str";
static constexpr char UIO_PDEC_REGISTERS[] = "/dev/uio0";
static constexpr char UIO_PDEC_CONFIG_MEMORY[] = "/dev/uio2";
@@ -43,6 +43,7 @@ static constexpr char GNSS_0_ENABLE[] = "enable_gnss_0";
static constexpr char GNSS_1_ENABLE[] = "enable_gnss_1";
static constexpr char GYRO_0_ENABLE[] = "enable_gyro_0";
static constexpr char GYRO_2_ENABLE[] = "enable_gyro_2";
+static constexpr char GNSS_SELECT[] = "gnss_mux_select";
static constexpr char HEATER_0[] = "heater0";
static constexpr char HEATER_1[] = "heater1";
static constexpr char HEATER_2[] = "heater2";
diff --git a/bsp_q7s/core/InitMission.cpp b/bsp_q7s/core/InitMission.cpp
index cb01496c..069d8ccb 100644
--- a/bsp_q7s/core/InitMission.cpp
+++ b/bsp_q7s/core/InitMission.cpp
@@ -86,7 +86,7 @@ void initmission::initTasks() {
"TCPIP_TMTC_BRIDGE", 50, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.2, missedDeadlineFunc);
result = tmtcBridgeTask->addComponent(objects::TMTC_BRIDGE);
if (result != HasReturnvaluesIF::RETURN_OK) {
- initmission::printAddObjectError("UDP_BRIDGE", objects::TMTC_BRIDGE);
+ initmission::printAddObjectError("TMTC_BRIDGE", objects::TMTC_BRIDGE);
}
PeriodicTaskIF* tmtcPollingTask = factory->createPeriodicTask(
"TMTC_POLLING", 80, PeriodicTaskIF::MINIMUM_STACK_SIZE, 2.0, missedDeadlineFunc);
@@ -135,9 +135,9 @@ void initmission::initTasks() {
}
#if OBSW_ADD_STAR_TRACKER == 1
- PeriodicTaskIF* strImgLoaderTask = factory->createPeriodicTask(
+ PeriodicTaskIF* strHelperTask = factory->createPeriodicTask(
"STR_HELPER", 20, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.2, missedDeadlineFunc);
- result = strImgLoaderTask->addComponent(objects::STR_HELPER);
+ result = strHelperTask->addComponent(objects::STR_HELPER);
if (result != HasReturnvaluesIF::RETURN_OK) {
initmission::printAddObjectError("STR_HELPER", objects::STR_HELPER);
}
@@ -204,7 +204,7 @@ void initmission::initTasks() {
#if BOARD_TE0720 == 0
fsTask->startTask();
#if OBSW_ADD_STAR_TRACKER == 1
- strImgLoaderTask->startTask();
+ strHelperTask > startTask();
#endif /* OBSW_ADD_STAR_TRACKER == 1 */
#endif
@@ -248,6 +248,8 @@ void initmission::createPstTasks(TaskFactory& factory,
sif::error << "InitMission::initTasks: Creating PST failed!" << std::endl;
}
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);
@@ -255,6 +257,7 @@ void initmission::createPstTasks(TaskFactory& factory,
sif::error << "InitMission::initTasks: Creating PST failed!" << std::endl;
}
taskVec.push_back(i2cPst);
+#endif
FixedTimeslotTaskIF* gomSpacePstTask = factory.createFixedTimeslotTask(
"GS_PST_TASK", 70, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 1.0, missedDeadlineFunc);
@@ -347,7 +350,7 @@ void initmission::createPusTasks(TaskFactory& factory,
void initmission::createTestTasks(TaskFactory& factory,
TaskDeadlineMissedFunction missedDeadlineFunc,
std::vector& taskVec) {
-#if OBSW_ADD_TEST_TASK == 1 || OBSW_ADD_SPI_TEST_CODE == 1 || \
+#if OBSW_ADD_TEST_TASK == 1 || OBSW_ADD_SPI_TEST_CODE == 1 || OBSW_ADD_I2C_TEST_CODE == 1 || \
(BOARD_TE0720 == 1 && OBSW_TEST_LIBGPIOD == 1)
ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
#endif
@@ -366,6 +369,12 @@ void initmission::createTestTasks(TaskFactory& factory,
initmission::printAddObjectError("SPI_TEST", objects::SPI_TEST);
}
#endif
+#if OBSW_ADD_I2C_TEST_CODE == 1
+ result = testTask->addComponent(objects::I2C_TEST);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ initmission::printAddObjectError("I2C_TEST", objects::I2C_TEST);
+ }
+#endif
#if BOARD_TE0720 == 1 && OBSW_TEST_LIBGPIOD == 1
result = testTask->addComponent(objects::LIBGPIOD_TEST);
if (result != HasReturnvaluesIF::RETURN_OK) {
diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp
index 6b93201a..cd34e347 100644
--- a/bsp_q7s/core/ObjectFactory.cpp
+++ b/bsp_q7s/core/ObjectFactory.cpp
@@ -1,5 +1,7 @@
#include "ObjectFactory.h"
+#include
+
#include
#include "OBSWConfig.h"
@@ -11,9 +13,6 @@
#include "bsp_q7s/devices/PlocMemoryDumper.h"
#include "bsp_q7s/devices/PlocSupervisorHandler.h"
#include "bsp_q7s/devices/PlocUpdater.h"
-#include "bsp_q7s/devices/startracker/StarTrackerDefinitions.h"
-#include "bsp_q7s/devices/startracker/StarTrackerHandler.h"
-#include "bsp_q7s/devices/startracker/StrHelper.h"
#include "bsp_q7s/gpio/gpioCallbacks.h"
#include "bsp_q7s/memory/FileSystemHandler.h"
#include "busConf.h"
@@ -42,9 +41,13 @@
#include "linux/csp/CspCookie.h"
#include "linux/devices/SolarArrayDeploymentHandler.h"
#include "linux/devices/SusHandler.h"
+#include "linux/devices/devicedefinitions/StarTrackerDefinitions.h"
#include "linux/devices/devicedefinitions/SusDefinitions.h"
+#include "linux/devices/startracker/StarTrackerHandler.h"
+#include "linux/devices/startracker/StrHelper.h"
#include "mission/core/GenericFactory.h"
#include "mission/devices/ACUHandler.h"
+#include "mission/devices/BpxBatteryHandler.h"
#include "mission/devices/GPSHyperionLinuxController.h"
#include "mission/devices/GyroADIS1650XHandler.h"
#include "mission/devices/HeaterHandler.h"
@@ -117,7 +120,8 @@ void ObjectFactory::produce(void* args) {
LinuxLibgpioIF* gpioComIF = nullptr;
UartComIF* uartComIF = nullptr;
SpiComIF* spiComIF = nullptr;
- createCommunicationInterfaces(&gpioComIF, &uartComIF, &spiComIF);
+ I2cComIF* i2cComIF = nullptr;
+ createCommunicationInterfaces(&gpioComIF, &uartComIF, &spiComIF, &i2cComIF);
createTmpComponents();
#if BOARD_TE0720 == 0
new CoreController(objects::CORE_CONTROLLER);
@@ -144,15 +148,28 @@ void ObjectFactory::produce(void* args) {
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);
+ static_cast(imtqHandler);
#if OBSW_DEBUG_IMTQ == 1
imtqHandler->setToGoToNormal(true);
imtqHandler->setStartUpImmediately();
#else
- (void) imtqHandler;
+ (void)imtqHandler;
#endif
#endif
createReactionWheelComponents(gpioComIF);
+#if OBSW_ADD_BPX_BATTERY_HANDLER == 1
+ I2cCookie* bpxI2cCookie = new I2cCookie(addresses::BPX_BATTERY, 100, q7s::I2C_DEFAULT_DEV);
+ BpxBatteryHandler* bpxHandler =
+ new BpxBatteryHandler(objects::BPX_BATT_HANDLER, objects::I2C_COM_IF, bpxI2cCookie);
+#if OBSW_TEST_BPX_BATT == 1
+ bpxHandler->setToGoToNormalMode(true);
+ bpxHandler->setStartUpImmediately();
+#else
+ static_cast(bpxHandler);
+#endif
+#endif
+
#if OBSW_ADD_PLOC_MPSOC == 1
UartCookie* plocMpsocCookie =
new UartCookie(objects::PLOC_MPSOC_HANDLER, q7s::UART_PLOC_MPSOC_DEV,
@@ -222,7 +239,7 @@ void ObjectFactory::createTmpComponents() {
}
void ObjectFactory::createCommunicationInterfaces(LinuxLibgpioIF** gpioComIF, UartComIF** uartComIF,
- SpiComIF** spiComIF) {
+ SpiComIF** spiComIF, I2cComIF** i2cComIF) {
if (gpioComIF == nullptr or uartComIF == nullptr or spiComIF == nullptr) {
sif::error << "ObjectFactory::createCommunicationInterfaces: Invalid passed ComIF pointer"
<< std::endl;
@@ -231,7 +248,7 @@ void ObjectFactory::createCommunicationInterfaces(LinuxLibgpioIF** gpioComIF, Ua
/* Communication interfaces */
new CspComIF(objects::CSP_COM_IF);
- new I2cComIF(objects::I2C_COM_IF);
+ *i2cComIF = new I2cComIF(objects::I2C_COM_IF);
*uartComIF = new UartComIF(objects::UART_COM_IF);
#if OBSW_ADD_SPI_TEST_CODE == 0
*spiComIF = new SpiComIF(objects::SPI_COM_IF, *gpioComIF);
@@ -481,6 +498,12 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI
gpio::LOW);
gpioCookieAcsBoard->addGpio(gpioIds::GNSS_1_ENABLE, gpio);
+ // Select pin. 0 for GPS side A, 1 for GPS side B
+ consumer.str("");
+ consumer << "0x" << std::hex << objects::GPS_CONTROLLER;
+ gpio = new GpiodRegularByLineName(q7s::gpioNames::GNSS_SELECT, consumer.str(), gpio::DIR_OUT,
+ gpio::LOW);
+ gpioCookieAcsBoard->addGpio(gpioIds::GNSS_SELECT, gpio);
gpioComIF->addGpios(gpioCookieAcsBoard);
#if OBSW_ADD_ACS_HANDLERS == 1
@@ -578,7 +601,8 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI
resetArgsGnss0.gnss1 = false;
resetArgsGnss0.gpioComIF = gpioComIF;
resetArgsGnss0.waitPeriodMs = 100;
- auto gpsHandler0 = new GPSHyperionHandler(objects::GPS_CONTROLLER, objects::NO_OBJECT, debugGps);
+ auto gpsHandler0 =
+ new GPSHyperionLinuxController(objects::GPS_CONTROLLER, objects::NO_OBJECT, debugGps);
gpsHandler0->setResetPinTriggerFunction(gps::triggerGpioResetPin, &resetArgsGnss0);
#endif /* OBSW_ADD_ACS_HANDLERS == 1 */
}
@@ -1108,4 +1132,7 @@ void ObjectFactory::createTestComponents(LinuxLibgpioIF* gpioComIF) {
#if OBSW_ADD_SPI_TEST_CODE == 1
new SpiTestClass(objects::SPI_TEST, gpioComIF);
#endif
+#if OBSW_ADD_I2C_TEST_CODE == 1
+ new I2cTestClass(objects::I2C_TEST, q7s::I2C_DEFAULT_DEV);
+#endif
}
diff --git a/bsp_q7s/core/ObjectFactory.h b/bsp_q7s/core/ObjectFactory.h
index 8fa4a147..b4ccbea4 100644
--- a/bsp_q7s/core/ObjectFactory.h
+++ b/bsp_q7s/core/ObjectFactory.h
@@ -4,6 +4,7 @@
class LinuxLibgpioIF;
class UartComIF;
class SpiComIF;
+class I2cComIF;
namespace ObjectFactory {
@@ -11,7 +12,7 @@ void setStatics();
void produce(void* args);
void createCommunicationInterfaces(LinuxLibgpioIF** gpioComIF, UartComIF** uartComIF,
- SpiComIF** spiComIF);
+ SpiComIF** spiComIF, I2cComIF** i2cComIF);
void createTmpComponents();
void createPcduComponents(LinuxLibgpioIF* gpioComIF);
void createRadSensorComponent(LinuxLibgpioIF* gpioComIF);
diff --git a/bsp_q7s/devices/CMakeLists.txt b/bsp_q7s/devices/CMakeLists.txt
index 70705e83..6347b5f8 100644
--- a/bsp_q7s/devices/CMakeLists.txt
+++ b/bsp_q7s/devices/CMakeLists.txt
@@ -2,6 +2,4 @@ target_sources(${TARGET_NAME} PRIVATE
PlocSupervisorHandler.cpp
PlocUpdater.cpp
PlocMemoryDumper.cpp
-)
-
-add_subdirectory(startracker)
\ No newline at end of file
+)
\ No newline at end of file
diff --git a/cmake/HardwareOsPreConfig.cmake b/cmake/HardwareOsPreConfig.cmake
index 3ff67565..88df808c 100644
--- a/cmake/HardwareOsPreConfig.cmake
+++ b/cmake/HardwareOsPreConfig.cmake
@@ -47,7 +47,7 @@ if(CMAKE_CROSSCOMPILING)
set_property(CACHE TGT_BSP
PROPERTY STRINGS
- "arm/q7s" "arm/raspberrypi"
+ "arm/q7s" "arm/raspberrypi" "arm/egse"
)
endif()
@@ -57,6 +57,8 @@ if(TGT_BSP)
set(BSP_PATH "bsp_linux_board")
elseif(TGT_BSP MATCHES "arm/q7s")
set(BSP_PATH "bsp_q7s")
+ elseif(TGT_BSP MATCHES "arm/egse")
+ set(BSP_PATH "bsp_egse")
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 9f1790bb..9623553c 100644
--- a/cmake/PreProjectConfig.cmake
+++ b/cmake/PreProjectConfig.cmake
@@ -16,7 +16,7 @@ if(FSFW_OSAL MATCHES linux AND TGT_BSP)
"${CMAKE_SCRIPT_PATH}/Q7SCrossCompileConfig.cmake"
PARENT_SCOPE
)
- elseif(TGT_BSP MATCHES "arm/raspberrypi")
+ elseif(TGT_BSP MATCHES "arm/raspberrypi" OR TGT_BSP MATCHES "arm/egse")
if(NOT DEFINED ENV{LINUX_ROOTFS})
if(NOT DEFINED LINUX_ROOTFS)
message(WARNING "No LINUX_ROOTFS environmental or CMake variable set!")
diff --git a/cmake/scripts/Q7S/q7s-env-win.sh b/cmake/scripts/Q7S/q7s-env-win.sh
index a8352331..2cbc0bab 100644
--- a/cmake/scripts/Q7S/q7s-env-win.sh
+++ b/cmake/scripts/Q7S/q7s-env-win.sh
@@ -1,5 +1,49 @@
#!/bin/sh
-export PATH=$PATH:"/c/Xilinx/SDK/2018.2/gnu/aarch32/nt/gcc-arm-linux-gnueabi/bin"
-export CROSS_COMPILE="arm-linux-gnueabihf"
+# Run with: source q7s-env-win-sh [OPTIONS]
+function help () {
+ echo "source q7s-env-win-sh [options] -t|--toolchain= -s|--sysroot="
+}
-export Q7S_SYSROOT="/c/Users/${USER}/Documents/EIVE/cortexa9hf-neon-xiphos-linux-gnueabi"
+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 Q7S_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/egse/egse_path_helper_win.sh b/cmake/scripts/egse/egse_path_helper_win.sh
new file mode 100644
index 00000000..4bda17b0
--- /dev/null
+++ b/cmake/scripts/egse/egse_path_helper_win.sh
@@ -0,0 +1,13 @@
+#!/bin/sh
+# Script to set path to raspberry pi toolchain
+# Run script with: source egse_path_helper_win.sh
+TOOLCHAIN_PATH="/c/SysGCC/raspberry/bin"
+if [ $# -eq 1 ];then
+ export PATH=$PATH:"$1"
+else
+ export PATH=$PATH:$TOOLCHAIN_PATH
+fi
+
+echo "Path of toolchain set to $TOOLCHAIN_PATH"
+export CROSS_COMPILE="arm-linux-gnueabihf"
+export RASPBERRY_VERSION="4"
\ No newline at end of file
diff --git a/cmake/scripts/egse/make-debug-cfg.sh b/cmake/scripts/egse/make-debug-cfg.sh
new file mode 100644
index 00000000..9a611373
--- /dev/null
+++ b/cmake/scripts/egse/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/egse"
+build_generator="make"
+build_dir="build-Debug-egse"
+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/common/config/commonObjects.h b/common/config/commonObjects.h
index bd364daf..09facbc1 100644
--- a/common/config/commonObjects.h
+++ b/common/config/commonObjects.h
@@ -25,6 +25,7 @@ enum commonObjects: uint32_t {
PDU1_HANDLER = 0x44250001,
PDU2_HANDLER = 0x44250002,
ACU_HANDLER = 0x44250003,
+ BPX_BATT_HANDLER = 0x44260000,
TMP1075_HANDLER_1 = 0x44420004,
TMP1075_HANDLER_2 = 0x44420005,
MGM_0_LIS3_HANDLER = 0x44120006,
diff --git a/common/config/devConf.h b/common/config/devConf.h
index 78681ec7..3938d312 100644
--- a/common/config/devConf.h
+++ b/common/config/devConf.h
@@ -42,9 +42,9 @@ 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 = 115200;
+static constexpr uint32_t PLOC_MPSOC_BAUD = 921600;
static constexpr uint32_t PLOC_SUPERVISOR_BAUD = 115200;
-static constexpr uint32_t STAR_TRACKER_BAUD = 115200;
+static constexpr uint32_t STAR_TRACKER_BAUD = 921600;
}
diff --git a/fsfw b/fsfw
index f08d291e..3c06d2db 160000
--- a/fsfw
+++ b/fsfw
@@ -1 +1 @@
-Subproject commit f08d291e3e22950e729c327c101d22a943910e9b
+Subproject commit 3c06d2dbbb0d79608e003a8a3c89ae90cc71f409
diff --git a/generators/bsp_q7s_events.csv b/generators/bsp_q7s_events.csv
index 040b2657..b3d874ab 100644
--- a/generators/bsp_q7s_events.csv
+++ b/generators/bsp_q7s_events.csv
@@ -1,140 +1,140 @@
-2200;STORE_SEND_WRITE_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2201;STORE_WRITE_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2202;STORE_SEND_READ_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2203;STORE_READ_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2204;UNEXPECTED_MSG;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2205;STORING_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2206;TM_DUMP_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2207;STORE_INIT_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2208;STORE_INIT_EMPTY;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2209;STORE_CONTENT_CORRUPTED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2210;STORE_INITIALIZE;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2211;INIT_DONE;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2212;DUMP_FINISHED;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2213;DELETION_FINISHED;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2214;DELETION_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2215;AUTO_CATALOGS_SENDING_FAILED;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2600;GET_DATA_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/storagemanager/StorageManagerIF.h
-2601;STORE_DATA_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/storagemanager/StorageManagerIF.h
-2800;DEVICE_BUILDING_COMMAND_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
-2801;DEVICE_SENDING_COMMAND_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
-2802;DEVICE_REQUESTING_REPLY_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
-2803;DEVICE_READING_REPLY_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
-2804;DEVICE_INTERPRETING_REPLY_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
-2805;DEVICE_MISSED_REPLY;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
-2806;DEVICE_UNKNOWN_REPLY;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
-2807;DEVICE_UNREQUESTED_REPLY;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
-2808;INVALID_DEVICE_COMMAND;LOW;Indicates a SW bug in child class.;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
-2809;MONITORING_LIMIT_EXCEEDED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
-2810;MONITORING_AMBIGUOUS;HIGH;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
-4201;FUSE_CURRENT_HIGH;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/power/Fuse.h
-4202;FUSE_WENT_OFF;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/power/Fuse.h
-4204;POWER_ABOVE_HIGH_LIMIT;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/power/Fuse.h
-4205;POWER_BELOW_LOW_LIMIT;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/power/Fuse.h
-4300;SWITCH_WENT_OFF;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/power/PowerSwitchIF.h
-5000;HEATER_ON;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/thermal/Heater.h
-5001;HEATER_OFF;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/thermal/Heater.h
-5002;HEATER_TIMEOUT;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/thermal/Heater.h
-5003;HEATER_STAYED_ON;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/thermal/Heater.h
-5004;HEATER_STAYED_OFF;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/thermal/Heater.h
-5200;TEMP_SENSOR_HIGH;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/thermal/AbstractTemperatureSensor.h
-5201;TEMP_SENSOR_LOW;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/thermal/AbstractTemperatureSensor.h
-5202;TEMP_SENSOR_GRADIENT;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/thermal/AbstractTemperatureSensor.h
-5901;COMPONENT_TEMP_LOW;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/thermal/ThermalComponentIF.h
-5902;COMPONENT_TEMP_HIGH;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/thermal/ThermalComponentIF.h
-5903;COMPONENT_TEMP_OOL_LOW;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/thermal/ThermalComponentIF.h
-5904;COMPONENT_TEMP_OOL_HIGH;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/thermal/ThermalComponentIF.h
-5905;TEMP_NOT_IN_OP_RANGE;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/thermal/ThermalComponentIF.h
-7101;FDIR_CHANGED_STATE;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/fdir/FailureIsolationBase.h
-7102;FDIR_STARTS_RECOVERY;MEDIUM;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/fdir/FailureIsolationBase.h
-7103;FDIR_TURNS_OFF_DEVICE;MEDIUM;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/fdir/FailureIsolationBase.h
-7201;MONITOR_CHANGED_STATE;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/monitoring/MonitoringIF.h
-7202;VALUE_BELOW_LOW_LIMIT;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/monitoring/MonitoringIF.h
-7203;VALUE_ABOVE_HIGH_LIMIT;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/monitoring/MonitoringIF.h
-7204;VALUE_OUT_OF_RANGE;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/monitoring/MonitoringIF.h
-7301;SWITCHING_TM_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/datapool/HkSwitchHelper.h
-7400;CHANGING_MODE;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/modes/HasModesIF.h
-7401;MODE_INFO;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/modes/HasModesIF.h
-7402;FALLBACK_FAILED;HIGH;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/modes/HasModesIF.h
-7403;MODE_TRANSITION_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/modes/HasModesIF.h
-7404;CANT_KEEP_MODE;HIGH;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/modes/HasModesIF.h
-7405;OBJECT_IN_INVALID_MODE;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/modes/HasModesIF.h
-7406;FORCING_MODE;MEDIUM;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/modes/HasModesIF.h
-7407;MODE_CMD_REJECTED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/modes/HasModesIF.h
-7506;HEALTH_INFO;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/health/HasHealthIF.h
-7507;CHILD_CHANGED_HEALTH;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/health/HasHealthIF.h
-7508;CHILD_PROBLEMS;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/health/HasHealthIF.h
-7509;OVERWRITING_HEALTH;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/health/HasHealthIF.h
-7510;TRYING_RECOVERY;MEDIUM;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/health/HasHealthIF.h
-7511;RECOVERY_STEP;MEDIUM;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/health/HasHealthIF.h
-7512;RECOVERY_DONE;MEDIUM;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/health/HasHealthIF.h
-7900;RF_AVAILABLE;INFO;A RF available signal was detected. P1: raw RFA state, P2: 0;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
-7901;RF_LOST;INFO;A previously found RF available signal was lost. P1: raw RFA state, P2: 0;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
-7902;BIT_LOCK;INFO;A Bit Lock signal. Was detected. P1: raw BLO state, P2: 0;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
-7903;BIT_LOCK_LOST;INFO;A previously found Bit Lock signal was lost. P1: raw BLO state, P2: 0;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
-7905;FRAME_PROCESSING_FAILED;LOW;The CCSDS Board could not interpret a TC;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
-8900;CLOCK_SET;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/pus/Service9TimeManagement.h
-8901;CLOCK_SET_FAILURE;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/pus/Service9TimeManagement.h
-9700;TEST;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/pus/Service17Test.h
-10600;CHANGE_OF_SETUP_PARAMETER;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/hal/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h
-10900;GPIO_PULL_HIGH_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/mission/devices/HeaterHandler.h
-10901;GPIO_PULL_LOW_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/mission/devices/HeaterHandler.h
-10902;SWITCH_ALREADY_ON;LOW;;C:\Users\jakob\eive-software\eive_obsw/mission/devices/HeaterHandler.h
-10903;SWITCH_ALREADY_OFF;LOW;;C:\Users\jakob\eive-software\eive_obsw/mission/devices/HeaterHandler.h
-10904;MAIN_SWITCH_TIMEOUT;LOW;;C:\Users\jakob\eive-software\eive_obsw/mission/devices/HeaterHandler.h
-11000;MAIN_SWITCH_ON_TIMEOUT;LOW;;C:\Users\jakob\eive-software\eive_obsw/linux/devices/SolarArrayDeploymentHandler.h
-11001;MAIN_SWITCH_OFF_TIMEOUT;LOW;;C:\Users\jakob\eive-software\eive_obsw/linux/devices/SolarArrayDeploymentHandler.h
-11002;DEPLOYMENT_FAILED;HIGH;;C:\Users\jakob\eive-software\eive_obsw/linux/devices/SolarArrayDeploymentHandler.h
-11003;DEPL_SA1_GPIO_SWTICH_ON_FAILED;HIGH;;C:\Users\jakob\eive-software\eive_obsw/linux/devices/SolarArrayDeploymentHandler.h
-11004;DEPL_SA2_GPIO_SWTICH_ON_FAILED;HIGH;;C:\Users\jakob\eive-software\eive_obsw/linux/devices/SolarArrayDeploymentHandler.h
-11101;MEMORY_READ_RPT_CRC_FAILURE;LOW;;C:\Users\jakob\eive-software\eive_obsw/mission/devices/PlocMPSoCHandler.h
-11102;ACK_FAILURE;LOW;;C:\Users\jakob\eive-software\eive_obsw/mission/devices/PlocMPSoCHandler.h
-11103;EXE_FAILURE;LOW;;C:\Users\jakob\eive-software\eive_obsw/mission/devices/PlocMPSoCHandler.h
-11104;CRC_FAILURE_EVENT;LOW;;C:\Users\jakob\eive-software\eive_obsw/mission/devices/PlocMPSoCHandler.h
-11201;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;C:\Users\jakob\eive-software\eive_obsw/mission/devices/IMTQHandler.h
-11202;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;C:\Users\jakob\eive-software\eive_obsw/mission/devices/IMTQHandler.h
-11203;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;C:\Users\jakob\eive-software\eive_obsw/mission/devices/IMTQHandler.h
-11204;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;C:\Users\jakob\eive-software\eive_obsw/mission/devices/IMTQHandler.h
-11205;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;C:\Users\jakob\eive-software\eive_obsw/mission/devices/IMTQHandler.h
-11206;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;C:\Users\jakob\eive-software\eive_obsw/mission/devices/IMTQHandler.h
-11207;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;C:\Users\jakob\eive-software\eive_obsw/mission/devices/IMTQHandler.h
-11208;INVALID_ERROR_BYTE;LOW;Received invalid error byte. This indicates an error of the communication link between IMTQ and OBC.;C:\Users\jakob\eive-software\eive_obsw/mission/devices/IMTQHandler.h
-11301;ERROR_STATE;HIGH;Reaction wheel signals an error state;C:\Users\jakob\eive-software\eive_obsw/mission/devices/RwHandler.h
-11501;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/PlocSupervisorHandler.h
-11502;SUPV_ACK_FAILURE;LOW;PLOC supervisor received acknowledgment failure report;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/PlocSupervisorHandler.h
-11503;SUPV_EXE_FAILURE;LOW;PLOC received execution failure report;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/PlocSupervisorHandler.h
-11504;SUPV_CRC_FAILURE_EVENT;LOW;PLOC supervisor reply has invalid crc;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/PlocSupervisorHandler.h
-11600;SANITIZATION_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/memory/SdCardManager.h
-11700;UPDATE_FILE_NOT_EXISTS;LOW;;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/PlocUpdater.h
-11701;ACTION_COMMANDING_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/PlocUpdater.h
-11702;UPDATE_AVAILABLE_FAILED;LOW;Supervisor handler replied action message indicating a command execution failure of the update available command;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/PlocUpdater.h
-11703;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);C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/PlocUpdater.h
-11704;UPDATE_VERIFY_FAILED;LOW;Supervisor failed to execute the update verify command.;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/PlocUpdater.h
-11705;UPDATE_FINISHED;INFO;MPSoC update successful completed;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/PlocUpdater.h
-11800;SEND_MRAM_DUMP_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/PlocMemoryDumper.h
-11801;MRAM_DUMP_FAILED;LOW;Received completion failure report form PLOC supervisor handler P1: MRAM start address of failing dump command;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/PlocMemoryDumper.h
-11802;MRAM_DUMP_FINISHED;LOW;MRAM dump finished successfully;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/PlocMemoryDumper.h
-11901;INVALID_TC_FRAME;HIGH;;C:\Users\jakob\eive-software\eive_obsw/linux/obc/PdecHandler.h
-11902;INVALID_FAR;HIGH;Read invalid FAR from PDEC after startup;C:\Users\jakob\eive-software\eive_obsw/linux/obc/PdecHandler.h
-11903;CARRIER_LOCK;INFO;Carrier lock detected;C:\Users\jakob\eive-software\eive_obsw/linux/obc/PdecHandler.h
-11904;BIT_LOCK_PDEC;INFO;Bit lock detected (data valid);C:\Users\jakob\eive-software\eive_obsw/linux/obc/PdecHandler.h
-12000;IMAGE_UPLOAD_FAILED;LOW;Image upload failed;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h
-12001;IMAGE_DOWNLOAD_FAILED;LOW;Image download failed;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h
-12002;IMAGE_UPLOAD_SUCCESSFUL;LOW;Uploading image to star tracker was successfulop;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h
-12003;IMAGE_DOWNLOAD_SUCCESSFUL;LOW;Image download was successful;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h
-12004;FLASH_WRITE_SUCCESSFUL;LOW;Finished flash write procedure successfully;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h
-12005;FLASH_READ_SUCCESSFUL;LOW;Finished flash read procedure successfully;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h
-12006;FLASH_WRITE_FAILED;LOW;Flash write procedure failed;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h
-12007;FLASH_READ_FAILED;LOW;Flash read procedure failed;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h
-12008;FPGA_DOWNLOAD_SUCCESSFUL;LOW;Download of FPGA image successful;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h
-12009;FPGA_DOWNLOAD_FAILED;LOW;Download of FPGA image failed;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h
-12010;FPGA_UPLOAD_SUCCESSFUL;LOW;Upload of FPGA image successful;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h
-12011;FPGA_UPLOAD_FAILED;LOW;Upload of FPGA image failed;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h
-12012;STR_HELPER_READING_REPLY_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h
-12013;STR_HELPER_COM_ERROR;LOW;;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h
-12014;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;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h
-12015;STR_HELPER_DEC_ERROR;LOW;;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h
-12016;POSITION_MISMATCH;LOW;Position mismatch P1: The expected position and thus the position for which the image upload/download failed;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h
-12017;STR_HELPER_FILE_NOT_EXISTS;LOW;Specified file does not existP1: Internal state of str helper;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h
-12018;STR_HELPER_SENDING_PACKET_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h
-12019;STR_HELPER_REQUESTING_MSG_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h
+2200;STORE_SEND_WRITE_FAILED;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
+2201;STORE_WRITE_FAILED;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
+2202;STORE_SEND_READ_FAILED;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
+2203;STORE_READ_FAILED;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
+2204;UNEXPECTED_MSG;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
+2205;STORING_FAILED;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
+2206;TM_DUMP_FAILED;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
+2207;STORE_INIT_FAILED;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
+2208;STORE_INIT_EMPTY;INFO;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
+2209;STORE_CONTENT_CORRUPTED;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
+2210;STORE_INITIALIZE;INFO;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
+2211;INIT_DONE;INFO;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
+2212;DUMP_FINISHED;INFO;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
+2213;DELETION_FINISHED;INFO;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
+2214;DELETION_FAILED;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
+2215;AUTO_CATALOGS_SENDING_FAILED;INFO;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
+2600;GET_DATA_FAILED;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/storagemanager/StorageManagerIF.h
+2601;STORE_DATA_FAILED;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/storagemanager/StorageManagerIF.h
+2800;DEVICE_BUILDING_COMMAND_FAILED;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
+2801;DEVICE_SENDING_COMMAND_FAILED;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
+2802;DEVICE_REQUESTING_REPLY_FAILED;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
+2803;DEVICE_READING_REPLY_FAILED;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
+2804;DEVICE_INTERPRETING_REPLY_FAILED;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
+2805;DEVICE_MISSED_REPLY;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
+2806;DEVICE_UNKNOWN_REPLY;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
+2807;DEVICE_UNREQUESTED_REPLY;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
+2808;INVALID_DEVICE_COMMAND;LOW;Indicates a SW bug in child class.;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
+2809;MONITORING_LIMIT_EXCEEDED;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
+2810;MONITORING_AMBIGUOUS;HIGH;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
+2811;DEVICE_WANTS_HARD_REBOOT;HIGH;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
+4201;FUSE_CURRENT_HIGH;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/power/Fuse.h
+4202;FUSE_WENT_OFF;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/power/Fuse.h
+4204;POWER_ABOVE_HIGH_LIMIT;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/power/Fuse.h
+4205;POWER_BELOW_LOW_LIMIT;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/power/Fuse.h
+4300;SWITCH_WENT_OFF;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/power/PowerSwitchIF.h
+5000;HEATER_ON;INFO;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/thermal/Heater.h
+5001;HEATER_OFF;INFO;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/thermal/Heater.h
+5002;HEATER_TIMEOUT;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/thermal/Heater.h
+5003;HEATER_STAYED_ON;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/thermal/Heater.h
+5004;HEATER_STAYED_OFF;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/thermal/Heater.h
+5200;TEMP_SENSOR_HIGH;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/thermal/AbstractTemperatureSensor.h
+5201;TEMP_SENSOR_LOW;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/thermal/AbstractTemperatureSensor.h
+5202;TEMP_SENSOR_GRADIENT;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/thermal/AbstractTemperatureSensor.h
+5901;COMPONENT_TEMP_LOW;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/thermal/ThermalComponentIF.h
+5902;COMPONENT_TEMP_HIGH;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/thermal/ThermalComponentIF.h
+5903;COMPONENT_TEMP_OOL_LOW;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/thermal/ThermalComponentIF.h
+5904;COMPONENT_TEMP_OOL_HIGH;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/thermal/ThermalComponentIF.h
+5905;TEMP_NOT_IN_OP_RANGE;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/thermal/ThermalComponentIF.h
+7101;FDIR_CHANGED_STATE;INFO;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/fdir/FailureIsolationBase.h
+7102;FDIR_STARTS_RECOVERY;MEDIUM;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/fdir/FailureIsolationBase.h
+7103;FDIR_TURNS_OFF_DEVICE;MEDIUM;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/fdir/FailureIsolationBase.h
+7201;MONITOR_CHANGED_STATE;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/monitoring/MonitoringIF.h
+7202;VALUE_BELOW_LOW_LIMIT;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/monitoring/MonitoringIF.h
+7203;VALUE_ABOVE_HIGH_LIMIT;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/monitoring/MonitoringIF.h
+7204;VALUE_OUT_OF_RANGE;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/monitoring/MonitoringIF.h
+7400;CHANGING_MODE;INFO;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/modes/HasModesIF.h
+7401;MODE_INFO;INFO;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/modes/HasModesIF.h
+7402;FALLBACK_FAILED;HIGH;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/modes/HasModesIF.h
+7403;MODE_TRANSITION_FAILED;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/modes/HasModesIF.h
+7404;CANT_KEEP_MODE;HIGH;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/modes/HasModesIF.h
+7405;OBJECT_IN_INVALID_MODE;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/modes/HasModesIF.h
+7406;FORCING_MODE;MEDIUM;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/modes/HasModesIF.h
+7407;MODE_CMD_REJECTED;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/modes/HasModesIF.h
+7506;HEALTH_INFO;INFO;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/health/HasHealthIF.h
+7507;CHILD_CHANGED_HEALTH;INFO;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/health/HasHealthIF.h
+7508;CHILD_PROBLEMS;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/health/HasHealthIF.h
+7509;OVERWRITING_HEALTH;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/health/HasHealthIF.h
+7510;TRYING_RECOVERY;MEDIUM;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/health/HasHealthIF.h
+7511;RECOVERY_STEP;MEDIUM;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/health/HasHealthIF.h
+7512;RECOVERY_DONE;MEDIUM;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/health/HasHealthIF.h
+7900;RF_AVAILABLE;INFO;A RF available signal was detected. P1: raw RFA state, P2: 0;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
+7901;RF_LOST;INFO;A previously found RF available signal was lost. P1: raw RFA state, P2: 0;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
+7902;BIT_LOCK;INFO;A Bit Lock signal. Was detected. P1: raw BLO state, P2: 0;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
+7903;BIT_LOCK_LOST;INFO;A previously found Bit Lock signal was lost. P1: raw BLO state, P2: 0;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
+7905;FRAME_PROCESSING_FAILED;LOW;The CCSDS Board could not interpret a TC;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
+8900;CLOCK_SET;INFO;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/pus/Service9TimeManagement.h
+8901;CLOCK_SET_FAILURE;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/pus/Service9TimeManagement.h
+9700;TEST;INFO;;/home/rmueller/EIVE/eive-obsw/fsfw/src/fsfw/pus/Service17Test.h
+10600;CHANGE_OF_SETUP_PARAMETER;LOW;;/home/rmueller/EIVE/eive-obsw/fsfw/hal/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h
+10900;GPIO_PULL_HIGH_FAILED;LOW;;/home/rmueller/EIVE/eive-obsw/mission/devices/HeaterHandler.h
+10901;GPIO_PULL_LOW_FAILED;LOW;;/home/rmueller/EIVE/eive-obsw/mission/devices/HeaterHandler.h
+10902;SWITCH_ALREADY_ON;LOW;;/home/rmueller/EIVE/eive-obsw/mission/devices/HeaterHandler.h
+10903;SWITCH_ALREADY_OFF;LOW;;/home/rmueller/EIVE/eive-obsw/mission/devices/HeaterHandler.h
+10904;MAIN_SWITCH_TIMEOUT;LOW;;/home/rmueller/EIVE/eive-obsw/mission/devices/HeaterHandler.h
+11000;MAIN_SWITCH_ON_TIMEOUT;LOW;;/home/rmueller/EIVE/eive-obsw/linux/devices/SolarArrayDeploymentHandler.h
+11001;MAIN_SWITCH_OFF_TIMEOUT;LOW;;/home/rmueller/EIVE/eive-obsw/linux/devices/SolarArrayDeploymentHandler.h
+11002;DEPLOYMENT_FAILED;HIGH;;/home/rmueller/EIVE/eive-obsw/linux/devices/SolarArrayDeploymentHandler.h
+11003;DEPL_SA1_GPIO_SWTICH_ON_FAILED;HIGH;;/home/rmueller/EIVE/eive-obsw/linux/devices/SolarArrayDeploymentHandler.h
+11004;DEPL_SA2_GPIO_SWTICH_ON_FAILED;HIGH;;/home/rmueller/EIVE/eive-obsw/linux/devices/SolarArrayDeploymentHandler.h
+11101;MEMORY_READ_RPT_CRC_FAILURE;LOW;;/home/rmueller/EIVE/eive-obsw/mission/devices/PlocMPSoCHandler.h
+11102;ACK_FAILURE;LOW;;/home/rmueller/EIVE/eive-obsw/mission/devices/PlocMPSoCHandler.h
+11103;EXE_FAILURE;LOW;;/home/rmueller/EIVE/eive-obsw/mission/devices/PlocMPSoCHandler.h
+11104;CRC_FAILURE_EVENT;LOW;;/home/rmueller/EIVE/eive-obsw/mission/devices/PlocMPSoCHandler.h
+11201;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;/home/rmueller/EIVE/eive-obsw/mission/devices/IMTQHandler.h
+11202;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;/home/rmueller/EIVE/eive-obsw/mission/devices/IMTQHandler.h
+11203;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;/home/rmueller/EIVE/eive-obsw/mission/devices/IMTQHandler.h
+11204;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;/home/rmueller/EIVE/eive-obsw/mission/devices/IMTQHandler.h
+11205;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;/home/rmueller/EIVE/eive-obsw/mission/devices/IMTQHandler.h
+11206;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;/home/rmueller/EIVE/eive-obsw/mission/devices/IMTQHandler.h
+11207;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;/home/rmueller/EIVE/eive-obsw/mission/devices/IMTQHandler.h
+11208;INVALID_ERROR_BYTE;LOW;Received invalid error byte. This indicates an error of the communication link between IMTQ and OBC.;/home/rmueller/EIVE/eive-obsw/mission/devices/IMTQHandler.h
+11301;ERROR_STATE;HIGH;Reaction wheel signals an error state;/home/rmueller/EIVE/eive-obsw/mission/devices/RwHandler.h
+11501;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/PlocSupervisorHandler.h
+11502;SUPV_ACK_FAILURE;LOW;PLOC supervisor received acknowledgment failure report;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/PlocSupervisorHandler.h
+11503;SUPV_EXE_FAILURE;LOW;PLOC received execution failure report;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/PlocSupervisorHandler.h
+11504;SUPV_CRC_FAILURE_EVENT;LOW;PLOC supervisor reply has invalid crc;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/PlocSupervisorHandler.h
+11600;SANITIZATION_FAILED;LOW;;/home/rmueller/EIVE/eive-obsw/bsp_q7s/memory/SdCardManager.h
+11700;UPDATE_FILE_NOT_EXISTS;LOW;;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/PlocUpdater.h
+11701;ACTION_COMMANDING_FAILED;LOW;Failed to send command to supervisor handler P1: Return value of CommandActionHelper::commandAction P2: Action ID of command to send;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/PlocUpdater.h
+11702;UPDATE_AVAILABLE_FAILED;LOW;Supervisor handler replied action message indicating a command execution failure of the update available command;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/PlocUpdater.h
+11703;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);/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/PlocUpdater.h
+11704;UPDATE_VERIFY_FAILED;LOW;Supervisor failed to execute the update verify command.;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/PlocUpdater.h
+11705;UPDATE_FINISHED;INFO;MPSoC update successful completed;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/PlocUpdater.h
+11800;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;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/PlocMemoryDumper.h
+11801;MRAM_DUMP_FAILED;LOW;Received completion failure report form PLOC supervisor handler P1: MRAM start address of failing dump command;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/PlocMemoryDumper.h
+11802;MRAM_DUMP_FINISHED;LOW;MRAM dump finished successfully;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/PlocMemoryDumper.h
+11901;INVALID_TC_FRAME;HIGH;;/home/rmueller/EIVE/eive-obsw/linux/obc/PdecHandler.h
+11902;INVALID_FAR;HIGH;Read invalid FAR from PDEC after startup;/home/rmueller/EIVE/eive-obsw/linux/obc/PdecHandler.h
+11903;CARRIER_LOCK;INFO;Carrier lock detected;/home/rmueller/EIVE/eive-obsw/linux/obc/PdecHandler.h
+11904;BIT_LOCK_PDEC;INFO;Bit lock detected (data valid);/home/rmueller/EIVE/eive-obsw/linux/obc/PdecHandler.h
+12000;IMAGE_UPLOAD_FAILED;LOW;Image upload failed;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/startracker/StrHelper.h
+12001;IMAGE_DOWNLOAD_FAILED;LOW;Image download failed;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/startracker/StrHelper.h
+12002;IMAGE_UPLOAD_SUCCESSFUL;LOW;Uploading image to star tracker was successfulop;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/startracker/StrHelper.h
+12003;IMAGE_DOWNLOAD_SUCCESSFUL;LOW;Image download was successful;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/startracker/StrHelper.h
+12004;FLASH_WRITE_SUCCESSFUL;LOW;Finished flash write procedure successfully;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/startracker/StrHelper.h
+12005;FLASH_READ_SUCCESSFUL;LOW;Finished flash read procedure successfully;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/startracker/StrHelper.h
+12006;FLASH_WRITE_FAILED;LOW;Flash write procedure failed;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/startracker/StrHelper.h
+12007;FLASH_READ_FAILED;LOW;Flash read procedure failed;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/startracker/StrHelper.h
+12008;FPGA_DOWNLOAD_SUCCESSFUL;LOW;Download of FPGA image successful;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/startracker/StrHelper.h
+12009;FPGA_DOWNLOAD_FAILED;LOW;Download of FPGA image failed;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/startracker/StrHelper.h
+12010;FPGA_UPLOAD_SUCCESSFUL;LOW;Upload of FPGA image successful;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/startracker/StrHelper.h
+12011;FPGA_UPLOAD_FAILED;LOW;Upload of FPGA image failed;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/startracker/StrHelper.h
+12012;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;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/startracker/StrHelper.h
+12013;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;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/startracker/StrHelper.h
+12014;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;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/startracker/StrHelper.h
+12015;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;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/startracker/StrHelper.h
+12016;POSITION_MISMATCH;LOW;Position mismatch P1: The expected position and thus the position for which the image upload/download failed;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/startracker/StrHelper.h
+12017;STR_HELPER_FILE_NOT_EXISTS;LOW;Specified file does not exist P1: Internal state of str helper;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/startracker/StrHelper.h
+12018;STR_HELPER_SENDING_PACKET_FAILED;LOW;;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/startracker/StrHelper.h
+12019;STR_HELPER_REQUESTING_MSG_FAILED;LOW;;/home/rmueller/EIVE/eive-obsw/bsp_q7s/devices/startracker/StrHelper.h
diff --git a/generators/bsp_q7s_objects.csv b/generators/bsp_q7s_objects.csv
index af48751f..c686ec40 100644
--- a/generators/bsp_q7s_objects.csv
+++ b/generators/bsp_q7s_objects.csv
@@ -28,14 +28,14 @@
0x44120313;GYRO_3_L3G_HANDLER
0x44120350;RW4
0x44130001;STAR_TRACKER
-0x44130045;GPS0_HANDLER
-0x44130146;GPS1_HANDLER
+0x44130045;GPS_CONTROLLER
0x44140014;IMTQ_HANDLER
0x442000A1;PCDU_HANDLER
0x44250000;P60DOCK_HANDLER
0x44250001;PDU1_HANDLER
0x44250002;PDU2_HANDLER
0x44250003;ACU_HANDLER
+0x44260000;BPX_BATT_HANDLER
0x443200A5;RAD_SENSOR
0x44330000;PLOC_UPDATER
0x44330001;PLOC_MEMORY_DUMPER
@@ -75,11 +75,7 @@
0x50000400;TMTC_POLLING_TASK
0x50000500;FILE_SYSTEM_HANDLER
0x50000600;PTME
-0x50000700;PAPB_VC0
-0x50000701;PAPB_VC1
-0x50000702;PAPB_VC2
-0x50000703;PAPB_VC3
-0x50000704;PDEC_HANDLER
+0x50000700;PDEC_HANDLER
0x50000800;CCSDS_HANDLER
0x51000500;PUS_SERVICE_6
0x53000000;FSFW_OBJECTS_START
@@ -93,6 +89,7 @@
0x53000020;PUS_SERVICE_20_PARAMETERS
0x53000200;PUS_SERVICE_200_MODE_MGMT
0x53000201;PUS_SERVICE_201_HEALTH
+0x53001000;CFDP_PACKET_DISTRIBUTOR
0x53010000;HEALTH_TABLE
0x53010100;MODE_STORE
0x53030000;EVENT_MANAGER
diff --git a/generators/events/translateEvents.cpp b/generators/events/translateEvents.cpp
index 11a02c64..9e6a5f61 100644
--- a/generators/events/translateEvents.cpp
+++ b/generators/events/translateEvents.cpp
@@ -1,7 +1,7 @@
/**
* @brief Auto-generated event translation file. Contains 140 translations.
* @details
- * Generated on: 2022-01-17 15:35:58
+ * Generated on: 2022-02-03 17:30:40
*/
#include "translateEvents.h"
@@ -34,6 +34,7 @@ const char *DEVICE_UNREQUESTED_REPLY_STRING = "DEVICE_UNREQUESTED_REPLY";
const char *INVALID_DEVICE_COMMAND_STRING = "INVALID_DEVICE_COMMAND";
const char *MONITORING_LIMIT_EXCEEDED_STRING = "MONITORING_LIMIT_EXCEEDED";
const char *MONITORING_AMBIGUOUS_STRING = "MONITORING_AMBIGUOUS";
+const char *DEVICE_WANTS_HARD_REBOOT_STRING = "DEVICE_WANTS_HARD_REBOOT";
const char *FUSE_CURRENT_HIGH_STRING = "FUSE_CURRENT_HIGH";
const char *FUSE_WENT_OFF_STRING = "FUSE_WENT_OFF";
const char *POWER_ABOVE_HIGH_LIMIT_STRING = "POWER_ABOVE_HIGH_LIMIT";
@@ -59,7 +60,6 @@ const char *MONITOR_CHANGED_STATE_STRING = "MONITOR_CHANGED_STATE";
const char *VALUE_BELOW_LOW_LIMIT_STRING = "VALUE_BELOW_LOW_LIMIT";
const char *VALUE_ABOVE_HIGH_LIMIT_STRING = "VALUE_ABOVE_HIGH_LIMIT";
const char *VALUE_OUT_OF_RANGE_STRING = "VALUE_OUT_OF_RANGE";
-const char *SWITCHING_TM_FAILED_STRING = "SWITCHING_TM_FAILED";
const char *CHANGING_MODE_STRING = "CHANGING_MODE";
const char *MODE_INFO_STRING = "MODE_INFO";
const char *FALLBACK_FAILED_STRING = "FALLBACK_FAILED";
@@ -147,289 +147,289 @@ const char *STR_HELPER_SENDING_PACKET_FAILED_STRING = "STR_HELPER_SENDING_PACKET
const char *STR_HELPER_REQUESTING_MSG_FAILED_STRING = "STR_HELPER_REQUESTING_MSG_FAILED";
const char * translateEvents(Event event) {
- switch( (event & 0xffff) ) {
- case(2200):
- return STORE_SEND_WRITE_FAILED_STRING;
- case(2201):
- return STORE_WRITE_FAILED_STRING;
- case(2202):
- return STORE_SEND_READ_FAILED_STRING;
- case(2203):
- return STORE_READ_FAILED_STRING;
- case(2204):
- return UNEXPECTED_MSG_STRING;
- case(2205):
- return STORING_FAILED_STRING;
- case(2206):
- return TM_DUMP_FAILED_STRING;
- case(2207):
- return STORE_INIT_FAILED_STRING;
- case(2208):
- return STORE_INIT_EMPTY_STRING;
- case(2209):
- return STORE_CONTENT_CORRUPTED_STRING;
- case(2210):
- return STORE_INITIALIZE_STRING;
- case(2211):
- return INIT_DONE_STRING;
- case(2212):
- return DUMP_FINISHED_STRING;
- case(2213):
- return DELETION_FINISHED_STRING;
- case(2214):
- return DELETION_FAILED_STRING;
- case(2215):
- return AUTO_CATALOGS_SENDING_FAILED_STRING;
- case(2600):
- return GET_DATA_FAILED_STRING;
- case(2601):
- return STORE_DATA_FAILED_STRING;
- case(2800):
- return DEVICE_BUILDING_COMMAND_FAILED_STRING;
- case(2801):
- return DEVICE_SENDING_COMMAND_FAILED_STRING;
- case(2802):
- return DEVICE_REQUESTING_REPLY_FAILED_STRING;
- case(2803):
- return DEVICE_READING_REPLY_FAILED_STRING;
- case(2804):
- return DEVICE_INTERPRETING_REPLY_FAILED_STRING;
- case(2805):
- return DEVICE_MISSED_REPLY_STRING;
- case(2806):
- return DEVICE_UNKNOWN_REPLY_STRING;
- case(2807):
- return DEVICE_UNREQUESTED_REPLY_STRING;
- case(2808):
- return INVALID_DEVICE_COMMAND_STRING;
- case(2809):
- return MONITORING_LIMIT_EXCEEDED_STRING;
- case(2810):
- return MONITORING_AMBIGUOUS_STRING;
- case(4201):
- return FUSE_CURRENT_HIGH_STRING;
- case(4202):
- return FUSE_WENT_OFF_STRING;
- case(4204):
- return POWER_ABOVE_HIGH_LIMIT_STRING;
- case(4205):
- return POWER_BELOW_LOW_LIMIT_STRING;
- case(4300):
- return SWITCH_WENT_OFF_STRING;
- case(5000):
- return HEATER_ON_STRING;
- case(5001):
- return HEATER_OFF_STRING;
- case(5002):
- return HEATER_TIMEOUT_STRING;
- case(5003):
- return HEATER_STAYED_ON_STRING;
- case(5004):
- return HEATER_STAYED_OFF_STRING;
- case(5200):
- return TEMP_SENSOR_HIGH_STRING;
- case(5201):
- return TEMP_SENSOR_LOW_STRING;
- case(5202):
- return TEMP_SENSOR_GRADIENT_STRING;
- case(5901):
- return COMPONENT_TEMP_LOW_STRING;
- case(5902):
- return COMPONENT_TEMP_HIGH_STRING;
- case(5903):
- return COMPONENT_TEMP_OOL_LOW_STRING;
- case(5904):
- return COMPONENT_TEMP_OOL_HIGH_STRING;
- case(5905):
- return TEMP_NOT_IN_OP_RANGE_STRING;
- case(7101):
- return FDIR_CHANGED_STATE_STRING;
- case(7102):
- return FDIR_STARTS_RECOVERY_STRING;
- case(7103):
- return FDIR_TURNS_OFF_DEVICE_STRING;
- case(7201):
- return MONITOR_CHANGED_STATE_STRING;
- case(7202):
- return VALUE_BELOW_LOW_LIMIT_STRING;
- case(7203):
- return VALUE_ABOVE_HIGH_LIMIT_STRING;
- case(7204):
- return VALUE_OUT_OF_RANGE_STRING;
- case(7301):
- return SWITCHING_TM_FAILED_STRING;
- case(7400):
- return CHANGING_MODE_STRING;
- case(7401):
- return MODE_INFO_STRING;
- case(7402):
- return FALLBACK_FAILED_STRING;
- case(7403):
- return MODE_TRANSITION_FAILED_STRING;
- case(7404):
- return CANT_KEEP_MODE_STRING;
- case(7405):
- return OBJECT_IN_INVALID_MODE_STRING;
- case(7406):
- return FORCING_MODE_STRING;
- case(7407):
- return MODE_CMD_REJECTED_STRING;
- case(7506):
- return HEALTH_INFO_STRING;
- case(7507):
- return CHILD_CHANGED_HEALTH_STRING;
- case(7508):
- return CHILD_PROBLEMS_STRING;
- case(7509):
- return OVERWRITING_HEALTH_STRING;
- case(7510):
- return TRYING_RECOVERY_STRING;
- case(7511):
- return RECOVERY_STEP_STRING;
- case(7512):
- return RECOVERY_DONE_STRING;
- case(7900):
- return RF_AVAILABLE_STRING;
- case(7901):
- return RF_LOST_STRING;
- case(7902):
- return BIT_LOCK_STRING;
- case(7903):
- return BIT_LOCK_LOST_STRING;
- case(7905):
- return FRAME_PROCESSING_FAILED_STRING;
- case(8900):
- return CLOCK_SET_STRING;
- case(8901):
- return CLOCK_SET_FAILURE_STRING;
- case(9700):
- 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(11301):
- return ERROR_STATE_STRING;
- case(11501):
- return SUPV_MEMORY_READ_RPT_CRC_FAILURE_STRING;
- case(11502):
- return SUPV_ACK_FAILURE_STRING;
- case(11503):
- return SUPV_EXE_FAILURE_STRING;
- case(11504):
- return SUPV_CRC_FAILURE_EVENT_STRING;
- case(11600):
- return SANITIZATION_FAILED_STRING;
- case(11700):
- return UPDATE_FILE_NOT_EXISTS_STRING;
- case(11701):
- return ACTION_COMMANDING_FAILED_STRING;
- case(11702):
- return UPDATE_AVAILABLE_FAILED_STRING;
- case(11703):
- return UPDATE_TRANSFER_FAILED_STRING;
- case(11704):
- return UPDATE_VERIFY_FAILED_STRING;
- case(11705):
- return UPDATE_FINISHED_STRING;
- case(11800):
- return SEND_MRAM_DUMP_FAILED_STRING;
- case(11801):
- return MRAM_DUMP_FAILED_STRING;
- case(11802):
- return MRAM_DUMP_FINISHED_STRING;
- case(11901):
- return INVALID_TC_FRAME_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;
- case(12001):
- return IMAGE_DOWNLOAD_FAILED_STRING;
- case(12002):
- return IMAGE_UPLOAD_SUCCESSFUL_STRING;
- case(12003):
- return IMAGE_DOWNLOAD_SUCCESSFUL_STRING;
- case(12004):
- return FLASH_WRITE_SUCCESSFUL_STRING;
- case(12005):
- return FLASH_READ_SUCCESSFUL_STRING;
- case(12006):
- return FLASH_WRITE_FAILED_STRING;
- case(12007):
- return FLASH_READ_FAILED_STRING;
- case(12008):
- return FPGA_DOWNLOAD_SUCCESSFUL_STRING;
- case(12009):
- return FPGA_DOWNLOAD_FAILED_STRING;
- case(12010):
- return FPGA_UPLOAD_SUCCESSFUL_STRING;
- case(12011):
- return FPGA_UPLOAD_FAILED_STRING;
- case(12012):
- return STR_HELPER_READING_REPLY_FAILED_STRING;
- case(12013):
- return STR_HELPER_COM_ERROR_STRING;
- case(12014):
- return STR_HELPER_NO_REPLY_STRING;
- case(12015):
- return STR_HELPER_DEC_ERROR_STRING;
- case(12016):
- return POSITION_MISMATCH_STRING;
- case(12017):
- return STR_HELPER_FILE_NOT_EXISTS_STRING;
- case(12018):
- return STR_HELPER_SENDING_PACKET_FAILED_STRING;
- case(12019):
- return STR_HELPER_REQUESTING_MSG_FAILED_STRING;
- default:
- return "UNKNOWN_EVENT";
- }
- return 0;
+ switch( (event & 0xffff) ) {
+ case(2200):
+ return STORE_SEND_WRITE_FAILED_STRING;
+ case(2201):
+ return STORE_WRITE_FAILED_STRING;
+ case(2202):
+ return STORE_SEND_READ_FAILED_STRING;
+ case(2203):
+ return STORE_READ_FAILED_STRING;
+ case(2204):
+ return UNEXPECTED_MSG_STRING;
+ case(2205):
+ return STORING_FAILED_STRING;
+ case(2206):
+ return TM_DUMP_FAILED_STRING;
+ case(2207):
+ return STORE_INIT_FAILED_STRING;
+ case(2208):
+ return STORE_INIT_EMPTY_STRING;
+ case(2209):
+ return STORE_CONTENT_CORRUPTED_STRING;
+ case(2210):
+ return STORE_INITIALIZE_STRING;
+ case(2211):
+ return INIT_DONE_STRING;
+ case(2212):
+ return DUMP_FINISHED_STRING;
+ case(2213):
+ return DELETION_FINISHED_STRING;
+ case(2214):
+ return DELETION_FAILED_STRING;
+ case(2215):
+ return AUTO_CATALOGS_SENDING_FAILED_STRING;
+ case(2600):
+ return GET_DATA_FAILED_STRING;
+ case(2601):
+ return STORE_DATA_FAILED_STRING;
+ case(2800):
+ return DEVICE_BUILDING_COMMAND_FAILED_STRING;
+ case(2801):
+ return DEVICE_SENDING_COMMAND_FAILED_STRING;
+ case(2802):
+ return DEVICE_REQUESTING_REPLY_FAILED_STRING;
+ case(2803):
+ return DEVICE_READING_REPLY_FAILED_STRING;
+ case(2804):
+ return DEVICE_INTERPRETING_REPLY_FAILED_STRING;
+ case(2805):
+ return DEVICE_MISSED_REPLY_STRING;
+ case(2806):
+ return DEVICE_UNKNOWN_REPLY_STRING;
+ case(2807):
+ return DEVICE_UNREQUESTED_REPLY_STRING;
+ case(2808):
+ return INVALID_DEVICE_COMMAND_STRING;
+ case(2809):
+ return MONITORING_LIMIT_EXCEEDED_STRING;
+ case(2810):
+ return MONITORING_AMBIGUOUS_STRING;
+ case(2811):
+ return DEVICE_WANTS_HARD_REBOOT_STRING;
+ case(4201):
+ return FUSE_CURRENT_HIGH_STRING;
+ case(4202):
+ return FUSE_WENT_OFF_STRING;
+ case(4204):
+ return POWER_ABOVE_HIGH_LIMIT_STRING;
+ case(4205):
+ return POWER_BELOW_LOW_LIMIT_STRING;
+ case(4300):
+ return SWITCH_WENT_OFF_STRING;
+ case(5000):
+ return HEATER_ON_STRING;
+ case(5001):
+ return HEATER_OFF_STRING;
+ case(5002):
+ return HEATER_TIMEOUT_STRING;
+ case(5003):
+ return HEATER_STAYED_ON_STRING;
+ case(5004):
+ return HEATER_STAYED_OFF_STRING;
+ case(5200):
+ return TEMP_SENSOR_HIGH_STRING;
+ case(5201):
+ return TEMP_SENSOR_LOW_STRING;
+ case(5202):
+ return TEMP_SENSOR_GRADIENT_STRING;
+ case(5901):
+ return COMPONENT_TEMP_LOW_STRING;
+ case(5902):
+ return COMPONENT_TEMP_HIGH_STRING;
+ case(5903):
+ return COMPONENT_TEMP_OOL_LOW_STRING;
+ case(5904):
+ return COMPONENT_TEMP_OOL_HIGH_STRING;
+ case(5905):
+ return TEMP_NOT_IN_OP_RANGE_STRING;
+ case(7101):
+ return FDIR_CHANGED_STATE_STRING;
+ case(7102):
+ return FDIR_STARTS_RECOVERY_STRING;
+ case(7103):
+ return FDIR_TURNS_OFF_DEVICE_STRING;
+ case(7201):
+ return MONITOR_CHANGED_STATE_STRING;
+ case(7202):
+ return VALUE_BELOW_LOW_LIMIT_STRING;
+ case(7203):
+ return VALUE_ABOVE_HIGH_LIMIT_STRING;
+ case(7204):
+ return VALUE_OUT_OF_RANGE_STRING;
+ case(7400):
+ return CHANGING_MODE_STRING;
+ case(7401):
+ return MODE_INFO_STRING;
+ case(7402):
+ return FALLBACK_FAILED_STRING;
+ case(7403):
+ return MODE_TRANSITION_FAILED_STRING;
+ case(7404):
+ return CANT_KEEP_MODE_STRING;
+ case(7405):
+ return OBJECT_IN_INVALID_MODE_STRING;
+ case(7406):
+ return FORCING_MODE_STRING;
+ case(7407):
+ return MODE_CMD_REJECTED_STRING;
+ case(7506):
+ return HEALTH_INFO_STRING;
+ case(7507):
+ return CHILD_CHANGED_HEALTH_STRING;
+ case(7508):
+ return CHILD_PROBLEMS_STRING;
+ case(7509):
+ return OVERWRITING_HEALTH_STRING;
+ case(7510):
+ return TRYING_RECOVERY_STRING;
+ case(7511):
+ return RECOVERY_STEP_STRING;
+ case(7512):
+ return RECOVERY_DONE_STRING;
+ case(7900):
+ return RF_AVAILABLE_STRING;
+ case(7901):
+ return RF_LOST_STRING;
+ case(7902):
+ return BIT_LOCK_STRING;
+ case(7903):
+ return BIT_LOCK_LOST_STRING;
+ case(7905):
+ return FRAME_PROCESSING_FAILED_STRING;
+ case(8900):
+ return CLOCK_SET_STRING;
+ case(8901):
+ return CLOCK_SET_FAILURE_STRING;
+ case(9700):
+ 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(11301):
+ return ERROR_STATE_STRING;
+ case(11501):
+ return SUPV_MEMORY_READ_RPT_CRC_FAILURE_STRING;
+ case(11502):
+ return SUPV_ACK_FAILURE_STRING;
+ case(11503):
+ return SUPV_EXE_FAILURE_STRING;
+ case(11504):
+ return SUPV_CRC_FAILURE_EVENT_STRING;
+ case(11600):
+ return SANITIZATION_FAILED_STRING;
+ case(11700):
+ return UPDATE_FILE_NOT_EXISTS_STRING;
+ case(11701):
+ return ACTION_COMMANDING_FAILED_STRING;
+ case(11702):
+ return UPDATE_AVAILABLE_FAILED_STRING;
+ case(11703):
+ return UPDATE_TRANSFER_FAILED_STRING;
+ case(11704):
+ return UPDATE_VERIFY_FAILED_STRING;
+ case(11705):
+ return UPDATE_FINISHED_STRING;
+ case(11800):
+ return SEND_MRAM_DUMP_FAILED_STRING;
+ case(11801):
+ return MRAM_DUMP_FAILED_STRING;
+ case(11802):
+ return MRAM_DUMP_FINISHED_STRING;
+ case(11901):
+ return INVALID_TC_FRAME_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;
+ case(12001):
+ return IMAGE_DOWNLOAD_FAILED_STRING;
+ case(12002):
+ return IMAGE_UPLOAD_SUCCESSFUL_STRING;
+ case(12003):
+ return IMAGE_DOWNLOAD_SUCCESSFUL_STRING;
+ case(12004):
+ return FLASH_WRITE_SUCCESSFUL_STRING;
+ case(12005):
+ return FLASH_READ_SUCCESSFUL_STRING;
+ case(12006):
+ return FLASH_WRITE_FAILED_STRING;
+ case(12007):
+ return FLASH_READ_FAILED_STRING;
+ case(12008):
+ return FPGA_DOWNLOAD_SUCCESSFUL_STRING;
+ case(12009):
+ return FPGA_DOWNLOAD_FAILED_STRING;
+ case(12010):
+ return FPGA_UPLOAD_SUCCESSFUL_STRING;
+ case(12011):
+ return FPGA_UPLOAD_FAILED_STRING;
+ case(12012):
+ return STR_HELPER_READING_REPLY_FAILED_STRING;
+ case(12013):
+ return STR_HELPER_COM_ERROR_STRING;
+ case(12014):
+ return STR_HELPER_NO_REPLY_STRING;
+ case(12015):
+ return STR_HELPER_DEC_ERROR_STRING;
+ case(12016):
+ return POSITION_MISMATCH_STRING;
+ case(12017):
+ return STR_HELPER_FILE_NOT_EXISTS_STRING;
+ case(12018):
+ return STR_HELPER_SENDING_PACKET_FAILED_STRING;
+ case(12019):
+ return STR_HELPER_REQUESTING_MSG_FAILED_STRING;
+ default:
+ return "UNKNOWN_EVENT";
+ }
+ return 0;
}
diff --git a/generators/objects/translateObjects.cpp b/generators/objects/translateObjects.cpp
index 899aaf2b..44b74490 100644
--- a/generators/objects/translateObjects.cpp
+++ b/generators/objects/translateObjects.cpp
@@ -1,8 +1,8 @@
/**
* @brief Auto-generated object translation file.
* @details
- * Contains 113 translations.
- * Generated on: 2022-01-17 15:36:10
+ * Contains 110 translations.
+ * Generated on: 2022-02-03 12:01:36
*/
#include "translateObjects.h"
@@ -36,14 +36,14 @@ const char *MGM_3_RM3100_HANDLER_STRING = "MGM_3_RM3100_HANDLER";
const char *GYRO_3_L3G_HANDLER_STRING = "GYRO_3_L3G_HANDLER";
const char *RW4_STRING = "RW4";
const char *STAR_TRACKER_STRING = "STAR_TRACKER";
-const char *GPS0_HANDLER_STRING = "GPS0_HANDLER";
-const char *GPS1_HANDLER_STRING = "GPS1_HANDLER";
+const char *GPS_CONTROLLER_STRING = "GPS_CONTROLLER";
const char *IMTQ_HANDLER_STRING = "IMTQ_HANDLER";
const char *PCDU_HANDLER_STRING = "PCDU_HANDLER";
const char *P60DOCK_HANDLER_STRING = "P60DOCK_HANDLER";
const char *PDU1_HANDLER_STRING = "PDU1_HANDLER";
const char *PDU2_HANDLER_STRING = "PDU2_HANDLER";
const char *ACU_HANDLER_STRING = "ACU_HANDLER";
+const char *BPX_BATT_HANDLER_STRING = "BPX_BATT_HANDLER";
const char *RAD_SENSOR_STRING = "RAD_SENSOR";
const char *PLOC_UPDATER_STRING = "PLOC_UPDATER";
const char *PLOC_MEMORY_DUMPER_STRING = "PLOC_MEMORY_DUMPER";
@@ -83,10 +83,6 @@ const char *TMTC_BRIDGE_STRING = "TMTC_BRIDGE";
const char *TMTC_POLLING_TASK_STRING = "TMTC_POLLING_TASK";
const char *FILE_SYSTEM_HANDLER_STRING = "FILE_SYSTEM_HANDLER";
const char *PTME_STRING = "PTME";
-const char *PAPB_VC0_STRING = "PAPB_VC0";
-const char *PAPB_VC1_STRING = "PAPB_VC1";
-const char *PAPB_VC2_STRING = "PAPB_VC2";
-const char *PAPB_VC3_STRING = "PAPB_VC3";
const char *PDEC_HANDLER_STRING = "PDEC_HANDLER";
const char *CCSDS_HANDLER_STRING = "CCSDS_HANDLER";
const char *PUS_SERVICE_6_STRING = "PUS_SERVICE_6";
@@ -101,6 +97,7 @@ const char *PUS_SERVICE_17_TEST_STRING = "PUS_SERVICE_17_TEST";
const char *PUS_SERVICE_20_PARAMETERS_STRING = "PUS_SERVICE_20_PARAMETERS";
const char *PUS_SERVICE_200_MODE_MGMT_STRING = "PUS_SERVICE_200_MODE_MGMT";
const char *PUS_SERVICE_201_HEALTH_STRING = "PUS_SERVICE_201_HEALTH";
+const char *CFDP_PACKET_DISTRIBUTOR_STRING = "CFDP_PACKET_DISTRIBUTOR";
const char *HEALTH_TABLE_STRING = "HEALTH_TABLE";
const char *MODE_STORE_STRING = "MODE_STORE";
const char *EVENT_MANAGER_STRING = "EVENT_MANAGER";
@@ -183,9 +180,7 @@ const char* translateObject(object_id_t object) {
case 0x44130001:
return STAR_TRACKER_STRING;
case 0x44130045:
- return GPS0_HANDLER_STRING;
- case 0x44130146:
- return GPS1_HANDLER_STRING;
+ return GPS_CONTROLLER_STRING;
case 0x44140014:
return IMTQ_HANDLER_STRING;
case 0x442000A1:
@@ -198,6 +193,8 @@ const char* translateObject(object_id_t object) {
return PDU2_HANDLER_STRING;
case 0x44250003:
return ACU_HANDLER_STRING;
+ case 0x44260000:
+ return BPX_BATT_HANDLER_STRING;
case 0x443200A5:
return RAD_SENSOR_STRING;
case 0x44330000:
@@ -277,14 +274,6 @@ const char* translateObject(object_id_t object) {
case 0x50000600:
return PTME_STRING;
case 0x50000700:
- return PAPB_VC0_STRING;
- case 0x50000701:
- return PAPB_VC1_STRING;
- case 0x50000702:
- return PAPB_VC2_STRING;
- case 0x50000703:
- return PAPB_VC3_STRING;
- case 0x50000704:
return PDEC_HANDLER_STRING;
case 0x50000800:
return CCSDS_HANDLER_STRING;
@@ -312,6 +301,8 @@ const char* translateObject(object_id_t object) {
return PUS_SERVICE_200_MODE_MGMT_STRING;
case 0x53000201:
return PUS_SERVICE_201_HEALTH_STRING;
+ case 0x53001000:
+ return CFDP_PACKET_DISTRIBUTOR_STRING;
case 0x53010000:
return HEALTH_TABLE_STRING;
case 0x53010100:
diff --git a/linux/boardtest/I2cTestClass.cpp b/linux/boardtest/I2cTestClass.cpp
index 090691e2..1bd0aa52 100644
--- a/linux/boardtest/I2cTestClass.cpp
+++ b/linux/boardtest/I2cTestClass.cpp
@@ -1,5 +1,101 @@
-#include
+#include "I2cTestClass.h"
-I2cTestClass::I2cTestClass(object_id_t objectId) : TestTask(objectId) {}
+#include
+#include
+#include
+#include
-ReturnValue_t I2cTestClass::performPeriodicAction() { return HasReturnvaluesIF::RETURN_OK; }
+#include "fsfw/globalfunctions/arrayprinter.h"
+#include "fsfw/serviceinterface.h"
+
+I2cTestClass::I2cTestClass(object_id_t objectId, std::string i2cdev)
+ : TestTask(objectId), i2cdev(i2cdev) {
+ mode = TestModes::BPX_BATTERY;
+}
+
+ReturnValue_t I2cTestClass::initialize() {
+ if (mode == TestModes::BPX_BATTERY) {
+ battInit();
+ }
+ return HasReturnvaluesIF::RETURN_OK;
+}
+
+ReturnValue_t I2cTestClass::performPeriodicAction() {
+ if (mode == TestModes::BPX_BATTERY) {
+ battPeriodic();
+ }
+ return HasReturnvaluesIF::RETURN_OK;
+}
+
+void I2cTestClass::battInit() {
+ sif::info << "I2cTestClass: BPX Initialization" << std::endl;
+ UnixFileGuard fileHelper(i2cdev, &bpxInfo.fd, O_RDWR, "I2cTestClass::sendMessage");
+ if (fileHelper.getOpenResult() != HasReturnvaluesIF::RETURN_OK) {
+ sif::error << "Opening I2C device" << i2cdev << " failed" << std::endl;
+ return;
+ }
+ if (ioctl(bpxInfo.fd, I2C_SLAVE, bpxInfo.addr) < 0) {
+ sif::error << "Failed to acquire bus access and/or talk to slave" << std::endl;
+ }
+ cmdBuf[0] = BpxBattery::PORT_PING;
+ cmdBuf[1] = 0x42;
+ sendLen = 2;
+ ReturnValue_t result = i2cWrite(bpxInfo.fd, cmdBuf.data(), sendLen);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return;
+ }
+ // Receive back port, error byte and ping reply
+ recvLen = 3;
+ result = i2cRead(bpxInfo.fd, replyBuf.data(), recvLen);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return;
+ }
+ sif::info << "Ping reply:" << std::endl;
+ arrayprinter::print(replyBuf.data(), recvLen);
+ if (replyBuf[2] != 0x42) {
+ sif::warning << "Received ping reply not expected value 0x42" << std::endl;
+ }
+}
+
+void I2cTestClass::battPeriodic() {
+ UnixFileGuard fileHelper(i2cdev, &bpxInfo.fd, O_RDWR, "I2cTestClass::sendMessage");
+ if (fileHelper.getOpenResult() != HasReturnvaluesIF::RETURN_OK) {
+ sif::error << "Opening I2C device" << i2cdev << " failed" << std::endl;
+ return;
+ }
+ if (ioctl(bpxInfo.fd, I2C_SLAVE, bpxInfo.addr) < 0) {
+ sif::error << "Failed to acquire bus access and/or talk to slave" << std::endl;
+ }
+ cmdBuf[0] = BpxBattery::PORT_GET_HK;
+ sendLen = 1;
+ ReturnValue_t result = i2cWrite(bpxInfo.fd, cmdBuf.data(), sendLen);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return;
+ }
+ // Receive back HK set
+ recvLen = 23;
+ result = i2cRead(bpxInfo.fd, replyBuf.data(), recvLen);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return;
+ }
+ sif::info << "HK reply:" << std::endl;
+ arrayprinter::print(replyBuf.data(), recvLen);
+}
+
+ReturnValue_t I2cTestClass::i2cWrite(int fd, uint8_t* data, size_t len) {
+ if (write(fd, data, len) != static_cast(len)) {
+ sif::error << "Failed to write to I2C bus" << std::endl;
+ sif::error << "Error " << errno << ": " << strerror(errno) << std::endl;
+ return HasReturnvaluesIF::RETURN_FAILED;
+ }
+ return HasReturnvaluesIF::RETURN_OK;
+}
+
+ReturnValue_t I2cTestClass::i2cRead(int fd, uint8_t* data, size_t len) {
+ if (read(fd, data, len) != static_cast(len)) {
+ sif::error << "Failed to read from I2C bus" << std::endl;
+ sif::error << "Error " << errno << ": " << strerror(errno) << std::endl;
+ return HasReturnvaluesIF::RETURN_FAILED;
+ }
+ return HasReturnvaluesIF::RETURN_OK;
+}
diff --git a/linux/boardtest/I2cTestClass.h b/linux/boardtest/I2cTestClass.h
index 314f9dda..500243c5 100644
--- a/linux/boardtest/I2cTestClass.h
+++ b/linux/boardtest/I2cTestClass.h
@@ -3,13 +3,38 @@
#include
+#include
+#include
+
+#include "mission/devices/devicedefinitions/BpxBatteryDefinitions.h"
+
class I2cTestClass : public TestTask {
public:
- I2cTestClass(object_id_t objectId);
+ I2cTestClass(object_id_t objectId, std::string i2cdev);
+ ReturnValue_t initialize() override;
ReturnValue_t performPeriodicAction() override;
private:
+ enum TestModes { NONE, BPX_BATTERY };
+ struct I2cInfo {
+ int addr = 0;
+ int fd = 0;
+ };
+
+ TestModes mode = TestModes::NONE;
+ void battInit();
+ void battPeriodic();
+
+ I2cInfo bpxInfo = {.addr = 0x07, .fd = 0};
+ std::string i2cdev;
+ size_t sendLen = 0;
+ size_t recvLen = 0;
+ std::array cmdBuf = {};
+ std::array replyBuf = {};
+
+ ReturnValue_t i2cWrite(int fd, uint8_t* data, size_t len);
+ ReturnValue_t i2cRead(int fd, uint8_t* data, size_t len);
};
#endif /* LINUX_BOARDTEST_I2CTESTCLASS_H_ */
diff --git a/linux/boardtest/UartTestClass.cpp b/linux/boardtest/UartTestClass.cpp
index 9b20ad13..e6033c09 100644
--- a/linux/boardtest/UartTestClass.cpp
+++ b/linux/boardtest/UartTestClass.cpp
@@ -17,6 +17,23 @@
UartTestClass::UartTestClass(object_id_t objectId) : TestTask(objectId) {}
ReturnValue_t UartTestClass::initialize() {
+ if (mode == TestModes::GPS) {
+ gpsInit();
+ }
+
+ return HasReturnvaluesIF::RETURN_OK;
+}
+
+ReturnValue_t UartTestClass::performOneShotAction() { return HasReturnvaluesIF::RETURN_OK; }
+
+ReturnValue_t UartTestClass::performPeriodicAction() {
+ if (mode == TestModes::GPS) {
+ gpsPeriodic();
+ }
+ return HasReturnvaluesIF::RETURN_OK;
+}
+
+void UartTestClass::gpsInit() {
#if RPI_TEST_GPS_DEVICE == 1
int result = lwgps_init(&gpsData);
if (result == 0) {
@@ -62,16 +79,9 @@ ReturnValue_t UartTestClass::initialize() {
// Flush received and unread data. Those are old NMEA strings which are not relevant anymore
tcflush(serialPort, TCIFLUSH);
#endif
- return HasReturnvaluesIF::RETURN_OK;
}
-ReturnValue_t UartTestClass::performOneShotAction() {
-#if RPI_TEST_GPS_DEVICE == 1
-#endif
- return HasReturnvaluesIF::RETURN_OK;
-}
-
-ReturnValue_t UartTestClass::performPeriodicAction() {
+void UartTestClass::gpsPeriodic() {
#if RPI_TEST_GPS_DEVICE == 1
int bytesRead = 0;
do {
@@ -107,5 +117,4 @@ ReturnValue_t UartTestClass::performPeriodicAction() {
}
} while (bytesRead > 0);
#endif
- return HasReturnvaluesIF::RETURN_OK;
}
diff --git a/linux/boardtest/UartTestClass.h b/linux/boardtest/UartTestClass.h
index f32d909d..fb0e2501 100644
--- a/linux/boardtest/UartTestClass.h
+++ b/linux/boardtest/UartTestClass.h
@@ -17,6 +17,15 @@ class UartTestClass : public TestTask {
ReturnValue_t performPeriodicAction() override;
private:
+ enum TestModes {
+ GPS,
+ // Solar Cell Experiment
+ SCE
+ };
+
+ void gpsInit();
+ void gpsPeriodic();
+ TestModes mode = TestModes::GPS;
lwgps_t gpsData = {};
struct termios tty = {};
int serialPort = 0;
diff --git a/linux/devices/CMakeLists.txt b/linux/devices/CMakeLists.txt
index b02c8e57..0b545a7d 100644
--- a/linux/devices/CMakeLists.txt
+++ b/linux/devices/CMakeLists.txt
@@ -2,3 +2,5 @@ target_sources(${TARGET_NAME} PRIVATE
SolarArrayDeploymentHandler.cpp
SusHandler.cpp
)
+
+add_subdirectory(startracker)
\ No newline at end of file
diff --git a/bsp_q7s/devices/startracker/StarTrackerDefinitions.h b/linux/devices/devicedefinitions/StarTrackerDefinitions.h
similarity index 99%
rename from bsp_q7s/devices/startracker/StarTrackerDefinitions.h
rename to linux/devices/devicedefinitions/StarTrackerDefinitions.h
index 0c04e1c5..7073bac9 100644
--- a/bsp_q7s/devices/startracker/StarTrackerDefinitions.h
+++ b/linux/devices/devicedefinitions/StarTrackerDefinitions.h
@@ -1,5 +1,5 @@
-#ifndef MISSION_STARTRACKER_DEFINITIONS_H_
-#define MISSION_STARTRACKER_DEFINITIONS_H_
+#ifndef LINUX_DEVICES_DEVICEDEFINITIONS_DEFINITIONS_H_
+#define LINUX_DEVICES_DEVICEDEFINITIONS_DEFINITIONS_H_
#include
#include
@@ -1253,4 +1253,4 @@ class LimitsSet : public StaticLocalDataSet {
}
};
} // namespace StarTracker
-#endif /* MISSION_STARTRACKER_DEFINITIONS_H_ */
+#endif /* LINUX_DEVICES_DEVICEDEFINITIONS_DEFINITIONS_H_ */
diff --git a/bsp_q7s/devices/startracker/ArcsecDatalinkLayer.cpp b/linux/devices/startracker/ArcsecDatalinkLayer.cpp
similarity index 100%
rename from bsp_q7s/devices/startracker/ArcsecDatalinkLayer.cpp
rename to linux/devices/startracker/ArcsecDatalinkLayer.cpp
diff --git a/bsp_q7s/devices/startracker/ArcsecDatalinkLayer.h b/linux/devices/startracker/ArcsecDatalinkLayer.h
similarity index 97%
rename from bsp_q7s/devices/startracker/ArcsecDatalinkLayer.h
rename to linux/devices/startracker/ArcsecDatalinkLayer.h
index 6b4d3095..d287a888 100644
--- a/bsp_q7s/devices/startracker/ArcsecDatalinkLayer.h
+++ b/linux/devices/startracker/ArcsecDatalinkLayer.h
@@ -1,8 +1,8 @@
#ifndef BSP_Q7S_DEVICES_ARCSECDATALINKLAYER_H_
#define BSP_Q7S_DEVICES_ARCSECDATALINKLAYER_H_
-#include "StarTrackerDefinitions.h"
#include "fsfw/returnvalues/HasReturnvaluesIF.h"
+#include "linux/devices/devicedefinitions/StarTrackerDefinitions.h"
extern "C" {
#include "common/misc.h"
diff --git a/bsp_q7s/devices/startracker/ArcsecJsonKeys.h b/linux/devices/startracker/ArcsecJsonKeys.h
similarity index 98%
rename from bsp_q7s/devices/startracker/ArcsecJsonKeys.h
rename to linux/devices/startracker/ArcsecJsonKeys.h
index 044bef8d..28d4ad3f 100644
--- a/bsp_q7s/devices/startracker/ArcsecJsonKeys.h
+++ b/linux/devices/startracker/ArcsecJsonKeys.h
@@ -71,7 +71,7 @@ static const char MAX_TOTAL_VALUE[] = "maxTotalValue";
static const char MIN_BRIGHT_NEIGHBOURS[] = "minBrightNeighbours";
static const char MAX_BRIGHT_NEIGHBOURS[] = "maxBrightNeighbours";
static const char MAX_PIXEL_TO_CONSIDER[] = "maxPixelsToConsider";
-//static const char SIGNAL_THRESHOLD[] = "signalThreshold";
+// static const char SIGNAL_THRESHOLD[] = "signalThreshold";
static const char BLOB_DARK_THRESHOLD[] = "darkThreshold";
static const char ENABLE_HISTOGRAM[] = "enableHistogram";
static const char ENABLE_CONTRAST[] = "enableContrast";
diff --git a/bsp_q7s/devices/startracker/ArcsecJsonParamBase.cpp b/linux/devices/startracker/ArcsecJsonParamBase.cpp
similarity index 90%
rename from bsp_q7s/devices/startracker/ArcsecJsonParamBase.cpp
rename to linux/devices/startracker/ArcsecJsonParamBase.cpp
index 36aa8ea3..cc8bbc35 100644
--- a/bsp_q7s/devices/startracker/ArcsecJsonParamBase.cpp
+++ b/linux/devices/startracker/ArcsecJsonParamBase.cpp
@@ -8,14 +8,14 @@ ReturnValue_t ArcsecJsonParamBase::create(std::string fullname, uint8_t* buffer)
ReturnValue_t result = RETURN_OK;
result = init(fullname);
if (result != RETURN_OK) {
- sif::warning << "ArcsecJsonParamBase::create: Failed to init parameter command for set "
- << setName << std::endl;
+ sif::warning << "ArcsecJsonParamBase::create: Failed to init parameter command for set "
+ << setName << std::endl;
return result;
}
result = createCommand(buffer);
if (result != RETURN_OK) {
- sif::warning << "ArcsecJsonParamBase::create: Failed to create parameter command for set "
- << setName << std::endl;
+ sif::warning << "ArcsecJsonParamBase::create: Failed to create parameter command for set "
+ << setName << std::endl;
}
return result;
}
@@ -98,6 +98,6 @@ ReturnValue_t ArcsecJsonParamBase::initSet() {
}
}
sif::warning << "ArcsecJsonParamBase::initSet: Set " << setName << "not present in json file"
- << std::endl;
+ << std::endl;
return SET_NOT_EXISTS;
}
diff --git a/bsp_q7s/devices/startracker/ArcsecJsonParamBase.h b/linux/devices/startracker/ArcsecJsonParamBase.h
similarity index 98%
rename from bsp_q7s/devices/startracker/ArcsecJsonParamBase.h
rename to linux/devices/startracker/ArcsecJsonParamBase.h
index a3e7528f..2d20fcae 100644
--- a/bsp_q7s/devices/startracker/ArcsecJsonParamBase.h
+++ b/linux/devices/startracker/ArcsecJsonParamBase.h
@@ -5,8 +5,8 @@
#include
#include
-#include "StarTrackerDefinitions.h"
#include "fsfw/returnvalues/HasReturnvaluesIF.h"
+#include "linux/devices/devicedefinitions/StarTrackerDefinitions.h"
extern "C" {
#include "thirdparty/arcsec_star_tracker/common/generated/tmtcstructs.h"
diff --git a/bsp_q7s/devices/startracker/CMakeLists.txt b/linux/devices/startracker/CMakeLists.txt
similarity index 100%
rename from bsp_q7s/devices/startracker/CMakeLists.txt
rename to linux/devices/startracker/CMakeLists.txt
diff --git a/bsp_q7s/devices/startracker/StarTrackerHandler.cpp b/linux/devices/startracker/StarTrackerHandler.cpp
similarity index 99%
rename from bsp_q7s/devices/startracker/StarTrackerHandler.cpp
rename to linux/devices/startracker/StarTrackerHandler.cpp
index 95cf4d21..3857ed81 100644
--- a/bsp_q7s/devices/startracker/StarTrackerHandler.cpp
+++ b/linux/devices/startracker/StarTrackerHandler.cpp
@@ -12,6 +12,7 @@ extern "C" {
#include
#include
#include
+
#include "common/misc.h"
}
diff --git a/bsp_q7s/devices/startracker/StarTrackerHandler.h b/linux/devices/startracker/StarTrackerHandler.h
similarity index 99%
rename from bsp_q7s/devices/startracker/StarTrackerHandler.h
rename to linux/devices/startracker/StarTrackerHandler.h
index b362b67f..aa7630b1 100644
--- a/bsp_q7s/devices/startracker/StarTrackerHandler.h
+++ b/linux/devices/startracker/StarTrackerHandler.h
@@ -5,11 +5,11 @@
#include "ArcsecDatalinkLayer.h"
#include "ArcsecJsonParamBase.h"
-#include "StarTrackerDefinitions.h"
#include "StrHelper.h"
#include "fsfw/devicehandlers/DeviceHandlerBase.h"
#include "fsfw/src/fsfw/serialize/SerializeAdapter.h"
#include "fsfw/timemanager/Countdown.h"
+#include "linux/devices/devicedefinitions/StarTrackerDefinitions.h"
#include "thirdparty/arcsec_star_tracker/common/SLIP.h"
/**
@@ -269,11 +269,16 @@ class StarTrackerHandler : public DeviceHandlerBase {
// Countdown to insert delay for star tracker to switch from bootloader to firmware program
Countdown bootCountdown;
+#ifdef EGSE
+ std::string paramJsonFile = "/mnt/sd0/startracker/full.json";
+#else
#if OBSW_STAR_TRACKER_GROUND_CONFIG == 1
std::string paramJsonFile = "/mnt/sd0/startracker/ground-config.json";
#else
std::string paramJsonFile = "/mnt/sd0/startracker/flight-config.json";
#endif
+#endif
+
enum class InternalState { TEMPERATURE_REQUEST };
InternalState internalState = InternalState::TEMPERATURE_REQUEST;
diff --git a/bsp_q7s/devices/startracker/StarTrackerJsonCommands.cpp b/linux/devices/startracker/StarTrackerJsonCommands.cpp
similarity index 100%
rename from bsp_q7s/devices/startracker/StarTrackerJsonCommands.cpp
rename to linux/devices/startracker/StarTrackerJsonCommands.cpp
diff --git a/bsp_q7s/devices/startracker/StarTrackerJsonCommands.h b/linux/devices/startracker/StarTrackerJsonCommands.h
similarity index 99%
rename from bsp_q7s/devices/startracker/StarTrackerJsonCommands.h
rename to linux/devices/startracker/StarTrackerJsonCommands.h
index 0c6c1b99..2c816056 100644
--- a/bsp_q7s/devices/startracker/StarTrackerJsonCommands.h
+++ b/linux/devices/startracker/StarTrackerJsonCommands.h
@@ -66,7 +66,7 @@ class Mounting : public ArcsecJsonParamBase {
*/
class ImageProcessor : public ArcsecJsonParamBase {
public:
- ImageProcessor();
+ ImageProcessor();
size_t getSize();
diff --git a/bsp_q7s/devices/startracker/StrHelper.cpp b/linux/devices/startracker/StrHelper.cpp
similarity index 97%
rename from bsp_q7s/devices/startracker/StrHelper.cpp
rename to linux/devices/startracker/StrHelper.cpp
index 7a17260e..77bfe3d9 100644
--- a/bsp_q7s/devices/startracker/StrHelper.cpp
+++ b/linux/devices/startracker/StrHelper.cpp
@@ -1,9 +1,9 @@
#include "StrHelper.h"
-#include "OBSWConfig.h"
#include
#include
+#include "OBSWConfig.h"
#include "mission/utility/Timestamp.h"
StrHelper::StrHelper(object_id_t objectId) : SystemObject(objectId) {}
@@ -11,11 +11,13 @@ StrHelper::StrHelper(object_id_t objectId) : SystemObject(objectId) {}
StrHelper::~StrHelper() {}
ReturnValue_t StrHelper::initialize() {
+#ifdef XIPHOS_Q7S
sdcMan = SdCardManager::instance();
if (sdcMan == nullptr) {
sif::warning << "StrHelper::initialize: Invalid SD Card Manager" << std::endl;
return RETURN_FAILED;
}
+#endif
return RETURN_OK;
}
@@ -107,10 +109,12 @@ ReturnValue_t StrHelper::setComIF(DeviceCommunicationIF* communicationInterface_
void StrHelper::setComCookie(CookieIF* comCookie_) { comCookie = comCookie_; }
ReturnValue_t StrHelper::startImageUpload(std::string fullname) {
+#ifdef XIPHOS_Q7S
ReturnValue_t result = checkPath(fullname);
if (result != RETURN_OK) {
return result;
}
+#endif
uploadImage.uploadFile = fullname;
if (not std::filesystem::exists(fullname)) {
return FILE_NOT_EXISTS;
@@ -122,10 +126,12 @@ ReturnValue_t StrHelper::startImageUpload(std::string fullname) {
}
ReturnValue_t StrHelper::startImageDownload(std::string path) {
+#ifdef XIPHOS_Q7S
ReturnValue_t result = checkPath(path);
if (result != RETURN_OK) {
return result;
}
+#endif
if (not std::filesystem::exists(path)) {
return PATH_NOT_EXISTS;
}
@@ -145,10 +151,12 @@ void StrHelper::setFlashReadFilename(std::string filename) { flashRead.filename
void StrHelper::setDownloadFpgaImage(std::string filename) { fpgaDownload.fileName = filename; }
ReturnValue_t StrHelper::startFirmwareUpdate(std::string fullname) {
+#ifdef XIPHOS_Q7S
ReturnValue_t result = checkPath(fullname);
if (result != RETURN_OK) {
return result;
}
+#endif
flashWrite.fullname = fullname;
if (not std::filesystem::exists(flashWrite.fullname)) {
return FILE_NOT_EXISTS;
@@ -163,10 +171,12 @@ ReturnValue_t StrHelper::startFirmwareUpdate(std::string fullname) {
ReturnValue_t StrHelper::startFlashRead(std::string path, uint8_t region, uint32_t address,
uint32_t length) {
+#ifdef XIPHOS_Q7S
ReturnValue_t result = checkPath(path);
if (result != RETURN_OK) {
return result;
}
+#endif
flashRead.path = path;
if (not std::filesystem::exists(flashRead.path)) {
return FILE_NOT_EXISTS;
@@ -311,7 +321,7 @@ ReturnValue_t StrHelper::performImageUpload() {
return result;
}
#if OBSW_DEBUG_STARTRACKER == 1
- printProgress((uploadReq.position + 1) * SIZE_IMAGE_PART, imageSize);
+ printProgress((uploadReq.position + 1) * SIZE_IMAGE_PART, imageSize);
#endif /* OBSW_DEBUG_STARTRACKER == 1 */
return RETURN_OK;
}
@@ -676,6 +686,7 @@ ReturnValue_t StrHelper::checkFpgaActionReply(uint32_t expectedPosition, uint32_
return result;
}
+#ifdef XIPHOS_Q7S
ReturnValue_t StrHelper::checkPath(std::string name) {
if (name.substr(0, sizeof(SdCardManager::SD_0_MOUNT_POINT)) ==
std::string(SdCardManager::SD_0_MOUNT_POINT)) {
@@ -692,17 +703,18 @@ ReturnValue_t StrHelper::checkPath(std::string name) {
}
return RETURN_OK;
}
+#endif
void StrHelper::printProgress(uint32_t itemsTransferred, uint32_t fullNumItems) {
- float progressInPercent =
- static_cast(itemsTransferred) / static_cast(fullNumItems) * 100;
- if (static_cast(progressInPercent) == nextProgressPrint) {
- sif::info << "Str Helper Progress: " << progressInPercent << " %" << std::endl;
- nextProgressPrint += FIVE_PERCENT;
- }
- if (nextProgressPrint > 100) {
- nextProgressPrint = 0;
- }
+ float progressInPercent =
+ static_cast(itemsTransferred) / static_cast(fullNumItems) * 100;
+ if (static_cast(progressInPercent) == nextProgressPrint) {
+ sif::info << "Str Helper Progress: " << progressInPercent << " %" << std::endl;
+ nextProgressPrint += FIVE_PERCENT;
+ }
+ if (nextProgressPrint > 100) {
+ nextProgressPrint = 0;
+ }
}
ReturnValue_t StrHelper::unlockAndEraseRegions(uint32_t from, uint32_t to) {
diff --git a/bsp_q7s/devices/startracker/StrHelper.h b/linux/devices/startracker/StrHelper.h
similarity index 98%
rename from bsp_q7s/devices/startracker/StrHelper.h
rename to linux/devices/startracker/StrHelper.h
index e0e402b0..85ae0b49 100644
--- a/bsp_q7s/devices/startracker/StrHelper.h
+++ b/linux/devices/startracker/StrHelper.h
@@ -4,7 +4,12 @@
#include
#include "ArcsecDatalinkLayer.h"
+#include "OBSWConfig.h"
+
+#ifdef XIPHOS_Q7S
#include "bsp_q7s/memory/SdCardManager.h"
+#endif
+
#include "fsfw/devicehandlers/CookieIF.h"
#include "fsfw/objectmanager/SystemObject.h"
#include "fsfw/osal/linux/BinarySemaphore.h"
@@ -124,7 +129,7 @@ class StrHelper : public SystemObject, public ExecutableObjectIF, public HasRetu
*
* @param path Path where file with read flash data will be created
* @param region Region ID of flash region to read from
- * @param address Start address of flash section to read
+ * @param address Start address of flash section to read
* @param length Number of bytes to read from flash
*/
ReturnValue_t startFlashRead(std::string path, uint8_t region, uint32_t address, uint32_t length);
@@ -294,7 +299,9 @@ class StrHelper : public SystemObject, public ExecutableObjectIF, public HasRetu
};
FlashRead flashRead;
+#ifdef XIPHOS_Q7S
SdCardManager* sdcMan = nullptr;
+#endif
uint8_t commandBuffer[startracker::MAX_FRAME_SIZE];
@@ -396,12 +403,14 @@ class StrHelper : public SystemObject, public ExecutableObjectIF, public HasRetu
*/
ReturnValue_t checkFpgaActionReply(uint32_t expectedPosition, uint32_t expectedLength);
+#ifdef XIPHOS_Q7S
/**
* @brief Checks if a path points to an sd card and whether the SD card is monuted.
*
* @return SD_NOT_MOUNTED id SD card is not mounted, otherwise RETURN_OK
*/
ReturnValue_t checkPath(std::string name);
+#endif
/**
* @brief Prints progress of transfer which can be useful for large data transfers
diff --git a/linux/fsfwconfig/FSFWConfig.h.in b/linux/fsfwconfig/FSFWConfig.h.in
index 9e8f2016..9db84254 100644
--- a/linux/fsfwconfig/FSFWConfig.h.in
+++ b/linux/fsfwconfig/FSFWConfig.h.in
@@ -73,6 +73,7 @@ static constexpr size_t FSFW_MAX_TM_PACKET_SIZE = 2048;
}
#define FSFW_HAL_SPI_WIRETAPPING 0
+#define FSFW_HAL_I2C_WIRETAPPING 0
#define FSFW_DEV_HYPERION_GPS_CREATE_NMEA_CSV 0
#define FSFW_HAL_L3GD20_GYRO_DEBUG 0
diff --git a/linux/fsfwconfig/OBSWConfig.h.in b/linux/fsfwconfig/OBSWConfig.h.in
index 3162eeb1..1369383c 100644
--- a/linux/fsfwconfig/OBSWConfig.h.in
+++ b/linux/fsfwconfig/OBSWConfig.h.in
@@ -9,6 +9,7 @@
#cmakedefine RASPBERRY_PI
#cmakedefine XIPHOS_Q7S
#cmakedefine BEAGLEBONEBLACK
+#cmakedefine EGSE
#ifdef RASPBERRY_PI
#include "rpiConfig.h"
@@ -41,6 +42,7 @@ debugging. */
#define OBSW_ENABLE_TIMERS 1
#define OBSW_ADD_MGT 1
+#define OBSW_ADD_BPX_BATTERY_HANDLER 1
#define OBSW_ADD_STAR_TRACKER 0
#define OBSW_ADD_PLOC_SUPERVISOR 0
#define OBSW_ADD_PLOC_MPSOC 0
@@ -55,9 +57,14 @@ debugging. */
#define OBSW_ENABLE_SYRLINKS_TRANSMIT_TIMEOUT 0
#define OBSW_SYRLINKS_SIMULATED 1
#define OBSW_STAR_TRACKER_GROUND_CONFIG 1
+#define OBSW_ENABLE_PERIODIC_HK 0
#endif
+#if defined EGSE
+#define OBSW_ADD_STAR_TRACKER 1
+#endif
+
/*******************************************************************/
/** All of the following flags should be disabled for mission code */
/*******************************************************************/
@@ -66,15 +73,19 @@ debugging. */
#define OBSW_SWITCH_TO_NORMAL_MODE_AFTER_STARTUP 1
#define OBSW_PRINT_MISSED_DEADLINES 1
-// If this is enabled, all other SPI code should be disabled
+#define OBSW_SYRLINKS_SIMULATED 1
#define OBSW_ADD_TEST_CODE 0
+// If this is enabled, all other SPI code should be disabled
#define OBSW_ADD_SPI_TEST_CODE 0
+// If this is enabled, all other I2C code should be disabled
+#define OBSW_ADD_I2C_TEST_CODE 0
#define OBSW_ADD_TEST_PST 0
#define OBSW_ADD_TEST_TASK 0
#define OBSW_TEST_LIBGPIOD 0
#define OBSW_TEST_RADIATION_SENSOR_HANDLER 0
#define OBSW_TEST_SUS_HANDLER 0
#define OBSW_TEST_PLOC_HANDLER 0
+#define OBSW_TEST_BPX_BATT 0
#define OBSW_TEST_CCSDS_BRIDGE 0
#define OBSW_TEST_CCSDS_PTME 0
#define OBSW_TEST_TE7020_HEATER 0
@@ -82,6 +93,7 @@ debugging. */
#define OBSW_TEST_GPIO_OPEN_BY_LINE_NAME 0
#define OBSW_DEBUG_P60DOCK 0
+#define OBSW_DEBUG_BPX_BATT 0
#define OBSW_DEBUG_PDU1 0
#define OBSW_DEBUG_PDU2 0
#define OBSW_DEBUG_GPS 0
@@ -92,11 +104,16 @@ debugging. */
#define OBSW_DEBUG_SUS 0
#define OBSW_DEBUG_RTD 0
#define OBSW_DEBUG_RW 0
-#define OBSW_DEBUG_STARTRACKER 0
#define OBSW_DEBUG_PLOC_MPSOC 0
#define OBSW_DEBUG_PLOC_SUPERVISOR 0
#define OBSW_DEBUG_PDEC_HANDLER 0
+#if defined EGSE
+#define OBSW_DEBUG_STARTRACKER 1
+#else
+#define OBSW_DEBUG_STARTRACKER 0
+#endif
+
#ifdef RASPBERRY_PI
#define OBSW_ENABLE_TIMERS 1
diff --git a/linux/fsfwconfig/devices/gpioIds.h b/linux/fsfwconfig/devices/gpioIds.h
index bb753a30..46717569 100644
--- a/linux/fsfwconfig/devices/gpioIds.h
+++ b/linux/fsfwconfig/devices/gpioIds.h
@@ -29,6 +29,7 @@ enum gpioId_t {
GNSS_1_NRESET,
GNSS_0_ENABLE,
GNSS_1_ENABLE,
+ GNSS_SELECT,
GYRO_0_ENABLE,
GYRO_2_ENABLE,
diff --git a/linux/fsfwconfig/events/translateEvents.cpp b/linux/fsfwconfig/events/translateEvents.cpp
index 9ee9f3cf..922892c8 100644
--- a/linux/fsfwconfig/events/translateEvents.cpp
+++ b/linux/fsfwconfig/events/translateEvents.cpp
@@ -1,7 +1,7 @@
/**
* @brief Auto-generated event translation file. Contains 140 translations.
* @details
- * Generated on: 2022-01-17 15:35:58
+ * Generated on: 2022-02-03 17:30:40
*/
#include "translateEvents.h"
@@ -34,6 +34,7 @@ const char *DEVICE_UNREQUESTED_REPLY_STRING = "DEVICE_UNREQUESTED_REPLY";
const char *INVALID_DEVICE_COMMAND_STRING = "INVALID_DEVICE_COMMAND";
const char *MONITORING_LIMIT_EXCEEDED_STRING = "MONITORING_LIMIT_EXCEEDED";
const char *MONITORING_AMBIGUOUS_STRING = "MONITORING_AMBIGUOUS";
+const char *DEVICE_WANTS_HARD_REBOOT_STRING = "DEVICE_WANTS_HARD_REBOOT";
const char *FUSE_CURRENT_HIGH_STRING = "FUSE_CURRENT_HIGH";
const char *FUSE_WENT_OFF_STRING = "FUSE_WENT_OFF";
const char *POWER_ABOVE_HIGH_LIMIT_STRING = "POWER_ABOVE_HIGH_LIMIT";
@@ -59,7 +60,6 @@ const char *MONITOR_CHANGED_STATE_STRING = "MONITOR_CHANGED_STATE";
const char *VALUE_BELOW_LOW_LIMIT_STRING = "VALUE_BELOW_LOW_LIMIT";
const char *VALUE_ABOVE_HIGH_LIMIT_STRING = "VALUE_ABOVE_HIGH_LIMIT";
const char *VALUE_OUT_OF_RANGE_STRING = "VALUE_OUT_OF_RANGE";
-const char *SWITCHING_TM_FAILED_STRING = "SWITCHING_TM_FAILED";
const char *CHANGING_MODE_STRING = "CHANGING_MODE";
const char *MODE_INFO_STRING = "MODE_INFO";
const char *FALLBACK_FAILED_STRING = "FALLBACK_FAILED";
@@ -206,6 +206,8 @@ const char *translateEvents(Event event) {
return MONITORING_LIMIT_EXCEEDED_STRING;
case (2810):
return MONITORING_AMBIGUOUS_STRING;
+ case (2811):
+ return DEVICE_WANTS_HARD_REBOOT_STRING;
case (4201):
return FUSE_CURRENT_HIGH_STRING;
case (4202):
@@ -256,8 +258,6 @@ const char *translateEvents(Event event) {
return VALUE_ABOVE_HIGH_LIMIT_STRING;
case (7204):
return VALUE_OUT_OF_RANGE_STRING;
- case (7301):
- return SWITCHING_TM_FAILED_STRING;
case (7400):
return CHANGING_MODE_STRING;
case (7401):
diff --git a/linux/fsfwconfig/objects/systemObjectList.h b/linux/fsfwconfig/objects/systemObjectList.h
index c868730b..a03e4d38 100644
--- a/linux/fsfwconfig/objects/systemObjectList.h
+++ b/linux/fsfwconfig/objects/systemObjectList.h
@@ -62,6 +62,7 @@ enum sourceObjects : uint32_t {
LIBGPIOD_TEST = 0x54123456,
SPI_TEST = 0x54000010,
UART_TEST = 0x54000020,
+ I2C_TEST = 0x54000030,
DUMMY_INTERFACE = 0x5400CAFE,
DUMMY_HANDLER = 0x5400AFFE,
P60DOCK_TEST_TASK = 0x00005060,
diff --git a/linux/fsfwconfig/objects/translateObjects.cpp b/linux/fsfwconfig/objects/translateObjects.cpp
index 03973790..08e6e126 100644
--- a/linux/fsfwconfig/objects/translateObjects.cpp
+++ b/linux/fsfwconfig/objects/translateObjects.cpp
@@ -1,8 +1,8 @@
/**
* @brief Auto-generated object translation file.
* @details
- * Contains 113 translations.
- * Generated on: 2022-01-17 15:36:10
+ * Contains 110 translations.
+ * Generated on: 2022-02-03 12:01:36
*/
#include "translateObjects.h"
@@ -36,14 +36,14 @@ const char *MGM_3_RM3100_HANDLER_STRING = "MGM_3_RM3100_HANDLER";
const char *GYRO_3_L3G_HANDLER_STRING = "GYRO_3_L3G_HANDLER";
const char *RW4_STRING = "RW4";
const char *STAR_TRACKER_STRING = "STAR_TRACKER";
-const char *GPS0_HANDLER_STRING = "GPS0_HANDLER";
-const char *GPS1_HANDLER_STRING = "GPS1_HANDLER";
+const char *GPS_CONTROLLER_STRING = "GPS_CONTROLLER";
const char *IMTQ_HANDLER_STRING = "IMTQ_HANDLER";
const char *PCDU_HANDLER_STRING = "PCDU_HANDLER";
const char *P60DOCK_HANDLER_STRING = "P60DOCK_HANDLER";
const char *PDU1_HANDLER_STRING = "PDU1_HANDLER";
const char *PDU2_HANDLER_STRING = "PDU2_HANDLER";
const char *ACU_HANDLER_STRING = "ACU_HANDLER";
+const char *BPX_BATT_HANDLER_STRING = "BPX_BATT_HANDLER";
const char *RAD_SENSOR_STRING = "RAD_SENSOR";
const char *PLOC_UPDATER_STRING = "PLOC_UPDATER";
const char *PLOC_MEMORY_DUMPER_STRING = "PLOC_MEMORY_DUMPER";
@@ -83,10 +83,6 @@ const char *TMTC_BRIDGE_STRING = "TMTC_BRIDGE";
const char *TMTC_POLLING_TASK_STRING = "TMTC_POLLING_TASK";
const char *FILE_SYSTEM_HANDLER_STRING = "FILE_SYSTEM_HANDLER";
const char *PTME_STRING = "PTME";
-const char *PAPB_VC0_STRING = "PAPB_VC0";
-const char *PAPB_VC1_STRING = "PAPB_VC1";
-const char *PAPB_VC2_STRING = "PAPB_VC2";
-const char *PAPB_VC3_STRING = "PAPB_VC3";
const char *PDEC_HANDLER_STRING = "PDEC_HANDLER";
const char *CCSDS_HANDLER_STRING = "CCSDS_HANDLER";
const char *PUS_SERVICE_6_STRING = "PUS_SERVICE_6";
@@ -101,6 +97,7 @@ const char *PUS_SERVICE_17_TEST_STRING = "PUS_SERVICE_17_TEST";
const char *PUS_SERVICE_20_PARAMETERS_STRING = "PUS_SERVICE_20_PARAMETERS";
const char *PUS_SERVICE_200_MODE_MGMT_STRING = "PUS_SERVICE_200_MODE_MGMT";
const char *PUS_SERVICE_201_HEALTH_STRING = "PUS_SERVICE_201_HEALTH";
+const char *CFDP_PACKET_DISTRIBUTOR_STRING = "CFDP_PACKET_DISTRIBUTOR";
const char *HEALTH_TABLE_STRING = "HEALTH_TABLE";
const char *MODE_STORE_STRING = "MODE_STORE";
const char *EVENT_MANAGER_STRING = "EVENT_MANAGER";
@@ -183,9 +180,7 @@ const char *translateObject(object_id_t object) {
case 0x44130001:
return STAR_TRACKER_STRING;
case 0x44130045:
- return GPS0_HANDLER_STRING;
- case 0x44130146:
- return GPS1_HANDLER_STRING;
+ return GPS_CONTROLLER_STRING;
case 0x44140014:
return IMTQ_HANDLER_STRING;
case 0x442000A1:
@@ -198,6 +193,8 @@ const char *translateObject(object_id_t object) {
return PDU2_HANDLER_STRING;
case 0x44250003:
return ACU_HANDLER_STRING;
+ case 0x44260000:
+ return BPX_BATT_HANDLER_STRING;
case 0x443200A5:
return RAD_SENSOR_STRING;
case 0x44330000:
@@ -277,14 +274,6 @@ const char *translateObject(object_id_t object) {
case 0x50000600:
return PTME_STRING;
case 0x50000700:
- return PAPB_VC0_STRING;
- case 0x50000701:
- return PAPB_VC1_STRING;
- case 0x50000702:
- return PAPB_VC2_STRING;
- case 0x50000703:
- return PAPB_VC3_STRING;
- case 0x50000704:
return PDEC_HANDLER_STRING;
case 0x50000800:
return CCSDS_HANDLER_STRING;
@@ -312,6 +301,8 @@ const char *translateObject(object_id_t object) {
return PUS_SERVICE_200_MODE_MGMT_STRING;
case 0x53000201:
return PUS_SERVICE_201_HEALTH_STRING;
+ case 0x53001000:
+ return CFDP_PACKET_DISTRIBUTOR_STRING;
case 0x53010000:
return HEALTH_TABLE_STRING;
case 0x53010100:
diff --git a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp
index 70119272..52f364b4 100644
--- a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp
+++ b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp
@@ -526,6 +526,14 @@ ReturnValue_t pst::pstI2c(FixedTimeslotTaskIF *thisSequence) {
thisSequence->addSlot(objects::IMTQ_HANDLER, length * 0.6, DeviceHandlerIF::SEND_READ);
thisSequence->addSlot(objects::IMTQ_HANDLER, length * 0.8, DeviceHandlerIF::GET_READ);
#endif
+#if OBSW_ADD_BPX_BATTERY_HANDLER == 1
+ thisSequence->addSlot(objects::BPX_BATT_HANDLER, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
+ thisSequence->addSlot(objects::BPX_BATT_HANDLER, length * 0.2, DeviceHandlerIF::SEND_WRITE);
+ thisSequence->addSlot(objects::BPX_BATT_HANDLER, length * 0.4, DeviceHandlerIF::GET_WRITE);
+ thisSequence->addSlot(objects::BPX_BATT_HANDLER, length * 0.6, DeviceHandlerIF::SEND_READ);
+ thisSequence->addSlot(objects::BPX_BATT_HANDLER, length * 0.8, DeviceHandlerIF::GET_READ);
+#endif
+ static_cast(length);
if (thisSequence->checkSequence() != HasReturnvaluesIF::RETURN_OK) {
sif::error << "I2C PST initialization failed" << std::endl;
return HasReturnvaluesIF::RETURN_FAILED;
@@ -548,9 +556,11 @@ ReturnValue_t pst::pstUart(FixedTimeslotTaskIF *thisSequence) {
thisSequence->addSlot(objects::PLOC_MPSOC_HANDLER, length * 0.8, DeviceHandlerIF::GET_READ);
#endif
+#ifdef XIPHOS_Q7S
thisSequence->addSlot(objects::PLOC_UPDATER, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
thisSequence->addSlot(objects::PLOC_MEMORY_DUMPER, length * 0,
DeviceHandlerIF::PERFORM_OPERATION);
+#endif
#if OBSW_ADD_PLOC_SUPERVISOR == 1
thisSequence->addSlot(objects::PLOC_SUPERVISOR_HANDLER, length * 0,
DeviceHandlerIF::PERFORM_OPERATION);
@@ -579,7 +589,7 @@ ReturnValue_t pst::pstUart(FixedTimeslotTaskIF *thisSequence) {
thisSequence->addSlot(objects::STAR_TRACKER, length * 0.6, DeviceHandlerIF::SEND_READ);
thisSequence->addSlot(objects::STAR_TRACKER, length * 0.8, DeviceHandlerIF::GET_READ);
#endif
-
+ static_cast(length);
if (uartPstEmpty) {
return HasReturnvaluesIF::RETURN_OK;
}
diff --git a/mission/devices/BpxBatteryHandler.cpp b/mission/devices/BpxBatteryHandler.cpp
new file mode 100644
index 00000000..2ad20c9d
--- /dev/null
+++ b/mission/devices/BpxBatteryHandler.cpp
@@ -0,0 +1,282 @@
+#include "BpxBatteryHandler.h"
+
+#include
+
+#include "OBSWConfig.h"
+
+BpxBatteryHandler::BpxBatteryHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie)
+ : DeviceHandlerBase(objectId, comIF, comCookie), hkSet(this), cfgSet(this) {}
+
+BpxBatteryHandler::~BpxBatteryHandler() {}
+
+void BpxBatteryHandler::doStartUp() {
+ if (state == States::CHECK_COM) {
+ if (commandExecuted) {
+ state = States::IDLE;
+ commandExecuted = false;
+ if (goToNormalModeImmediately) {
+ setMode(MODE_NORMAL);
+ } else {
+ setMode(_MODE_TO_ON);
+ }
+ }
+ }
+}
+
+void BpxBatteryHandler::doShutDown() {
+ // Perform a COM check on reboot
+ state = States::CHECK_COM;
+}
+
+ReturnValue_t BpxBatteryHandler::buildNormalDeviceCommand(DeviceCommandId_t* id) {
+ *id = BpxBattery::GET_HK;
+ return buildCommandFromCommand(*id, nullptr, 0);
+}
+
+ReturnValue_t BpxBatteryHandler::buildTransitionDeviceCommand(DeviceCommandId_t* id) {
+ if (state == States::CHECK_COM) {
+ *id = BpxBattery::PING;
+ return buildCommandFromCommand(*id, nullptr, 0);
+ }
+ return HasReturnvaluesIF::RETURN_OK;
+}
+
+void BpxBatteryHandler::fillCommandAndReplyMap() {
+ using namespace BpxBattery;
+ insertInCommandAndReplyMap(GET_HK, 1, &hkSet, GET_HK_REPLY_LEN);
+ insertInCommandAndReplyMap(BpxBattery::PING, 1, nullptr, PING_REPLY_LEN);
+ insertInCommandAndReplyMap(BpxBattery::REBOOT, 1, nullptr, 0);
+ insertInCommandAndReplyMap(BpxBattery::RESET_COUNTERS, 1, nullptr, EMPTY_REPLY_LEN);
+ insertInCommandAndReplyMap(BpxBattery::CONFIG_CMD, 1, nullptr, EMPTY_REPLY_LEN);
+ insertInCommandAndReplyMap(BpxBattery::CONFIG_GET, 1, &cfgSet, CONFIG_GET_REPLY_LEN);
+}
+
+ReturnValue_t BpxBatteryHandler::buildCommandFromCommand(DeviceCommandId_t deviceCommand,
+ const uint8_t* commandData,
+ size_t commandDataLen) {
+ switch (deviceCommand) {
+ case (BpxBattery::GET_HK): {
+ cmdBuf[0] = BpxBattery::PORT_GET_HK;
+ this->rawPacketLen = 1;
+ break;
+ }
+ case (BpxBattery::PING): {
+ if (commandDataLen == 1 and commandData != nullptr) {
+ sentPingByte = commandData[0];
+ } else {
+ sentPingByte = BpxBattery::DEFAULT_PING_SENT_BYTE;
+ }
+
+ cmdBuf[0] = BpxBattery::PORT_PING;
+ cmdBuf[1] = sentPingByte;
+ this->rawPacketLen = 2;
+ break;
+ }
+ case (BpxBattery::REBOOT): {
+ cmdBuf[0] = BpxBattery::PORT_REBOOT;
+ cmdBuf[1] = 0x80;
+ cmdBuf[2] = 0x07;
+ cmdBuf[3] = 0x80;
+ cmdBuf[4] = 0x07;
+ this->rawPacketLen = 5;
+ // This instructs the FDIR to set the device mode off and on again
+ // to ensure the I2C communication is also verified
+ triggerEvent(DeviceHandlerIF::DEVICE_WANTS_HARD_REBOOT);
+ break;
+ }
+ case (BpxBattery::RESET_COUNTERS): {
+ cmdBuf[0] = BpxBattery::PORT_RESET_COUNTERS;
+ cmdBuf[1] = BpxBattery::RESET_COUNTERS_MAGIC_VALUE;
+ this->rawPacketLen = 2;
+ break;
+ }
+ case (BpxBattery::CONFIG_CMD): {
+ cmdBuf[0] = BpxBattery::PORT_CONFIG_CMD;
+ // Needs to be set to 0x01 according to datasheet
+ cmdBuf[1] = 0x01;
+ this->rawPacketLen = 2;
+ break;
+ }
+ case (BpxBattery::CONFIG_GET): {
+ cmdBuf[0] = BpxBattery::PORT_CONFIG_GET;
+ this->rawPacketLen = 1;
+ break;
+ }
+ case (BpxBattery::CONFIG_SET): {
+ cmdBuf[0] = BpxBattery::PORT_CONFIG_SET;
+ if (commandDataLen != 3) {
+ return DeviceHandlerIF::INVALID_NUMBER_OR_LENGTH_OF_PARAMETERS;
+ }
+ for (uint8_t idx = 0; idx < 3; idx++) {
+ cmdBuf[idx + 1] = commandData[idx];
+ }
+ this->rawPacketLen = 4;
+ break;
+ }
+ case (BpxBattery::MAN_HEAT_ON): {
+ cmdBuf[0] = BpxBattery::PORT_MAN_HEAT_ON;
+ if (commandDataLen != 2) {
+ return DeviceHandlerIF::INVALID_NUMBER_OR_LENGTH_OF_PARAMETERS;
+ }
+ for (uint8_t idx = 0; idx < 2; idx++) {
+ cmdBuf[idx + 1] = commandData[idx];
+ }
+ this->rawPacketLen = 3;
+ break;
+ }
+ case (BpxBattery::MAN_HEAT_OFF): {
+ cmdBuf[0] = BpxBattery::PORT_MAN_HEAT_OFF;
+ this->rawPacketLen = 1;
+ break;
+ }
+ default: {
+ return DeviceHandlerIF::COMMAND_NOT_SUPPORTED;
+ }
+ }
+ this->rawPacket = cmdBuf.data();
+
+ lastCmd = deviceCommand;
+ return HasReturnvaluesIF::RETURN_OK;
+}
+
+ReturnValue_t BpxBatteryHandler::scanForReply(const uint8_t* start, size_t remainingSize,
+ DeviceCommandId_t* foundId, size_t* foundLen) {
+ using namespace BpxBattery;
+ switch (lastCmd) {
+ case (BpxBattery::GET_HK): {
+ if (remainingSize != GET_HK_REPLY_LEN) {
+ return DeviceHandlerIF::LENGTH_MISSMATCH;
+ }
+ break;
+ }
+ case (BpxBattery::PING):
+ case (BpxBattery::MAN_HEAT_ON):
+ case (BpxBattery::MAN_HEAT_OFF): {
+ if (remainingSize != PING_REPLY_LEN) {
+ return DeviceHandlerIF::LENGTH_MISSMATCH;
+ }
+ break;
+ }
+ case (BpxBattery::REBOOT): {
+ // Ignore
+ break;
+ }
+ case (BpxBattery::RESET_COUNTERS):
+ case (BpxBattery::CONFIG_CMD):
+ case (BpxBattery::CONFIG_SET): {
+ if (remainingSize != EMPTY_REPLY_LEN) {
+ return DeviceHandlerIF::LENGTH_MISSMATCH;
+ }
+ break;
+ }
+ case (BpxBattery::CONFIG_GET): {
+ if (remainingSize != CONFIG_GET_REPLY_LEN) {
+ return DeviceHandlerIF::LENGTH_MISSMATCH;
+ }
+
+ break;
+ }
+ default: {
+ return DeviceHandlerIF::UNKNOWN_DEVICE_REPLY;
+ }
+ }
+ *foundLen = remainingSize;
+ *foundId = lastCmd;
+ return HasReturnvaluesIF::RETURN_OK;
+}
+
+ReturnValue_t BpxBatteryHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8_t* packet) {
+ if (id != BpxBattery::REBOOT and packet[1] != 0) {
+ return DeviceHandlerIF::DEVICE_REPORTED_ERROR;
+ }
+ switch (id) {
+ case (BpxBattery::GET_HK): {
+ PoolReadGuard rg(&hkSet);
+ ReturnValue_t result = hkSet.parseRawHk(packet + 2, 21);
+ hkSet.setValidity(true, true);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+#if OBSW_DEBUG_BPX_BATT == 1
+ sif::info << "BPX Battery HK output:" << std::endl;
+ sif::info << "Charge current [mA]: " << hkSet.chargeCurrent << std::endl;
+ sif::info << "Discharge current [mA]: " << hkSet.dischargeCurrent << std::endl;
+ sif::info << "Heater current [mA]: " << hkSet.heaterCurrent << std::endl;
+ sif::info << "Battery voltage [mV]: " << hkSet.battVoltage << std::endl;
+ sif::info << "Battery Temperature 1 [C]: " << hkSet.battTemp1 << std::endl;
+ sif::info << "Battery Temperature 2 [C]: " << hkSet.battTemp2 << std::endl;
+ sif::info << "Battery Temperature 3 [C]: " << hkSet.battTemp3 << std::endl;
+ sif::info << "Battery Temperature 4 [C]: " << hkSet.battTemp4 << std::endl;
+ sif::info << "Battery Reboot Counter: " << hkSet.rebootCounter << std::endl;
+ sif::info << "Battery Boot Cause: " << static_cast(hkSet.bootcause.value) << std::endl;
+#endif
+ break;
+ }
+ case (BpxBattery::PING): {
+ if (packet[2] != sentPingByte) {
+ return DeviceHandlerIF::INVALID_DATA;
+ }
+ if (mode == _MODE_START_UP) {
+ commandExecuted = true;
+ }
+ break;
+ }
+ case (BpxBattery::RESET_COUNTERS):
+ case (BpxBattery::CONFIG_CMD):
+ case (BpxBattery::CONFIG_SET): {
+ break;
+ }
+ case (BpxBattery::MAN_HEAT_ON):
+ case (BpxBattery::MAN_HEAT_OFF): {
+ if (packet[2] != 0x01) {
+ return DeviceHandlerIF::DEVICE_DID_NOT_EXECUTE;
+ }
+ break;
+ }
+ case (BpxBattery::CONFIG_GET): {
+ PoolReadGuard rg(&cfgSet);
+ ReturnValue_t result = cfgSet.parseRawHk(packet + 2, 3);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ cfgSet.setValidity(true, true);
+ break;
+ }
+ case (BpxBattery::REBOOT): {
+ break;
+ }
+ default: {
+ return DeviceHandlerIF::UNKNOWN_DEVICE_REPLY;
+ }
+ }
+ return HasReturnvaluesIF::RETURN_OK;
+}
+
+uint32_t BpxBatteryHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return 10000; }
+
+ReturnValue_t BpxBatteryHandler::initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
+ LocalDataPoolManager& poolManager) {
+ localDataPoolMap.emplace(BpxBattery::BATT_TEMP_1, &battTemp1);
+ localDataPoolMap.emplace(BpxBattery::BATT_TEMP_2, &battTemp2);
+ localDataPoolMap.emplace(BpxBattery::BATT_TEMP_3, &battTemp3);
+ localDataPoolMap.emplace(BpxBattery::BATT_TEMP_4, &battTemp4);
+ localDataPoolMap.emplace(BpxBattery::CHARGE_CURRENT, &chargeCurrent);
+ localDataPoolMap.emplace(BpxBattery::DISCHARGE_CURRENT, &dischargeCurrent);
+ localDataPoolMap.emplace(BpxBattery::HEATER_CURRENT, &heaterCurrent);
+ localDataPoolMap.emplace(BpxBattery::BATT_VOLTAGE, &battVolt);
+ localDataPoolMap.emplace(BpxBattery::REBOOT_COUNTER, &rebootCounter);
+ localDataPoolMap.emplace(BpxBattery::BOOTCAUSE, &bootCause);
+
+ localDataPoolMap.emplace(BpxBattery::BATTERY_HEATER_MODE, &battheatMode);
+ localDataPoolMap.emplace(BpxBattery::BATTHEAT_LOW_LIMIT, &battheatLow);
+ localDataPoolMap.emplace(BpxBattery::BATTHEAT_HIGH_LIMIT, &battheatHigh);
+
+#if OBSW_ENABLE_PERIODIC_HK == 1
+ poolManager.subscribeForPeriodicPacket(hkSet.getSid(), true, 1.0, false);
+#endif
+ return HasReturnvaluesIF::RETURN_OK;
+}
+
+void BpxBatteryHandler::setToGoToNormalMode(bool enable) {
+ this->goToNormalModeImmediately = enable;
+}
diff --git a/mission/devices/BpxBatteryHandler.h b/mission/devices/BpxBatteryHandler.h
new file mode 100644
index 00000000..eb75fe2c
--- /dev/null
+++ b/mission/devices/BpxBatteryHandler.h
@@ -0,0 +1,58 @@
+#ifndef MISSION_DEVICES_BPXBATTERYHANDLER_H_
+#define MISSION_DEVICES_BPXBATTERYHANDLER_H_
+
+#include
+
+#include "devicedefinitions/BpxBatteryDefinitions.h"
+
+class BpxBatteryHandler : public DeviceHandlerBase {
+ public:
+ BpxBatteryHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie);
+ virtual ~BpxBatteryHandler();
+
+ void setToGoToNormalMode(bool enable);
+
+ protected:
+ enum class States {
+ CHECK_COM = 0,
+ IDLE = 1,
+ };
+
+ States state = States::CHECK_COM;
+ bool commandExecuted = false;
+ bool goToNormalModeImmediately = false;
+ uint8_t sentPingByte = BpxBattery::DEFAULT_PING_SENT_BYTE;
+ BpxBatteryHk hkSet;
+ DeviceCommandId_t lastCmd = DeviceHandlerIF::NO_COMMAND_ID;
+ BpxBatteryCfg cfgSet;
+ std::array cmdBuf = {};
+ PoolEntry chargeCurrent = PoolEntry({0});
+ PoolEntry dischargeCurrent = PoolEntry({0});
+ PoolEntry heaterCurrent = PoolEntry({0});
+ PoolEntry battVolt = PoolEntry({0});
+ PoolEntry battTemp1 = PoolEntry({0});
+ PoolEntry battTemp2 = PoolEntry({0});
+ PoolEntry battTemp3 = PoolEntry({0});
+ PoolEntry battTemp4 = PoolEntry({0});
+ PoolEntry rebootCounter = PoolEntry({0});
+ PoolEntry bootCause = PoolEntry({0});
+ PoolEntry battheatMode = PoolEntry({0});
+ PoolEntry battheatLow = PoolEntry({0});
+ PoolEntry battheatHigh = PoolEntry({0});
+
+ 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;
+ uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override;
+ ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
+ LocalDataPoolManager& poolManager) override;
+};
+
+#endif /* MISSION_DEVICES_BPXBATTERYHANDLER_H_ */
diff --git a/mission/devices/CMakeLists.txt b/mission/devices/CMakeLists.txt
index 9491a3aa..03ff3556 100644
--- a/mission/devices/CMakeLists.txt
+++ b/mission/devices/CMakeLists.txt
@@ -1,6 +1,7 @@
target_sources(${TARGET_NAME} PUBLIC
GPSHyperionLinuxController.cpp
GomspaceDeviceHandler.cpp
+ BpxBatteryHandler.cpp
Tmp1075Handler.cpp
PCDUHandler.cpp
P60DockHandler.cpp
diff --git a/mission/devices/PlocMPSoCHandler.h b/mission/devices/PlocMPSoCHandler.h
index 2b14424f..09ad2e2a 100644
--- a/mission/devices/PlocMPSoCHandler.h
+++ b/mission/devices/PlocMPSoCHandler.h
@@ -52,25 +52,25 @@ class PlocMPSoCHandler : public DeviceHandlerBase {
private:
static const uint8_t INTERFACE_ID = CLASS_ID::PLOC_MPSOC_HANDLER;
- static const ReturnValue_t CRC_FAILURE =
- MAKE_RETURN_CODE(0xA0); //!> Space Packet received from PLOC has invalid CRC
- static const ReturnValue_t RECEIVED_ACK_FAILURE =
- MAKE_RETURN_CODE(0xA1); //!> Received ACK failure reply from PLOC
- static const ReturnValue_t RECEIVED_EXE_FAILURE =
- MAKE_RETURN_CODE(0xA2); //!> Received execution failure reply from PLOC
- static const ReturnValue_t INVALID_APID =
- MAKE_RETURN_CODE(0xA3); //!> Received space packet with invalid APID from PLOC
+ //! Space Packet received from PLOC has invalid CRC
+ static const ReturnValue_t CRC_FAILURE = MAKE_RETURN_CODE(0xA0);
+ //! Received ACK failure reply from PLOC
+ static const ReturnValue_t RECEIVED_ACK_FAILURE = MAKE_RETURN_CODE(0xA1);
+ //! Received execution failure reply from PLOC
+ static const ReturnValue_t RECEIVED_EXE_FAILURE = MAKE_RETURN_CODE(0xA2);
+ //! Received space packet with invalid APID from PLOC
+ static const ReturnValue_t INVALID_APID = MAKE_RETURN_CODE(0xA3);
static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::PLOC_MPSOC_HANDLER;
- static const Event MEMORY_READ_RPT_CRC_FAILURE =
- MAKE_EVENT(1, severity::LOW); //!> PLOC crc failure in telemetry packet
- static const Event ACK_FAILURE =
- MAKE_EVENT(2, severity::LOW); //!> PLOC receive acknowledgment failure report
- static const Event EXE_FAILURE =
- MAKE_EVENT(3, severity::LOW); //!> PLOC receive execution failure report
- static const Event CRC_FAILURE_EVENT =
- MAKE_EVENT(4, severity::LOW); //!> PLOC reply has invalid crc
+ //! PLOC crc failure in telemetry packet
+ static const Event MEMORY_READ_RPT_CRC_FAILURE = MAKE_EVENT(1, severity::LOW);
+ //! PLOC receive acknowledgment failure report
+ static const Event ACK_FAILURE = MAKE_EVENT(2, severity::LOW);
+ //! PLOC receive execution failure report
+ static const Event EXE_FAILURE = MAKE_EVENT(3, severity::LOW);
+ //! PLOC reply has invalid crc
+ static const Event CRC_FAILURE_EVENT = MAKE_EVENT(4, severity::LOW);
static const uint16_t APID_MASK = 0x7FF;
static const uint16_t PACKET_SEQUENCE_COUNT_MASK = 0x3FFF;
diff --git a/mission/devices/devicedefinitions/BpxBatteryDefinitions.h b/mission/devices/devicedefinitions/BpxBatteryDefinitions.h
new file mode 100644
index 00000000..54d4e1f8
--- /dev/null
+++ b/mission/devices/devicedefinitions/BpxBatteryDefinitions.h
@@ -0,0 +1,251 @@
+#ifndef MISSION_DEVICES_DEVICEDEFINITIONS_BPXBATTERYDEFINITIONS_H_
+#define MISSION_DEVICES_DEVICEDEFINITIONS_BPXBATTERYDEFINITIONS_H_
+
+#include
+#include
+
+#include
+
+#include "fsfw/devicehandlers/DeviceHandlerIF.h"
+
+namespace BpxBattery {
+
+enum LocalPoolIds {
+ CHARGE_CURRENT = 0,
+ DISCHARGE_CURRENT = 1,
+ HEATER_CURRENT = 2,
+ BATT_VOLTAGE = 3,
+ BATT_TEMP_1 = 4,
+ BATT_TEMP_2 = 5,
+ BATT_TEMP_3 = 6,
+ BATT_TEMP_4 = 7,
+ REBOOT_COUNTER = 8,
+ BOOTCAUSE = 9,
+
+ BATTERY_HEATER_MODE = 10,
+ BATTHEAT_LOW_LIMIT = 11,
+ BATTHEAT_HIGH_LIMIT = 12
+};
+
+static constexpr DeviceCommandId_t GET_HK = 0;
+static constexpr DeviceCommandId_t PING = 1;
+static constexpr DeviceCommandId_t REBOOT = 2;
+static constexpr DeviceCommandId_t RESET_COUNTERS = 3;
+// This is the mnemonic GomSpace chose, but this command actually restores the default config
+static constexpr DeviceCommandId_t CONFIG_CMD = 4;
+static constexpr DeviceCommandId_t CONFIG_GET = 5;
+static constexpr DeviceCommandId_t CONFIG_SET = 6;
+
+static constexpr DeviceCommandId_t MAN_HEAT_ON = 10;
+static constexpr DeviceCommandId_t MAN_HEAT_OFF = 11;
+
+static constexpr uint8_t RESET_COUNTERS_MAGIC_VALUE = 0x42;
+static constexpr uint8_t DEFAULT_PING_SENT_BYTE = 0x07;
+
+static constexpr uint32_t HK_SET_ID = GET_HK;
+static constexpr uint32_t CFG_SET_ID = CONFIG_GET;
+
+static constexpr size_t GET_HK_REPLY_LEN = 23;
+static constexpr size_t PING_REPLY_LEN = 3;
+static constexpr size_t EMPTY_REPLY_LEN = 2;
+static constexpr size_t CONFIG_GET_REPLY_LEN = 5;
+
+static constexpr uint8_t PORT_PING = 1;
+static constexpr uint8_t PORT_REBOOT = 4;
+static constexpr uint8_t PORT_GET_HK = 9;
+static constexpr uint8_t PORT_RESET_COUNTERS = 15;
+static constexpr uint8_t PORT_CONFIG_CMD = 17;
+static constexpr uint8_t PORT_CONFIG_GET = 18;
+static constexpr uint8_t PORT_CONFIG_SET = 19;
+static constexpr uint8_t PORT_MAN_HEAT_ON = 20;
+static constexpr uint8_t PORT_MAN_HEAT_OFF = 21;
+
+static constexpr uint8_t HK_ENTRIES = 10;
+static constexpr uint8_t CFG_ENTRIES = 3;
+
+// Taken from BPX manual 3.14
+typedef struct __attribute__((packed)) {
+ //! Mode for battheater [0=OFF,1=Auto]
+ uint8_t battheater_mode;
+ int8_t battheater_low;
+ //! Turn heater on at [degC]
+ int8_t battheater_high;
+ //! Turn heater off at [degC]
+} bpx_config_t;
+
+//! Not used for more but might still be useful
+class BpxHkDeserializer : public SerialLinkedListAdapter {
+ public:
+ BpxHkDeserializer() { setLinks(); }
+
+ //! Charge current in mA
+ SerializeElement chargeCurrent;
+ //! Discharge current in mA
+ SerializeElement dischargeCurrent;
+ //! Heater current in mA
+ SerializeElement heaterCurrent;
+
+ //! Battery voltage in mV
+ SerializeElement battVoltage;
+ //! Battery temperature 1 in degC
+ SerializeElement battTemp1;
+ //! Battery temperature 2 in degC
+ SerializeElement battTemp2;
+ //! Battery temperature 3 in degC
+ SerializeElement battTemp3;
+ //! Battery temperature 4 in degC
+ SerializeElement battTemp4;
+
+ SerializeElement rebootCounter;
+ SerializeElement bootcause;
+
+ private:
+ void setLinks() {
+ setStart(&chargeCurrent);
+ chargeCurrent.setNext(&dischargeCurrent);
+ dischargeCurrent.setNext(&heaterCurrent);
+ heaterCurrent.setNext(&battVoltage);
+ battVoltage.setNext(&battTemp1);
+ battTemp1.setNext(&battTemp2);
+ battTemp2.setNext(&battTemp3);
+ battTemp3.setNext(&battTemp4);
+ battTemp4.setNext(&rebootCounter);
+ rebootCounter.setNext(&bootcause);
+ }
+};
+
+}; // namespace BpxBattery
+
+/**
+ * @brief BPX HK data holder
+ */
+class BpxBatteryHk : public StaticLocalDataSet {
+ public:
+ /**
+ * Constructor for data users
+ * @param gyroId
+ */
+ BpxBatteryHk(object_id_t bpxId) : StaticLocalDataSet(sid_t(bpxId, BpxBattery::HK_SET_ID)) {
+ setAllVariablesReadOnly();
+ }
+
+ ReturnValue_t parseRawHk(const uint8_t* data, size_t size) {
+ size_t remSize = size;
+ ReturnValue_t result =
+ chargeCurrent.deSerialize(&data, &remSize, SerializeIF::Endianness::NETWORK);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ result = dischargeCurrent.deSerialize(&data, &remSize, SerializeIF::Endianness::NETWORK);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ result = heaterCurrent.deSerialize(&data, &remSize, SerializeIF::Endianness::NETWORK);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ result = battVoltage.deSerialize(&data, &remSize, SerializeIF::Endianness::NETWORK);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ result = battTemp1.deSerialize(&data, &remSize, SerializeIF::Endianness::NETWORK);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ result = battTemp2.deSerialize(&data, &remSize, SerializeIF::Endianness::NETWORK);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ result = battTemp3.deSerialize(&data, &remSize, SerializeIF::Endianness::NETWORK);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ result = battTemp4.deSerialize(&data, &remSize, SerializeIF::Endianness::NETWORK);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ result = rebootCounter.deSerialize(&data, &remSize, SerializeIF::Endianness::NETWORK);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ result = bootcause.deSerialize(&data, &remSize, SerializeIF::Endianness::NETWORK);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ return result;
+ }
+
+ //! Charge current in mA
+ lp_var_t chargeCurrent =
+ lp_var_t(sid.objectId, BpxBattery::CHARGE_CURRENT, this);
+ //! Discharge current in mA
+ lp_var_t dischargeCurrent =
+ lp_var_t(sid.objectId, BpxBattery::DISCHARGE_CURRENT, this);
+ //! Heater current in mA
+ lp_var_t heaterCurrent =
+ lp_var_t(sid.objectId, BpxBattery::HEATER_CURRENT, this);
+
+ //! Battery voltage in mV
+ lp_var_t battVoltage = lp_var_t(sid.objectId, BpxBattery::BATT_VOLTAGE, this);
+ //! Battery temperature 1 in degC
+ lp_var_t battTemp1 = lp_var_t(sid.objectId, BpxBattery::BATT_TEMP_1, this);
+ //! Battery temperature 2 in degC
+ lp_var_t battTemp2 = lp_var_t(sid.objectId, BpxBattery::BATT_TEMP_2, this);
+ //! Battery temperature 3 in degC
+ lp_var_t battTemp3 = lp_var_t(sid.objectId, BpxBattery::BATT_TEMP_3, this);
+ //! Battery temperature 4 in degC
+ lp_var_t battTemp4 = lp_var_t(sid.objectId, BpxBattery::BATT_TEMP_4, this);
+ lp_var_t rebootCounter =
+ lp_var_t(sid.objectId, BpxBattery::REBOOT_COUNTER, this);
+ lp_var_t bootcause = lp_var_t(sid.objectId, BpxBattery::BOOTCAUSE, this);
+
+ private:
+ friend class BpxBatteryHandler;
+ /**
+ * Constructor for data creator
+ * @param hkOwner
+ */
+ BpxBatteryHk(HasLocalDataPoolIF* hkOwner) : StaticLocalDataSet(hkOwner, BpxBattery::HK_SET_ID) {}
+};
+
+class BpxBatteryCfg : public StaticLocalDataSet {
+ public:
+ /**
+ * Constructor for data users
+ * @param gyroId
+ */
+ BpxBatteryCfg(object_id_t bpxId) : StaticLocalDataSet(sid_t(bpxId, BpxBattery::CFG_SET_ID)) {
+ setAllVariablesReadOnly();
+ }
+
+ ReturnValue_t parseRawHk(const uint8_t* data, size_t size) {
+ if (size < 3) {
+ return SerializeIF::STREAM_TOO_SHORT;
+ }
+ battheatermode.value = data[0];
+ battheaterLow.value = data[1];
+ battheaterHigh.value = data[2];
+ return HasReturnvaluesIF::RETURN_OK;
+ }
+
+ //! Mode for battheater [0=OFF,1=Auto]
+ lp_var_t battheatermode =
+ lp_var_t(sid.objectId, BpxBattery::BATTERY_HEATER_MODE, this);
+ //! Turn heater on at [degC]
+ lp_var_t battheaterLow =
+ lp_var_t(sid.objectId, BpxBattery::BATTHEAT_LOW_LIMIT, this);
+ //! Turn heater off at [degC]
+ lp_var_t battheaterHigh =
+ lp_var_t(sid.objectId, BpxBattery::BATTHEAT_HIGH_LIMIT, this);
+
+ private:
+ friend class BpxBatteryHandler;
+ /**
+ * Constructor for data creator
+ * @param hkOwner
+ */
+ BpxBatteryCfg(HasLocalDataPoolIF* hkOwner)
+ : StaticLocalDataSet(hkOwner, BpxBattery::CFG_SET_ID) {}
+};
+
+#endif /* MISSION_DEVICES_DEVICEDEFINITIONS_BPXBATTERYDEFINITIONS_H_ */
diff --git a/mission/devices/devicedefinitions/IMTQHandlerDefinitions.h b/mission/devices/devicedefinitions/IMTQHandlerDefinitions.h
index 609bbdf8..69a3d048 100644
--- a/mission/devices/devicedefinitions/IMTQHandlerDefinitions.h
+++ b/mission/devices/devicedefinitions/IMTQHandlerDefinitions.h
@@ -390,7 +390,7 @@ class EngHkDataset : public StaticLocalDataSet {
lp_var_t coilXCurrentmA = lp_var_t(sid.objectId, COIL_X_CURRENT, this);
lp_var_t coilYCurrentmA = lp_var_t(sid.objectId, COIL_Y_CURRENT, this);
lp_var_t coilZCurrentmA = lp_var_t(sid.objectId, COIL_Z_CURRENT, this);
- /** All temperatures in [°C] */
+ /** All temperatures in [�C] */
lp_var_t coilXTemperature = lp_var_t(sid.objectId, COIL_X_TEMPERATURE, this);
lp_var_t coilYTemperature = lp_var_t(sid.objectId, COIL_Y_TEMPERATURE, this);
lp_var_t coilZTemperature = lp_var_t(sid.objectId, COIL_Z_TEMPERATURE, this);
@@ -477,7 +477,7 @@ class CommandDipolePacket : public SerialLinkedListAdapter {
* Raw magnetic field: [nT]
* Calibrated magnetic field: [nT]
* Coil currents: [mA]
- * Temperature: [°C]
+ * Temperature: [C]
* The +X self test generates a positive dipole in X direction and measures the magnetic
* field with the built-in MTM. The procedure of the test is as follows:
* 1. All coils off (INIT step)
@@ -554,7 +554,7 @@ class PosXSelfTestSet : public StaticLocalDataSet {
* Raw magnetic field: [nT]
* Calibrated magnetic field: [nT]
* Coil currents: [mA]
- * Temperature: [°C]
+ * Temperature: [C]
* The -X self test generates a negative dipole in X direction and measures the magnetic
* field with the built-in MTM. The procedure of the test is as follows:
* 1. All coils off (INIT step)
@@ -631,7 +631,7 @@ class NegXSelfTestSet : public StaticLocalDataSet {
* Raw magnetic field: [nT]
* Calibrated magnetic field: [nT]
* Coil currents: [mA]
- * Temperature: [°C]
+ * Temperature: [C]
* The +Y self test generates a positive dipole in y direction and measures the magnetic
* field with the built-in MTM. The procedure of the test is as follows:
* 1. All coils off (INIT step)
@@ -708,7 +708,7 @@ class PosYSelfTestSet : public StaticLocalDataSet {
* Raw magnetic field: [nT]
* Calibrated magnetic field: [nT]
* Coil currents: [mA]
- * Temperature: [°C]
+ * Temperature: [C]
* The -Y self test generates a negative dipole in y direction and measures the magnetic
* field with the built-in MTM. The procedure of the test is as follows:
* 1. All coils off (INIT step)
@@ -785,7 +785,7 @@ class NegYSelfTestSet : public StaticLocalDataSet {
* Raw magnetic field: [nT]
* Calibrated magnetic field: [nT]
* Coil currents: [mA]
- * Temperature: [°C]
+ * Temperature: [C]
* The +Z self test generates a positive dipole in z direction and measures the magnetic
* field with the built-in MTM. The procedure of the test is as follows:
* 1. All coils off (INIT step)
@@ -862,7 +862,7 @@ class PosZSelfTestSet : public StaticLocalDataSet {
* Raw magnetic field: [nT]
* Calibrated magnetic field: [nT]
* Coil currents: [mA]
- * Temperature: [°C]
+ * Temperature: [C]
* The -Z self test generates a negative dipole in z direction and measures the magnetic
* field with the built-in MTM. The procedure of the test is as follows:
* 1. All coils off (INIT step)
diff --git a/scripts/apply-clang-format.sh b/scripts/apply-clang-format.sh
index 55a31487..724b44a0 100755
--- a/scripts/apply-clang-format.sh
+++ b/scripts/apply-clang-format.sh
@@ -8,4 +8,5 @@ find ./linux -iname *.h -o -iname *.cpp -o -iname *.c | xargs clang-format --sty
find ./bsp_q7s -iname *.h -o -iname *.cpp -o -iname *.c | xargs clang-format --style=file -i
find ./bsp_linux_board -iname *.h -o -iname *.cpp -o -iname *.c | xargs clang-format --style=file -i
find ./bsp_hosted -iname *.h -o -iname *.cpp -o -iname *.c | xargs clang-format --style=file -i
+find ./bsp_egse -iname *.h -o -iname *.cpp -o -iname *.c | xargs clang-format --style=file -i
find ./test -iname *.h -o -iname *.cpp -o -iname *.c | xargs clang-format --style=file -i
diff --git a/scripts/egse-port.sh b/scripts/egse-port.sh
new file mode 100644
index 00000000..ef4864fc
--- /dev/null
+++ b/scripts/egse-port.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+echo "-L 1534:localhost:1534 portforwarding for tcf agent"
+echo "-L 1537:192.168.133.10:7301 for TMTC commanding using the TCP/IP IF"
+
+ssh -L 1534:localhost:1534 \
+ -L 1537:localhost:7301 pi@192.168.18.31
\ No newline at end of file
diff --git a/scripts/q7s-cp.py b/scripts/q7s-cp.py
index 0c8c1a79..0478001a 100755
--- a/scripts/q7s-cp.py
+++ b/scripts/q7s-cp.py
@@ -1,44 +1,75 @@
#!/usr/bin/env python3
import argparse
import os
+import sys
def main():
args = handle_args()
cmd = build_cmd(args)
# Run the command
- print(f'Running command: {cmd}')
+ print(f"Running command: {cmd}")
result = os.system(cmd)
if result != 0:
- print('')
- print('Removing problematic SSH key and trying again..')
- remove_ssh_key_cmd = 'ssh-keygen -f "${HOME}/.ssh/known_hosts" -R "[localhost]:1535"'
+ print("")
+ print("Removing problematic SSH key and trying again..")
+ remove_ssh_key_cmd = (
+ 'ssh-keygen -f "${HOME}/.ssh/known_hosts" -R "[localhost]:1535"'
+ )
os.system(remove_ssh_key_cmd)
+ print(f'Running command "{cmd}"')
result = os.system(cmd)
def handle_args():
- help_string = 'This script copies files to the Q7S as long as port forwarding is active.\n'
- help_string += 'You can set up port forwarding with ' \
- '"ssh -L 1535:192.168.133.10:22 " -t /bin/bash'
- parser = argparse.ArgumentParser(
- description=help_string
+ help_string = (
+ "This script copies files to the Q7S as long as port forwarding is active.\n"
)
+ help_string += (
+ "You can set up port forwarding with "
+ '"ssh -L 1535:192.168.133.10:22 " -t /bin/bash'
+ )
+ parser = argparse.ArgumentParser(description=help_string)
# Optional arguments
- parser.add_argument('-r', '--recursive', dest='recursive', default=False, action='store_true')
- parser.add_argument('-t', '--target', help='Target destination', default='/tmp')
- parser.add_argument('-P', '--port', help='Target port', default=1535)
+ parser.add_argument(
+ "-r", "--recursive", dest="recursive", default=False, action="store_true"
+ )
+ parser.add_argument(
+ "-t",
+ "--target",
+ help="Target destination. If files are copied to Q7S, will be /tmp by default. "
+ "If files are copied back to host, will be current directory by default",
+ default="",
+ )
+ parser.add_argument("-P", "--port", help="Target port", default=1535)
+ parser.add_argument(
+ "-i",
+ "--invert",
+ default=False,
+ action="store_true",
+ help="Copy from Q7S to host instead. Always copies to current directory.",
+ )
# Positional argument(s)
- parser.add_argument('source', help='Source files to copy')
+ parser.add_argument(
+ "source", help="Source files to copy or target files to copy back to host"
+ )
return parser.parse_args()
def build_cmd(args):
# Build run command
- cmd = 'scp '
+ cmd = "scp "
if args.recursive:
- cmd += '-r '
- cmd += f'-P {args.port} {args.source} root@localhost:'
+ cmd += "-r "
+ target = args.target
+ if args.invert and target == "":
+ target = "."
+ elif target == "":
+ target = f"/tmp"
+ if args.invert:
+ cmd += f"-P {args.port} root@localhost:{args.source} {target}"
+ else:
+ cmd += f"-P {args.port} {args.source} root@localhost:{target}"
if args.target:
cmd += args.target
return cmd
diff --git a/thirdparty/arcsec_star_tracker b/thirdparty/arcsec_star_tracker
index 2d10c6b8..aa1ebfc1 160000
--- a/thirdparty/arcsec_star_tracker
+++ b/thirdparty/arcsec_star_tracker
@@ -1 +1 @@
-Subproject commit 2d10c6b85ea4cab4f4baf1918c51d54eee4202c2
+Subproject commit aa1ebfc154558dad746a175d2efee52470fddefe
diff --git a/tmtc b/tmtc
index 2e326da1..199ffe1a 160000
--- a/tmtc
+++ b/tmtc
@@ -1 +1 @@
-Subproject commit 2e326da175bb0e806b460507ddcf2977cd1a2372
+Subproject commit 199ffe1a321c09ba9726c87413045f8b32f40e90