diff --git a/CHANGELOG.md b/CHANGELOG.md index fd68ddf9..1676b812 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,12 +19,6 @@ and this project adheres to [Semantic Versioning](http://semver.org/). - Bump C++ required version to C++17. Every project which uses the FSFW and every modern compiler supports it PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/622 -- HAL Linux SPI: Set the Clock Default State when setting new SPI speed - and mode - PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/573 -- GPIO HAL: `Direction`, `GpioOperation` and `Levels` are enum classes now, which prevents - name clashes with Windows defines. - PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/572 - New CMake option `FSFW_HAL_LINUX_ADD_LIBGPIOD` to specifically exclude `gpiod` code. PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/572 - HAL Devicehandlers: Periodic printout is run-time configurable now @@ -91,6 +85,7 @@ PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/636 PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/572 - HAL Linux Uart: Baudrate and bits per word are enums now, avoiding misconfigurations PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/585 +- Linux HAL: Add wiretapping option for I2C. Enabled with `FSFW_HAL_I2C_WIRETAPPING` defined to 1 ### Time @@ -153,17 +148,6 @@ https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/593 PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/590 - `Subsystem`: New API to add table and sequence entries -## HAL - -- SPI: Cache the SPI device in the communication interface. Architecturally, this makes a - lot more sense because each ComIF should be responsible for one SPI bus. -- SPI: Move the empty transfer to update the line polarity to separate function. This means - it is not automatically called when calling the setter function for SPI speed and mode. - The user should call this function after locking the CS mutex if multiple SPI devices with - differing speeds and modes are attached to one bus. -- SPI: Getter functions for SPI speed and mode. -- I2C: Add wiretapping option for I2C. Enabled with `FSFW_HAL_I2C_WIRETAPPING` defined to 1. - ## Fixed - TCP TMTC Server: `MutexGuard` was not created properly in diff --git a/CMakeLists.txt b/CMakeLists.txt index 15e7662a..c87acecd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -189,7 +189,7 @@ message( ) # Check whether the user has already installed ETL first -find_package(${FSFW_ETL_LIB_NAME} ${FSFW_ETL_LIB_MAJOR_VERSION} CONFIG QUIET) +find_package(${FSFW_ETL_LIB_NAME} ${FSFW_ETL_LIB_MAJOR_VERSION} QUIET) # Not installed, so use FetchContent to download and provide etl if(NOT ${FSFW_ETL_LIB_NAME}_FOUND) message( diff --git a/src/fsfw/devicehandlers/DeviceHandlerBase.h b/src/fsfw/devicehandlers/DeviceHandlerBase.h index 58e54da0..7e6f0d19 100644 --- a/src/fsfw/devicehandlers/DeviceHandlerBase.h +++ b/src/fsfw/devicehandlers/DeviceHandlerBase.h @@ -7,6 +7,7 @@ #include "DeviceHandlerFailureIsolation.h" #include "DeviceHandlerIF.h" #include "DeviceHandlerThermalSet.h" +#include "DhbCfgHelpers.h" #include "fsfw/action/ActionHelper.h" #include "fsfw/action/HasActionsIF.h" #include "fsfw/datapool/PoolVariableIF.h" @@ -488,9 +489,9 @@ class DeviceHandlerBase : public DeviceHandlerIF, * @return - @c RETURN_OK when the command was successfully inserted, * - @c RETURN_FAILED else. */ - ReturnValue_t insertInCommandMap(DeviceCommandId_t deviceCommand, - bool useAlternativeReply = false, - DeviceCommandId_t alternativeReplyId = 0); + ReturnValue_t insertInCommandMap( + DeviceCommandId_t deviceCommand, bool useAlternativeReply = false, + DeviceCommandId_t alternativeReplyId = DeviceHandlerIF::NO_COMMAND_ID); /** * Enables a periodic reply for a given command. It sets to delay cycles to the specified diff --git a/src/fsfw/devicehandlers/DhbCfgHelpers.h b/src/fsfw/devicehandlers/DhbCfgHelpers.h new file mode 100644 index 00000000..fd838297 --- /dev/null +++ b/src/fsfw/devicehandlers/DhbCfgHelpers.h @@ -0,0 +1,72 @@ +#ifndef FSFW_SRC_FSFW_DEVICEHANDLERS_DHBCFGHELPERS_H_ +#define FSFW_SRC_FSFW_DEVICEHANDLERS_DHBCFGHELPERS_H_ + +/** + * @brief This is the base class for configuration related to both DHB commands, replies and their + * combination + */ +struct CfgBase { + public: + explicit CfgBase(DeviceCommandId_t cmdAndOrReplyId) : cmdAndOrReplyId(cmdAndOrReplyId){}; + DeviceCommandId_t cmdAndOrReplyId; +}; + +/** + * @brief Configuration class for commands + */ +struct CmdCfg { + public: + explicit CmdCfg(DeviceCommandId_t cmdId) : baseCfg(cmdId){}; + + CfgBase baseCfg; + //! This can be used if a command can trigger multiple replies + std::pair alternativeReply = {false, DeviceHandlerIF::NO_COMMAND_ID}; +}; + +/** + * @brief Configuration class for replies + */ +struct ReplyCfg { + public: + ReplyCfg(DeviceCommandId_t replyId, uint16_t maxDelayCycles) + : baseCfg(replyId), maxDelayCycles(maxDelayCycles){}; + ReplyCfg(DeviceCommandId_t replyId, uint16_t maxDelayCycles, LocalPoolDataSetBase* set) + : ReplyCfg(replyId, maxDelayCycles) { + dataSet = set; + }; + + CfgBase baseCfg; + //! A data set can be mapped to a reply ID. This allows to omit the #getDataSetHandle + //! override in a user device handler as this pointer will be passed as long as the device + //! command ID is equal to the set ID. + LocalPoolDataSetBase* dataSet = nullptr; + //! For Command-Reply combinations: + //! The maximum number of cycles the handler should wait for a reply + //! to this command. + //! + //! Reply Only: + //! For periodic replies, this variable will be the number of delay cycles between the replies. + //! For the non-periodic variant, this variable is not used as there is no meaningful + //! definition for delay + uint16_t maxDelayCycles = 0; + //! First parameter: Specify whether reply is arriving periodically + //! Second parameter: Specify whether periodic reply should be enabled immediately + std::pair periodicCfg = {false, false}; + //! If a reply needs to be requested with a specific length, the length can be specified here + size_t replyLen = 0; + //! It is also possible to use a time based instead of a cycle based mechanism to specify + //! how long a reply takes. For non-periodic replies without a command, this variable is not used. + Countdown* countdown = nullptr; +}; + +/** + * @brief Configuration class for commands and replies + */ +struct CmdReplyCfg { + public: + CmdReplyCfg(CmdCfg cmdCfg, ReplyCfg replyCfg) : cmdCfg(cmdCfg), replyCfg(replyCfg) {} + CmdCfg cmdCfg; + ReplyCfg replyCfg; +}; + +#endif /* FSFW_SRC_FSFW_DEVICEHANDLERS_DHBCFGHELPERS_H_ */