diff --git a/FprimeZephyrReference/Components/Drv/CMakeLists.txt b/FprimeZephyrReference/Components/Drv/CMakeLists.txt index c37c4d2..efcd2f9 100644 --- a/FprimeZephyrReference/Components/Drv/CMakeLists.txt +++ b/FprimeZephyrReference/Components/Drv/CMakeLists.txt @@ -1,4 +1,3 @@ -add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Helpers/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Ina219Manager/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Lis2mdlManager/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Lsm6dsoManager/") diff --git a/FprimeZephyrReference/Components/Drv/Helpers/CMakeLists.txt b/FprimeZephyrReference/Components/Drv/Helpers/CMakeLists.txt deleted file mode 100644 index 5bac4cd..0000000 --- a/FprimeZephyrReference/Components/Drv/Helpers/CMakeLists.txt +++ /dev/null @@ -1,34 +0,0 @@ -#### -# F Prime CMakeLists.txt: -# -# SOURCES: list of source files (to be compiled) -# AUTOCODER_INPUTS: list of files to be passed to the autocoders -# DEPENDS: list of libraries that this module depends on -# -# More information in the F´ CMake API documentation: -# https://fprime.jpl.nasa.gov/latest/docs/reference/api/cmake/API/ -# -#### - -# Module names are derived from the path from the nearest project/library/framework -# root when not specifically overridden by the developer. i.e. The module defined by -# `Ref/SignalGen/CMakeLists.txt` will be named `Ref_SignalGen`. - -register_fprime_library( - SOURCES - "${CMAKE_CURRENT_LIST_DIR}/Helpers.cpp" - DEPENDS - Fw_Types -) - -### Unit Tests ### -# register_fprime_ut( -# AUTOCODER_INPUTS -# "${CMAKE_CURRENT_LIST_DIR}/Helpers.fpp" -# SOURCES -# "${CMAKE_CURRENT_LIST_DIR}/test/ut/HelpersTestMain.cpp" -# "${CMAKE_CURRENT_LIST_DIR}/test/ut/HelpersTester.cpp" -# DEPENDS -# STest # For rules-based testing -# UT_AUTO_HELPERS -# ) diff --git a/FprimeZephyrReference/Components/Drv/Helpers/Helpers.cpp b/FprimeZephyrReference/Components/Drv/Helpers/Helpers.cpp deleted file mode 100644 index fac9e1f..0000000 --- a/FprimeZephyrReference/Components/Drv/Helpers/Helpers.cpp +++ /dev/null @@ -1,16 +0,0 @@ -// ====================================================================== -// \title Helpers.cpp -// \brief cpp file for Helpers component implementation class -// ====================================================================== - -#include "FprimeZephyrReference/Components/Drv/Helpers/Helpers.hpp" - -#include - -namespace Drv { - -F64 sensor_value_to_f64(const struct sensor_value& val) { - return val.val1 + (val.val2 / 1000000.0f); -} - -} // namespace Drv diff --git a/FprimeZephyrReference/Components/Drv/Helpers/Helpers.hpp b/FprimeZephyrReference/Components/Drv/Helpers/Helpers.hpp deleted file mode 100644 index 02c9325..0000000 --- a/FprimeZephyrReference/Components/Drv/Helpers/Helpers.hpp +++ /dev/null @@ -1,19 +0,0 @@ -// ====================================================================== -// \title Helpers.hpp -// \brief hpp file for Helpers component implementation class -// ====================================================================== - -#ifndef Components_Helpers_HPP -#define Components_Helpers_HPP - -#include -#include - -namespace Drv { - -//! Convert a Zephyr sensor_value to an Fprime F64 -F64 sensor_value_to_f64(const struct sensor_value& val); - -} // namespace Drv - -#endif diff --git a/FprimeZephyrReference/Components/Drv/Lis2mdlManager/CMakeLists.txt b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/CMakeLists.txt index 1bdafd8..482ee77 100644 --- a/FprimeZephyrReference/Components/Drv/Lis2mdlManager/CMakeLists.txt +++ b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/CMakeLists.txt @@ -19,8 +19,8 @@ register_fprime_library( "${CMAKE_CURRENT_LIST_DIR}/Lis2mdlManager.fpp" SOURCES "${CMAKE_CURRENT_LIST_DIR}/Lis2mdlManager.cpp" - DEPENDS - FprimeZephyrReference_Components_Drv_Helpers + # DEPENDS + # FprimeZephyrReference_Components_Drv_Helpers ) ### Unit Tests ### diff --git a/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp index e0b133f..23484e4 100644 --- a/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp +++ b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp @@ -13,18 +13,24 @@ namespace Drv { // Component construction and destruction // ---------------------------------------------------------------------- -Lis2mdlManager ::Lis2mdlManager(const char* const compName) : Lis2mdlManagerComponentBase(compName) { - dev = device_get_binding("LIS2MDL"); -} +Lis2mdlManager ::Lis2mdlManager(const char* const compName) : Lis2mdlManagerComponentBase(compName) {} Lis2mdlManager ::~Lis2mdlManager() {} +// ---------------------------------------------------------------------- +// Helper methods +// ---------------------------------------------------------------------- + +void Lis2mdlManager ::configure(const struct device* dev) { + this->m_dev = dev; +} + // ---------------------------------------------------------------------- // Handler implementations for typed input ports // ---------------------------------------------------------------------- Drv::MagneticField Lis2mdlManager ::magneticFieldGet_handler(FwIndexType portNum) { - if (!device_is_ready(dev)) { + if (!device_is_ready(this->m_dev)) { this->log_WARNING_HI_DeviceNotReady(); return Drv::MagneticField(0.0, 0.0, 0.0); } @@ -34,14 +40,14 @@ Drv::MagneticField Lis2mdlManager ::magneticFieldGet_handler(FwIndexType portNum struct sensor_value y; struct sensor_value z; - sensor_sample_fetch_chan(dev, SENSOR_CHAN_MAGN_XYZ); + sensor_sample_fetch_chan(this->m_dev, SENSOR_CHAN_MAGN_XYZ); - sensor_channel_get(dev, SENSOR_CHAN_MAGN_X, &x); - sensor_channel_get(dev, SENSOR_CHAN_MAGN_Y, &y); - sensor_channel_get(dev, SENSOR_CHAN_MAGN_Z, &z); + sensor_channel_get(this->m_dev, SENSOR_CHAN_MAGN_X, &x); + sensor_channel_get(this->m_dev, SENSOR_CHAN_MAGN_Y, &y); + sensor_channel_get(this->m_dev, SENSOR_CHAN_MAGN_Z, &z); Drv::MagneticField magnetic_readings = - Drv::MagneticField(Drv::sensor_value_to_f64(x), Drv::sensor_value_to_f64(y), Drv::sensor_value_to_f64(z)); + Drv::MagneticField(sensor_value_to_double(&x), sensor_value_to_double(&y), sensor_value_to_double(&z)); this->tlmWrite_MagneticField(magnetic_readings); diff --git a/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.hpp b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.hpp index 34f5de3..f7850ce 100644 --- a/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.hpp +++ b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.hpp @@ -6,11 +6,7 @@ #ifndef Components_Lis2mdlManager_HPP #define Components_Lis2mdlManager_HPP -// clang-format off -// Keep the includes in this order #include "FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManagerComponentAc.hpp" -#include "FprimeZephyrReference/Components/Drv/Helpers/Helpers.hpp" -// clang-format on #include #include @@ -30,6 +26,14 @@ class Lis2mdlManager final : public Lis2mdlManagerComponentBase { //! Destroy Lis2mdlManager object ~Lis2mdlManager(); + public: + // ---------------------------------------------------------------------- + // Helper methods + // ---------------------------------------------------------------------- + + //! Configure the LIS2MDL device + void configure(const struct device* dev); + private: // ---------------------------------------------------------------------- // Handler implementations for typed input ports @@ -44,7 +48,7 @@ class Lis2mdlManager final : public Lis2mdlManagerComponentBase { // ---------------------------------------------------------------------- //! Zephyr device stores the initialized LIS2MDL sensor - const struct device* dev; + const struct device* m_dev; }; } // namespace Drv diff --git a/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/CMakeLists.txt b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/CMakeLists.txt index 9ec411e..b7bea3a 100644 --- a/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/CMakeLists.txt +++ b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/CMakeLists.txt @@ -19,8 +19,8 @@ register_fprime_library( "${CMAKE_CURRENT_LIST_DIR}/Lsm6dsoManager.fpp" SOURCES "${CMAKE_CURRENT_LIST_DIR}/Lsm6dsoManager.cpp" - DEPENDS - FprimeZephyrReference_Components_Drv_Helpers + # DEPENDS + # FprimeZephyrReference_Components_Drv_Helpers ) ### Unit Tests ### diff --git a/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.cpp b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.cpp index a0d219c..c0cf0cb 100644 --- a/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.cpp +++ b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.cpp @@ -13,29 +13,35 @@ namespace Drv { // Component construction and destruction // ---------------------------------------------------------------------- -Lsm6dsoManager ::Lsm6dsoManager(const char* const compName) : Lsm6dsoManagerComponentBase(compName) { - dev = DEVICE_DT_GET_ONE(st_lsm6dso); +Lsm6dsoManager ::Lsm6dsoManager(const char* const compName) : Lsm6dsoManagerComponentBase(compName) {} + +Lsm6dsoManager ::~Lsm6dsoManager() {} + +// ---------------------------------------------------------------------- +// Helper methods +// ---------------------------------------------------------------------- + +void Lsm6dsoManager ::configure(const struct device* dev) { + this->m_dev = dev; // Configure the sensor struct sensor_value odr = {.val1 = 12, .val2 = 500000}; // 12.5 Hz - if (sensor_attr_set(dev, SENSOR_CHAN_ACCEL_XYZ, SENSOR_ATTR_SAMPLING_FREQUENCY, &odr) != 0) { + if (sensor_attr_set(this->m_dev, SENSOR_CHAN_ACCEL_XYZ, SENSOR_ATTR_SAMPLING_FREQUENCY, &odr) != 0) { this->log_WARNING_HI_AccelerometerSamplingFrequencyNotConfigured(); } - if (sensor_attr_set(dev, SENSOR_CHAN_GYRO_XYZ, SENSOR_ATTR_SAMPLING_FREQUENCY, &odr) != 0) { + if (sensor_attr_set(this->m_dev, SENSOR_CHAN_GYRO_XYZ, SENSOR_ATTR_SAMPLING_FREQUENCY, &odr) != 0) { this->log_WARNING_HI_GyroscopeSamplingFrequencyNotConfigured(); } } -Lsm6dsoManager ::~Lsm6dsoManager() {} - // ---------------------------------------------------------------------- // Handler implementations for typed input ports // ---------------------------------------------------------------------- Drv::Acceleration Lsm6dsoManager ::accelerationGet_handler(FwIndexType portNum) { - if (!device_is_ready(dev)) { + if (!device_is_ready(this->m_dev)) { this->log_WARNING_HI_DeviceNotReady(); return Drv::Acceleration(0.0, 0.0, 0.0); } @@ -45,21 +51,21 @@ Drv::Acceleration Lsm6dsoManager ::accelerationGet_handler(FwIndexType portNum) struct sensor_value y; struct sensor_value z; - sensor_sample_fetch_chan(dev, SENSOR_CHAN_ACCEL_XYZ); + sensor_sample_fetch_chan(this->m_dev, SENSOR_CHAN_ACCEL_XYZ); - sensor_channel_get(dev, SENSOR_CHAN_ACCEL_X, &x); - sensor_channel_get(dev, SENSOR_CHAN_ACCEL_Y, &y); - sensor_channel_get(dev, SENSOR_CHAN_ACCEL_Z, &z); + sensor_channel_get(this->m_dev, SENSOR_CHAN_ACCEL_X, &x); + sensor_channel_get(this->m_dev, SENSOR_CHAN_ACCEL_Y, &y); + sensor_channel_get(this->m_dev, SENSOR_CHAN_ACCEL_Z, &z); Drv::Acceleration acceleration = - Drv::Acceleration(Drv::sensor_value_to_f64(x), Drv::sensor_value_to_f64(y), Drv::sensor_value_to_f64(z)); + Drv::Acceleration(sensor_value_to_double(&x), sensor_value_to_double(&y), sensor_value_to_double(&z)); this->tlmWrite_Acceleration(acceleration); return acceleration; } Drv::AngularVelocity Lsm6dsoManager ::angularVelocityGet_handler(FwIndexType portNum) { - if (!device_is_ready(dev)) { + if (!device_is_ready(this->m_dev)) { this->log_WARNING_HI_DeviceNotReady(); return Drv::AngularVelocity(0.0, 0.0, 0.0); } @@ -69,21 +75,21 @@ Drv::AngularVelocity Lsm6dsoManager ::angularVelocityGet_handler(FwIndexType por struct sensor_value y; struct sensor_value z; - sensor_sample_fetch_chan(dev, SENSOR_CHAN_GYRO_XYZ); + sensor_sample_fetch_chan(this->m_dev, SENSOR_CHAN_GYRO_XYZ); - sensor_channel_get(dev, SENSOR_CHAN_GYRO_X, &x); - sensor_channel_get(dev, SENSOR_CHAN_GYRO_Y, &y); - sensor_channel_get(dev, SENSOR_CHAN_GYRO_Z, &z); + sensor_channel_get(this->m_dev, SENSOR_CHAN_GYRO_X, &x); + sensor_channel_get(this->m_dev, SENSOR_CHAN_GYRO_Y, &y); + sensor_channel_get(this->m_dev, SENSOR_CHAN_GYRO_Z, &z); Drv::AngularVelocity angular_velocity = - Drv::AngularVelocity(Drv::sensor_value_to_f64(x), Drv::sensor_value_to_f64(y), Drv::sensor_value_to_f64(z)); + Drv::AngularVelocity(sensor_value_to_double(&x), sensor_value_to_double(&y), sensor_value_to_double(&z)); this->tlmWrite_AngularVelocity(angular_velocity); return angular_velocity; } F64 Lsm6dsoManager ::temperatureGet_handler(FwIndexType portNum) { - if (!device_is_ready(dev)) { + if (!device_is_ready(this->m_dev)) { this->log_WARNING_HI_DeviceNotReady(); return 0; } @@ -91,13 +97,13 @@ F64 Lsm6dsoManager ::temperatureGet_handler(FwIndexType portNum) { struct sensor_value temp; - sensor_sample_fetch_chan(dev, SENSOR_CHAN_DIE_TEMP); + sensor_sample_fetch_chan(this->m_dev, SENSOR_CHAN_DIE_TEMP); - sensor_channel_get(dev, SENSOR_CHAN_DIE_TEMP, &temp); + sensor_channel_get(this->m_dev, SENSOR_CHAN_DIE_TEMP, &temp); - this->tlmWrite_Temperature(Drv::sensor_value_to_f64(temp)); + this->tlmWrite_Temperature(sensor_value_to_double(&temp)); - return Drv::sensor_value_to_f64(temp); + return sensor_value_to_double(&temp); } } // namespace Drv diff --git a/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.hpp b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.hpp index 2a15c39..e28bc24 100644 --- a/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.hpp +++ b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.hpp @@ -6,11 +6,7 @@ #ifndef Components_Lsm6dsoManager_HPP #define Components_Lsm6dsoManager_HPP -// clang-format off -// Keep the includes in this order #include "FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManagerComponentAc.hpp" -#include "FprimeZephyrReference/Components/Drv/Helpers/Helpers.hpp" -// clang-format on #include #include @@ -30,6 +26,14 @@ class Lsm6dsoManager final : public Lsm6dsoManagerComponentBase { //! Destroy Lsm6dsoManager object ~Lsm6dsoManager(); + public: + // ---------------------------------------------------------------------- + // Helper methods + // ---------------------------------------------------------------------- + + //! Configure the LSM6DSO device + void configure(const struct device* dev); + private: // ---------------------------------------------------------------------- // Handler implementations for typed input ports @@ -52,7 +56,7 @@ class Lsm6dsoManager final : public Lsm6dsoManagerComponentBase { // ---------------------------------------------------------------------- //! Zephyr device stores the initialized LSM6DSO sensor - const struct device* dev; + const struct device* m_dev; }; } // namespace Drv diff --git a/FprimeZephyrReference/ReferenceDeployment/Main.cpp b/FprimeZephyrReference/ReferenceDeployment/Main.cpp index 9c95ac8..6b5187a 100644 --- a/FprimeZephyrReference/ReferenceDeployment/Main.cpp +++ b/FprimeZephyrReference/ReferenceDeployment/Main.cpp @@ -14,6 +14,8 @@ const struct device* ina219Sys = device_get_binding("INA219 sys"); const struct device* ina219Sol = device_get_binding("INA219 sol"); const struct device* serial = DEVICE_DT_GET(DT_NODELABEL(cdc_acm_uart0)); const struct device* lora = DEVICE_DT_GET(DT_NODELABEL(lora0)); +const struct device* lsm6dso = DEVICE_DT_GET(DT_NODELABEL(lsm6dso0)); +const struct device* lis2mdl = DEVICE_DT_GET(DT_NODELABEL(lis2mdl0)); int main(int argc, char* argv[]) { // ** DO NOT REMOVE **// @@ -28,6 +30,8 @@ int main(int argc, char* argv[]) { inputs.ina219SolDevice = ina219Sol; inputs.loraDevice = lora; inputs.uartDevice = serial; + inputs.lsm6dsoDevice = lsm6dso; + inputs.lis2mdlDevice = lis2mdl; inputs.baudRate = 115200; // Setup, cycle, and teardown topology diff --git a/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentTopology.cpp b/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentTopology.cpp index 35871a2..0580479 100644 --- a/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentTopology.cpp +++ b/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentTopology.cpp @@ -87,6 +87,9 @@ void setupTopology(const TopologyState& state) { // for over-the-air communications. lora.start(state.loraDevice, Zephyr::TransmitState::DISABLED); comDriver.configure(state.uartDevice, state.baudRate); + + lsm6dsoManager.configure(state.lsm6dsoDevice); + lis2mdlManager.configure(state.lis2mdlDevice); ina219SysManager.configure(state.ina219SysDevice); ina219SolManager.configure(state.ina219SolDevice); } diff --git a/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentTopologyDefs.hpp b/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentTopologyDefs.hpp index 40e6680..fc9fe0c 100644 --- a/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentTopologyDefs.hpp +++ b/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentTopologyDefs.hpp @@ -73,6 +73,8 @@ struct TopologyState { const device* ina219SolDevice; //!< device path for solar panel ina219 const device* uartDevice; //!< UART device path for communication const device* loraDevice; //!< LoRa device path for communication + const device* lsm6dsoDevice; //!< LSM6DSO device path for accelerometer/gyroscope + const device* lis2mdlDevice; //!< LIS2MDL device path for magnetometer U32 baudRate; //!< Baud rate for UART communication CdhCore::SubtopologyState cdhCore; //!< Subtopology state for CdhCore ComCcsds::SubtopologyState comCcsds; //!< Subtopology state for ComCcsds diff --git a/boards/bronco_space/proves_flight_control_board_v5/proves_flight_control_board_v5.dtsi b/boards/bronco_space/proves_flight_control_board_v5/proves_flight_control_board_v5.dtsi index 9eaeb2c..363ac07 100644 --- a/boards/bronco_space/proves_flight_control_board_v5/proves_flight_control_board_v5.dtsi +++ b/boards/bronco_space/proves_flight_control_board_v5/proves_flight_control_board_v5.dtsi @@ -178,7 +178,7 @@ zephyr_udc0: &usbd { label = "LSM6DSO"; }; - lis2mdl: lis2mdl@1e { + lis2mdl0: lis2mdl0@1e { compatible = "st,lis2mdl"; reg = <0x1e>; label = "LIS2MDL";