Merge branch 'mueller/acs-ss-init' into mueller/pl-ss
All checks were successful
EIVE/eive-obsw/pipeline/pr-develop This commit looks good
All checks were successful
EIVE/eive-obsw/pipeline/pr-develop This commit looks good
This commit is contained in:
commit
0e97c4ad9a
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -1,6 +1,3 @@
|
|||||||
[submodule "etl"]
|
|
||||||
path = thirdparty/etl
|
|
||||||
url = https://github.com/ETLCPP/etl.git
|
|
||||||
[submodule "arduino"]
|
[submodule "arduino"]
|
||||||
path = arduino
|
path = arduino
|
||||||
url = https://egit.irs.uni-stuttgart.de/eive/eive_arduino_interface.git
|
url = https://egit.irs.uni-stuttgart.de/eive/eive_arduino_interface.git
|
||||||
|
@ -13,12 +13,19 @@ list yields a list of all related PRs for each release.
|
|||||||
|
|
||||||
# [v1.11.0]
|
# [v1.11.0]
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- ACS Subsystem
|
||||||
|
- Custom Syrlinks FDIR which disabled most of the default FDIR functionality
|
||||||
|
|
||||||
## Changed
|
## Changed
|
||||||
|
|
||||||
|
- PCDU handler only called once in PST, but can handle multiple messages now
|
||||||
- Update rootfs base of Linux, all related OBSW changes
|
- Update rootfs base of Linux, all related OBSW changes
|
||||||
- Use gpsd version 3.17 now. Includes API changes
|
- Use gpsd version 3.17 now. Includes API changes
|
||||||
- Add `/usr/local/bin` to PATH. All shell scripts are there now
|
- Add `/usr/local/bin` to PATH. All shell scripts are there now
|
||||||
- Rename GPS device to `/dev/gps0`
|
- Rename GPS device to `/dev/gps0`
|
||||||
|
- Add Syrlinks and TMP devices to Software by default
|
||||||
|
|
||||||
# [v1.10.1]
|
# [v1.10.1]
|
||||||
|
|
||||||
|
116
CMakeLists.txt
116
CMakeLists.txt
@ -9,24 +9,16 @@
|
|||||||
################################################################################
|
################################################################################
|
||||||
cmake_minimum_required(VERSION 3.13)
|
cmake_minimum_required(VERSION 3.13)
|
||||||
|
|
||||||
# set(CMAKE_VERBOSE TRUE)
|
|
||||||
set(OBSW_VERSION_MAJOR_IF_GIT_FAILS 0)
|
set(OBSW_VERSION_MAJOR_IF_GIT_FAILS 0)
|
||||||
set(OBSW_VERSION_MINOR_IF_GIT_FAILS 0)
|
set(OBSW_VERSION_MINOR_IF_GIT_FAILS 0)
|
||||||
set(OBSW_VERSION_REVISION_IF_GIT_FAILS 0)
|
set(OBSW_VERSION_REVISION_IF_GIT_FAILS 0)
|
||||||
|
|
||||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
|
# set(CMAKE_VERBOSE TRUE)
|
||||||
|
|
||||||
option(EIVE_ADD_ETL_LIB "Add ETL library" ON)
|
|
||||||
option(EIVE_ADD_JSON_LIB "Add JSON library" ON)
|
|
||||||
option(EIVE_HARDCODED_TOOLCHAIN_FILE "\
|
option(EIVE_HARDCODED_TOOLCHAIN_FILE "\
|
||||||
For Linux Board Target BSPs, a default toolchain file will be set. Should be set to OFF \
|
For Linux Board Target BSPs, a default toolchain file will be set. Should be set to OFF \
|
||||||
if a different toolchain file is set externally" ON
|
if a different toolchain file is set externally" ON
|
||||||
)
|
)
|
||||||
option(EIVE_SYSROOT_MAGIC "Perform sysroot magic which might not be necessary" OFF)
|
|
||||||
option(EIVE_CREATE_UNIQUE_OBSW_BIN "Append username to generated binary name" ON)
|
|
||||||
|
|
||||||
set(OBSW_ADD_STAR_TRACKER 0)
|
|
||||||
set(OBSW_DEBUG_STARTRACKER 0)
|
|
||||||
|
|
||||||
if(NOT FSFW_OSAL)
|
if(NOT FSFW_OSAL)
|
||||||
set(FSFW_OSAL linux CACHE STRING "OS for the FSFW.")
|
set(FSFW_OSAL linux CACHE STRING "OS for the FSFW.")
|
||||||
@ -39,13 +31,35 @@ if(TGT_BSP)
|
|||||||
elseif(TGT_BSP MATCHES "arm/q7s")
|
elseif(TGT_BSP MATCHES "arm/q7s")
|
||||||
option(EIVE_BUILD_GPSD_GPS_HANDLER "Build GPSD dependent GPS Handler" ON)
|
option(EIVE_BUILD_GPSD_GPS_HANDLER "Build GPSD dependent GPS Handler" ON)
|
||||||
endif()
|
endif()
|
||||||
|
option(EIVE_CREATE_UNIQUE_OBSW_BIN "Append username to generated binary name" ON)
|
||||||
|
else()
|
||||||
|
option(EIVE_CREATE_UNIQUE_OBSW_BIN "Append username to generated binary name" OFF)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
|
||||||
# Perform steps like loading toolchain files where applicable.
|
# Perform steps like loading toolchain files where applicable.
|
||||||
include(PreProjectConfig)
|
include(PreProjectConfig)
|
||||||
include(EiveHelpers)
|
|
||||||
pre_project_config()
|
pre_project_config()
|
||||||
|
|
||||||
|
# Project Name
|
||||||
|
project(eive-obsw)
|
||||||
|
|
||||||
|
# Specify the C++ standard
|
||||||
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED True)
|
||||||
|
|
||||||
|
include(EiveHelpers)
|
||||||
|
|
||||||
|
option(EIVE_ADD_ETL_LIB "Add ETL library" ON)
|
||||||
|
option(EIVE_ADD_JSON_LIB "Add JSON library" ON)
|
||||||
|
|
||||||
|
set(OBSW_ADD_STAR_TRACKER 0)
|
||||||
|
set(OBSW_DEBUG_STARTRACKER 0)
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# Pre-Sources preparation
|
||||||
|
################################################################################
|
||||||
|
|
||||||
# Version handling
|
# Version handling
|
||||||
set(GIT_VER_HANDLING_OK FALSE)
|
set(GIT_VER_HANDLING_OK FALSE)
|
||||||
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.git)
|
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.git)
|
||||||
@ -77,21 +91,6 @@ if(NOT GIT_VER_HANDLING_OK)
|
|||||||
set(OBSW_VERSION_REVISION ${OBSW_VERSION_REVISION_IF_GIT_FAILS})
|
set(OBSW_VERSION_REVISION ${OBSW_VERSION_REVISION_IF_GIT_FAILS})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Check whether the user has already installed Catch2 first. This has to come before
|
|
||||||
# the project call. We could also exclude doing this when the Q7S primary OBSW is built..
|
|
||||||
find_package(Catch2 3 CONFIG QUIET)
|
|
||||||
|
|
||||||
# Project Name
|
|
||||||
project(eive-obsw)
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
# Pre-Sources preparation
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
# Specify the C++ standard
|
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED True)
|
|
||||||
|
|
||||||
# Set names and variables
|
# Set names and variables
|
||||||
set(OBSW_NAME ${CMAKE_PROJECT_NAME})
|
set(OBSW_NAME ${CMAKE_PROJECT_NAME})
|
||||||
set(WATCHDOG_NAME eive-watchdog)
|
set(WATCHDOG_NAME eive-watchdog)
|
||||||
@ -250,30 +249,8 @@ elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
|||||||
set(COMPILER_FLAGS "/permissive-")
|
set(COMPILER_FLAGS "/permissive-")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT(TGT_BSP MATCHES "arm/te0720-1cfa") AND NOT(TGT_BSP MATCHES "arm/q7s"))
|
|
||||||
# Not installed, so use FetchContent to download and provide Catch2
|
|
||||||
if(NOT Catch2_FOUND)
|
|
||||||
message(STATUS "Did not find a valid Catch2 installation. Using FetchContent to install it")
|
|
||||||
include(FetchContent)
|
|
||||||
|
|
||||||
FetchContent_Declare(
|
|
||||||
Catch2
|
|
||||||
GIT_REPOSITORY https://github.com/catchorg/Catch2.git
|
|
||||||
GIT_TAG v3.0.0-preview4
|
|
||||||
)
|
|
||||||
|
|
||||||
FetchContent_MakeAvailable(Catch2)
|
|
||||||
#fixes regression -preview4, to be confirmed in later releases
|
|
||||||
set_target_properties(Catch2 PROPERTIES DEBUG_POSTFIX "")
|
|
||||||
set_target_properties(Catch2 PROPERTIES EXCLUDE_FROM_ALL "true")
|
|
||||||
set_target_properties(Catch2WithMain PROPERTIES EXCLUDE_FROM_ALL "true")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
add_library(${LIB_EIVE_MISSION})
|
add_library(${LIB_EIVE_MISSION})
|
||||||
|
|
||||||
|
|
||||||
# Add main executable
|
# Add main executable
|
||||||
add_executable(${OBSW_NAME})
|
add_executable(${OBSW_NAME})
|
||||||
if(EIVE_CREATE_UNIQUE_OBSW_BIN)
|
if(EIVE_CREATE_UNIQUE_OBSW_BIN)
|
||||||
@ -301,12 +278,13 @@ target_include_directories(${WATCHDOG_NAME} PUBLIC
|
|||||||
# unittests
|
# unittests
|
||||||
add_executable(${UNITTEST_NAME} EXCLUDE_FROM_ALL)
|
add_executable(${UNITTEST_NAME} EXCLUDE_FROM_ALL)
|
||||||
|
|
||||||
|
if(EIVE_ADD_ETL_LIB)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(EIVE_ADD_JSON_LIB)
|
if(EIVE_ADD_JSON_LIB)
|
||||||
add_subdirectory(${LIB_JSON_PATH})
|
add_subdirectory(${LIB_JSON_PATH})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(EIVE_ADD_LINUX_FILES)
|
if(EIVE_ADD_LINUX_FILES)
|
||||||
add_subdirectory(${LIB_ARCSEC_PATH})
|
add_subdirectory(${LIB_ARCSEC_PATH})
|
||||||
add_subdirectory(${LINUX_PATH})
|
add_subdirectory(${LINUX_PATH})
|
||||||
@ -316,26 +294,52 @@ if(ADD_CSP_LIB)
|
|||||||
add_subdirectory(${LIB_CSP_PATH})
|
add_subdirectory(${LIB_CSP_PATH})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
add_subdirectory(${COMMON_PATH})
|
add_subdirectory(${COMMON_PATH})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
add_subdirectory(${LIB_LWGPS_PATH})
|
add_subdirectory(${LIB_LWGPS_PATH})
|
||||||
add_subdirectory(${FSFW_PATH})
|
add_subdirectory(${FSFW_PATH})
|
||||||
add_subdirectory(${LIB_EIVE_MISSION_PATH})
|
add_subdirectory(${LIB_EIVE_MISSION_PATH})
|
||||||
add_subdirectory(${TEST_PATH})
|
add_subdirectory(${TEST_PATH})
|
||||||
|
|
||||||
|
|
||||||
add_subdirectory(${UNITTEST_PATH})
|
add_subdirectory(${UNITTEST_PATH})
|
||||||
|
|
||||||
|
# This should have already been downloaded by the FSFW
|
||||||
|
# Still include it to be safe
|
||||||
|
include(FetchContent)
|
||||||
|
FetchContent_Declare(
|
||||||
|
etl
|
||||||
|
GIT_REPOSITORY https://github.com/ETLCPP/etl
|
||||||
|
GIT_TAG ${FSFW_ETL_LIB_VERSION}
|
||||||
|
)
|
||||||
|
FetchContent_MakeAvailable(etl)
|
||||||
|
|
||||||
|
# Use same Catch2 version as framework
|
||||||
|
if (NOT(TGT_BSP MATCHES "arm/te0720-1cfa") AND NOT(TGT_BSP MATCHES "arm/q7s"))
|
||||||
|
# Check whether the user has already installed Catch2 first
|
||||||
|
find_package(Catch2 ${FSFW_CATCH2_LIB_MAJOR_VERSION} CONFIG QUIET)
|
||||||
|
# Not installed, so use FetchContent to download and provide Catch2
|
||||||
|
if(NOT Catch2_FOUND)
|
||||||
|
message(STATUS "${MSG_PREFIX} Catch2 installation not found. Downloading Catch2 library with FetchContent")
|
||||||
|
include(FetchContent)
|
||||||
|
|
||||||
|
FetchContent_Declare(
|
||||||
|
Catch2
|
||||||
|
GIT_REPOSITORY https://github.com/catchorg/Catch2.git
|
||||||
|
GIT_TAG ${FSFW_CATCH2_LIB_VERSION}
|
||||||
|
)
|
||||||
|
|
||||||
|
FetchContent_MakeAvailable(Catch2)
|
||||||
|
#fixes regression -preview4, to be confirmed in later releases
|
||||||
|
set_target_properties(Catch2 PROPERTIES DEBUG_POSTFIX "")
|
||||||
|
set_target_properties(Catch2 PROPERTIES EXCLUDE_FROM_ALL "true")
|
||||||
|
set_target_properties(Catch2WithMain PROPERTIES EXCLUDE_FROM_ALL "true")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# Post-Sources preparation
|
# Post-Sources preparation
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Add libraries
|
# Add libraries
|
||||||
target_link_libraries(${LIB_EIVE_MISSION} PUBLIC
|
target_link_libraries(${LIB_EIVE_MISSION} PUBLIC
|
||||||
${LIB_FSFW_NAME}
|
${LIB_FSFW_NAME}
|
||||||
@ -374,7 +378,7 @@ endif()
|
|||||||
|
|
||||||
if(EIVE_ADD_ETL_LIB)
|
if(EIVE_ADD_ETL_LIB)
|
||||||
target_link_libraries(${LIB_EIVE_MISSION} PUBLIC
|
target_link_libraries(${LIB_EIVE_MISSION} PUBLIC
|
||||||
${LIB_ETL_NAME}
|
etl
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
127
README.md
127
README.md
@ -39,12 +39,14 @@ Target systems:
|
|||||||
the [Xiphos Traq Platform](https://trac2.xiphos.ca/eive-q7). Press on index to find all
|
the [Xiphos Traq Platform](https://trac2.xiphos.ca/eive-q7). Press on index to find all
|
||||||
relevant pages. The most recent datasheet can be found
|
relevant pages. The most recent datasheet can be found
|
||||||
[here](https://trac2.xiphos.ca/manual/wiki/Q7RevB/UserManual).
|
[here](https://trac2.xiphos.ca/manual/wiki/Q7RevB/UserManual).
|
||||||
* Linux OS built with Yocto 2.5
|
* Linux OS built with Yocto 2.5. SDK and root filesystem can be rebuilt with
|
||||||
|
[yocto](https://egit.irs.uni-stuttgart.de/eive/q7s-yocto)
|
||||||
* [Linux Kernel](https://github.com/XiphosSystemsCorp/linux-xlnx.git) . EIVE version can be found
|
* [Linux Kernel](https://github.com/XiphosSystemsCorp/linux-xlnx.git) . EIVE version can be found
|
||||||
[here](https://github.com/spacefisch/linux-xlnx) . Pre-compiled files can be
|
[here](https://github.com/spacefisch/linux-xlnx) . Pre-compiled files can be
|
||||||
found [here](https://eive-cloud.irs.uni-stuttgart.de/index.php/apps/files/?dir=/EIVE_IRS/Software/q7s-linux-components&fileid=777299).
|
found [here](https://eive-cloud.irs.uni-stuttgart.de/index.php/apps/files/?dir=/EIVE_IRS/Software/q7s-linux-components&fileid=777299).
|
||||||
* Q7S base project can be found [here](https://egit.irs.uni-stuttgart.de/eive/q7s-base)
|
* Q7S base project can be found [here](https://egit.irs.uni-stuttgart.de/eive/q7s-base)
|
||||||
* Minimal base project files can be found [here](https://eive-cloud.irs.uni-stuttgart.de/index.php/apps/files/?dir=/EIVE_IRS/Software/xiphos-q7s-sdk&fileid=510908)
|
* Minimal base project files and Xiphos SDK can be found
|
||||||
|
[here](https://eive-cloud.irs.uni-stuttgart.de/index.php/apps/files/?dir=/EIVE_IRS/Software/xiphos-q7s-sdk&fileid=510908)
|
||||||
* Host System
|
* Host System
|
||||||
* Generic software components which are not dependant on hardware can also
|
* Generic software components which are not dependant on hardware can also
|
||||||
be run on a host system. All host code is contained in the `bsp_hosted` folder
|
be run on a host system. All host code is contained in the `bsp_hosted` folder
|
||||||
@ -55,7 +57,8 @@ Target systems:
|
|||||||
The steps in the primary README are related to the main OBC target Q7S.
|
The steps in the primary README are related to the main OBC target Q7S.
|
||||||
The CMake build system can be used to generate build systems as well (see helper scripts in `cmake/scripts`:
|
The CMake build system can be used to generate build systems as well (see helper scripts in `cmake/scripts`:
|
||||||
|
|
||||||
- Linux (Raspberry Pi): See special section below.
|
- Linux Raspberry Pi: See special section below. Uses the `bsp_linux_board` folder
|
||||||
|
- Linux Trenz TE7020_1CFA: Uses the `bsp_te0720_1cfa` folder
|
||||||
- Linux Host: Uses the `bsp_hosted` BSP folder and the CMake Unix Makefiles generator.
|
- Linux Host: Uses the `bsp_hosted` BSP folder and the CMake Unix Makefiles generator.
|
||||||
- Windows Host: Uses the `bsp_hosted` BSP folder, the CMake MinGW Makefiles generator and MSYS2.
|
- Windows Host: Uses the `bsp_hosted` BSP folder, the CMake MinGW Makefiles generator and MSYS2.
|
||||||
|
|
||||||
@ -68,7 +71,7 @@ prerequisites.
|
|||||||
|
|
||||||
1. ARM cross-compiler installed, either as part of [Vivado 2018.2 installation](#vivado) or
|
1. ARM cross-compiler installed, either as part of [Vivado 2018.2 installation](#vivado) or
|
||||||
as a [separate download](#arm-toolchain)
|
as a [separate download](#arm-toolchain)
|
||||||
2. [Q7S sysroot](#q7s-sysroot) on local development machine
|
2. [Q7S sysroot](#sysroot) on local development machine
|
||||||
3. Recommended: Eclipse or [Vivado 2018.2 SDK](#vivado) for OBSW development
|
3. Recommended: Eclipse or [Vivado 2018.2 SDK](#vivado) for OBSW development
|
||||||
3. [TCF agent](https://wiki.eclipse.org/TCF) running on Q7S
|
3. [TCF agent](https://wiki.eclipse.org/TCF) running on Q7S
|
||||||
|
|
||||||
@ -96,11 +99,9 @@ When using Windows, run theses steps in MSYS2.
|
|||||||
git submodule update
|
git submodule update
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Ensure that the cross-compiler is working with `arm-linux-gnueabihf-gcc --version`.
|
3. Ensure that the cross-compiler is working with `arm-linux-gnueabihf-gcc --version` and that
|
||||||
It is recommended to set up a shell script which takes care of setting up the environment
|
the sysroot environmental variables have been set like specified in the
|
||||||
for convenience or to set up the
|
[root filesystem chapter](#sysroot).
|
||||||
[PATH and the CROSS_COMPILE variable permanently](https://unix.stackexchange.com/questions/26047/how-to-correctly-add-a-path-to-path)
|
|
||||||
in the `.profile` file.
|
|
||||||
|
|
||||||
4. Run the CMake configuration to create the build system in a `build-Debug-Q7S` folder.
|
4. Run the CMake configuration to create the build system in a `build-Debug-Q7S` folder.
|
||||||
Add `-G "MinGW Makefiles` in MinGW64 on Windows.
|
Add `-G "MinGW Makefiles` in MinGW64 on Windows.
|
||||||
@ -230,18 +231,19 @@ A serial console session is up permanently in a `tmux` session
|
|||||||
|
|
||||||
### Serial console
|
### Serial console
|
||||||
|
|
||||||
You can check whether the sessions exist with `tmux ls`
|
You can check whether the sessions exist with `tmux ls`.
|
||||||
|
This is the command to connect to the serial interface of the FM using the
|
||||||
|
RS422 interface of the flight preparation panel:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
tmux a -t q7s-serial
|
tmux a -t q7s-fm-fpp
|
||||||
```
|
```
|
||||||
|
|
||||||
If the session does not exist, you can create it like this
|
If the session does not exist, you can create it like this
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
tmux new -s q7s-serial
|
tmux new -s q7s-fm-fpp -t /bin/bash
|
||||||
/bin/bash
|
launch-q7s-fpp
|
||||||
q7s_serial
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Other useful tmux commands:
|
Other useful tmux commands:
|
||||||
@ -261,55 +263,50 @@ Other useful tmux commands:
|
|||||||
You can use the following command to connect to the Q7S with `ssh`:
|
You can use the following command to connect to the Q7S with `ssh`:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
q7s_ssh
|
q7s-fm-ssh
|
||||||
```
|
```
|
||||||
|
|
||||||
## Port forwarding for connection to TCF agent
|
|
||||||
|
|
||||||
This is a required step to connect to the `tcf-agent` on the Q7S, which is required for convenient
|
|
||||||
remote debugging. Assuming the IPv6
|
|
||||||
|
|
||||||
```sh
|
|
||||||
ssh -L 1534:192.168.133.10:1534 eive@2001:7c0:2018:1099:babe:0:e1fe:f1a5 -t /bin/bash
|
|
||||||
```
|
|
||||||
|
|
||||||
You then need to connect to `localhost` with port `1534`.
|
|
||||||
|
|
||||||
## Port forwarding for file transfers with `scp`
|
|
||||||
|
|
||||||
```sh
|
|
||||||
ssh -L 1535:192.168.133.10:22 eive@2001:7c0:2018:1099:babe:0:e1fe:f1a5 -t /bin/bash
|
|
||||||
```
|
|
||||||
|
|
||||||
You then need to run `scp` with the `-P 1535` flag with `localhost` as the target IP address.
|
|
||||||
|
|
||||||
## Port forwarding for TMTC commanding
|
|
||||||
|
|
||||||
You can enable port forwarding for TMTC commanding with the following command:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
ssh -L 1536:192.168.133.10:7301 eive@2001:7c0:2018:1099:babe:0:e1fe:f1a5 -t /bin/bash
|
|
||||||
```
|
|
||||||
|
|
||||||
This forwards TMTC packets on port `1536` of localhost to the TMTC reception port of the Q7S.
|
|
||||||
|
|
||||||
## Set up all port forwarding at once
|
## Set up all port forwarding at once
|
||||||
|
|
||||||
|
Port forwarding is necessary for remote-debugging using the `tcf-agent`, copying files
|
||||||
|
with `scp` & `q7s-cp.py` and sending TMTC commands.
|
||||||
You can specify the `-L` option multiple times to set up all port forwarding at once.
|
You can specify the `-L` option multiple times to set up all port forwarding at once.
|
||||||
Example for using the UDP communication interface:
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
ssh -L 1534:192.168.133.10:1534 \
|
ssh -L 1534:192.168.155.55:1534 \
|
||||||
-L 1535:192.168.133.10:22 \
|
-L 1535:192.168.155.55:22 \
|
||||||
-L 1536:192.168.133.10:7301 \
|
-L 1536:192.168.155.55:7301 \
|
||||||
|
-L 1537:127.0.0.1:7100 \
|
||||||
|
-L 1538:192.168.133.10:1534 \
|
||||||
|
-L 1539:192.168.133.10:22 \
|
||||||
|
-L 1540:192.168.133.10:7301 \
|
||||||
eive@2001:7c0:2018:1099:babe:0:e1fe:f1a5 \
|
eive@2001:7c0:2018:1099:babe:0:e1fe:f1a5 \
|
||||||
-t 'export CONSOLE_PREFIX="[Q7S Tunnel] /bin/bash'
|
-t 'CONSOLE_PREFIX="[Q7S Tunnel]" /bin/bash'
|
||||||
```
|
```
|
||||||
|
|
||||||
There is also a shell script called `q7s-port.sh` which can be used to achieve the same.
|
There is also a shell script called `q7s-port.sh` which can be used to achieve the same.
|
||||||
|
|
||||||
# <a id="set-up-prereq"></a> Setting up prerequisites
|
# <a id="set-up-prereq"></a> Setting up prerequisites
|
||||||
|
|
||||||
|
## <a id="sysroot"></a> Getting system root for Linux cross-compilation
|
||||||
|
|
||||||
|
Cross-compiling any program for an embedded Linux board generally required parts of the target root
|
||||||
|
file system on the development/host computer. For the Q7S, you can install the cross-compilation
|
||||||
|
root file system by simply installing the SDK. You can find the most recent SDK
|
||||||
|
[here](https://eive-cloud.irs.uni-stuttgart.de/index.php/apps/files/?dir=/EIVE_IRS/Software/xiphos-q7s-sdk).
|
||||||
|
|
||||||
|
If you are compiling for the Q7S or the TE7020, the `ZYNQ_7020_SYSROOT` environment variable
|
||||||
|
must be set to the location of the SDK compile sysroot. Here is an example on how to do this
|
||||||
|
in Ubuntu, assuming the SDK was installed in the default location
|
||||||
|
|
||||||
|
```sh
|
||||||
|
export ZYNQ_7020_SYSROOT="/opt/xiphos/sdk/ark/sysroots/cortexa9hf-neon-xiphos-linux-gnueabi"
|
||||||
|
```
|
||||||
|
|
||||||
|
If you are comiling for the Raspberry Pi, you have to set the `LINUX_ROOTFS` environmental
|
||||||
|
variable instead. You can find a base root filesystem for the Raspberry Pi
|
||||||
|
[here](https://eive-cloud.irs.uni-stuttgart.de/index.php/apps/files/?dir=/EIVE_IRS/Software/rootfs).
|
||||||
|
|
||||||
## <a id="vivado"></a> Installing Vivado the the Xilinx development tools
|
## <a id="vivado"></a> Installing Vivado the the Xilinx development tools
|
||||||
|
|
||||||
It's also possible to perform debugging with a normal Eclipse installation by installing
|
It's also possible to perform debugging with a normal Eclipse installation by installing
|
||||||
@ -348,7 +345,9 @@ twice) and generate this list manually with the following commands, according to
|
|||||||
sudo apt install libncurses5
|
sudo apt install libncurses5
|
||||||
```
|
```
|
||||||
|
|
||||||
2. ```sh
|
2. Execute the following command
|
||||||
|
|
||||||
|
```sh
|
||||||
sudo <installRoot>/Vivado/2018.2/bin/vivado -nolog -nojournal -mode batch -source
|
sudo <installRoot>/Vivado/2018.2/bin/vivado -nolog -nojournal -mode batch -source
|
||||||
<installRoot>/.xinstall/Vivado_2018.2/scripts/xlpartinfo.tcl -tclargs
|
<installRoot>/.xinstall/Vivado_2018.2/scripts/xlpartinfo.tcl -tclargs
|
||||||
<installRoot>/Vivado/2018.2/data/parts/installed_devices.txt
|
<installRoot>/Vivado/2018.2/data/parts/installed_devices.txt
|
||||||
@ -423,21 +422,6 @@ You can download the toolchains for Windows and Linux
|
|||||||
sudo apt-get install cmake
|
sudo apt-get install cmake
|
||||||
````
|
````
|
||||||
|
|
||||||
## <a id="q7s-sysroot"></a> Getting the Q7S system root
|
|
||||||
|
|
||||||
It is necessary to copy the Q7S system root to your local development machine for libraries
|
|
||||||
like `libgpio`. You can find the system root for the Q7S, the Raspberry Pi and the
|
|
||||||
Beagle Bone Black for download here
|
|
||||||
[here](https://eive-cloud.irs.uni-stuttgart.de/index.php/apps/files/?dir=/EIVE_IRS/Software/rootfs&fileid=831849).
|
|
||||||
Download it and unzip it somewhere in the Xilinx installation folder.
|
|
||||||
You can use the following command if `wget` can be used or for CI/CD:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
wget https://eive-cloud.irs.uni-stuttgart.de/index.php/s/SyXpdBBQX32xPgE/download/cortexa9hf-neon-xiphos-linux-gnueabi.tar.gz
|
|
||||||
```
|
|
||||||
|
|
||||||
Then, create a new environmental variables `Q7S_SYSROOT` and set it to the local system root path.
|
|
||||||
|
|
||||||
### Updating system root for CI
|
### Updating system root for CI
|
||||||
|
|
||||||
If the system root is updated, it needs to be manually updated on the buggy file server.
|
If the system root is updated, it needs to be manually updated on the buggy file server.
|
||||||
@ -727,7 +711,10 @@ More detailed information about the used q7s commands can be found in the Q7S us
|
|||||||
|
|
||||||
# <a id="q7s"></a> Q7S OBC
|
# <a id="q7s"></a> Q7S OBC
|
||||||
|
|
||||||
## Launching an application at start-up
|
## Launching an application at start-up - deprecated
|
||||||
|
|
||||||
|
This way to enable auto-startup is deprecated. It is instead recommended to tweak the yocto
|
||||||
|
recipes file for the related `systemd` service to enable auto-startup with `SYSTEMD_AUTO_ENABLE`.
|
||||||
|
|
||||||
You can also do the steps performed here on a host computer inside the `q7s-rootfs` directory
|
You can also do the steps performed here on a host computer inside the `q7s-rootfs` directory
|
||||||
of the [Q7S base repository](https://egit.irs.uni-stuttgart.de/eive/q7s-base). This might
|
of the [Q7S base repository](https://egit.irs.uni-stuttgart.de/eive/q7s-base). This might
|
||||||
@ -829,10 +816,9 @@ If a timeout occurs, this special file will be deleted as well.
|
|||||||
The watchdog and its configuration will be directly integrated into this repostory, which
|
The watchdog and its configuration will be directly integrated into this repostory, which
|
||||||
makes adaptions easy.
|
makes adaptions easy.
|
||||||
|
|
||||||
### `tcfagent`
|
### `tcf-agent`
|
||||||
|
|
||||||
This starts the `/usr/bin/agent` program to allows remote debugging. Might not be part of
|
This starts the `/usr/bin/tcf-agent` program to allows remote debugging
|
||||||
the mission code
|
|
||||||
|
|
||||||
### `eive-early-config`
|
### `eive-early-config`
|
||||||
|
|
||||||
@ -1196,8 +1182,11 @@ Alternatively, changes from other upstreams (forks) and branches can be merged l
|
|||||||
in the same way.
|
in the same way.
|
||||||
|
|
||||||
# <a id="coding-style"></a> Coding Style
|
# <a id="coding-style"></a> Coding Style
|
||||||
|
|
||||||
* the formatting is based on the clang-format tools
|
* the formatting is based on the clang-format tools
|
||||||
|
|
||||||
## Setting up eclipse auto-fromatter with clang-format
|
## Setting up eclipse auto-fromatter with clang-format
|
||||||
|
|
||||||
1. Help → Install New Software → Add
|
1. Help → Install New Software → Add
|
||||||
2. In location insert the link http://www.cppstyle.com/luna
|
2. In location insert the link http://www.cppstyle.com/luna
|
||||||
3. The software package CppStyle should now be available for installation
|
3. The software package CppStyle should now be available for installation
|
||||||
|
@ -8,6 +8,8 @@
|
|||||||
|
|
||||||
#include "commonConfig.h"
|
#include "commonConfig.h"
|
||||||
|
|
||||||
|
#define OBSW_PRINT_MISSED_DEADLINES 1
|
||||||
|
|
||||||
#define OBSW_ADD_TEST_CODE 1
|
#define OBSW_ADD_TEST_CODE 1
|
||||||
|
|
||||||
/* These defines should be disabled for mission code but are useful for
|
/* These defines should be disabled for mission code but are useful for
|
||||||
@ -20,6 +22,12 @@ debugging. */
|
|||||||
// Set to 1 if telecommands are received via the PDEC IP Core
|
// Set to 1 if telecommands are received via the PDEC IP Core
|
||||||
#define OBSW_TC_FROM_PDEC 0
|
#define OBSW_TC_FROM_PDEC 0
|
||||||
|
|
||||||
|
#define OBSW_SYRLINKS_SIMULATED 0
|
||||||
|
|
||||||
|
#define OBSW_INITIALIZE_SWITCHES 0
|
||||||
|
|
||||||
|
#define OBSW_TCP_SERVER_WIRETAPPING 0
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
||||||
#include "objects/systemObjectList.h"
|
#include "objects/systemObjectList.h"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include "InitMission.h"
|
#include "InitMission.h"
|
||||||
#include "OBSWVersion.h"
|
#include "commonConfig.h"
|
||||||
#include "fsfw/FSFWVersion.h"
|
#include "fsfw/FSFWVersion.h"
|
||||||
#include "fsfw/tasks/TaskFactory.h"
|
#include "fsfw/tasks/TaskFactory.h"
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
@ -19,9 +19,9 @@ static const char* COMPILE_PRINTOUT = "unknown OS";
|
|||||||
int main(void) {
|
int main(void) {
|
||||||
std::cout << "-- EIVE OBSW --" << std::endl;
|
std::cout << "-- EIVE OBSW --" << std::endl;
|
||||||
std::cout << "-- Compiled for " << COMPILE_PRINTOUT << " --" << std::endl;
|
std::cout << "-- Compiled for " << COMPILE_PRINTOUT << " --" << std::endl;
|
||||||
std::cout << "-- OBSW " << SW_NAME << " v" << SW_VERSION << "." << SW_SUBVERSION << "."
|
std::cout << "-- OBSW "
|
||||||
<< SW_REVISION << ", FSFW v" << FSFW_VERSION << "." << FSFW_SUBVERSION << "."
|
<< " v" << common::OBSW_VERSION << " | FSFW v" << fsfw::FSFW_VERSION << " --"
|
||||||
<< FSFW_REVISION << "--" << std::endl;
|
<< std::endl;
|
||||||
std::cout << "-- " << __DATE__ << " " << __TIME__ << " --" << std::endl;
|
std::cout << "-- " << __DATE__ << " " << __TIME__ << " --" << std::endl;
|
||||||
|
|
||||||
initmission::initMission();
|
initmission::initMission();
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
#include "ObjectFactory.h"
|
#include "ObjectFactory.h"
|
||||||
|
|
||||||
|
#include <mission/system/fdir/GomspacePowerFdir.h>
|
||||||
|
#include <mission/system/fdir/SyrlinksFdir.h>
|
||||||
|
|
||||||
#include "OBSWConfig.h"
|
#include "OBSWConfig.h"
|
||||||
#include "bsp_q7s/boardtest/Q7STestTask.h"
|
#include "bsp_q7s/boardtest/Q7STestTask.h"
|
||||||
#include "bsp_q7s/callbacks/gnssCallback.h"
|
#include "bsp_q7s/callbacks/gnssCallback.h"
|
||||||
@ -37,10 +40,10 @@
|
|||||||
#include "linux/obc/PdecHandler.h"
|
#include "linux/obc/PdecHandler.h"
|
||||||
#include "linux/obc/Ptme.h"
|
#include "linux/obc/Ptme.h"
|
||||||
#include "linux/obc/PtmeConfig.h"
|
#include "linux/obc/PtmeConfig.h"
|
||||||
#include "mission/system/objects/AcsBoardFdir.h"
|
#include "mission/system/fdir/AcsBoardFdir.h"
|
||||||
#include "mission/system/objects/RtdFdir.h"
|
#include "mission/system/fdir/RtdFdir.h"
|
||||||
|
#include "mission/system/fdir/SusFdir.h"
|
||||||
#include "mission/system/objects/SusAssembly.h"
|
#include "mission/system/objects/SusAssembly.h"
|
||||||
#include "mission/system/objects/SusFdir.h"
|
|
||||||
#include "mission/system/objects/TcsBoardAssembly.h"
|
#include "mission/system/objects/TcsBoardAssembly.h"
|
||||||
#include "mission/system/tree/system.h"
|
#include "mission/system/tree/system.h"
|
||||||
#include "tmtc/apid.h"
|
#include "tmtc/apid.h"
|
||||||
@ -154,7 +157,7 @@ void ObjectFactory::produce(void* args) {
|
|||||||
createSolarArrayDeploymentComponents();
|
createSolarArrayDeploymentComponents();
|
||||||
createPlPcduComponents(gpioComIF, spiComIF, pwrSwitcher);
|
createPlPcduComponents(gpioComIF, spiComIF, pwrSwitcher);
|
||||||
#if OBSW_ADD_SYRLINKS == 1
|
#if OBSW_ADD_SYRLINKS == 1
|
||||||
createSyrlinksComponents();
|
createSyrlinksComponents(pwrSwitcher);
|
||||||
#endif /* OBSW_ADD_SYRLINKS == 1 */
|
#endif /* OBSW_ADD_SYRLINKS == 1 */
|
||||||
createRtdComponents(q7s::SPI_DEFAULT_DEV, gpioComIF, pwrSwitcher);
|
createRtdComponents(q7s::SPI_DEFAULT_DEV, gpioComIF, pwrSwitcher);
|
||||||
createPayloadComponents(gpioComIF);
|
createPayloadComponents(gpioComIF);
|
||||||
@ -170,6 +173,9 @@ void ObjectFactory::produce(void* args) {
|
|||||||
imtqHandler->setStartUpImmediately();
|
imtqHandler->setStartUpImmediately();
|
||||||
imtqHandler->setToGoToNormal(true);
|
imtqHandler->setToGoToNormal(true);
|
||||||
#endif
|
#endif
|
||||||
|
#if OBSW_DEBUG_IMTQ == 1
|
||||||
|
imtqHandler->setDebugMode(true);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
createReactionWheelComponents(gpioComIF);
|
createReactionWheelComponents(gpioComIF);
|
||||||
|
|
||||||
@ -179,6 +185,9 @@ void ObjectFactory::produce(void* args) {
|
|||||||
new BpxBatteryHandler(objects::BPX_BATT_HANDLER, objects::I2C_COM_IF, bpxI2cCookie);
|
new BpxBatteryHandler(objects::BPX_BATT_HANDLER, objects::I2C_COM_IF, bpxI2cCookie);
|
||||||
bpxHandler->setStartUpImmediately();
|
bpxHandler->setStartUpImmediately();
|
||||||
bpxHandler->setToGoToNormalMode(true);
|
bpxHandler->setToGoToNormalMode(true);
|
||||||
|
#if OBSW_DEBUG_BPX_BATT == 1
|
||||||
|
bpxHandler->setDebugMode(true);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
new FileSystemHandler(objects::FILE_SYSTEM_HANDLER);
|
new FileSystemHandler(objects::FILE_SYSTEM_HANDLER);
|
||||||
@ -249,14 +258,22 @@ void ObjectFactory::createPcduComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchI
|
|||||||
CspCookie* pdu1CspCookie = new CspCookie(PDU::MAX_REPLY_LENGTH, addresses::PDU1);
|
CspCookie* pdu1CspCookie = new CspCookie(PDU::MAX_REPLY_LENGTH, addresses::PDU1);
|
||||||
CspCookie* pdu2CspCookie = new CspCookie(PDU::MAX_REPLY_LENGTH, addresses::PDU2);
|
CspCookie* pdu2CspCookie = new CspCookie(PDU::MAX_REPLY_LENGTH, addresses::PDU2);
|
||||||
CspCookie* acuCspCookie = new CspCookie(ACU::MAX_REPLY_LENGTH, addresses::ACU);
|
CspCookie* acuCspCookie = new CspCookie(ACU::MAX_REPLY_LENGTH, addresses::ACU);
|
||||||
/* Device Handler */
|
|
||||||
|
auto p60Fdir = new GomspacePowerFdir(objects::P60DOCK_HANDLER);
|
||||||
P60DockHandler* p60dockhandler =
|
P60DockHandler* p60dockhandler =
|
||||||
new P60DockHandler(objects::P60DOCK_HANDLER, objects::CSP_COM_IF, p60DockCspCookie);
|
new P60DockHandler(objects::P60DOCK_HANDLER, objects::CSP_COM_IF, p60DockCspCookie, p60Fdir);
|
||||||
|
|
||||||
|
auto pdu1Fdir = new GomspacePowerFdir(objects::PDU1_HANDLER);
|
||||||
PDU1Handler* pdu1handler =
|
PDU1Handler* pdu1handler =
|
||||||
new PDU1Handler(objects::PDU1_HANDLER, objects::CSP_COM_IF, pdu1CspCookie);
|
new PDU1Handler(objects::PDU1_HANDLER, objects::CSP_COM_IF, pdu1CspCookie, pdu1Fdir);
|
||||||
|
|
||||||
|
auto pdu2Fdir = new GomspacePowerFdir(objects::PDU2_HANDLER);
|
||||||
PDU2Handler* pdu2handler =
|
PDU2Handler* pdu2handler =
|
||||||
new PDU2Handler(objects::PDU2_HANDLER, objects::CSP_COM_IF, pdu2CspCookie);
|
new PDU2Handler(objects::PDU2_HANDLER, objects::CSP_COM_IF, pdu2CspCookie, pdu2Fdir);
|
||||||
ACUHandler* acuhandler = new ACUHandler(objects::ACU_HANDLER, objects::CSP_COM_IF, acuCspCookie);
|
|
||||||
|
auto acuFdir = new GomspacePowerFdir(objects::ACU_HANDLER);
|
||||||
|
ACUHandler* acuhandler =
|
||||||
|
new ACUHandler(objects::ACU_HANDLER, objects::CSP_COM_IF, acuCspCookie, acuFdir);
|
||||||
auto pcduHandler = new PCDUHandler(objects::PCDU_HANDLER, 50);
|
auto pcduHandler = new PCDUHandler(objects::PCDU_HANDLER, 50);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -270,6 +287,12 @@ void ObjectFactory::createPcduComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchI
|
|||||||
if (pwrSwitcher != nullptr) {
|
if (pwrSwitcher != nullptr) {
|
||||||
*pwrSwitcher = pcduHandler;
|
*pwrSwitcher = pcduHandler;
|
||||||
}
|
}
|
||||||
|
#if OBSW_DEBUG_P60DOCK == 1
|
||||||
|
p60dockhandler->setDebugMode(true);
|
||||||
|
#endif
|
||||||
|
#if OBSW_DEBUG_ACU == 1
|
||||||
|
acuhandler->setDebugMode(true);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectFactory::createRadSensorComponent(LinuxLibgpioIF* gpioComIF) {
|
void ObjectFactory::createRadSensorComponent(LinuxLibgpioIF* gpioComIF) {
|
||||||
@ -633,9 +656,14 @@ void ObjectFactory::createSyrlinksComponents(PowerSwitchIF* pwrSwitcher) {
|
|||||||
syrlinks::MAX_REPLY_SIZE, UartModes::NON_CANONICAL);
|
syrlinks::MAX_REPLY_SIZE, UartModes::NON_CANONICAL);
|
||||||
syrlinksUartCookie->setParityEven();
|
syrlinksUartCookie->setParityEven();
|
||||||
|
|
||||||
auto syrlinksHandler = new SyrlinksHkHandler(objects::SYRLINKS_HK_HANDLER, objects::UART_COM_IF,
|
auto syrlinksFdir = new SyrlinksFdir(objects::SYRLINKS_HK_HANDLER);
|
||||||
syrlinksUartCookie, pcdu::PDU1_CH1_SYRLINKS_12V);
|
auto syrlinksHandler =
|
||||||
|
new SyrlinksHkHandler(objects::SYRLINKS_HK_HANDLER, objects::UART_COM_IF, syrlinksUartCookie,
|
||||||
|
pcdu::PDU1_CH1_SYRLINKS_12V, syrlinksFdir);
|
||||||
syrlinksHandler->setPowerSwitcher(pwrSwitcher);
|
syrlinksHandler->setPowerSwitcher(pwrSwitcher);
|
||||||
|
#if OBSW_DEBUG_SYRLINKS == 1
|
||||||
|
syrlinksHandler->setDebugMode(true);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectFactory::createPayloadComponents(LinuxLibgpioIF* gpioComIF) {
|
void ObjectFactory::createPayloadComponents(LinuxLibgpioIF* gpioComIF) {
|
||||||
@ -736,32 +764,35 @@ void ObjectFactory::createReactionWheelComponents(LinuxLibgpioIF* gpioComIF) {
|
|||||||
|
|
||||||
auto rwHandler1 =
|
auto rwHandler1 =
|
||||||
new RwHandler(objects::RW1, objects::SPI_COM_IF, rw1SpiCookie, gpioComIF, gpioIds::EN_RW1);
|
new RwHandler(objects::RW1, objects::SPI_COM_IF, rw1SpiCookie, gpioComIF, gpioIds::EN_RW1);
|
||||||
|
rw1SpiCookie->setCallbackArgs(rwHandler1);
|
||||||
#if OBSW_DEBUG_RW == 1
|
#if OBSW_DEBUG_RW == 1
|
||||||
rwHandler1->setStartUpImmediately();
|
rwHandler1->setStartUpImmediately();
|
||||||
|
rwHandler1->setDebugMode(true);
|
||||||
#endif
|
#endif
|
||||||
rw1SpiCookie->setCallbackArgs(rwHandler1);
|
|
||||||
rwHandler1->setStartUpImmediately();
|
|
||||||
|
|
||||||
auto rwHandler2 =
|
auto rwHandler2 =
|
||||||
new RwHandler(objects::RW2, objects::SPI_COM_IF, rw2SpiCookie, gpioComIF, gpioIds::EN_RW2);
|
new RwHandler(objects::RW2, objects::SPI_COM_IF, rw2SpiCookie, gpioComIF, gpioIds::EN_RW2);
|
||||||
|
rw2SpiCookie->setCallbackArgs(rwHandler2);
|
||||||
#if OBSW_DEBUG_RW == 1
|
#if OBSW_DEBUG_RW == 1
|
||||||
rwHandler2->setStartUpImmediately();
|
rwHandler2->setStartUpImmediately();
|
||||||
|
rwHandler2->setDebugMode(true);
|
||||||
#endif
|
#endif
|
||||||
rw2SpiCookie->setCallbackArgs(rwHandler2);
|
|
||||||
|
|
||||||
auto rwHandler3 =
|
auto rwHandler3 =
|
||||||
new RwHandler(objects::RW3, objects::SPI_COM_IF, rw3SpiCookie, gpioComIF, gpioIds::EN_RW3);
|
new RwHandler(objects::RW3, objects::SPI_COM_IF, rw3SpiCookie, gpioComIF, gpioIds::EN_RW3);
|
||||||
|
rw3SpiCookie->setCallbackArgs(rwHandler3);
|
||||||
#if OBSW_DEBUG_RW == 1
|
#if OBSW_DEBUG_RW == 1
|
||||||
rwHandler3->setStartUpImmediately();
|
rwHandler3->setStartUpImmediately();
|
||||||
|
rwHandler3->setDebugMode(true);
|
||||||
#endif
|
#endif
|
||||||
rw3SpiCookie->setCallbackArgs(rwHandler3);
|
|
||||||
|
|
||||||
auto rwHandler4 =
|
auto rwHandler4 =
|
||||||
new RwHandler(objects::RW4, objects::SPI_COM_IF, rw4SpiCookie, gpioComIF, gpioIds::EN_RW4);
|
new RwHandler(objects::RW4, objects::SPI_COM_IF, rw4SpiCookie, gpioComIF, gpioIds::EN_RW4);
|
||||||
|
rw4SpiCookie->setCallbackArgs(rwHandler4);
|
||||||
#if OBSW_DEBUG_RW == 1
|
#if OBSW_DEBUG_RW == 1
|
||||||
rwHandler4->setStartUpImmediately();
|
rwHandler4->setStartUpImmediately();
|
||||||
|
rwHandler4->setDebugMode(true);
|
||||||
#endif
|
#endif
|
||||||
rw4SpiCookie->setCallbackArgs(rwHandler4);
|
|
||||||
|
|
||||||
#endif /* OBSW_ADD_RW == 1 */
|
#endif /* OBSW_ADD_RW == 1 */
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,10 @@
|
|||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include "fsfw/version.h"
|
#include "fsfw/version.h"
|
||||||
|
|
||||||
|
/* These defines should be disabled for mission code but are useful for
|
||||||
|
debugging. */
|
||||||
|
#define OBSW_VERBOSE_LEVEL 1
|
||||||
|
|
||||||
#define OBSW_ADD_LWGPS_TEST 0
|
#define OBSW_ADD_LWGPS_TEST 0
|
||||||
|
|
||||||
// Disable this for mission code. It allows exchanging TMTC packets via the Ethernet port
|
// Disable this for mission code. It allows exchanging TMTC packets via the Ethernet port
|
||||||
|
@ -30,6 +30,7 @@ enum: uint8_t {
|
|||||||
PDU1_HANDLER = 133,
|
PDU1_HANDLER = 133,
|
||||||
PDU2_HANDLER = 134,
|
PDU2_HANDLER = 134,
|
||||||
ACU_HANDLER = 135,
|
ACU_HANDLER = 135,
|
||||||
|
SYRLINKS = 136,
|
||||||
COMMON_SUBSYSTEM_ID_END
|
COMMON_SUBSYSTEM_ID_END
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
2
fsfw
2
fsfw
@ -1 +1 @@
|
|||||||
Subproject commit 1c4ea6dd0dbc6e93086c28d8e0ce3bed5be0c73c
|
Subproject commit 7760b3063ee9249316edd1772384474676b062b2
|
@ -9,9 +9,9 @@
|
|||||||
#include <linux/callbacks/gpioCallbacks.h>
|
#include <linux/callbacks/gpioCallbacks.h>
|
||||||
#include <mission/devices/Max31865PT1000Handler.h>
|
#include <mission/devices/Max31865PT1000Handler.h>
|
||||||
#include <mission/devices/SusHandler.h>
|
#include <mission/devices/SusHandler.h>
|
||||||
#include <mission/system/objects/RtdFdir.h>
|
#include <mission/system/fdir/RtdFdir.h>
|
||||||
|
#include <mission/system/fdir/SusFdir.h>
|
||||||
#include <mission/system/objects/SusAssembly.h>
|
#include <mission/system/objects/SusAssembly.h>
|
||||||
#include <mission/system/objects/SusFdir.h>
|
|
||||||
#include <mission/system/objects/TcsBoardAssembly.h>
|
#include <mission/system/objects/TcsBoardAssembly.h>
|
||||||
|
|
||||||
#include "OBSWConfig.h"
|
#include "OBSWConfig.h"
|
||||||
@ -267,6 +267,9 @@ void ObjectFactory::createRtdComponents(std::string spiDev, GpioIF* gpioComIF,
|
|||||||
rtdFdir = new RtdFdir(rtdIds[idx]);
|
rtdFdir = new RtdFdir(rtdIds[idx]);
|
||||||
rtds[idx]->setCustomFdir(rtdFdir);
|
rtds[idx]->setCustomFdir(rtdFdir);
|
||||||
rtds[idx]->setDeviceIdx(idx + 3);
|
rtds[idx]->setDeviceIdx(idx + 3);
|
||||||
|
#if OBSW_DEBUG_RTD == 1
|
||||||
|
rtds[idx]->setDebugMode(true);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if OBSW_TEST_RTD == 1
|
#if OBSW_TEST_RTD == 1
|
||||||
|
@ -15,10 +15,6 @@
|
|||||||
#include "commonConfig.h"
|
#include "commonConfig.h"
|
||||||
#include "OBSWVersion.h"
|
#include "OBSWVersion.h"
|
||||||
|
|
||||||
/* These defines should be disabled for mission code but are useful for
|
|
||||||
debugging. */
|
|
||||||
#define OBSW_VERBOSE_LEVEL 1
|
|
||||||
|
|
||||||
#define Q7S_EM 0
|
#define Q7S_EM 0
|
||||||
|
|
||||||
/*******************************************************************/
|
/*******************************************************************/
|
||||||
@ -49,10 +45,10 @@ debugging. */
|
|||||||
#define OBSW_ADD_ACS_HANDLERS 1
|
#define OBSW_ADD_ACS_HANDLERS 1
|
||||||
#define OBSW_ADD_RW 0
|
#define OBSW_ADD_RW 0
|
||||||
#define OBSW_ADD_RTD_DEVICES 1
|
#define OBSW_ADD_RTD_DEVICES 1
|
||||||
#define OBSW_ADD_TMP_DEVICES 0
|
#define OBSW_ADD_TMP_DEVICES 1
|
||||||
#define OBSW_ADD_RAD_SENSORS 1
|
#define OBSW_ADD_RAD_SENSORS 1
|
||||||
#define OBSW_ADD_PL_PCDU 1
|
#define OBSW_ADD_PL_PCDU 1
|
||||||
#define OBSW_ADD_SYRLINKS 0
|
#define OBSW_ADD_SYRLINKS 1
|
||||||
#define OBSW_ENABLE_SYRLINKS_TRANSMIT_TIMEOUT 0
|
#define OBSW_ENABLE_SYRLINKS_TRANSMIT_TIMEOUT 0
|
||||||
#define OBSW_STAR_TRACKER_GROUND_CONFIG 1
|
#define OBSW_STAR_TRACKER_GROUND_CONFIG 1
|
||||||
|
|
||||||
@ -129,6 +125,8 @@ debugging. */
|
|||||||
#define OBSW_DEBUG_BPX_BATT 0
|
#define OBSW_DEBUG_BPX_BATT 0
|
||||||
#define OBSW_TEST_IMTQ 0
|
#define OBSW_TEST_IMTQ 0
|
||||||
#define OBSW_DEBUG_IMTQ 0
|
#define OBSW_DEBUG_IMTQ 0
|
||||||
|
#define OBSW_TEST_RW 0
|
||||||
|
#define OBSW_DEBUG_RW 0
|
||||||
|
|
||||||
#define OBSW_TEST_LIBGPIOD 0
|
#define OBSW_TEST_LIBGPIOD 0
|
||||||
#define OBSW_TEST_PLOC_HANDLER 0
|
#define OBSW_TEST_PLOC_HANDLER 0
|
||||||
@ -145,7 +143,7 @@ debugging. */
|
|||||||
#define OBSW_DEBUG_GPS 0
|
#define OBSW_DEBUG_GPS 0
|
||||||
#define OBSW_DEBUG_ACU 0
|
#define OBSW_DEBUG_ACU 0
|
||||||
#define OBSW_DEBUG_SYRLINKS 0
|
#define OBSW_DEBUG_SYRLINKS 0
|
||||||
#define OBSW_DEBUG_RW 0
|
|
||||||
#define OBSW_DEBUG_PDEC_HANDLER 0
|
#define OBSW_DEBUG_PDEC_HANDLER 0
|
||||||
|
|
||||||
#ifdef TE0720_1CFA
|
#ifdef TE0720_1CFA
|
||||||
@ -185,7 +183,7 @@ debugging. */
|
|||||||
|
|
||||||
#endif // RASPBERRY_PI
|
#endif // RASPBERRY_PI
|
||||||
|
|
||||||
#define TCP_SERVER_WIRETAPPING 0
|
#define OBSW_TCP_SERVER_WIRETAPPING 0
|
||||||
|
|
||||||
/*******************************************************************/
|
/*******************************************************************/
|
||||||
/** CMake Defines */
|
/** CMake Defines */
|
||||||
|
@ -514,7 +514,6 @@ ReturnValue_t pst::pstGompaceCan(FixedTimeslotTaskIF *thisSequence) {
|
|||||||
#if Q7S_EM != 1
|
#if Q7S_EM != 1
|
||||||
// PCDU handlers receives two messages and both must be handled
|
// PCDU handlers receives two messages and both must be handled
|
||||||
thisSequence->addSlot(objects::PCDU_HANDLER, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
|
thisSequence->addSlot(objects::PCDU_HANDLER, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
|
||||||
thisSequence->addSlot(objects::PCDU_HANDLER, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
|
|
||||||
|
|
||||||
thisSequence->addSlot(objects::P60DOCK_HANDLER, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
|
thisSequence->addSlot(objects::P60DOCK_HANDLER, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
|
||||||
thisSequence->addSlot(objects::PDU1_HANDLER, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
|
thisSequence->addSlot(objects::PDU1_HANDLER, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
|
||||||
|
@ -111,9 +111,9 @@ void ObjectFactory::produceGenericObjects() {
|
|||||||
tcpServer->setSpacePacketParsingOptions({common::PUS_PACKET_ID});
|
tcpServer->setSpacePacketParsingOptions({common::PUS_PACKET_ID});
|
||||||
sif::info << "Created TCP server for TMTC commanding with listener port "
|
sif::info << "Created TCP server for TMTC commanding with listener port "
|
||||||
<< tcpServer->getTcpPort() << std::endl;
|
<< tcpServer->getTcpPort() << std::endl;
|
||||||
#if TCP_SERVER_WIRETAPPING == 1
|
#if OBSW_TCP_SERVER_WIRETAPPING == 1
|
||||||
tcpServer->enableWiretapping(true);
|
tcpServer->enableWiretapping(true);
|
||||||
#endif /* TCP_SERVER_WIRETAPPING == 1 */
|
#endif /* OBSW_TCP_SERVER_WIRETAPPING == 1 */
|
||||||
#endif /* OBSW_USE_TMTC_TCP_BRIDGE == 0 */
|
#endif /* OBSW_USE_TMTC_TCP_BRIDGE == 0 */
|
||||||
tmtcBridge->setMaxNumberOfPacketsStored(70);
|
tmtcBridge->setMaxNumberOfPacketsStored(70);
|
||||||
#endif /* OBSW_ADD_TCPIP_BRIDGE == 1 */
|
#endif /* OBSW_ADD_TCPIP_BRIDGE == 1 */
|
||||||
|
@ -2,8 +2,9 @@
|
|||||||
|
|
||||||
#include "OBSWConfig.h"
|
#include "OBSWConfig.h"
|
||||||
|
|
||||||
ACUHandler::ACUHandler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie)
|
ACUHandler::ACUHandler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie,
|
||||||
: GomspaceDeviceHandler(objectId, comIF, comCookie, ACU::MAX_CONFIGTABLE_ADDRESS,
|
FailureIsolationBase *customFdir)
|
||||||
|
: GomspaceDeviceHandler(objectId, comIF, comCookie, customFdir, ACU::MAX_CONFIGTABLE_ADDRESS,
|
||||||
ACU::MAX_HKTABLE_ADDRESS, ACU::HK_TABLE_REPLY_SIZE),
|
ACU::MAX_HKTABLE_ADDRESS, ACU::HK_TABLE_REPLY_SIZE),
|
||||||
acuHkTableDataset(this) {}
|
acuHkTableDataset(this) {}
|
||||||
|
|
||||||
@ -23,7 +24,8 @@ void ACUHandler::letChildHandleHkReply(DeviceCommandId_t id, const uint8_t *pack
|
|||||||
parseHkTableReply(packet);
|
parseHkTableReply(packet);
|
||||||
handleDeviceTM(&acuHkTableDataset, id, true);
|
handleDeviceTM(&acuHkTableDataset, id, true);
|
||||||
|
|
||||||
#if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_ACU == 1
|
if (debugMode) {
|
||||||
|
#if OBSW_VERBOSE_LEVEL >= 1
|
||||||
acuHkTableDataset.read();
|
acuHkTableDataset.read();
|
||||||
float temperatureC_1 = acuHkTableDataset.temperature1.value * 0.1;
|
float temperatureC_1 = acuHkTableDataset.temperature1.value * 0.1;
|
||||||
float temperatureC_2 = acuHkTableDataset.temperature2.value * 0.1;
|
float temperatureC_2 = acuHkTableDataset.temperature2.value * 0.1;
|
||||||
@ -38,6 +40,7 @@ void ACUHandler::letChildHandleHkReply(DeviceCommandId_t id, const uint8_t *pack
|
|||||||
acuHkTableDataset.commit();
|
acuHkTableDataset.commit();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
LocalPoolDataSetBase *ACUHandler::getDataSetHandle(sid_t sid) {
|
LocalPoolDataSetBase *ACUHandler::getDataSetHandle(sid_t sid) {
|
||||||
if (sid == acuHkTableDataset.getSid()) {
|
if (sid == acuHkTableDataset.getSid()) {
|
||||||
@ -317,3 +320,5 @@ void ACUHandler::printChannelStats() {
|
|||||||
<< static_cast<unsigned int>(acuHkTableDataset.currentInChannel5.value) << std::setw(15)
|
<< static_cast<unsigned int>(acuHkTableDataset.currentInChannel5.value) << std::setw(15)
|
||||||
<< std::right << acuHkTableDataset.voltageInChannel5.value << std::endl;
|
<< std::right << acuHkTableDataset.voltageInChannel5.value << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ACUHandler::setDebugMode(bool enable) { this->debugMode = enable; }
|
||||||
|
@ -12,9 +12,12 @@
|
|||||||
*/
|
*/
|
||||||
class ACUHandler : public GomspaceDeviceHandler {
|
class ACUHandler : public GomspaceDeviceHandler {
|
||||||
public:
|
public:
|
||||||
ACUHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie);
|
ACUHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie,
|
||||||
|
FailureIsolationBase* customFdir);
|
||||||
virtual ~ACUHandler();
|
virtual ~ACUHandler();
|
||||||
|
|
||||||
|
void setDebugMode(bool enable);
|
||||||
|
|
||||||
virtual ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
|
virtual ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
|
||||||
LocalDataPoolManager& poolManager) override;
|
LocalDataPoolManager& poolManager) override;
|
||||||
|
|
||||||
@ -37,6 +40,7 @@ class ACUHandler : public GomspaceDeviceHandler {
|
|||||||
static const DeviceCommandId_t PRINT_CHANNEL_STATS = 51;
|
static const DeviceCommandId_t PRINT_CHANNEL_STATS = 51;
|
||||||
|
|
||||||
ACU::HkTableDataset acuHkTableDataset;
|
ACU::HkTableDataset acuHkTableDataset;
|
||||||
|
bool debugMode = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Function extracts the hk table information from the received csp packet and stores
|
* @brief Function extracts the hk table information from the received csp packet and stores
|
||||||
|
@ -197,7 +197,7 @@ ReturnValue_t BpxBatteryHandler::interpretDeviceReply(DeviceCommandId_t id, cons
|
|||||||
if (result != HasReturnvaluesIF::RETURN_OK) {
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
#if OBSW_DEBUG_BPX_BATT == 1
|
if (debugMode) {
|
||||||
sif::info << "BPX Battery HK output:" << std::endl;
|
sif::info << "BPX Battery HK output:" << std::endl;
|
||||||
sif::info << "Charge current [mA]: " << hkSet.chargeCurrent << std::endl;
|
sif::info << "Charge current [mA]: " << hkSet.chargeCurrent << std::endl;
|
||||||
sif::info << "Discharge current [mA]: " << hkSet.dischargeCurrent << std::endl;
|
sif::info << "Discharge current [mA]: " << hkSet.dischargeCurrent << std::endl;
|
||||||
@ -209,7 +209,7 @@ ReturnValue_t BpxBatteryHandler::interpretDeviceReply(DeviceCommandId_t id, cons
|
|||||||
sif::info << "Battery Temperature 4 [C]: " << hkSet.battTemp4 << std::endl;
|
sif::info << "Battery Temperature 4 [C]: " << hkSet.battTemp4 << std::endl;
|
||||||
sif::info << "Battery Reboot Counter: " << hkSet.rebootCounter << std::endl;
|
sif::info << "Battery Reboot Counter: " << hkSet.rebootCounter << std::endl;
|
||||||
sif::info << "Battery Boot Cause: " << static_cast<int>(hkSet.bootcause.value) << std::endl;
|
sif::info << "Battery Boot Cause: " << static_cast<int>(hkSet.bootcause.value) << std::endl;
|
||||||
#endif
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case (BpxBattery::PING): {
|
case (BpxBattery::PING): {
|
||||||
@ -277,3 +277,5 @@ ReturnValue_t BpxBatteryHandler::initializeLocalDataPool(localpool::DataPool& lo
|
|||||||
void BpxBatteryHandler::setToGoToNormalMode(bool enable) {
|
void BpxBatteryHandler::setToGoToNormalMode(bool enable) {
|
||||||
this->goToNormalModeImmediately = enable;
|
this->goToNormalModeImmediately = enable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BpxBatteryHandler::setDebugMode(bool enable) { this->debugMode = enable; }
|
||||||
|
@ -11,6 +11,7 @@ class BpxBatteryHandler : public DeviceHandlerBase {
|
|||||||
virtual ~BpxBatteryHandler();
|
virtual ~BpxBatteryHandler();
|
||||||
|
|
||||||
void setToGoToNormalMode(bool enable);
|
void setToGoToNormalMode(bool enable);
|
||||||
|
void setDebugMode(bool enable);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
enum class States {
|
enum class States {
|
||||||
@ -20,6 +21,7 @@ class BpxBatteryHandler : public DeviceHandlerBase {
|
|||||||
|
|
||||||
States state = States::CHECK_COM;
|
States state = States::CHECK_COM;
|
||||||
bool commandExecuted = false;
|
bool commandExecuted = false;
|
||||||
|
bool debugMode = false;
|
||||||
bool goToNormalModeImmediately = false;
|
bool goToNormalModeImmediately = false;
|
||||||
uint8_t sentPingByte = BpxBattery::DEFAULT_PING_SENT_BYTE;
|
uint8_t sentPingByte = BpxBattery::DEFAULT_PING_SENT_BYTE;
|
||||||
BpxBatteryHk hkSet;
|
BpxBatteryHk hkSet;
|
||||||
|
@ -7,9 +7,10 @@
|
|||||||
#include "devicedefinitions/powerDefinitions.h"
|
#include "devicedefinitions/powerDefinitions.h"
|
||||||
|
|
||||||
GomspaceDeviceHandler::GomspaceDeviceHandler(object_id_t objectId, object_id_t comIF,
|
GomspaceDeviceHandler::GomspaceDeviceHandler(object_id_t objectId, object_id_t comIF,
|
||||||
CookieIF* comCookie, uint16_t maxConfigTableAddress,
|
CookieIF* comCookie, FailureIsolationBase* customFdir,
|
||||||
|
uint16_t maxConfigTableAddress,
|
||||||
uint16_t maxHkTableAddress, uint16_t hkTableReplySize)
|
uint16_t maxHkTableAddress, uint16_t hkTableReplySize)
|
||||||
: DeviceHandlerBase(objectId, comIF, comCookie),
|
: DeviceHandlerBase(objectId, comIF, comCookie, customFdir),
|
||||||
maxConfigTableAddress(maxConfigTableAddress),
|
maxConfigTableAddress(maxConfigTableAddress),
|
||||||
maxHkTableAddress(maxHkTableAddress),
|
maxHkTableAddress(maxHkTableAddress),
|
||||||
hkTableReplySize(hkTableReplySize) {
|
hkTableReplySize(hkTableReplySize) {
|
||||||
|
@ -38,8 +38,8 @@ class GomspaceDeviceHandler : public DeviceHandlerBase {
|
|||||||
* device.
|
* device.
|
||||||
*/
|
*/
|
||||||
GomspaceDeviceHandler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie,
|
GomspaceDeviceHandler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie,
|
||||||
uint16_t maxConfigTableAddress, uint16_t maxHkTableAddress,
|
FailureIsolationBase *customFdir, uint16_t maxConfigTableAddress,
|
||||||
uint16_t hkTableReplySize);
|
uint16_t maxHkTableAddress, uint16_t hkTableReplySize);
|
||||||
virtual ~GomspaceDeviceHandler();
|
virtual ~GomspaceDeviceHandler();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -687,7 +687,8 @@ void IMTQHandler::fillEngHkDataset(const uint8_t* packet) {
|
|||||||
offset += 2;
|
offset += 2;
|
||||||
engHkDataset.mcuTemperature = (*(packet + offset + 1) << 8 | *(packet + offset));
|
engHkDataset.mcuTemperature = (*(packet + offset + 1) << 8 | *(packet + offset));
|
||||||
|
|
||||||
#if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_IMTQ == 1
|
if (debugMode) {
|
||||||
|
#if OBSW_VERBOSE_LEVEL >= 1
|
||||||
sif::info << "IMTQ digital voltage: " << engHkDataset.digitalVoltageMv << " mV" << std::endl;
|
sif::info << "IMTQ digital voltage: " << engHkDataset.digitalVoltageMv << " mV" << std::endl;
|
||||||
sif::info << "IMTQ analog voltage: " << engHkDataset.analogVoltageMv << " mV" << std::endl;
|
sif::info << "IMTQ analog voltage: " << engHkDataset.analogVoltageMv << " mV" << std::endl;
|
||||||
sif::info << "IMTQ digital current: " << engHkDataset.digitalCurrentmA << " mA" << std::endl;
|
sif::info << "IMTQ digital current: " << engHkDataset.digitalCurrentmA << " mA" << std::endl;
|
||||||
@ -701,6 +702,7 @@ void IMTQHandler::fillEngHkDataset(const uint8_t* packet) {
|
|||||||
sif::info << "IMTQ coil MCU temperature: " << engHkDataset.mcuTemperature << " °C" << std::endl;
|
sif::info << "IMTQ coil MCU temperature: " << engHkDataset.mcuTemperature << " °C" << std::endl;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void IMTQHandler::setToGoToNormal(bool enable) { this->goToNormalMode = enable; }
|
void IMTQHandler::setToGoToNormal(bool enable) { this->goToNormalMode = enable; }
|
||||||
|
|
||||||
@ -755,7 +757,8 @@ void IMTQHandler::fillCalibratedMtmDataset(const uint8_t* packet) {
|
|||||||
calMtmMeasurementSet.coilActuationStatus = (*(packet + offset + 3) << 24) |
|
calMtmMeasurementSet.coilActuationStatus = (*(packet + offset + 3) << 24) |
|
||||||
(*(packet + offset + 2) << 16) |
|
(*(packet + offset + 2) << 16) |
|
||||||
(*(packet + offset + 1) << 8) | (*(packet + offset));
|
(*(packet + offset + 1) << 8) | (*(packet + offset));
|
||||||
#if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_IMTQ == 1
|
if (debugMode) {
|
||||||
|
#if OBSW_VERBOSE_LEVEL >= 1
|
||||||
sif::info << "IMTQ calibrated MTM measurement X: " << calMtmMeasurementSet.mtmXnT << " nT"
|
sif::info << "IMTQ calibrated MTM measurement X: " << calMtmMeasurementSet.mtmXnT << " nT"
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
sif::info << "IMTQ calibrated MTM measurement Y: " << calMtmMeasurementSet.mtmYnT << " nT"
|
sif::info << "IMTQ calibrated MTM measurement Y: " << calMtmMeasurementSet.mtmYnT << " nT"
|
||||||
@ -766,6 +769,7 @@ void IMTQHandler::fillCalibratedMtmDataset(const uint8_t* packet) {
|
|||||||
<< (unsigned int)calMtmMeasurementSet.coilActuationStatus.value << std::endl;
|
<< (unsigned int)calMtmMeasurementSet.coilActuationStatus.value << std::endl;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void IMTQHandler::fillRawMtmDataset(const uint8_t* packet) {
|
void IMTQHandler::fillRawMtmDataset(const uint8_t* packet) {
|
||||||
PoolReadGuard rg(&rawMtmMeasurementSet);
|
PoolReadGuard rg(&rawMtmMeasurementSet);
|
||||||
@ -785,14 +789,19 @@ void IMTQHandler::fillRawMtmDataset(const uint8_t* packet) {
|
|||||||
rawMtmMeasurementSet.coilActuationStatus = (*(packet + offset + 3) << 24) |
|
rawMtmMeasurementSet.coilActuationStatus = (*(packet + offset + 3) << 24) |
|
||||||
(*(packet + offset + 2) << 16) |
|
(*(packet + offset + 2) << 16) |
|
||||||
(*(packet + offset + 1) << 8) | (*(packet + offset));
|
(*(packet + offset + 1) << 8) | (*(packet + offset));
|
||||||
#if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_IMTQ == 1
|
if (debugMode) {
|
||||||
sif::info << "IMTQ raw MTM measurement X: " << rawMtmMeasurementSet.mtmXnT << " nT" << std::endl;
|
#if OBSW_VERBOSE_LEVEL >= 1
|
||||||
sif::info << "IMTQ raw MTM measurement Y: " << rawMtmMeasurementSet.mtmYnT << " nT" << std::endl;
|
sif::info << "IMTQ raw MTM measurement X: " << rawMtmMeasurementSet.mtmXnT << " nT"
|
||||||
sif::info << "IMTQ raw MTM measurement Z: " << rawMtmMeasurementSet.mtmZnT << " nT" << std::endl;
|
<< std::endl;
|
||||||
|
sif::info << "IMTQ raw MTM measurement Y: " << rawMtmMeasurementSet.mtmYnT << " nT"
|
||||||
|
<< std::endl;
|
||||||
|
sif::info << "IMTQ raw MTM measurement Z: " << rawMtmMeasurementSet.mtmZnT << " nT"
|
||||||
|
<< std::endl;
|
||||||
sif::info << "IMTQ coil actuation status during MTM measurement: "
|
sif::info << "IMTQ coil actuation status during MTM measurement: "
|
||||||
<< (unsigned int)rawMtmMeasurementSet.coilActuationStatus.value << std::endl;
|
<< (unsigned int)rawMtmMeasurementSet.coilActuationStatus.value << std::endl;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void IMTQHandler::handleSelfTestReply(const uint8_t* packet) {
|
void IMTQHandler::handleSelfTestReply(const uint8_t* packet) {
|
||||||
uint16_t offset = 2;
|
uint16_t offset = 2;
|
||||||
@ -954,7 +963,8 @@ void IMTQHandler::handlePositiveXSelfTestReply(const uint8_t* packet) {
|
|||||||
posXselfTestDataset.finaCoilZTemperature = *(packet + offset + 1) << 8 | *(packet + offset);
|
posXselfTestDataset.finaCoilZTemperature = *(packet + offset + 1) << 8 | *(packet + offset);
|
||||||
offset += 4;
|
offset += 4;
|
||||||
|
|
||||||
#if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_IMTQ == 1
|
if (debugMode) {
|
||||||
|
#if OBSW_VERBOSE_LEVEL >= 1
|
||||||
sif::info << "IMTQ self test (INIT) err: "
|
sif::info << "IMTQ self test (INIT) err: "
|
||||||
<< static_cast<unsigned int>(posXselfTestDataset.initErr.value) << std::endl;
|
<< static_cast<unsigned int>(posXselfTestDataset.initErr.value) << std::endl;
|
||||||
sif::info << "IMTQ self test (INIT) raw magnetic field X: " << posXselfTestDataset.initRawMagX
|
sif::info << "IMTQ self test (INIT) raw magnetic field X: " << posXselfTestDataset.initRawMagX
|
||||||
@ -984,12 +994,12 @@ void IMTQHandler::handlePositiveXSelfTestReply(const uint8_t* packet) {
|
|||||||
|
|
||||||
sif::info << "IMTQ self test (+X) err: "
|
sif::info << "IMTQ self test (+X) err: "
|
||||||
<< static_cast<unsigned int>(posXselfTestDataset.err.value) << std::endl;
|
<< static_cast<unsigned int>(posXselfTestDataset.err.value) << std::endl;
|
||||||
sif::info << "IMTQ self test (+X) raw magnetic field X: " << posXselfTestDataset.rawMagX << " nT"
|
sif::info << "IMTQ self test (+X) raw magnetic field X: " << posXselfTestDataset.rawMagX
|
||||||
<< std::endl;
|
<< " nT" << std::endl;
|
||||||
sif::info << "IMTQ self test (+X) raw magnetic field Y: " << posXselfTestDataset.rawMagY << " nT"
|
sif::info << "IMTQ self test (+X) raw magnetic field Y: " << posXselfTestDataset.rawMagY
|
||||||
<< std::endl;
|
<< " nT" << std::endl;
|
||||||
sif::info << "IMTQ self test (+X) raw magnetic field Z: " << posXselfTestDataset.rawMagZ << " nT"
|
sif::info << "IMTQ self test (+X) raw magnetic field Z: " << posXselfTestDataset.rawMagZ
|
||||||
<< std::endl;
|
<< " nT" << std::endl;
|
||||||
sif::info << "IMTQ self test (+X) calibrated magnetic field X: " << posXselfTestDataset.calMagX
|
sif::info << "IMTQ self test (+X) calibrated magnetic field X: " << posXselfTestDataset.calMagX
|
||||||
<< " nT" << std::endl;
|
<< " nT" << std::endl;
|
||||||
sif::info << "IMTQ self test (+X) calibrated magnetic field Y: " << posXselfTestDataset.calMagY
|
sif::info << "IMTQ self test (+X) calibrated magnetic field Y: " << posXselfTestDataset.calMagY
|
||||||
@ -1037,6 +1047,7 @@ void IMTQHandler::handlePositiveXSelfTestReply(const uint8_t* packet) {
|
|||||||
<< posXselfTestDataset.finaCoilZTemperature << " °C" << std::endl;
|
<< posXselfTestDataset.finaCoilZTemperature << " °C" << std::endl;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void IMTQHandler::handleNegativeXSelfTestReply(const uint8_t* packet) {
|
void IMTQHandler::handleNegativeXSelfTestReply(const uint8_t* packet) {
|
||||||
PoolReadGuard rg(&posXselfTestDataset);
|
PoolReadGuard rg(&posXselfTestDataset);
|
||||||
@ -1164,7 +1175,8 @@ void IMTQHandler::handleNegativeXSelfTestReply(const uint8_t* packet) {
|
|||||||
negXselfTestDataset.finaCoilZTemperature = *(packet + offset + 1) << 8 | *(packet + offset);
|
negXselfTestDataset.finaCoilZTemperature = *(packet + offset + 1) << 8 | *(packet + offset);
|
||||||
offset += 4;
|
offset += 4;
|
||||||
|
|
||||||
#if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_IMTQ == 1
|
if (debugMode) {
|
||||||
|
#if OBSW_VERBOSE_LEVEL >= 1
|
||||||
sif::info << "IMTQ self test (INIT) err: "
|
sif::info << "IMTQ self test (INIT) err: "
|
||||||
<< static_cast<unsigned int>(negXselfTestDataset.initErr.value) << std::endl;
|
<< static_cast<unsigned int>(negXselfTestDataset.initErr.value) << std::endl;
|
||||||
sif::info << "IMTQ self test (INIT) raw magnetic field X: " << negXselfTestDataset.initRawMagX
|
sif::info << "IMTQ self test (INIT) raw magnetic field X: " << negXselfTestDataset.initRawMagX
|
||||||
@ -1194,12 +1206,12 @@ void IMTQHandler::handleNegativeXSelfTestReply(const uint8_t* packet) {
|
|||||||
|
|
||||||
sif::info << "IMTQ self test (-X) err: "
|
sif::info << "IMTQ self test (-X) err: "
|
||||||
<< static_cast<unsigned int>(negXselfTestDataset.err.value) << std::endl;
|
<< static_cast<unsigned int>(negXselfTestDataset.err.value) << std::endl;
|
||||||
sif::info << "IMTQ self test (-X) raw magnetic field X: " << negXselfTestDataset.rawMagX << " nT"
|
sif::info << "IMTQ self test (-X) raw magnetic field X: " << negXselfTestDataset.rawMagX
|
||||||
<< std::endl;
|
<< " nT" << std::endl;
|
||||||
sif::info << "IMTQ self test (-X) raw magnetic field Y: " << negXselfTestDataset.rawMagY << " nT"
|
sif::info << "IMTQ self test (-X) raw magnetic field Y: " << negXselfTestDataset.rawMagY
|
||||||
<< std::endl;
|
<< " nT" << std::endl;
|
||||||
sif::info << "IMTQ self test (-X) raw magnetic field Z: " << negXselfTestDataset.rawMagZ << " nT"
|
sif::info << "IMTQ self test (-X) raw magnetic field Z: " << negXselfTestDataset.rawMagZ
|
||||||
<< std::endl;
|
<< " nT" << std::endl;
|
||||||
sif::info << "IMTQ self test (-X) calibrated magnetic field X: " << negXselfTestDataset.calMagX
|
sif::info << "IMTQ self test (-X) calibrated magnetic field X: " << negXselfTestDataset.calMagX
|
||||||
<< " nT" << std::endl;
|
<< " nT" << std::endl;
|
||||||
sif::info << "IMTQ self test (-X) calibrated magnetic field Y: " << negXselfTestDataset.calMagY
|
sif::info << "IMTQ self test (-X) calibrated magnetic field Y: " << negXselfTestDataset.calMagY
|
||||||
@ -1247,6 +1259,7 @@ void IMTQHandler::handleNegativeXSelfTestReply(const uint8_t* packet) {
|
|||||||
<< negXselfTestDataset.finaCoilZTemperature << " °C" << std::endl;
|
<< negXselfTestDataset.finaCoilZTemperature << " °C" << std::endl;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void IMTQHandler::handlePositiveYSelfTestReply(const uint8_t* packet) {
|
void IMTQHandler::handlePositiveYSelfTestReply(const uint8_t* packet) {
|
||||||
PoolReadGuard rg(&posXselfTestDataset);
|
PoolReadGuard rg(&posXselfTestDataset);
|
||||||
@ -1374,7 +1387,8 @@ void IMTQHandler::handlePositiveYSelfTestReply(const uint8_t* packet) {
|
|||||||
posYselfTestDataset.finaCoilZTemperature = *(packet + offset + 1) << 8 | *(packet + offset);
|
posYselfTestDataset.finaCoilZTemperature = *(packet + offset + 1) << 8 | *(packet + offset);
|
||||||
offset += 4;
|
offset += 4;
|
||||||
|
|
||||||
#if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_IMTQ == 1
|
if (debugMode) {
|
||||||
|
#if OBSW_VERBOSE_LEVEL >= 1
|
||||||
sif::info << "IMTQ self test (INIT) err: "
|
sif::info << "IMTQ self test (INIT) err: "
|
||||||
<< static_cast<unsigned int>(posYselfTestDataset.initErr.value) << std::endl;
|
<< static_cast<unsigned int>(posYselfTestDataset.initErr.value) << std::endl;
|
||||||
sif::info << "IMTQ self test (INIT) raw magnetic field X: " << posYselfTestDataset.initRawMagX
|
sif::info << "IMTQ self test (INIT) raw magnetic field X: " << posYselfTestDataset.initRawMagX
|
||||||
@ -1404,12 +1418,12 @@ void IMTQHandler::handlePositiveYSelfTestReply(const uint8_t* packet) {
|
|||||||
|
|
||||||
sif::info << "IMTQ self test (+Y) err: "
|
sif::info << "IMTQ self test (+Y) err: "
|
||||||
<< static_cast<unsigned int>(posYselfTestDataset.err.value) << std::endl;
|
<< static_cast<unsigned int>(posYselfTestDataset.err.value) << std::endl;
|
||||||
sif::info << "IMTQ self test (+Y) raw magnetic field X: " << posYselfTestDataset.rawMagX << " nT"
|
sif::info << "IMTQ self test (+Y) raw magnetic field X: " << posYselfTestDataset.rawMagX
|
||||||
<< std::endl;
|
<< " nT" << std::endl;
|
||||||
sif::info << "IMTQ self test (+Y) raw magnetic field Y: " << posYselfTestDataset.rawMagY << " nT"
|
sif::info << "IMTQ self test (+Y) raw magnetic field Y: " << posYselfTestDataset.rawMagY
|
||||||
<< std::endl;
|
<< " nT" << std::endl;
|
||||||
sif::info << "IMTQ self test (+Y) raw magnetic field Z: " << posYselfTestDataset.rawMagZ << " nT"
|
sif::info << "IMTQ self test (+Y) raw magnetic field Z: " << posYselfTestDataset.rawMagZ
|
||||||
<< std::endl;
|
<< " nT" << std::endl;
|
||||||
sif::info << "IMTQ self test (+Y) calibrated magnetic field X: " << posYselfTestDataset.calMagX
|
sif::info << "IMTQ self test (+Y) calibrated magnetic field X: " << posYselfTestDataset.calMagX
|
||||||
<< " nT" << std::endl;
|
<< " nT" << std::endl;
|
||||||
sif::info << "IMTQ self test (+Y) calibrated magnetic field Y: " << posYselfTestDataset.calMagY
|
sif::info << "IMTQ self test (+Y) calibrated magnetic field Y: " << posYselfTestDataset.calMagY
|
||||||
@ -1457,6 +1471,7 @@ void IMTQHandler::handlePositiveYSelfTestReply(const uint8_t* packet) {
|
|||||||
<< posYselfTestDataset.finaCoilZTemperature << " °C" << std::endl;
|
<< posYselfTestDataset.finaCoilZTemperature << " °C" << std::endl;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void IMTQHandler::handleNegativeYSelfTestReply(const uint8_t* packet) {
|
void IMTQHandler::handleNegativeYSelfTestReply(const uint8_t* packet) {
|
||||||
PoolReadGuard rg(&posXselfTestDataset);
|
PoolReadGuard rg(&posXselfTestDataset);
|
||||||
@ -1584,7 +1599,8 @@ void IMTQHandler::handleNegativeYSelfTestReply(const uint8_t* packet) {
|
|||||||
negYselfTestDataset.finaCoilZTemperature = *(packet + offset + 1) << 8 | *(packet + offset);
|
negYselfTestDataset.finaCoilZTemperature = *(packet + offset + 1) << 8 | *(packet + offset);
|
||||||
offset += 4;
|
offset += 4;
|
||||||
|
|
||||||
#if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_IMTQ == 1
|
if (debugMode) {
|
||||||
|
#if OBSW_VERBOSE_LEVEL >= 1
|
||||||
sif::info << "IMTQ self test (INIT) err: "
|
sif::info << "IMTQ self test (INIT) err: "
|
||||||
<< static_cast<unsigned int>(negYselfTestDataset.initErr.value) << std::endl;
|
<< static_cast<unsigned int>(negYselfTestDataset.initErr.value) << std::endl;
|
||||||
sif::info << "IMTQ self test (INIT) raw magnetic field X: " << negYselfTestDataset.initRawMagX
|
sif::info << "IMTQ self test (INIT) raw magnetic field X: " << negYselfTestDataset.initRawMagX
|
||||||
@ -1614,12 +1630,12 @@ void IMTQHandler::handleNegativeYSelfTestReply(const uint8_t* packet) {
|
|||||||
|
|
||||||
sif::info << "IMTQ self test (-Y) err: "
|
sif::info << "IMTQ self test (-Y) err: "
|
||||||
<< static_cast<unsigned int>(negYselfTestDataset.err.value) << std::endl;
|
<< static_cast<unsigned int>(negYselfTestDataset.err.value) << std::endl;
|
||||||
sif::info << "IMTQ self test (-Y) raw magnetic field X: " << negYselfTestDataset.rawMagX << " nT"
|
sif::info << "IMTQ self test (-Y) raw magnetic field X: " << negYselfTestDataset.rawMagX
|
||||||
<< std::endl;
|
<< " nT" << std::endl;
|
||||||
sif::info << "IMTQ self test (-Y) raw magnetic field Y: " << negYselfTestDataset.rawMagY << " nT"
|
sif::info << "IMTQ self test (-Y) raw magnetic field Y: " << negYselfTestDataset.rawMagY
|
||||||
<< std::endl;
|
<< " nT" << std::endl;
|
||||||
sif::info << "IMTQ self test (-Y) raw magnetic field Z: " << negYselfTestDataset.rawMagZ << " nT"
|
sif::info << "IMTQ self test (-Y) raw magnetic field Z: " << negYselfTestDataset.rawMagZ
|
||||||
<< std::endl;
|
<< " nT" << std::endl;
|
||||||
sif::info << "IMTQ self test (-Y) calibrated magnetic field X: " << negYselfTestDataset.calMagX
|
sif::info << "IMTQ self test (-Y) calibrated magnetic field X: " << negYselfTestDataset.calMagX
|
||||||
<< " nT" << std::endl;
|
<< " nT" << std::endl;
|
||||||
sif::info << "IMTQ self test (-Y) calibrated magnetic field Y: " << negYselfTestDataset.calMagY
|
sif::info << "IMTQ self test (-Y) calibrated magnetic field Y: " << negYselfTestDataset.calMagY
|
||||||
@ -1667,6 +1683,7 @@ void IMTQHandler::handleNegativeYSelfTestReply(const uint8_t* packet) {
|
|||||||
<< negYselfTestDataset.finaCoilZTemperature << " °C" << std::endl;
|
<< negYselfTestDataset.finaCoilZTemperature << " °C" << std::endl;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void IMTQHandler::handlePositiveZSelfTestReply(const uint8_t* packet) {
|
void IMTQHandler::handlePositiveZSelfTestReply(const uint8_t* packet) {
|
||||||
PoolReadGuard rg(&posXselfTestDataset);
|
PoolReadGuard rg(&posXselfTestDataset);
|
||||||
@ -1794,7 +1811,8 @@ void IMTQHandler::handlePositiveZSelfTestReply(const uint8_t* packet) {
|
|||||||
posZselfTestDataset.finaCoilZTemperature = *(packet + offset + 1) << 8 | *(packet + offset);
|
posZselfTestDataset.finaCoilZTemperature = *(packet + offset + 1) << 8 | *(packet + offset);
|
||||||
offset += 4;
|
offset += 4;
|
||||||
|
|
||||||
#if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_IMTQ == 1
|
if (debugMode) {
|
||||||
|
#if OBSW_VERBOSE_LEVEL >= 1
|
||||||
sif::info << "IMTQ self test (INIT) err: "
|
sif::info << "IMTQ self test (INIT) err: "
|
||||||
<< static_cast<unsigned int>(posZselfTestDataset.initErr.value) << std::endl;
|
<< static_cast<unsigned int>(posZselfTestDataset.initErr.value) << std::endl;
|
||||||
sif::info << "IMTQ self test (INIT) raw magnetic field X: " << posZselfTestDataset.initRawMagX
|
sif::info << "IMTQ self test (INIT) raw magnetic field X: " << posZselfTestDataset.initRawMagX
|
||||||
@ -1824,12 +1842,12 @@ void IMTQHandler::handlePositiveZSelfTestReply(const uint8_t* packet) {
|
|||||||
|
|
||||||
sif::info << "IMTQ self test (+Z) err: "
|
sif::info << "IMTQ self test (+Z) err: "
|
||||||
<< static_cast<unsigned int>(posZselfTestDataset.err.value) << std::endl;
|
<< static_cast<unsigned int>(posZselfTestDataset.err.value) << std::endl;
|
||||||
sif::info << "IMTQ self test (+Z) raw magnetic field X: " << posZselfTestDataset.rawMagX << " nT"
|
sif::info << "IMTQ self test (+Z) raw magnetic field X: " << posZselfTestDataset.rawMagX
|
||||||
<< std::endl;
|
<< " nT" << std::endl;
|
||||||
sif::info << "IMTQ self test (+Z) raw magnetic field Y: " << posZselfTestDataset.rawMagY << " nT"
|
sif::info << "IMTQ self test (+Z) raw magnetic field Y: " << posZselfTestDataset.rawMagY
|
||||||
<< std::endl;
|
<< " nT" << std::endl;
|
||||||
sif::info << "IMTQ self test (+Z) raw magnetic field Z: " << posZselfTestDataset.rawMagZ << " nT"
|
sif::info << "IMTQ self test (+Z) raw magnetic field Z: " << posZselfTestDataset.rawMagZ
|
||||||
<< std::endl;
|
<< " nT" << std::endl;
|
||||||
sif::info << "IMTQ self test (+Z) calibrated magnetic field X: " << posZselfTestDataset.calMagX
|
sif::info << "IMTQ self test (+Z) calibrated magnetic field X: " << posZselfTestDataset.calMagX
|
||||||
<< " nT" << std::endl;
|
<< " nT" << std::endl;
|
||||||
sif::info << "IMTQ self test (+Z) calibrated magnetic field Y: " << posZselfTestDataset.calMagY
|
sif::info << "IMTQ self test (+Z) calibrated magnetic field Y: " << posZselfTestDataset.calMagY
|
||||||
@ -1877,6 +1895,7 @@ void IMTQHandler::handlePositiveZSelfTestReply(const uint8_t* packet) {
|
|||||||
<< posZselfTestDataset.finaCoilZTemperature << " °C" << std::endl;
|
<< posZselfTestDataset.finaCoilZTemperature << " °C" << std::endl;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void IMTQHandler::handleNegativeZSelfTestReply(const uint8_t* packet) {
|
void IMTQHandler::handleNegativeZSelfTestReply(const uint8_t* packet) {
|
||||||
PoolReadGuard rg(&posXselfTestDataset);
|
PoolReadGuard rg(&posXselfTestDataset);
|
||||||
@ -2004,7 +2023,8 @@ void IMTQHandler::handleNegativeZSelfTestReply(const uint8_t* packet) {
|
|||||||
negZselfTestDataset.finaCoilZTemperature = *(packet + offset + 1) << 8 | *(packet + offset);
|
negZselfTestDataset.finaCoilZTemperature = *(packet + offset + 1) << 8 | *(packet + offset);
|
||||||
offset += 4;
|
offset += 4;
|
||||||
|
|
||||||
#if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_IMTQ == 1
|
if (debugMode) {
|
||||||
|
#if OBSW_VERBOSE_LEVEL >= 1
|
||||||
sif::info << "IMTQ self test (INIT) err: "
|
sif::info << "IMTQ self test (INIT) err: "
|
||||||
<< static_cast<unsigned int>(negZselfTestDataset.initErr.value) << std::endl;
|
<< static_cast<unsigned int>(negZselfTestDataset.initErr.value) << std::endl;
|
||||||
sif::info << "IMTQ self test (INIT) raw magnetic field X: " << negZselfTestDataset.initRawMagX
|
sif::info << "IMTQ self test (INIT) raw magnetic field X: " << negZselfTestDataset.initRawMagX
|
||||||
@ -2034,12 +2054,12 @@ void IMTQHandler::handleNegativeZSelfTestReply(const uint8_t* packet) {
|
|||||||
|
|
||||||
sif::info << "IMTQ self test (-Z) err: "
|
sif::info << "IMTQ self test (-Z) err: "
|
||||||
<< static_cast<unsigned int>(negZselfTestDataset.err.value) << std::endl;
|
<< static_cast<unsigned int>(negZselfTestDataset.err.value) << std::endl;
|
||||||
sif::info << "IMTQ self test (-Z) raw magnetic field X: " << negZselfTestDataset.rawMagX << " nT"
|
sif::info << "IMTQ self test (-Z) raw magnetic field X: " << negZselfTestDataset.rawMagX
|
||||||
<< std::endl;
|
<< " nT" << std::endl;
|
||||||
sif::info << "IMTQ self test (-Z) raw magnetic field Y: " << negZselfTestDataset.rawMagY << " nT"
|
sif::info << "IMTQ self test (-Z) raw magnetic field Y: " << negZselfTestDataset.rawMagY
|
||||||
<< std::endl;
|
<< " nT" << std::endl;
|
||||||
sif::info << "IMTQ self test (-Z) raw magnetic field Z: " << negZselfTestDataset.rawMagZ << " nT"
|
sif::info << "IMTQ self test (-Z) raw magnetic field Z: " << negZselfTestDataset.rawMagZ
|
||||||
<< std::endl;
|
<< " nT" << std::endl;
|
||||||
sif::info << "IMTQ self test (-Z) calibrated magnetic field X: " << negZselfTestDataset.calMagX
|
sif::info << "IMTQ self test (-Z) calibrated magnetic field X: " << negZselfTestDataset.calMagX
|
||||||
<< " nT" << std::endl;
|
<< " nT" << std::endl;
|
||||||
sif::info << "IMTQ self test (-Z) calibrated magnetic field Y: " << negZselfTestDataset.calMagY
|
sif::info << "IMTQ self test (-Z) calibrated magnetic field Y: " << negZselfTestDataset.calMagY
|
||||||
@ -2087,6 +2107,9 @@ void IMTQHandler::handleNegativeZSelfTestReply(const uint8_t* packet) {
|
|||||||
<< negZselfTestDataset.finaCoilZTemperature << " °C" << std::endl;
|
<< negZselfTestDataset.finaCoilZTemperature << " °C" << std::endl;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void IMTQHandler::setDebugMode(bool enable) { this->debugMode = enable; }
|
||||||
|
|
||||||
void IMTQHandler::checkErrorByte(const uint8_t errorByte, const uint8_t step) {
|
void IMTQHandler::checkErrorByte(const uint8_t errorByte, const uint8_t step) {
|
||||||
std::string stepString("");
|
std::string stepString("");
|
||||||
|
@ -21,6 +21,8 @@ class IMTQHandler : public DeviceHandlerBase {
|
|||||||
*/
|
*/
|
||||||
void setToGoToNormal(bool enable);
|
void setToGoToNormal(bool enable);
|
||||||
|
|
||||||
|
void setDebugMode(bool enable);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void doStartUp() override;
|
void doStartUp() override;
|
||||||
void doShutDown() override;
|
void doShutDown() override;
|
||||||
@ -99,6 +101,7 @@ class IMTQHandler : public DeviceHandlerBase {
|
|||||||
|
|
||||||
uint8_t commandBuffer[IMTQ::MAX_COMMAND_SIZE];
|
uint8_t commandBuffer[IMTQ::MAX_COMMAND_SIZE];
|
||||||
bool goToNormalMode = false;
|
bool goToNormalMode = false;
|
||||||
|
bool debugMode = false;
|
||||||
|
|
||||||
enum class CommunicationStep {
|
enum class CommunicationStep {
|
||||||
GET_ENG_HK_DATA,
|
GET_ENG_HK_DATA,
|
||||||
|
@ -399,12 +399,12 @@ ReturnValue_t Max31865PT1000Handler::interpretDeviceReply(DeviceCommandId_t id,
|
|||||||
// calculate approximation
|
// calculate approximation
|
||||||
float approxTemp = adcCode / 32.0 - 256.0;
|
float approxTemp = adcCode / 32.0 - 256.0;
|
||||||
|
|
||||||
#if OBSW_DEBUG_RTD == 1
|
if (debugMode) {
|
||||||
#if OBSW_VERBOSE_LEVEL >= 1
|
#if OBSW_VERBOSE_LEVEL >= 1
|
||||||
if (debugDivider->checkAndIncrement()) {
|
if (debugDivider->checkAndIncrement()) {
|
||||||
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
||||||
sif::info << "Max31865: ObjID " << std::hex << this->getObjectId() << " | RTD " << std::dec
|
sif::info << "Max31865: ObjID " << std::hex << this->getObjectId() << " | RTD "
|
||||||
<< static_cast<int>(deviceIdx) << ": R[Ohm] " << rtdValue
|
<< std::dec << static_cast<int>(deviceIdx) << ": R[Ohm] " << rtdValue
|
||||||
<< " Ohms | Approx T[C]: " << approxTemp << std::endl;
|
<< " Ohms | Approx T[C]: " << approxTemp << std::endl;
|
||||||
#else
|
#else
|
||||||
sif::printInfo("Max31685: Measured resistance is %f Ohms\n", rtdValue);
|
sif::printInfo("Max31685: Measured resistance is %f Ohms\n", rtdValue);
|
||||||
@ -412,7 +412,8 @@ ReturnValue_t Max31865PT1000Handler::interpretDeviceReply(DeviceCommandId_t id,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
}
|
||||||
|
|
||||||
PoolReadGuard pg(&sensorDataset);
|
PoolReadGuard pg(&sensorDataset);
|
||||||
if (pg.getReadResult() != HasReturnvaluesIF::RETURN_OK) {
|
if (pg.getReadResult() != HasReturnvaluesIF::RETURN_OK) {
|
||||||
// Configuration error
|
// Configuration error
|
||||||
@ -530,3 +531,5 @@ void Max31865PT1000Handler::modeChanged() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Max31865PT1000Handler::setDeviceIdx(uint8_t idx) { deviceIdx = idx; }
|
void Max31865PT1000Handler::setDeviceIdx(uint8_t idx) { deviceIdx = idx; }
|
||||||
|
|
||||||
|
void Max31865PT1000Handler::setDebugMode(bool enable) { this->debugMode = enable; }
|
||||||
|
@ -33,6 +33,8 @@ class Max31865PT1000Handler : public DeviceHandlerBase {
|
|||||||
Max31865PT1000Handler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie);
|
Max31865PT1000Handler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie);
|
||||||
virtual ~Max31865PT1000Handler();
|
virtual ~Max31865PT1000Handler();
|
||||||
|
|
||||||
|
void setDebugMode(bool enable);
|
||||||
|
|
||||||
// Configuration in 8 digit code:
|
// Configuration in 8 digit code:
|
||||||
// 1. 1 for V_BIAS enabled, 0 for disabled
|
// 1. 1 for V_BIAS enabled, 0 for disabled
|
||||||
// 2. 1 for Auto-conversion, 0 for off
|
// 2. 1 for Auto-conversion, 0 for off
|
||||||
@ -85,6 +87,7 @@ class Max31865PT1000Handler : public DeviceHandlerBase {
|
|||||||
private:
|
private:
|
||||||
uint8_t switchId = 0;
|
uint8_t switchId = 0;
|
||||||
bool instantNormal = false;
|
bool instantNormal = false;
|
||||||
|
bool debugMode = false;
|
||||||
bool warningSwitch = true;
|
bool warningSwitch = true;
|
||||||
|
|
||||||
enum class InternalState {
|
enum class InternalState {
|
||||||
|
@ -4,9 +4,11 @@
|
|||||||
|
|
||||||
#include "OBSWConfig.h"
|
#include "OBSWConfig.h"
|
||||||
|
|
||||||
P60DockHandler::P60DockHandler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie)
|
P60DockHandler::P60DockHandler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie,
|
||||||
: GomspaceDeviceHandler(objectId, comIF, comCookie, P60Dock::MAX_CONFIGTABLE_ADDRESS,
|
FailureIsolationBase *customFdir)
|
||||||
P60Dock::MAX_HKTABLE_ADDRESS, P60Dock::HK_TABLE_REPLY_SIZE),
|
: GomspaceDeviceHandler(objectId, comIF, comCookie, customFdir,
|
||||||
|
P60Dock::MAX_CONFIGTABLE_ADDRESS, P60Dock::MAX_HKTABLE_ADDRESS,
|
||||||
|
P60Dock::HK_TABLE_REPLY_SIZE),
|
||||||
coreHk(this),
|
coreHk(this),
|
||||||
auxHk(this) {}
|
auxHk(this) {}
|
||||||
|
|
||||||
@ -24,50 +26,6 @@ void P60DockHandler::letChildHandleHkReply(DeviceCommandId_t id, const uint8_t *
|
|||||||
* P60DockHandler itself.
|
* P60DockHandler itself.
|
||||||
*/
|
*/
|
||||||
handleDeviceTM(&coreHk, id, true);
|
handleDeviceTM(&coreHk, id, true);
|
||||||
|
|
||||||
#if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_P60DOCK == 1
|
|
||||||
p60dockHkTableDataset.read();
|
|
||||||
sif::info << "P60 Dock: ACU VCC switch: "
|
|
||||||
<< static_cast<unsigned int>(p60dockHkTableDataset.outputEnableStateAcuVcc.value)
|
|
||||||
<< std::endl;
|
|
||||||
sif::info << "P60 Dock: PDU1 VCC switch: "
|
|
||||||
<< static_cast<unsigned int>(p60dockHkTableDataset.outputEnableStatePdu1Vcc.value)
|
|
||||||
<< std::endl;
|
|
||||||
sif::info << "P60 Dock: PDU2 VCC switch: "
|
|
||||||
<< static_cast<unsigned int>(p60dockHkTableDataset.outputEnableStatePdu2Vcc.value)
|
|
||||||
<< std::endl;
|
|
||||||
sif::info << "P60 Dock: ACU VBAT switch: "
|
|
||||||
<< static_cast<unsigned int>(p60dockHkTableDataset.outputEnableStateAcuVbat.value)
|
|
||||||
<< std::endl;
|
|
||||||
sif::info << "P60 Dock: PDU1 VBAT switch: "
|
|
||||||
<< static_cast<unsigned int>(p60dockHkTableDataset.outputEnableStatePdu1Vbat.value)
|
|
||||||
<< std::endl;
|
|
||||||
sif::info << "P60 Dock: PDU2 VBAT switch: "
|
|
||||||
<< static_cast<unsigned int>(p60dockHkTableDataset.outputEnableStatePdu2Vbat.value)
|
|
||||||
<< std::endl;
|
|
||||||
sif::info << "P60 Dock: Stack VBAT switch: "
|
|
||||||
<< static_cast<unsigned int>(p60dockHkTableDataset.outputEnableStateStackVbat.value)
|
|
||||||
<< std::endl;
|
|
||||||
sif::info << "P60 Dock: Stack 3V3 switch: "
|
|
||||||
<< static_cast<unsigned int>(p60dockHkTableDataset.outputEnableStateStack3V3.value)
|
|
||||||
<< std::endl;
|
|
||||||
sif::info << "P60 Dock: Stack 5V switch: "
|
|
||||||
<< static_cast<unsigned int>(p60dockHkTableDataset.outputEnableStateStack5V.value)
|
|
||||||
<< std::endl;
|
|
||||||
|
|
||||||
float temperatureC = p60dockHkTableDataset.temperature1.value * 0.1;
|
|
||||||
sif::info << "P60 Dock: Temperature 1: " << temperatureC << " °C" << std::endl;
|
|
||||||
temperatureC = p60dockHkTableDataset.temperature2.value * 0.1;
|
|
||||||
sif::info << "P60 Dock: Temperature 2: " << temperatureC << " °C" << std::endl;
|
|
||||||
sif::info << "P60 Dock: Watchdog Timer seconds left before reboot: "
|
|
||||||
<< p60dockHkTableDataset.wdtGndLeft << " seconds" << std::endl;
|
|
||||||
sif::info << "P60 Dock: CSP 1, pings left before reboot: "
|
|
||||||
<< (int)p60dockHkTableDataset.wdtCspLeft1.value << std::endl;
|
|
||||||
sif::info << "P60 Dock: CSP 2, pings left before reboot: "
|
|
||||||
<< (int)p60dockHkTableDataset.wdtCspLeft1.value << std::endl;
|
|
||||||
|
|
||||||
p60dockHkTableDataset.commit();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void P60DockHandler::parseHkTableReply(const uint8_t *packet) {
|
void P60DockHandler::parseHkTableReply(const uint8_t *packet) {
|
||||||
@ -362,3 +320,5 @@ void P60DockHandler::printHkTableLatchups() {
|
|||||||
genericPrintoutHandler("X3 VBAT", hk::X3_IDLE_VBAT);
|
genericPrintoutHandler("X3 VBAT", hk::X3_IDLE_VBAT);
|
||||||
genericPrintoutHandler("X3 VCC", hk::X3_IDLE_VCC);
|
genericPrintoutHandler("X3 VCC", hk::X3_IDLE_VCC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void P60DockHandler::setDebugMode(bool enable) { this->debugMode = enable; }
|
||||||
|
@ -21,9 +21,12 @@ class P60DockHandler : public GomspaceDeviceHandler {
|
|||||||
//! [EXPORT] : [COMMENT] Battery mode has changed. P1: Old mode. P2: New mode
|
//! [EXPORT] : [COMMENT] Battery mode has changed. P1: Old mode. P2: New mode
|
||||||
static constexpr Event BATT_MODE_CHANGED = event::makeEvent(SUBSYSTEM_ID, 2, severity::MEDIUM);
|
static constexpr Event BATT_MODE_CHANGED = event::makeEvent(SUBSYSTEM_ID, 2, severity::MEDIUM);
|
||||||
|
|
||||||
P60DockHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie);
|
P60DockHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie,
|
||||||
|
FailureIsolationBase* customFdir);
|
||||||
virtual ~P60DockHandler();
|
virtual ~P60DockHandler();
|
||||||
|
|
||||||
|
void setDebugMode(bool enable);
|
||||||
|
|
||||||
virtual ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
|
virtual ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
|
||||||
LocalDataPoolManager& poolManager) override;
|
LocalDataPoolManager& poolManager) override;
|
||||||
|
|
||||||
@ -50,6 +53,7 @@ class P60DockHandler : public GomspaceDeviceHandler {
|
|||||||
P60Dock::CoreHkSet coreHk;
|
P60Dock::CoreHkSet coreHk;
|
||||||
P60Dock::HkTableDataset auxHk;
|
P60Dock::HkTableDataset auxHk;
|
||||||
bool firstHk = true;
|
bool firstHk = true;
|
||||||
|
bool debugMode = false;
|
||||||
static constexpr uint8_t MAX_CHANNEL_STR_WIDTH = 16;
|
static constexpr uint8_t MAX_CHANNEL_STR_WIDTH = 16;
|
||||||
|
|
||||||
PoolEntry<int16_t> hkCurrents = PoolEntry<int16_t>(P60Dock::hk::CHNLS_LEN);
|
PoolEntry<int16_t> hkCurrents = PoolEntry<int16_t>(P60Dock::hk::CHNLS_LEN);
|
||||||
|
@ -95,9 +95,11 @@ void PCDUHandler::initializeSwitchStates() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void PCDUHandler::readCommandQueue() {
|
void PCDUHandler::readCommandQueue() {
|
||||||
ReturnValue_t result;
|
ReturnValue_t result = RETURN_OK;
|
||||||
CommandMessage command;
|
CommandMessage command;
|
||||||
|
|
||||||
|
for (result = commandQueue->receiveMessage(&command); result == RETURN_OK;
|
||||||
|
result = commandQueue->receiveMessage(&command)) {
|
||||||
result = commandQueue->receiveMessage(&command);
|
result = commandQueue->receiveMessage(&command);
|
||||||
if (result != RETURN_OK) {
|
if (result != RETURN_OK) {
|
||||||
return;
|
return;
|
||||||
@ -108,6 +110,7 @@ void PCDUHandler::readCommandQueue() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
MessageQueueId_t PCDUHandler::getCommandQueue() const { return commandQueue->getId(); }
|
MessageQueueId_t PCDUHandler::getCommandQueue() const { return commandQueue->getId(); }
|
||||||
|
|
||||||
|
@ -5,8 +5,9 @@
|
|||||||
|
|
||||||
#include "devices/powerSwitcherList.h"
|
#include "devices/powerSwitcherList.h"
|
||||||
|
|
||||||
PDU1Handler::PDU1Handler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie)
|
PDU1Handler::PDU1Handler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie,
|
||||||
: GomspaceDeviceHandler(objectId, comIF, comCookie, PDU::MAX_CONFIGTABLE_ADDRESS,
|
FailureIsolationBase *customFdir)
|
||||||
|
: GomspaceDeviceHandler(objectId, comIF, comCookie, customFdir, PDU::MAX_CONFIGTABLE_ADDRESS,
|
||||||
PDU::MAX_HKTABLE_ADDRESS, PDU::HK_TABLE_REPLY_SIZE),
|
PDU::MAX_HKTABLE_ADDRESS, PDU::HK_TABLE_REPLY_SIZE),
|
||||||
coreHk(this),
|
coreHk(this),
|
||||||
auxHk(this) {}
|
auxHk(this) {}
|
||||||
|
@ -21,7 +21,8 @@
|
|||||||
*/
|
*/
|
||||||
class PDU1Handler : public GomspaceDeviceHandler {
|
class PDU1Handler : public GomspaceDeviceHandler {
|
||||||
public:
|
public:
|
||||||
PDU1Handler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie);
|
PDU1Handler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie,
|
||||||
|
FailureIsolationBase* customFdir);
|
||||||
virtual ~PDU1Handler();
|
virtual ~PDU1Handler();
|
||||||
|
|
||||||
virtual ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
|
virtual ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
|
||||||
|
@ -5,8 +5,9 @@
|
|||||||
|
|
||||||
#include "devices/powerSwitcherList.h"
|
#include "devices/powerSwitcherList.h"
|
||||||
|
|
||||||
PDU2Handler::PDU2Handler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie)
|
PDU2Handler::PDU2Handler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie,
|
||||||
: GomspaceDeviceHandler(objectId, comIF, comCookie, PDU::MAX_CONFIGTABLE_ADDRESS,
|
FailureIsolationBase *customFdir)
|
||||||
|
: GomspaceDeviceHandler(objectId, comIF, comCookie, customFdir, PDU::MAX_CONFIGTABLE_ADDRESS,
|
||||||
PDU::MAX_HKTABLE_ADDRESS, PDU::HK_TABLE_REPLY_SIZE),
|
PDU::MAX_HKTABLE_ADDRESS, PDU::HK_TABLE_REPLY_SIZE),
|
||||||
coreHk(this),
|
coreHk(this),
|
||||||
auxHk(this) {}
|
auxHk(this) {}
|
||||||
|
@ -21,7 +21,8 @@
|
|||||||
*/
|
*/
|
||||||
class PDU2Handler : public GomspaceDeviceHandler {
|
class PDU2Handler : public GomspaceDeviceHandler {
|
||||||
public:
|
public:
|
||||||
PDU2Handler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie);
|
PDU2Handler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie,
|
||||||
|
FailureIsolationBase* customFdir);
|
||||||
virtual ~PDU2Handler();
|
virtual ~PDU2Handler();
|
||||||
|
|
||||||
virtual ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
|
virtual ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
|
||||||
|
@ -2,7 +2,9 @@
|
|||||||
|
|
||||||
#include <fsfw/src/fsfw/datapool/PoolReadGuard.h>
|
#include <fsfw/src/fsfw/datapool/PoolReadGuard.h>
|
||||||
|
|
||||||
#ifdef FSFW_OSAL_LINUX
|
#include "OBSWConfig.h"
|
||||||
|
|
||||||
|
#ifdef XIPHOS_Q7S
|
||||||
#include <fsfw_hal/linux/UnixFileGuard.h>
|
#include <fsfw_hal/linux/UnixFileGuard.h>
|
||||||
#include <fsfw_hal/linux/spi/SpiComIF.h>
|
#include <fsfw_hal/linux/spi/SpiComIF.h>
|
||||||
#include <fsfw_hal/linux/spi/SpiCookie.h>
|
#include <fsfw_hal/linux/spi/SpiCookie.h>
|
||||||
@ -663,7 +665,7 @@ ReturnValue_t PayloadPcduHandler::handleDoubleParamUpdate(std::string key,
|
|||||||
return params.writeJsonFile();
|
return params.writeJsonFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef FSFW_OSAL_LINUX
|
#ifdef XIPHOS_Q7S
|
||||||
ReturnValue_t PayloadPcduHandler::extConvAsTwoCallback(SpiComIF* comIf, SpiCookie* cookie,
|
ReturnValue_t PayloadPcduHandler::extConvAsTwoCallback(SpiComIF* comIf, SpiCookie* cookie,
|
||||||
const uint8_t* sendData, size_t sendLen,
|
const uint8_t* sendData, size_t sendLen,
|
||||||
void* args) {
|
void* args) {
|
||||||
|
@ -68,10 +68,9 @@ class PayloadPcduHandler : public DeviceHandlerBase {
|
|||||||
void setToGoToNormalModeImmediately(bool enable);
|
void setToGoToNormalModeImmediately(bool enable);
|
||||||
void enablePeriodicPrintout(bool enable, uint8_t divider);
|
void enablePeriodicPrintout(bool enable, uint8_t divider);
|
||||||
|
|
||||||
|
#ifdef XIPHOS_Q7S
|
||||||
static ReturnValue_t extConvAsTwoCallback(SpiComIF* comIf, SpiCookie* cookie,
|
static ReturnValue_t extConvAsTwoCallback(SpiComIF* comIf, SpiCookie* cookie,
|
||||||
const uint8_t* sendData, size_t sendLen, void* args);
|
const uint8_t* sendData, size_t sendLen, void* args);
|
||||||
|
|
||||||
#ifdef FSFW_OSAL_LINUX
|
|
||||||
static ReturnValue_t transferAsTwo(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sendData,
|
static ReturnValue_t transferAsTwo(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sendData,
|
||||||
size_t sendLen, bool tempOnly);
|
size_t sendLen, bool tempOnly);
|
||||||
#endif
|
#endif
|
||||||
|
@ -341,13 +341,16 @@ void RwHandler::handleResetStatusReply(const uint8_t* packet) {
|
|||||||
lastResetStatusSet.lastResetStatus = resetStatus;
|
lastResetStatusSet.lastResetStatus = resetStatus;
|
||||||
}
|
}
|
||||||
lastResetStatusSet.currentResetStatus = resetStatus;
|
lastResetStatusSet.currentResetStatus = resetStatus;
|
||||||
#if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_RW == 1
|
if (debugMode) {
|
||||||
|
#if OBSW_VERBOSE_LEVEL >= 1
|
||||||
sif::info << "RwHandler::handleResetStatusReply: Last reset status: "
|
sif::info << "RwHandler::handleResetStatusReply: Last reset status: "
|
||||||
<< static_cast<unsigned int>(lastResetStatusSet.lastResetStatus.value) << std::endl;
|
<< static_cast<unsigned int>(lastResetStatusSet.lastResetStatus.value) << std::endl;
|
||||||
sif::info << "RwHandler::handleResetStatusReply: Current reset status: "
|
sif::info << "RwHandler::handleResetStatusReply: Current reset status: "
|
||||||
<< static_cast<unsigned int>(lastResetStatusSet.currentResetStatus.value) << std::endl;
|
<< static_cast<unsigned int>(lastResetStatusSet.currentResetStatus.value)
|
||||||
|
<< std::endl;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void RwHandler::handleGetRwStatusReply(const uint8_t* packet) {
|
void RwHandler::handleGetRwStatusReply(const uint8_t* packet) {
|
||||||
PoolReadGuard rg(&statusSet);
|
PoolReadGuard rg(&statusSet);
|
||||||
@ -371,28 +374,32 @@ void RwHandler::handleGetRwStatusReply(const uint8_t* packet) {
|
|||||||
sif::error << "RwHandler::handleGetRwStatusReply: Reaction wheel in error state" << std::endl;
|
sif::error << "RwHandler::handleGetRwStatusReply: Reaction wheel in error state" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_RW == 1
|
if (debugMode) {
|
||||||
|
#if OBSW_VERBOSE_LEVEL >= 1
|
||||||
sif::info << "RwHandler::handleGetRwStatusReply: Current speed is: " << statusSet.currSpeed
|
sif::info << "RwHandler::handleGetRwStatusReply: Current speed is: " << statusSet.currSpeed
|
||||||
<< " * 0.1 RPM" << std::endl;
|
<< " * 0.1 RPM" << std::endl;
|
||||||
sif::info << "RwHandler::handleGetRwStatusReply: Reference speed is: " << statusSet.referenceSpeed
|
sif::info << "RwHandler::handleGetRwStatusReply: Reference speed is: "
|
||||||
<< " * 0.1 RPM" << std::endl;
|
<< statusSet.referenceSpeed << " * 0.1 RPM" << std::endl;
|
||||||
sif::info << "RwHandler::handleGetRwStatusReply: State is: "
|
sif::info << "RwHandler::handleGetRwStatusReply: State is: "
|
||||||
<< (unsigned int)statusSet.state.value << std::endl;
|
<< (unsigned int)statusSet.state.value << std::endl;
|
||||||
sif::info << "RwHandler::handleGetRwStatusReply: clc mode is: "
|
sif::info << "RwHandler::handleGetRwStatusReply: clc mode is: "
|
||||||
<< (unsigned int)statusSet.clcMode.value << std::endl;
|
<< (unsigned int)statusSet.clcMode.value << std::endl;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void RwHandler::handleTemperatureReply(const uint8_t* packet) {
|
void RwHandler::handleTemperatureReply(const uint8_t* packet) {
|
||||||
PoolReadGuard rg(&temperatureSet);
|
PoolReadGuard rg(&temperatureSet);
|
||||||
uint8_t offset = 2;
|
uint8_t offset = 2;
|
||||||
temperatureSet.temperatureCelcius = *(packet + offset + 3) << 24 | *(packet + offset + 2) << 16 |
|
temperatureSet.temperatureCelcius = *(packet + offset + 3) << 24 | *(packet + offset + 2) << 16 |
|
||||||
*(packet + offset + 1) << 8 | *(packet + offset);
|
*(packet + offset + 1) << 8 | *(packet + offset);
|
||||||
#if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_RW == 1
|
if (debugMode) {
|
||||||
|
#if OBSW_VERBOSE_LEVEL >= 1
|
||||||
sif::info << "RwHandler::handleTemperatureReply: Temperature: "
|
sif::info << "RwHandler::handleTemperatureReply: Temperature: "
|
||||||
<< temperatureSet.temperatureCelcius << " °C" << std::endl;
|
<< temperatureSet.temperatureCelcius << " °C" << std::endl;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void RwHandler::handleGetTelemetryReply(const uint8_t* packet) {
|
void RwHandler::handleGetTelemetryReply(const uint8_t* packet) {
|
||||||
PoolReadGuard rg(&tmDataset);
|
PoolReadGuard rg(&tmDataset);
|
||||||
@ -468,7 +475,8 @@ void RwHandler::handleGetTelemetryReply(const uint8_t* packet) {
|
|||||||
offset += 4;
|
offset += 4;
|
||||||
tmDataset.spiTotalNumOfErrors = *(packet + offset + 3) << 24 | *(packet + offset + 2) << 16 |
|
tmDataset.spiTotalNumOfErrors = *(packet + offset + 3) << 24 | *(packet + offset + 2) << 16 |
|
||||||
*(packet + offset + 1) << 8 | *(packet + offset);
|
*(packet + offset + 1) << 8 | *(packet + offset);
|
||||||
#if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_RW == 1
|
if (debugMode) {
|
||||||
|
#if OBSW_VERBOSE_LEVEL >= 1
|
||||||
sif::info << "RwHandler::handleGetTelemetryReply: Last reset status: "
|
sif::info << "RwHandler::handleGetTelemetryReply: Last reset status: "
|
||||||
<< static_cast<unsigned int>(tmDataset.lastResetStatus.value) << std::endl;
|
<< static_cast<unsigned int>(tmDataset.lastResetStatus.value) << std::endl;
|
||||||
sif::info << "RwHandler::handleGetTelemetryReply: MCU temperature: " << tmDataset.mcuTemperature
|
sif::info << "RwHandler::handleGetTelemetryReply: MCU temperature: " << tmDataset.mcuTemperature
|
||||||
@ -518,3 +526,6 @@ void RwHandler::handleGetTelemetryReply(const uint8_t* packet) {
|
|||||||
<< tmDataset.spiTotalNumOfErrors << std::endl;
|
<< tmDataset.spiTotalNumOfErrors << std::endl;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RwHandler::setDebugMode(bool enable) { this->debugMode = enable; }
|
||||||
|
@ -30,6 +30,9 @@ class RwHandler : public DeviceHandlerBase {
|
|||||||
*/
|
*/
|
||||||
RwHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie, LinuxLibgpioIF* gpioComIF,
|
RwHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie, LinuxLibgpioIF* gpioComIF,
|
||||||
gpioId_t enableGpio);
|
gpioId_t enableGpio);
|
||||||
|
|
||||||
|
void setDebugMode(bool enable);
|
||||||
|
|
||||||
virtual ~RwHandler();
|
virtual ~RwHandler();
|
||||||
|
|
||||||
static const uint8_t INTERFACE_ID = CLASS_ID::RW_HANDLER;
|
static const uint8_t INTERFACE_ID = CLASS_ID::RW_HANDLER;
|
||||||
@ -86,6 +89,7 @@ class RwHandler : public DeviceHandlerBase {
|
|||||||
|
|
||||||
LinuxLibgpioIF* gpioComIF = nullptr;
|
LinuxLibgpioIF* gpioComIF = nullptr;
|
||||||
gpioId_t enableGpio = gpio::NO_GPIO;
|
gpioId_t enableGpio = gpio::NO_GPIO;
|
||||||
|
bool debugMode = false;
|
||||||
|
|
||||||
RwDefinitions::TemperatureSet temperatureSet;
|
RwDefinitions::TemperatureSet temperatureSet;
|
||||||
RwDefinitions::StatusSet statusSet;
|
RwDefinitions::StatusSet statusSet;
|
||||||
|
@ -5,8 +5,8 @@
|
|||||||
#include "OBSWConfig.h"
|
#include "OBSWConfig.h"
|
||||||
|
|
||||||
SyrlinksHkHandler::SyrlinksHkHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie,
|
SyrlinksHkHandler::SyrlinksHkHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie,
|
||||||
power::Switch_t powerSwitch)
|
power::Switch_t powerSwitch, FailureIsolationBase* customFdir)
|
||||||
: DeviceHandlerBase(objectId, comIF, comCookie),
|
: DeviceHandlerBase(objectId, comIF, comCookie, customFdir),
|
||||||
rxDataset(this),
|
rxDataset(this),
|
||||||
txDataset(this),
|
txDataset(this),
|
||||||
temperatureSet(this),
|
temperatureSet(this),
|
||||||
@ -166,12 +166,12 @@ ReturnValue_t SyrlinksHkHandler::buildCommandFromCommand(DeviceCommandId_t devic
|
|||||||
return RETURN_OK;
|
return RETURN_OK;
|
||||||
}
|
}
|
||||||
case (syrlinks::ENABLE_DEBUG): {
|
case (syrlinks::ENABLE_DEBUG): {
|
||||||
debug = true;
|
debugMode = true;
|
||||||
rawPacketLen = 0;
|
rawPacketLen = 0;
|
||||||
return RETURN_OK;
|
return RETURN_OK;
|
||||||
}
|
}
|
||||||
case (syrlinks::DISABLE_DEBUG): {
|
case (syrlinks::DISABLE_DEBUG): {
|
||||||
debug = false;
|
debugMode = false;
|
||||||
rawPacketLen = 0;
|
rawPacketLen = 0;
|
||||||
return RETURN_OK;
|
return RETURN_OK;
|
||||||
}
|
}
|
||||||
@ -363,7 +363,7 @@ ReturnValue_t SyrlinksHkHandler::interpretDeviceReply(DeviceCommandId_t id, cons
|
|||||||
tempBasebandBoard = calcTempVal(rawTempBasebandBoard);
|
tempBasebandBoard = calcTempVal(rawTempBasebandBoard);
|
||||||
temperatureSet.temperatureBasebandBoard = tempBasebandBoard;
|
temperatureSet.temperatureBasebandBoard = tempBasebandBoard;
|
||||||
PoolReadGuard rg(&temperatureSet);
|
PoolReadGuard rg(&temperatureSet);
|
||||||
if (debug) {
|
if (debugMode) {
|
||||||
sif::info << "Syrlinks temperature baseband board: " << tempBasebandBoard << " °C"
|
sif::info << "Syrlinks temperature baseband board: " << tempBasebandBoard << " °C"
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
}
|
}
|
||||||
@ -394,7 +394,7 @@ ReturnValue_t SyrlinksHkHandler::interpretDeviceReply(DeviceCommandId_t id, cons
|
|||||||
tempPowerAmplifier = calcTempVal(rawTempPowerAmplifier);
|
tempPowerAmplifier = calcTempVal(rawTempPowerAmplifier);
|
||||||
PoolReadGuard rg(&temperatureSet);
|
PoolReadGuard rg(&temperatureSet);
|
||||||
temperatureSet.temperaturePowerAmplifier = tempPowerAmplifier;
|
temperatureSet.temperaturePowerAmplifier = tempPowerAmplifier;
|
||||||
if (debug) {
|
if (debugMode) {
|
||||||
sif::info << "Syrlinks temperature power amplifier board: " << tempPowerAmplifier << " °C"
|
sif::info << "Syrlinks temperature power amplifier board: " << tempPowerAmplifier << " °C"
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
}
|
}
|
||||||
@ -540,8 +540,8 @@ void SyrlinksHkHandler::parseRxStatusRegistersReply(const uint8_t* packet) {
|
|||||||
offset += 6;
|
offset += 6;
|
||||||
rxDataset.rxDataRate = convertHexStringToUint8(reinterpret_cast<const char*>(packet + offset));
|
rxDataset.rxDataRate = convertHexStringToUint8(reinterpret_cast<const char*>(packet + offset));
|
||||||
|
|
||||||
#if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_SYRLINKS == 1
|
if (debugMode) {
|
||||||
if (debug) {
|
#if OBSW_VERBOSE_LEVEL >= 1
|
||||||
sif::info << "Syrlinks RX Status: 0x" << std::hex << (unsigned int)rxDataset.rxStatus.value
|
sif::info << "Syrlinks RX Status: 0x" << std::hex << (unsigned int)rxDataset.rxStatus.value
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
sif::info << "Syrlinks RX Sensitivity: " << std::dec << rxDataset.rxSensitivity << std::endl;
|
sif::info << "Syrlinks RX Sensitivity: " << std::dec << rxDataset.rxSensitivity << std::endl;
|
||||||
@ -551,14 +551,14 @@ void SyrlinksHkHandler::parseRxStatusRegistersReply(const uint8_t* packet) {
|
|||||||
sif::info << "Syrlinks RX Demod Eb: " << rxDataset.rxDemodEb << std::endl;
|
sif::info << "Syrlinks RX Demod Eb: " << rxDataset.rxDemodEb << std::endl;
|
||||||
sif::info << "Syrlinks RX Demod N0: " << rxDataset.rxDemodN0 << std::endl;
|
sif::info << "Syrlinks RX Demod N0: " << rxDataset.rxDemodN0 << std::endl;
|
||||||
sif::info << "Syrlinks RX Datarate: " << (unsigned int)rxDataset.rxDataRate.value << std::endl;
|
sif::info << "Syrlinks RX Datarate: " << (unsigned int)rxDataset.rxDataRate.value << std::endl;
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SyrlinksHkHandler::parseLclConfigReply(const uint8_t* packet) {
|
void SyrlinksHkHandler::parseLclConfigReply(const uint8_t* packet) {
|
||||||
uint16_t offset = syrlinks::MESSAGE_HEADER_SIZE;
|
uint16_t offset = syrlinks::MESSAGE_HEADER_SIZE;
|
||||||
uint8_t lclConfig = convertHexStringToUint8(reinterpret_cast<const char*>(packet + offset));
|
uint8_t lclConfig = convertHexStringToUint8(reinterpret_cast<const char*>(packet + offset));
|
||||||
if (debug) {
|
if (debugMode) {
|
||||||
sif::info << "SyrlinksHkHandler::parseRxStatusRegistersReply: Lcl config: "
|
sif::info << "SyrlinksHkHandler::parseRxStatusRegistersReply: Lcl config: "
|
||||||
<< static_cast<unsigned int>(lclConfig) << std::endl;
|
<< static_cast<unsigned int>(lclConfig) << std::endl;
|
||||||
}
|
}
|
||||||
@ -568,24 +568,20 @@ void SyrlinksHkHandler::parseTxStatusReply(const uint8_t* packet) {
|
|||||||
PoolReadGuard readHelper(&txDataset);
|
PoolReadGuard readHelper(&txDataset);
|
||||||
uint16_t offset = syrlinks::MESSAGE_HEADER_SIZE;
|
uint16_t offset = syrlinks::MESSAGE_HEADER_SIZE;
|
||||||
txDataset.txStatus = convertHexStringToUint8(reinterpret_cast<const char*>(packet + offset));
|
txDataset.txStatus = convertHexStringToUint8(reinterpret_cast<const char*>(packet + offset));
|
||||||
#if OBSW_DEBUG_SYRLINKS == 1
|
if (debugMode) {
|
||||||
if (debug) {
|
|
||||||
sif::info << "Syrlinks TX Status: 0x" << std::hex << (unsigned int)txDataset.txStatus.value
|
sif::info << "Syrlinks TX Status: 0x" << std::hex << (unsigned int)txDataset.txStatus.value
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SyrlinksHkHandler::parseTxWaveformReply(const uint8_t* packet) {
|
void SyrlinksHkHandler::parseTxWaveformReply(const uint8_t* packet) {
|
||||||
PoolReadGuard readHelper(&txDataset);
|
PoolReadGuard readHelper(&txDataset);
|
||||||
uint16_t offset = syrlinks::MESSAGE_HEADER_SIZE;
|
uint16_t offset = syrlinks::MESSAGE_HEADER_SIZE;
|
||||||
txDataset.txWaveform = convertHexStringToUint8(reinterpret_cast<const char*>(packet + offset));
|
txDataset.txWaveform = convertHexStringToUint8(reinterpret_cast<const char*>(packet + offset));
|
||||||
#if OBSW_DEBUG_SYRLINKS == 1
|
if (debugMode) {
|
||||||
if (debug) {
|
|
||||||
sif::info << "Syrlinks TX Waveform: 0x" << std::hex << (unsigned int)txDataset.txWaveform.value
|
sif::info << "Syrlinks TX Waveform: 0x" << std::hex << (unsigned int)txDataset.txWaveform.value
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SyrlinksHkHandler::parseAgcLowByte(const uint8_t* packet) {
|
void SyrlinksHkHandler::parseAgcLowByte(const uint8_t* packet) {
|
||||||
@ -593,11 +589,9 @@ void SyrlinksHkHandler::parseAgcLowByte(const uint8_t* packet) {
|
|||||||
uint16_t offset = syrlinks::MESSAGE_HEADER_SIZE;
|
uint16_t offset = syrlinks::MESSAGE_HEADER_SIZE;
|
||||||
txDataset.txAgcValue = agcValueHighByte << 8 |
|
txDataset.txAgcValue = agcValueHighByte << 8 |
|
||||||
convertHexStringToUint8(reinterpret_cast<const char*>(packet + offset));
|
convertHexStringToUint8(reinterpret_cast<const char*>(packet + offset));
|
||||||
#if OBSW_DEBUG_SYRLINKS == 1
|
if (debugMode) {
|
||||||
if (debug) {
|
|
||||||
sif::info << "Syrlinks TX AGC Value: " << txDataset.txAgcValue << std::endl;
|
sif::info << "Syrlinks TX AGC Value: " << txDataset.txAgcValue << std::endl;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SyrlinksHkHandler::parseAgcHighByte(const uint8_t* packet) {
|
void SyrlinksHkHandler::parseAgcHighByte(const uint8_t* packet) {
|
||||||
@ -654,3 +648,5 @@ void SyrlinksHkHandler::prepareCommand(std::string command, DeviceCommandId_t co
|
|||||||
rememberCommandId = commandId;
|
rememberCommandId = commandId;
|
||||||
rawPacket = commandBuffer;
|
rawPacket = commandBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SyrlinksHkHandler::setDebugMode(bool enable) { this->debugMode = enable; }
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
class SyrlinksHkHandler : public DeviceHandlerBase {
|
class SyrlinksHkHandler : public DeviceHandlerBase {
|
||||||
public:
|
public:
|
||||||
SyrlinksHkHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie,
|
SyrlinksHkHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie,
|
||||||
power::Switch_t powerSwitch);
|
power::Switch_t powerSwitch, FailureIsolationBase* customFdir);
|
||||||
virtual ~SyrlinksHkHandler();
|
virtual ~SyrlinksHkHandler();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -28,6 +28,8 @@ class SyrlinksHkHandler : public DeviceHandlerBase {
|
|||||||
*/
|
*/
|
||||||
void setModeNormal();
|
void setModeNormal();
|
||||||
|
|
||||||
|
void setDebugMode(bool enable);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void doStartUp() override;
|
void doStartUp() override;
|
||||||
void doShutDown() override;
|
void doShutDown() override;
|
||||||
@ -95,6 +97,7 @@ class SyrlinksHkHandler : public DeviceHandlerBase {
|
|||||||
|
|
||||||
const power::Switch_t powerSwitch = power::NO_SWITCH;
|
const power::Switch_t powerSwitch = power::NO_SWITCH;
|
||||||
|
|
||||||
|
bool debugMode = false;
|
||||||
uint8_t agcValueHighByte = 0;
|
uint8_t agcValueHighByte = 0;
|
||||||
uint16_t rawTempPowerAmplifier = 0;
|
uint16_t rawTempPowerAmplifier = 0;
|
||||||
uint16_t rawTempBasebandBoard = 0;
|
uint16_t rawTempBasebandBoard = 0;
|
||||||
@ -107,8 +110,6 @@ class SyrlinksHkHandler : public DeviceHandlerBase {
|
|||||||
|
|
||||||
StartupState startupState = StartupState::OFF;
|
StartupState startupState = StartupState::OFF;
|
||||||
|
|
||||||
bool debug = false;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This object is used to store the id of the next command to execute. This controls the
|
* This object is used to store the id of the next command to execute. This controls the
|
||||||
* read out of multiple registers which can not be fetched with one single command.
|
* read out of multiple registers which can not be fetched with one single command.
|
||||||
|
@ -1,8 +1,14 @@
|
|||||||
#ifndef MISSION_DEVICES_DEVICEDEFINITIONS_SYRLINKSDEFINITIONS_H_
|
#ifndef MISSION_DEVICES_DEVICEDEFINITIONS_SYRLINKSDEFINITIONS_H_
|
||||||
#define MISSION_DEVICES_DEVICEDEFINITIONS_SYRLINKSDEFINITIONS_H_
|
#define MISSION_DEVICES_DEVICEDEFINITIONS_SYRLINKSDEFINITIONS_H_
|
||||||
|
|
||||||
|
#include <commonSubsystemIds.h>
|
||||||
|
|
||||||
namespace syrlinks {
|
namespace syrlinks {
|
||||||
|
|
||||||
|
static constexpr uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::SYRLINKS;
|
||||||
|
|
||||||
|
static constexpr Event FDIR_REACTION_IGNORED = event::makeEvent(SUBSYSTEM_ID, 0, severity::MEDIUM);
|
||||||
|
|
||||||
static const DeviceCommandId_t NONE = 0;
|
static const DeviceCommandId_t NONE = 0;
|
||||||
static const DeviceCommandId_t RESET_UNIT = 1;
|
static const DeviceCommandId_t RESET_UNIT = 1;
|
||||||
/** Reads out all status registers */
|
/** Reads out all status registers */
|
||||||
|
@ -15,6 +15,8 @@ static constexpr Event SWITCH_CMD_SENT = event::makeEvent(SUBSYSTEM_ID, 0, sever
|
|||||||
static constexpr Event SWITCH_HAS_CHANGED = event::makeEvent(SUBSYSTEM_ID, 1, severity::INFO);
|
static constexpr Event SWITCH_HAS_CHANGED = event::makeEvent(SUBSYSTEM_ID, 1, severity::INFO);
|
||||||
static constexpr Event SWITCHING_Q7S_DENIED = event::makeEvent(SUBSYSTEM_ID, 2, severity::MEDIUM);
|
static constexpr Event SWITCHING_Q7S_DENIED = event::makeEvent(SUBSYSTEM_ID, 2, severity::MEDIUM);
|
||||||
|
|
||||||
|
static constexpr Event FDIR_REACTION_IGNORED = event::makeEvent(SUBSYSTEM_ID, 3, severity::MEDIUM);
|
||||||
|
|
||||||
} // namespace power
|
} // namespace power
|
||||||
|
|
||||||
#endif /* MISSION_DEVICES_DEVICEDEFINITIONS_POWERDEFINITIONS_H_ */
|
#endif /* MISSION_DEVICES_DEVICEDEFINITIONS_POWERDEFINITIONS_H_ */
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
add_subdirectory(objects)
|
add_subdirectory(objects)
|
||||||
add_subdirectory(tree)
|
add_subdirectory(tree)
|
||||||
|
add_subdirectory(fdir)
|
||||||
|
7
mission/system/fdir/CMakeLists.txt
Normal file
7
mission/system/fdir/CMakeLists.txt
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
target_sources(${LIB_EIVE_MISSION} PRIVATE
|
||||||
|
AcsBoardFdir.cpp
|
||||||
|
RtdFdir.cpp
|
||||||
|
SusFdir.cpp
|
||||||
|
SyrlinksFdir.cpp
|
||||||
|
GomspacePowerFdir.cpp
|
||||||
|
)
|
128
mission/system/fdir/GomspacePowerFdir.cpp
Normal file
128
mission/system/fdir/GomspacePowerFdir.cpp
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
#include "GomspacePowerFdir.h"
|
||||||
|
|
||||||
|
#include "fsfw/devicehandlers/DeviceHandlerIF.h"
|
||||||
|
#include "fsfw/health/HealthTableIF.h"
|
||||||
|
#include "fsfw/modes/HasModesIF.h"
|
||||||
|
#include "fsfw/objectmanager/ObjectManager.h"
|
||||||
|
#include "fsfw/power/Fuse.h"
|
||||||
|
#include "fsfw/serviceinterface/ServiceInterfaceStream.h"
|
||||||
|
#include "fsfw/thermal/ThermalComponentIF.h"
|
||||||
|
#include "mission/devices/devicedefinitions/powerDefinitions.h"
|
||||||
|
|
||||||
|
GomspacePowerFdir::GomspacePowerFdir(object_id_t devId, object_id_t parentId)
|
||||||
|
: DeviceHandlerFailureIsolation(devId, parentId) {}
|
||||||
|
|
||||||
|
ReturnValue_t GomspacePowerFdir::eventReceived(EventMessage* event) {
|
||||||
|
if (isFdirInActionOrAreWeFaulty(event)) {
|
||||||
|
return RETURN_OK;
|
||||||
|
}
|
||||||
|
ReturnValue_t result = RETURN_FAILED;
|
||||||
|
switch (event->getEvent()) {
|
||||||
|
case HasModesIF::MODE_TRANSITION_FAILED:
|
||||||
|
case HasModesIF::OBJECT_IN_INVALID_MODE:
|
||||||
|
case DeviceHandlerIF::DEVICE_WANTS_HARD_REBOOT:
|
||||||
|
// We'll try a recovery as long as defined in MAX_REBOOT.
|
||||||
|
// Might cause some AssemblyBase cycles, so keep number low.
|
||||||
|
// handleRecovery(event->getEvent());
|
||||||
|
triggerEvent(power::FDIR_REACTION_IGNORED, event->getEvent(), 0);
|
||||||
|
break;
|
||||||
|
case DeviceHandlerIF::DEVICE_INTERPRETING_REPLY_FAILED:
|
||||||
|
case DeviceHandlerIF::DEVICE_READING_REPLY_FAILED:
|
||||||
|
case DeviceHandlerIF::DEVICE_UNREQUESTED_REPLY:
|
||||||
|
case DeviceHandlerIF::DEVICE_UNKNOWN_REPLY: // Some DH's generate generic reply-ids.
|
||||||
|
case DeviceHandlerIF::DEVICE_BUILDING_COMMAND_FAILED:
|
||||||
|
// These faults all mean that there were stupid replies from a device.
|
||||||
|
if (strangeReplyCount.incrementAndCheck()) {
|
||||||
|
// handleRecovery(event->getEvent());
|
||||||
|
triggerEvent(power::FDIR_REACTION_IGNORED, event->getEvent(), 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DeviceHandlerIF::DEVICE_SENDING_COMMAND_FAILED:
|
||||||
|
case DeviceHandlerIF::DEVICE_REQUESTING_REPLY_FAILED:
|
||||||
|
// The two above should never be confirmed.
|
||||||
|
case DeviceHandlerIF::DEVICE_MISSED_REPLY:
|
||||||
|
result = sendConfirmationRequest(event);
|
||||||
|
if (result == HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// else
|
||||||
|
if (missedReplyCount.incrementAndCheck()) {
|
||||||
|
// handleRecovery(event->getEvent());
|
||||||
|
triggerEvent(power::FDIR_REACTION_IGNORED, event->getEvent(), 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case StorageManagerIF::GET_DATA_FAILED:
|
||||||
|
case StorageManagerIF::STORE_DATA_FAILED:
|
||||||
|
// Rather strange bugs, occur in RAW mode only. Ignore.
|
||||||
|
break;
|
||||||
|
case DeviceHandlerIF::INVALID_DEVICE_COMMAND:
|
||||||
|
// Ignore, is bad configuration. We can't do anything in flight.
|
||||||
|
break;
|
||||||
|
case HasHealthIF::HEALTH_INFO:
|
||||||
|
case HasModesIF::MODE_INFO:
|
||||||
|
case HasModesIF::CHANGING_MODE:
|
||||||
|
// Do nothing, but mark as handled.
|
||||||
|
break;
|
||||||
|
//****Power*****
|
||||||
|
case PowerSwitchIF::SWITCH_WENT_OFF:
|
||||||
|
if (powerConfirmation != MessageQueueIF::NO_QUEUE) {
|
||||||
|
result = sendConfirmationRequest(event, powerConfirmation);
|
||||||
|
if (result == RETURN_OK) {
|
||||||
|
setFdirState(DEVICE_MIGHT_BE_OFF);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Fuse::FUSE_WENT_OFF:
|
||||||
|
// Not so good, because PCDU reacted.
|
||||||
|
case Fuse::POWER_ABOVE_HIGH_LIMIT:
|
||||||
|
// Better, because software detected over-current.
|
||||||
|
setFaulty(event->getEvent());
|
||||||
|
break;
|
||||||
|
case Fuse::POWER_BELOW_LOW_LIMIT:
|
||||||
|
// Device might got stuck during boot, retry.
|
||||||
|
// handleRecovery(event->getEvent());
|
||||||
|
triggerEvent(power::FDIR_REACTION_IGNORED, event->getEvent(), 0);
|
||||||
|
break;
|
||||||
|
//****Thermal*****
|
||||||
|
case ThermalComponentIF::COMPONENT_TEMP_LOW:
|
||||||
|
case ThermalComponentIF::COMPONENT_TEMP_HIGH:
|
||||||
|
case ThermalComponentIF::COMPONENT_TEMP_OOL_LOW:
|
||||||
|
case ThermalComponentIF::COMPONENT_TEMP_OOL_HIGH:
|
||||||
|
// Well, the device is not really faulty, but it is required to stay off as long as possible.
|
||||||
|
setFaulty(event->getEvent());
|
||||||
|
break;
|
||||||
|
case ThermalComponentIF::TEMP_NOT_IN_OP_RANGE:
|
||||||
|
// Ignore, is information only.
|
||||||
|
break;
|
||||||
|
//*******Default monitoring variables. Are currently not used.*****
|
||||||
|
// case DeviceHandlerIF::MONITORING_LIMIT_EXCEEDED:
|
||||||
|
// setFaulty(event->getEvent());
|
||||||
|
// break;
|
||||||
|
// case DeviceHandlerIF::MONITORING_AMBIGUOUS:
|
||||||
|
// break;
|
||||||
|
default:
|
||||||
|
// We don't know the event, someone else should handle it.
|
||||||
|
return RETURN_FAILED;
|
||||||
|
}
|
||||||
|
return RETURN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GomspacePowerFdir::eventConfirmed(EventMessage* event) {
|
||||||
|
switch (event->getEvent()) {
|
||||||
|
case DeviceHandlerIF::DEVICE_SENDING_COMMAND_FAILED:
|
||||||
|
case DeviceHandlerIF::DEVICE_REQUESTING_REPLY_FAILED:
|
||||||
|
case DeviceHandlerIF::DEVICE_MISSED_REPLY:
|
||||||
|
if (missedReplyCount.incrementAndCheck()) {
|
||||||
|
// handleRecovery(event->getEvent());
|
||||||
|
triggerEvent(power::FDIR_REACTION_IGNORED, event->getEvent(), 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PowerSwitchIF::SWITCH_WENT_OFF:
|
||||||
|
// This means the switch went off only for one device.
|
||||||
|
// handleRecovery(event->getEvent());
|
||||||
|
triggerEvent(power::FDIR_REACTION_IGNORED, event->getEvent(), 0);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
15
mission/system/fdir/GomspacePowerFdir.h
Normal file
15
mission/system/fdir/GomspacePowerFdir.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#ifndef MISSION_SYSTEM_FDIR_GOMSPACEPOWERFDIR_H_
|
||||||
|
#define MISSION_SYSTEM_FDIR_GOMSPACEPOWERFDIR_H_
|
||||||
|
|
||||||
|
#include <fsfw/devicehandlers/DeviceHandlerFailureIsolation.h>
|
||||||
|
|
||||||
|
class GomspacePowerFdir : public DeviceHandlerFailureIsolation {
|
||||||
|
public:
|
||||||
|
GomspacePowerFdir(object_id_t devId, object_id_t parentId = objects::NO_OBJECT);
|
||||||
|
|
||||||
|
private:
|
||||||
|
ReturnValue_t eventReceived(EventMessage* event) override;
|
||||||
|
void eventConfirmed(EventMessage* event) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* MISSION_SYSTEM_FDIR_GOMSPACEPOWERFDIR_H_ */
|
128
mission/system/fdir/SyrlinksFdir.cpp
Normal file
128
mission/system/fdir/SyrlinksFdir.cpp
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
#include "SyrlinksFdir.h"
|
||||||
|
|
||||||
|
#include "fsfw/devicehandlers/DeviceHandlerIF.h"
|
||||||
|
#include "fsfw/health/HealthTableIF.h"
|
||||||
|
#include "fsfw/modes/HasModesIF.h"
|
||||||
|
#include "fsfw/objectmanager/ObjectManager.h"
|
||||||
|
#include "fsfw/power/Fuse.h"
|
||||||
|
#include "fsfw/serviceinterface/ServiceInterfaceStream.h"
|
||||||
|
#include "fsfw/thermal/ThermalComponentIF.h"
|
||||||
|
#include "mission/devices/devicedefinitions/SyrlinksDefinitions.h"
|
||||||
|
|
||||||
|
SyrlinksFdir::SyrlinksFdir(object_id_t syrlinksId)
|
||||||
|
: DeviceHandlerFailureIsolation(syrlinksId, objects::NO_OBJECT) {}
|
||||||
|
|
||||||
|
ReturnValue_t SyrlinksFdir::eventReceived(EventMessage* event) {
|
||||||
|
if (isFdirInActionOrAreWeFaulty(event)) {
|
||||||
|
return RETURN_OK;
|
||||||
|
}
|
||||||
|
ReturnValue_t result = RETURN_FAILED;
|
||||||
|
switch (event->getEvent()) {
|
||||||
|
case HasModesIF::MODE_TRANSITION_FAILED:
|
||||||
|
case HasModesIF::OBJECT_IN_INVALID_MODE:
|
||||||
|
case DeviceHandlerIF::DEVICE_WANTS_HARD_REBOOT:
|
||||||
|
// We'll try a recovery as long as defined in MAX_REBOOT.
|
||||||
|
// Might cause some AssemblyBase cycles, so keep number low.
|
||||||
|
// handleRecovery(event->getEvent());
|
||||||
|
triggerEvent(syrlinks::FDIR_REACTION_IGNORED, event->getEvent(), 0);
|
||||||
|
break;
|
||||||
|
case DeviceHandlerIF::DEVICE_INTERPRETING_REPLY_FAILED:
|
||||||
|
case DeviceHandlerIF::DEVICE_READING_REPLY_FAILED:
|
||||||
|
case DeviceHandlerIF::DEVICE_UNREQUESTED_REPLY:
|
||||||
|
case DeviceHandlerIF::DEVICE_UNKNOWN_REPLY: // Some DH's generate generic reply-ids.
|
||||||
|
case DeviceHandlerIF::DEVICE_BUILDING_COMMAND_FAILED:
|
||||||
|
// These faults all mean that there were stupid replies from a device.
|
||||||
|
if (strangeReplyCount.incrementAndCheck()) {
|
||||||
|
// handleRecovery(event->getEvent());
|
||||||
|
triggerEvent(syrlinks::FDIR_REACTION_IGNORED, event->getEvent(), 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DeviceHandlerIF::DEVICE_SENDING_COMMAND_FAILED:
|
||||||
|
case DeviceHandlerIF::DEVICE_REQUESTING_REPLY_FAILED:
|
||||||
|
// The two above should never be confirmed.
|
||||||
|
case DeviceHandlerIF::DEVICE_MISSED_REPLY:
|
||||||
|
result = sendConfirmationRequest(event);
|
||||||
|
if (result == HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// else
|
||||||
|
if (missedReplyCount.incrementAndCheck()) {
|
||||||
|
// handleRecovery(event->getEvent());
|
||||||
|
triggerEvent(syrlinks::FDIR_REACTION_IGNORED, event->getEvent(), 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case StorageManagerIF::GET_DATA_FAILED:
|
||||||
|
case StorageManagerIF::STORE_DATA_FAILED:
|
||||||
|
// Rather strange bugs, occur in RAW mode only. Ignore.
|
||||||
|
break;
|
||||||
|
case DeviceHandlerIF::INVALID_DEVICE_COMMAND:
|
||||||
|
// Ignore, is bad configuration. We can't do anything in flight.
|
||||||
|
break;
|
||||||
|
case HasHealthIF::HEALTH_INFO:
|
||||||
|
case HasModesIF::MODE_INFO:
|
||||||
|
case HasModesIF::CHANGING_MODE:
|
||||||
|
// Do nothing, but mark as handled.
|
||||||
|
break;
|
||||||
|
//****Power*****
|
||||||
|
case PowerSwitchIF::SWITCH_WENT_OFF:
|
||||||
|
if (powerConfirmation != MessageQueueIF::NO_QUEUE) {
|
||||||
|
result = sendConfirmationRequest(event, powerConfirmation);
|
||||||
|
if (result == RETURN_OK) {
|
||||||
|
setFdirState(DEVICE_MIGHT_BE_OFF);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Fuse::FUSE_WENT_OFF:
|
||||||
|
// Not so good, because PCDU reacted.
|
||||||
|
case Fuse::POWER_ABOVE_HIGH_LIMIT:
|
||||||
|
// Better, because software detected over-current.
|
||||||
|
setFaulty(event->getEvent());
|
||||||
|
break;
|
||||||
|
case Fuse::POWER_BELOW_LOW_LIMIT:
|
||||||
|
// Device might got stuck during boot, retry.
|
||||||
|
// handleRecovery(event->getEvent());
|
||||||
|
triggerEvent(syrlinks::FDIR_REACTION_IGNORED, event->getEvent(), 0);
|
||||||
|
break;
|
||||||
|
//****Thermal*****
|
||||||
|
case ThermalComponentIF::COMPONENT_TEMP_LOW:
|
||||||
|
case ThermalComponentIF::COMPONENT_TEMP_HIGH:
|
||||||
|
case ThermalComponentIF::COMPONENT_TEMP_OOL_LOW:
|
||||||
|
case ThermalComponentIF::COMPONENT_TEMP_OOL_HIGH:
|
||||||
|
// Well, the device is not really faulty, but it is required to stay off as long as possible.
|
||||||
|
setFaulty(event->getEvent());
|
||||||
|
break;
|
||||||
|
case ThermalComponentIF::TEMP_NOT_IN_OP_RANGE:
|
||||||
|
// Ignore, is information only.
|
||||||
|
break;
|
||||||
|
//*******Default monitoring variables. Are currently not used.*****
|
||||||
|
// case DeviceHandlerIF::MONITORING_LIMIT_EXCEEDED:
|
||||||
|
// setFaulty(event->getEvent());
|
||||||
|
// break;
|
||||||
|
// case DeviceHandlerIF::MONITORING_AMBIGUOUS:
|
||||||
|
// break;
|
||||||
|
default:
|
||||||
|
// We don't know the event, someone else should handle it.
|
||||||
|
return RETURN_FAILED;
|
||||||
|
}
|
||||||
|
return RETURN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SyrlinksFdir::eventConfirmed(EventMessage* event) {
|
||||||
|
switch (event->getEvent()) {
|
||||||
|
case DeviceHandlerIF::DEVICE_SENDING_COMMAND_FAILED:
|
||||||
|
case DeviceHandlerIF::DEVICE_REQUESTING_REPLY_FAILED:
|
||||||
|
case DeviceHandlerIF::DEVICE_MISSED_REPLY:
|
||||||
|
if (missedReplyCount.incrementAndCheck()) {
|
||||||
|
// handleRecovery(event->getEvent());
|
||||||
|
triggerEvent(syrlinks::FDIR_REACTION_IGNORED, event->getEvent(), 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PowerSwitchIF::SWITCH_WENT_OFF:
|
||||||
|
// This means the switch went off only for one device.
|
||||||
|
// handleRecovery(event->getEvent());
|
||||||
|
triggerEvent(syrlinks::FDIR_REACTION_IGNORED, event->getEvent(), 0);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
15
mission/system/fdir/SyrlinksFdir.h
Normal file
15
mission/system/fdir/SyrlinksFdir.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#ifndef MISSION_DEVICES_SYRLINKSFDIR_H_
|
||||||
|
#define MISSION_DEVICES_SYRLINKSFDIR_H_
|
||||||
|
|
||||||
|
#include <fsfw/devicehandlers/DeviceHandlerFailureIsolation.h>
|
||||||
|
|
||||||
|
class SyrlinksFdir : public DeviceHandlerFailureIsolation {
|
||||||
|
public:
|
||||||
|
SyrlinksFdir(object_id_t syrlinksId);
|
||||||
|
|
||||||
|
private:
|
||||||
|
ReturnValue_t eventReceived(EventMessage* event) override;
|
||||||
|
void eventConfirmed(EventMessage* event) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* MISSION_DEVICES_SYRLINKSFDIR_H_ */
|
@ -10,8 +10,4 @@ target_sources(${LIB_EIVE_MISSION} PRIVATE
|
|||||||
PowerStateMachineBase.cpp
|
PowerStateMachineBase.cpp
|
||||||
DualLaneAssemblyBase.cpp
|
DualLaneAssemblyBase.cpp
|
||||||
TcsBoardAssembly.cpp
|
TcsBoardAssembly.cpp
|
||||||
|
|
||||||
AcsBoardFdir.cpp
|
|
||||||
SusFdir.cpp
|
|
||||||
RtdFdir.cpp
|
|
||||||
)
|
)
|
||||||
|
1
thirdparty/etl
vendored
1
thirdparty/etl
vendored
@ -1 +0,0 @@
|
|||||||
Subproject commit c308dc427b7a34e54f33860fb2e244564b2740b4
|
|
3
thirdparty/libcsp/src/csp_iflist.c
vendored
3
thirdparty/libcsp/src/csp_iflist.c
vendored
@ -77,7 +77,10 @@ static int csp_bytesize(char *buf, int len, unsigned long int n) {
|
|||||||
postfix = 'B';
|
postfix = 'B';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wformat-truncation"
|
||||||
return snprintf(buf, len, "%.1f%c", size, postfix);
|
return snprintf(buf, len, "%.1f%c", size, postfix);
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
}
|
}
|
||||||
|
|
||||||
void csp_iflist_print(void) {
|
void csp_iflist_print(void) {
|
||||||
|
2
tmtc
2
tmtc
@ -1 +1 @@
|
|||||||
Subproject commit 76da8042a4601087e99fa856af241afe9e43695d
|
Subproject commit 0a47c17fa699dc571d2d3e63ec08c9f4cf513f65
|
Loading…
Reference in New Issue
Block a user