diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..fbf52d32 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,31 @@ +# Pull Request Title (e.g., Feature: Add user authentication) + +## Description + + + +## Related Issues/Tickets + + + +## How Has This Been Tested? + + + +- [ ] Unit tests +- [ ] Integration tests +- [ ] Z Tests +- [ ] Manual testing (describe steps) + +## Screenshots / Recordings (if applicable) + + + +## Checklist + +- [ ] Written detailed sdd with requirements, channels, ports, commands, telemetry defined and correctly formatted and spelled +- [ ] Have written relevant integration tests and have documented them in the sdd +- [ ] Have done a code review with +- [ ] Have tested this PR on every supported board with correct board definitions + +## Further Notes / Considerations diff --git a/.gitignore b/.gitignore index 1e9df69d..352a9f89 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ lib/zephyr-workspace/* .DS_Store *.gcov build +settings.ini **/__pycache__/ **/*.egg-info/ diff --git a/FprimeZephyrReference/Components/Drv/CMakeLists.txt b/FprimeZephyrReference/Components/Drv/CMakeLists.txt index c85b7be5..cfcd92d7 100644 --- a/FprimeZephyrReference/Components/Drv/CMakeLists.txt +++ b/FprimeZephyrReference/Components/Drv/CMakeLists.txt @@ -1,6 +1,5 @@ # Include project-wide components here - add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Helpers/") -add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Lis2mdlDriver/") -add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Lsm6dsoDriver/") +add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Lis2mdlManager/") +add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Lsm6dsoManager/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Types/") diff --git a/FprimeZephyrReference/Components/Drv/Helpers/CMakeLists.txt b/FprimeZephyrReference/Components/Drv/Helpers/CMakeLists.txt index d4fca52e..5bac4cd6 100644 --- a/FprimeZephyrReference/Components/Drv/Helpers/CMakeLists.txt +++ b/FprimeZephyrReference/Components/Drv/Helpers/CMakeLists.txt @@ -15,12 +15,10 @@ # `Ref/SignalGen/CMakeLists.txt` will be named `Ref_SignalGen`. register_fprime_library( - AUTOCODER_INPUTS - "${CMAKE_CURRENT_LIST_DIR}/Helpers.fpp" SOURCES "${CMAKE_CURRENT_LIST_DIR}/Helpers.cpp" -# DEPENDS -# MyPackage_MyOtherModule + DEPENDS + Fw_Types ) ### Unit Tests ### diff --git a/FprimeZephyrReference/Components/Drv/Helpers/Helpers.cpp b/FprimeZephyrReference/Components/Drv/Helpers/Helpers.cpp index 900ed97f..fac9e1f0 100644 --- a/FprimeZephyrReference/Components/Drv/Helpers/Helpers.cpp +++ b/FprimeZephyrReference/Components/Drv/Helpers/Helpers.cpp @@ -10,7 +10,7 @@ namespace Drv { F64 sensor_value_to_f64(const struct sensor_value& val) { - return val.val1 + val.val2 / 1000000.0f; + return val.val1 + (val.val2 / 1000000.0f); } } // namespace Drv diff --git a/FprimeZephyrReference/Components/Drv/Helpers/Helpers.fpp b/FprimeZephyrReference/Components/Drv/Helpers/Helpers.fpp deleted file mode 100644 index e69de29b..00000000 diff --git a/FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/CMakeLists.txt b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/CMakeLists.txt similarity index 73% rename from FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/CMakeLists.txt rename to FprimeZephyrReference/Components/Drv/Lis2mdlManager/CMakeLists.txt index 506cfda0..1bdafd80 100644 --- a/FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/CMakeLists.txt +++ b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/CMakeLists.txt @@ -16,9 +16,9 @@ register_fprime_library( AUTOCODER_INPUTS - "${CMAKE_CURRENT_LIST_DIR}/Lsm6dsoDriver.fpp" + "${CMAKE_CURRENT_LIST_DIR}/Lis2mdlManager.fpp" SOURCES - "${CMAKE_CURRENT_LIST_DIR}/Lsm6dsoDriver.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Lis2mdlManager.cpp" DEPENDS FprimeZephyrReference_Components_Drv_Helpers ) @@ -26,10 +26,10 @@ register_fprime_library( ### Unit Tests ### # register_fprime_ut( # AUTOCODER_INPUTS -# "${CMAKE_CURRENT_LIST_DIR}/Lsm6dsoDriver.fpp" +# "${CMAKE_CURRENT_LIST_DIR}/Lis2mdlManager.fpp" # SOURCES -# "${CMAKE_CURRENT_LIST_DIR}/test/ut/Lsm6dsoDriverTestMain.cpp" -# "${CMAKE_CURRENT_LIST_DIR}/test/ut/Lsm6dsoDriverTester.cpp" +# "${CMAKE_CURRENT_LIST_DIR}/test/ut/Lis2mdlManagerTestMain.cpp" +# "${CMAKE_CURRENT_LIST_DIR}/test/ut/Lis2mdlManagerTester.cpp" # DEPENDS # STest # For rules-based testing # UT_AUTO_HELPERS diff --git a/FprimeZephyrReference/Components/Drv/Lis2mdlDriver/Lis2mdlDriver.cpp b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp similarity index 62% rename from FprimeZephyrReference/Components/Drv/Lis2mdlDriver/Lis2mdlDriver.cpp rename to FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp index 8b2de64b..1df2fd39 100644 --- a/FprimeZephyrReference/Components/Drv/Lis2mdlDriver/Lis2mdlDriver.cpp +++ b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp @@ -1,9 +1,9 @@ // ====================================================================== -// \title Lis2mdlDriver.cpp -// \brief cpp file for Lis2mdlDriver component implementation class +// \title Lis2mdlManager.cpp +// \brief cpp file for Lis2mdlManager component implementation class // ====================================================================== -#include "FprimeZephyrReference/Components/Drv/Lis2mdlDriver/Lis2mdlDriver.hpp" +#include "FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.hpp" #include @@ -13,23 +13,23 @@ namespace Drv { // Component construction and destruction // ---------------------------------------------------------------------- -Lis2mdlDriver ::Lis2mdlDriver(const char* const compName) : Lis2mdlDriverComponentBase(compName) { +Lis2mdlManager ::Lis2mdlManager(const char* const compName) : Lis2mdlManagerComponentBase(compName) { // Initialize the lis2mdl sensor lis2mdl = device_get_binding("LIS2MDL"); - FW_ASSERT(device_is_ready(lis2mdl)); } -Lis2mdlDriver ::~Lis2mdlDriver() {} +Lis2mdlManager ::~Lis2mdlManager() {} // ---------------------------------------------------------------------- // Handler implementations for typed input ports // ---------------------------------------------------------------------- -Drv::MagneticField Lis2mdlDriver ::magneticFieldRead_handler(FwIndexType portNum) { +Drv::MagneticField Lis2mdlManager ::magneticFieldRead_handler(FwIndexType portNum) { if (!device_is_ready(lis2mdl)) { this->log_WARNING_HI_DeviceNotReady(); return Drv::MagneticField(0.0, 0.0, 0.0); } + this->log_WARNING_HI_DeviceNotReady_ThrottleClear(); struct sensor_value x; struct sensor_value y; @@ -41,7 +41,12 @@ Drv::MagneticField Lis2mdlDriver ::magneticFieldRead_handler(FwIndexType portNum sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_Y, &y); sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_Z, &z); - return Drv::MagneticField(Drv::sensor_value_to_f64(x), Drv::sensor_value_to_f64(y), Drv::sensor_value_to_f64(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)); + + this->tlmWrite_MagneticField(magnetic_readings); + + return magnetic_readings; } } // namespace Drv diff --git a/FprimeZephyrReference/Components/Drv/Lis2mdlDriver/Lis2mdlDriver.fpp b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.fpp similarity index 75% rename from FprimeZephyrReference/Components/Drv/Lis2mdlDriver/Lis2mdlDriver.fpp rename to FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.fpp index 9c00f65f..8e722107 100644 --- a/FprimeZephyrReference/Components/Drv/Lis2mdlDriver/Lis2mdlDriver.fpp +++ b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.fpp @@ -5,14 +5,18 @@ module Drv { # Component definition module Drv { - @ LIS2MDL Driver Component for F Prime FSW framework. - passive component Lis2mdlDriver { + @ LIS2MDL Manager Component for F Prime FSW framework. + passive component Lis2mdlManager { @ Port to read the current magnetic field in gauss. sync input port magneticFieldRead: MagneticFieldRead @ Event for reporting LSM6DSO not ready error event DeviceNotReady() severity warning high format "LIS2MDL device not ready" throttle 5 + @ Telemetry channel for magnetic field in gauss + telemetry MagneticField: MagneticField + + ############################################################################### # Standard AC Ports: Required for Channels, Events, Commands, and Parameters # ############################################################################### @@ -24,5 +28,8 @@ module Drv { @ Port for sending events to downlink event port logOut + + @ Port for sending telemetry channels to downlink + telemetry port tlmOut } } diff --git a/FprimeZephyrReference/Components/Drv/Lis2mdlDriver/Lis2mdlDriver.hpp b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.hpp similarity index 73% rename from FprimeZephyrReference/Components/Drv/Lis2mdlDriver/Lis2mdlDriver.hpp rename to FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.hpp index 195d4551..42607ecc 100644 --- a/FprimeZephyrReference/Components/Drv/Lis2mdlDriver/Lis2mdlDriver.hpp +++ b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.hpp @@ -1,14 +1,14 @@ // ====================================================================== -// \title Lis2mdlDriver.hpp -// \brief hpp file for Lis2mdlDriver component implementation class +// \title Lis2mdlManager.hpp +// \brief hpp file for Lis2mdlManager component implementation class // ====================================================================== -#ifndef Components_Lis2mdlDriver_HPP -#define Components_Lis2mdlDriver_HPP +#ifndef Components_Lis2mdlManager_HPP +#define Components_Lis2mdlManager_HPP // clang-format off // Keep the includes in this order -#include "FprimeZephyrReference/Components/Drv/Lis2mdlDriver/Lis2mdlDriverComponentAc.hpp" +#include "FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManagerComponentAc.hpp" #include "FprimeZephyrReference/Components/Drv/Helpers/Helpers.hpp" // clang-format on @@ -18,17 +18,17 @@ namespace Drv { -class Lis2mdlDriver final : public Lis2mdlDriverComponentBase { +class Lis2mdlManager final : public Lis2mdlManagerComponentBase { public: // ---------------------------------------------------------------------- // Component construction and destruction // ---------------------------------------------------------------------- - //! Construct Lis2mdlDriver object - Lis2mdlDriver(const char* const compName); + //! Construct Lis2mdlManager object + Lis2mdlManager(const char* const compName); - //! Destroy Lis2mdlDriver object - ~Lis2mdlDriver(); + //! Destroy Lis2mdlManager object + ~Lis2mdlManager(); private: // ---------------------------------------------------------------------- diff --git a/FprimeZephyrReference/Components/Drv/Lis2mdlDriver/docs/sdd.md b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/docs/sdd.md similarity index 60% rename from FprimeZephyrReference/Components/Drv/Lis2mdlDriver/docs/sdd.md rename to FprimeZephyrReference/Components/Drv/Lis2mdlManager/docs/sdd.md index de376344..83b76489 100644 --- a/FprimeZephyrReference/Components/Drv/Lis2mdlDriver/docs/sdd.md +++ b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/docs/sdd.md @@ -1,10 +1,10 @@ -# Components::Lis2mdlDriver +# Components::Lis2mdlManager -The LIS2MDL Driver component interfaces with the LIS2MDL magnetometer to provide magnetic field measurements. +The LIS2MDL Manager component interfaces with the LIS2MDL magnetometer to provide magnetic field measurements. ## Usage Examples -The LIS2MDL Driver component is designed to be called periodically to collect and return sensor data. It operates as a passive component that responds to manager calls. +The LIS2MDL Manager component is designed to be called periodically to collect and return sensor data. It operates as a passive component that responds to manager calls. ### Typical Usage @@ -20,17 +20,17 @@ The LIS2MDL Driver component is designed to be called periodically to collect an ```mermaid classDiagram namespace Components { - class Lis2mdlDriverComponentBase { + class Lis2mdlManagerComponentBase { <> } - class Lis2mdlDriver { + class Lis2mdlManager { - lis2mdl: device* - + Lis2mdlDriver(char* compName) - + ~Lis2mdlDriver() + + Lis2mdlManager(char* compName) + + ~Lis2mdlManager() - magneticFieldRead_handler(FwIndexType portNum): Drv::MagneticField } } - Lis2mdlDriverComponentBase <|-- Lis2mdlDriver : inherits + Lis2mdlManagerComponentBase <|-- Lis2mdlManager : inherits ``` ## Port Descriptions @@ -43,16 +43,16 @@ classDiagram ```mermaid sequenceDiagram participant Manager - participant LIS2MDL Driver + participant LIS2MDL Manager participant Zephyr Sensor API participant LIS2MDL Sensor - Manager-->>LIS2MDL Driver: Call MagneticFieldRead synchronous input port - LIS2MDL Driver->>Zephyr Sensor API: Fetch sensor data + Manager-->>LIS2MDL Manager: Call MagneticFieldRead synchronous input port + LIS2MDL Manager->>Zephyr Sensor API: Fetch sensor data Zephyr Sensor API->>LIS2MDL Sensor: Read sensor LIS2MDL Sensor->>Zephyr Sensor API: Return sensor data - Zephyr Sensor API->>LIS2MDL Driver: Return x, y, z sensor_value structs - LIS2MDL Driver-->>Manager: Return MagneticField struct + Zephyr Sensor API->>LIS2MDL Manager: Return x, y, z sensor_value structs + LIS2MDL Manager-->>Manager: Return MagneticField struct ``` ## Requirements @@ -64,4 +64,4 @@ Add requirements in the chart below ## Change Log | Date | Description | |---|---| -| 2025-9-15 | Initial LIS2MDL Driver component | +| 2025-9-15 | Initial LIS2MDL Manager component | diff --git a/FprimeZephyrReference/Components/Drv/Lis2mdlDriver/CMakeLists.txt b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/CMakeLists.txt similarity index 73% rename from FprimeZephyrReference/Components/Drv/Lis2mdlDriver/CMakeLists.txt rename to FprimeZephyrReference/Components/Drv/Lsm6dsoManager/CMakeLists.txt index 8ddaf7ae..9ec411e3 100644 --- a/FprimeZephyrReference/Components/Drv/Lis2mdlDriver/CMakeLists.txt +++ b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/CMakeLists.txt @@ -16,9 +16,9 @@ register_fprime_library( AUTOCODER_INPUTS - "${CMAKE_CURRENT_LIST_DIR}/Lis2mdlDriver.fpp" + "${CMAKE_CURRENT_LIST_DIR}/Lsm6dsoManager.fpp" SOURCES - "${CMAKE_CURRENT_LIST_DIR}/Lis2mdlDriver.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Lsm6dsoManager.cpp" DEPENDS FprimeZephyrReference_Components_Drv_Helpers ) @@ -26,10 +26,10 @@ register_fprime_library( ### Unit Tests ### # register_fprime_ut( # AUTOCODER_INPUTS -# "${CMAKE_CURRENT_LIST_DIR}/Lis2mdlDriver.fpp" +# "${CMAKE_CURRENT_LIST_DIR}/Lsm6dsoManager.fpp" # SOURCES -# "${CMAKE_CURRENT_LIST_DIR}/test/ut/Lis2mdlDriverTestMain.cpp" -# "${CMAKE_CURRENT_LIST_DIR}/test/ut/Lis2mdlDriverTester.cpp" +# "${CMAKE_CURRENT_LIST_DIR}/test/ut/Lsm6dsoManagerTestMain.cpp" +# "${CMAKE_CURRENT_LIST_DIR}/test/ut/Lsm6dsoManagerTester.cpp" # DEPENDS # STest # For rules-based testing # UT_AUTO_HELPERS diff --git a/FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriver.cpp b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.cpp similarity index 66% rename from FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriver.cpp rename to FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.cpp index 3aa699f8..d62596c2 100644 --- a/FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriver.cpp +++ b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.cpp @@ -1,9 +1,9 @@ // ====================================================================== -// \title Lsm6dsoDriver.cpp -// \brief cpp file for Lsm6dsoDriver component implementation class +// \title Lsm6dsoManager.cpp +// \brief cpp file for Lsm6dsoManager component implementation class // ====================================================================== -#include "FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriver.hpp" +#include "FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.hpp" #include @@ -13,24 +13,21 @@ namespace Drv { // Component construction and destruction // ---------------------------------------------------------------------- -Lsm6dsoDriver ::Lsm6dsoDriver(const char* const compName) : Lsm6dsoDriverComponentBase(compName) { +Lsm6dsoManager ::Lsm6dsoManager(const char* const compName) : Lsm6dsoManagerComponentBase(compName) { // Initialize the LSM6DSO sensor lsm6dso = DEVICE_DT_GET_ONE(st_lsm6dso); - FW_ASSERT(device_is_ready(lsm6dso)); // Configure the LSM6DSO sensor struct sensor_value odr = {.val1 = 12, .val2 = 500000}; // 12.5 Hz - FW_ASSERT(sensor_attr_set(lsm6dso, SENSOR_CHAN_ACCEL_XYZ, SENSOR_ATTR_SAMPLING_FREQUENCY, &odr) == 0); - FW_ASSERT(sensor_attr_set(lsm6dso, SENSOR_CHAN_GYRO_XYZ, SENSOR_ATTR_SAMPLING_FREQUENCY, &odr) == 0); } -Lsm6dsoDriver ::~Lsm6dsoDriver() {} +Lsm6dsoManager ::~Lsm6dsoManager() {} // ---------------------------------------------------------------------- // Handler implementations for typed input ports // ---------------------------------------------------------------------- -Drv::Acceleration Lsm6dsoDriver ::accelerationRead_handler(FwIndexType portNum) { +Drv::Acceleration Lsm6dsoManager ::accelerationRead_handler(FwIndexType portNum) { if (!device_is_ready(lsm6dso)) { this->log_WARNING_HI_DeviceNotReady(); return Drv::Acceleration(0.0, 0.0, 0.0); @@ -46,10 +43,14 @@ Drv::Acceleration Lsm6dsoDriver ::accelerationRead_handler(FwIndexType portNum) sensor_channel_get(lsm6dso, SENSOR_CHAN_ACCEL_Y, &y); sensor_channel_get(lsm6dso, SENSOR_CHAN_ACCEL_Z, &z); - return Drv::Acceleration(Drv::sensor_value_to_f64(x), Drv::sensor_value_to_f64(y), Drv::sensor_value_to_f64(z)); + Drv::Acceleration acceleration = + Drv::Acceleration(Drv::sensor_value_to_f64(x), Drv::sensor_value_to_f64(y), Drv::sensor_value_to_f64(z)); + + this->tlmWrite_Acceleration(acceleration); + return acceleration; } -Drv::AngularVelocity Lsm6dsoDriver ::angularVelocityRead_handler(FwIndexType portNum) { +Drv::AngularVelocity Lsm6dsoManager ::angularVelocityRead_handler(FwIndexType portNum) { if (!device_is_ready(lsm6dso)) { this->log_WARNING_HI_DeviceNotReady(); return Drv::AngularVelocity(0.0, 0.0, 0.0); @@ -65,10 +66,14 @@ Drv::AngularVelocity Lsm6dsoDriver ::angularVelocityRead_handler(FwIndexType por sensor_channel_get(lsm6dso, SENSOR_CHAN_GYRO_Y, &y); sensor_channel_get(lsm6dso, SENSOR_CHAN_GYRO_Z, &z); - return Drv::AngularVelocity(Drv::sensor_value_to_f64(x), Drv::sensor_value_to_f64(y), Drv::sensor_value_to_f64(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)); + + this->tlmWrite_AngularVelocity(angular_velocity); + return angular_velocity; } -F64 Lsm6dsoDriver ::temperatureRead_handler(FwIndexType portNum) { +F64 Lsm6dsoManager ::temperatureRead_handler(FwIndexType portNum) { if (!device_is_ready(lsm6dso)) { this->log_WARNING_HI_DeviceNotReady(); return 0; @@ -80,6 +85,8 @@ F64 Lsm6dsoDriver ::temperatureRead_handler(FwIndexType portNum) { sensor_channel_get(lsm6dso, SENSOR_CHAN_DIE_TEMP, &temp); + this->tlmWrite_Temperature(Drv::sensor_value_to_f64(temp)); + return Drv::sensor_value_to_f64(temp); } diff --git a/FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriver.fpp b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.fpp similarity index 71% rename from FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriver.fpp rename to FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.fpp index 638e9279..669b4eb8 100644 --- a/FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriver.fpp +++ b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.fpp @@ -8,7 +8,8 @@ module Drv { # Component definition module Drv { @ LSM6DSO Driver Component for F Prime FSW framework. - passive component Lsm6dsoDriver { + passive component Lsm6dsoManager { + # Ports @ Port to read the current acceleration in m/s^2. sync input port accelerationRead: AccelerationRead @@ -18,6 +19,16 @@ module Drv { @ Port to read the current temperature in degrees celsius. sync input port temperatureRead: TemperatureRead + # Telemetry channels + @ Telemetry channel for current acceleration in m/s^2. + telemetry Acceleration: Acceleration + + @ Telemetry channel for current angular velocity in rad/s. + telemetry AngularVelocity: AngularVelocity + + @ Telemetry channel for current temperature in degrees celsius. + telemetry Temperature: F64 + @ Event for reporting LSM6DSO not ready error event DeviceNotReady() severity warning high format "LSM6DSO device not ready" throttle 5 @@ -32,5 +43,8 @@ module Drv { @ Port for sending events to downlink event port logOut + + @ Port for sending telemetry channels to downlink + telemetry port tlmOut } } diff --git a/FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriver.hpp b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.hpp similarity index 78% rename from FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriver.hpp rename to FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.hpp index d114cc04..e996f72e 100644 --- a/FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriver.hpp +++ b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.hpp @@ -1,14 +1,14 @@ // ====================================================================== -// \title Lsm6dsoDriver.hpp -// \brief hpp file for Lsm6dsoDriver component implementation class +// \title Lsm6dsoManager.hpp +// \brief hpp file for Lsm6dsoManager component implementation class // ====================================================================== -#ifndef Components_Lsm6dsoDriver_HPP -#define Components_Lsm6dsoDriver_HPP +#ifndef Components_Lsm6dsoManager_HPP +#define Components_Lsm6dsoManager_HPP // clang-format off // Keep the includes in this order -#include "FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriverComponentAc.hpp" +#include "FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManagerComponentAc.hpp" #include "FprimeZephyrReference/Components/Drv/Helpers/Helpers.hpp" // clang-format on @@ -18,17 +18,17 @@ namespace Drv { -class Lsm6dsoDriver final : public Lsm6dsoDriverComponentBase { +class Lsm6dsoManager final : public Lsm6dsoManagerComponentBase { public: // ---------------------------------------------------------------------- // Component construction and destruction // ---------------------------------------------------------------------- - //! Construct Lsm6dsoDriver object - Lsm6dsoDriver(const char* const compName); + //! Construct Lsm6dsoManager object + Lsm6dsoManager(const char* const compName); - //! Destroy Lsm6dsoDriver object - ~Lsm6dsoDriver(); + //! Destroy Lsm6dsoManager object + ~Lsm6dsoManager(); private: // ---------------------------------------------------------------------- diff --git a/FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/docs/sdd.md b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/docs/sdd.md similarity index 94% rename from FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/docs/sdd.md rename to FprimeZephyrReference/Components/Drv/Lsm6dsoManager/docs/sdd.md index 20a678a5..58c4e79b 100644 --- a/FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/docs/sdd.md +++ b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/docs/sdd.md @@ -1,4 +1,4 @@ -# Components::Lsm6dsoDriver +# Components::Lsm6dsoManager The LSM6DSO Driver component interfaces with the LIS2MDL magnetometer to provide acceleration, angular velocity, and temperature measurements. @@ -19,19 +19,19 @@ The LSM6DSO Driver component is designed to be called periodically to collect an ```mermaid classDiagram namespace Components { - class Lsm6dsoDriverComponentBase { + class Lsm6dsoManagerComponentBase { <> } - class Lsm6dsoDriver { + class Lsm6dsoManager { - lsm6dso: device* - + Lsm6dsoDriver(char* compName) - + ~Lsm6dsoDriver() + + Lsm6dsoManager(char* compName) + + ~Lsm6dsoManager() - accelerationRead_handler(FwIndexType portNum): Drv::Acceleration - angularVelocityRead_handler(FwIndexType portNum): Drv::AngularVelocity - temperatureRead_handler(FwIndexType portNum): F64 } } - Lsm6dsoDriverComponentBase <|-- Lsm6dsoDriver : inherits + Lsm6dsoManagerComponentBase <|-- Lsm6dsoManager : inherits ``` ## Port Descriptions diff --git a/FprimeZephyrReference/Components/ImuManager/ImuManager.cpp b/FprimeZephyrReference/Components/ImuManager/ImuManager.cpp index 44a1c72e..a6989f6f 100644 --- a/FprimeZephyrReference/Components/ImuManager/ImuManager.cpp +++ b/FprimeZephyrReference/Components/ImuManager/ImuManager.cpp @@ -22,9 +22,12 @@ ImuManager ::~ImuManager() {} // ---------------------------------------------------------------------- void ImuManager ::run_handler(FwIndexType portNum, U32 context) { - this->tlmWrite_Acceleration(this->accelerationRead_out(0)); - this->tlmWrite_AngularVelocity(this->angularVelocityRead_out(0)); - this->tlmWrite_MagneticField(this->magneticFieldRead_out(0)); - this->tlmWrite_Temperature(this->temperatureRead_out(0)); + // Read from Lsm6dsoManager + this->accelerationRead_out(0); + this->angularVelocityRead_out(0); + this->temperatureRead_out(0); + + // Read from Lis2mdlManager + this->magneticFieldRead_out(0); } } // namespace Components diff --git a/FprimeZephyrReference/Components/ImuManager/ImuManager.fpp b/FprimeZephyrReference/Components/ImuManager/ImuManager.fpp index 2ef559b5..4d880301 100644 --- a/FprimeZephyrReference/Components/ImuManager/ImuManager.fpp +++ b/FprimeZephyrReference/Components/ImuManager/ImuManager.fpp @@ -3,37 +3,22 @@ module Components { passive component ImuManager { sync input port run: Svc.Sched - @ Port for sending accelerationRead calls to the LSM6DSO driver + @ Port for sending accelerationRead calls to the LSM6DSO Driver output port accelerationRead: Drv.AccelerationRead - @ Port for sending angularVelocityRead calls to the LSM6DSO driver + @ Port for sending angularVelocityRead calls to the LSM6DSO Driver output port angularVelocityRead: Drv.AngularVelocityRead - @ Port for sending magneticFieldRead calls to the LIS2MDL driver + @ Port for sending magneticFieldRead calls to the LIS2MDL Manager output port magneticFieldRead: Drv.MagneticFieldRead - @ Port for sending temperatureRead calls to the LSM6DSO driver + @ Port for sending temperatureRead calls to the LSM6DSO Driver output port temperatureRead: Drv.TemperatureRead - @ Telemetry channel for acceleration in m/s^2 - telemetry Acceleration: Drv.Acceleration - - @ Telemetry channel for angular velocity in rad/s - telemetry AngularVelocity: Drv.AngularVelocity - - @ Telemetry channel for magnetic field in gauss - telemetry MagneticField: Drv.MagneticField - - @ Telemetry channel for temperature in degrees Celsius - telemetry Temperature: F64 - ############################################################################### # Standard AC Ports: Required for Channels, Events, Commands, and Parameters # ############################################################################### @ Port for requesting the current time time get port timeCaller - - @ Port for sending telemetry channels to downlink - telemetry port tlmOut } } diff --git a/FprimeZephyrReference/Components/ImuManager/docs/sdd.md b/FprimeZephyrReference/Components/ImuManager/docs/sdd.md index 33f3ff69..2b3aee94 100644 --- a/FprimeZephyrReference/Components/ImuManager/docs/sdd.md +++ b/FprimeZephyrReference/Components/ImuManager/docs/sdd.md @@ -1,6 +1,6 @@ # Components::ImuManager -The IMU Manager (Inertial Measurement Unit) component provides sensor data related to motion and orientation of the craft. It interfaces with two drivers: the LIS2MDL Driver and the LSM6DSO Driver which provide acceleration, angular velocity, magnetic field, and temperature measurements. +The IMU Manager (Inertial Measurement Unit) component provides sensor data related to motion and orientation of the craft. It interfaces with two drivers: the LIS2MDL Manager and the LSM6DSO Driver which provide acceleration, angular velocity, magnetic field, and temperature measurements. ## Usage Examples @@ -11,7 +11,7 @@ The IMU Manager component is designed to be scheduled periodically to collect se 1. The component is instantiated and initialized during system startup 2. The scheduler calls the `run` port at regular intervals 3. On each run call, the component: - - Fetches sensor data from both the LIS2MDL Driver and LSM6DSO Driver + - Fetches sensor data from both the LIS2MDL Manager and LSM6DSO Driver - Outputs telemetry for acceleration, angular velocity, magnetic field, and temperature ## Class Diagram @@ -43,13 +43,13 @@ classDiagram sequenceDiagram participant Scheduler participant IMU Manager - participant LIS2MDL Driver + participant LIS2MDL Manager participant LSM6DSO Driver participant Telemetry Scheduler-->>IMU Manager: run - IMU Manager->>LIS2MDL Driver: MagneticFieldRead - LIS2MDL Driver->>IMU Manager: MagneticField struct + IMU Manager->>LIS2MDL Manager: MagneticFieldRead + LIS2MDL Manager->>IMU Manager: MagneticField struct IMU Manager->>LSM6DSO Driver: AccelerationRead LSM6DSO Driver->>IMU Manager: Acceleration struct IMU Manager->>LSM6DSO Driver: AngularVelocityRead @@ -80,4 +80,4 @@ Add requirements in the chart below | Date | Description | |---|---| | 2025-9-9 | Initial IMU Manager component | -| 2025-9-18 | Extracted Zephyr calls to discrete LIS2MDL Driver and LSM6DSO Driver | +| 2025-9-18 | Extracted Zephyr calls to discrete LIS2MDL Manager and LSM6DSO Driver | diff --git a/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi b/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi index 9596d5ef..4a0e736f 100644 --- a/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi +++ b/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi @@ -35,11 +35,14 @@ telemetry packets ReferenceDeploymentPackets { } packet Imu id 6 group 4 { - ReferenceDeployment.imuManager.Acceleration - ReferenceDeployment.imuManager.AngularVelocity - ReferenceDeployment.imuManager.MagneticField + ReferenceDeployment.lsm6dsoManager.Acceleration + ReferenceDeployment.lsm6dsoManager.AngularVelocity + ReferenceDeployment.lsm6dsoManager.Temperature + ReferenceDeployment.lis2mdlManager.MagneticField } + + } omit { CdhCore.cmdDisp.CommandErrors # Only has one library, no custom versions @@ -62,6 +65,4 @@ telemetry packets ReferenceDeploymentPackets { CdhCore.version.CustomVersion08 CdhCore.version.CustomVersion09 CdhCore.version.CustomVersion10 - # Reserving temp telemetry for future use - ReferenceDeployment.imuManager.Temperature } diff --git a/FprimeZephyrReference/ReferenceDeployment/Top/instances.fpp b/FprimeZephyrReference/ReferenceDeployment/Top/instances.fpp index 1bcb6199..597c813b 100644 --- a/FprimeZephyrReference/ReferenceDeployment/Top/instances.fpp +++ b/FprimeZephyrReference/ReferenceDeployment/Top/instances.fpp @@ -66,7 +66,7 @@ module ReferenceDeployment { instance imuManager: Components.ImuManager base id 0x10017000 - instance lis2mdlDriver: Drv.Lis2mdlDriver base id 0x10018000 + instance lis2mdlManager: Drv.Lis2mdlManager base id 0x10018000 - instance lsm6dsoDriver: Drv.Lsm6dsoDriver base id 0x10019000 + instance lsm6dsoManager: Drv.Lsm6dsoManager base id 0x10019000 } diff --git a/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp b/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp index 420f44f2..a0ade236 100644 --- a/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp +++ b/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp @@ -30,8 +30,8 @@ module ReferenceDeployment { instance watchdog instance prmDb instance imuManager - instance lis2mdlDriver - instance lsm6dsoDriver + instance lis2mdlManager + instance lsm6dsoManager # ---------------------------------------------------------------------- # Pattern graph specifiers @@ -103,10 +103,10 @@ module ReferenceDeployment { } connections imuManager { - imuManager.accelerationRead -> lsm6dsoDriver.accelerationRead - imuManager.angularVelocityRead -> lsm6dsoDriver.angularVelocityRead - imuManager.magneticFieldRead -> lis2mdlDriver.magneticFieldRead - imuManager.temperatureRead -> lsm6dsoDriver.temperatureRead + imuManager.accelerationRead -> lsm6dsoManager.accelerationRead + imuManager.angularVelocityRead -> lsm6dsoManager.angularVelocityRead + imuManager.magneticFieldRead -> lis2mdlManager.magneticFieldRead + imuManager.temperatureRead -> lsm6dsoManager.temperatureRead } connections ReferenceDeployment { diff --git a/boards/bronco_space/proves_flight_control_board_v5/proves_flight_control_board_v5-pinctrl.dtsi b/boards/bronco_space/proves_flight_control_board_v5/proves_flight_control_board_v5-pinctrl.dtsi index 012ca613..0ae79cf6 100644 --- a/boards/bronco_space/proves_flight_control_board_v5/proves_flight_control_board_v5-pinctrl.dtsi +++ b/boards/bronco_space/proves_flight_control_board_v5/proves_flight_control_board_v5-pinctrl.dtsi @@ -7,7 +7,7 @@ }; group2 { - pinmux = ; + pinmux = ; input-enable; }; }; 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 cc25572f..7b998db7 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 @@ -21,8 +21,8 @@ leds { compatible = "gpio-leds"; led0: led0 { - gpios = <&gpio0 24 GPIO_ACTIVE_HIGH>; - label = "User LED GPIO24"; + gpios = <&gpio0 23 GPIO_ACTIVE_HIGH>; + label = "Watchdog LED"; }; }; }; @@ -91,7 +91,7 @@ zephyr_udc0: &usbd { compatible = "semtech,sx1276"; reg = <0>; spi-max-frequency = <125000>; - dio-gpios = <&gpio0 13 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>,<&gpio0 12 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>; + dio-gpios = <&gpio0 14 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>,<&gpio0 13 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>; reset-gpios = <&gpio0 6 GPIO_ACTIVE_LOW>; power-amplifier-output = "pa-boost"; label = "HOPE_RF"; diff --git a/boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c_rp2350a_m33.dts b/boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c_rp2350a_m33.dts index e4290dd6..af941165 100644 --- a/boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c_rp2350a_m33.dts +++ b/boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c_rp2350a_m33.dts @@ -17,3 +17,15 @@ #include #include "../proves_flight_control_board_v5/proves_flight_control_board_v5.dtsi" + +// Configure the Watchdog LED +&led0 { + gpios = <&gpio0 24 GPIO_ACTIVE_HIGH>; +}; + +// Configure the LoRa DIO pins +&spi1 { + sx1276@0 { + dio-gpios = <&gpio0 13 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>,<&gpio0 12 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>; + }; +}; diff --git a/boards/bronco_space/proves_flight_control_board_v5d/proves_flight_control_board_v5d_rp2350a_m33.dts b/boards/bronco_space/proves_flight_control_board_v5d/proves_flight_control_board_v5d_rp2350a_m33.dts index e265d05f..e4290dd6 100644 --- a/boards/bronco_space/proves_flight_control_board_v5d/proves_flight_control_board_v5d_rp2350a_m33.dts +++ b/boards/bronco_space/proves_flight_control_board_v5d/proves_flight_control_board_v5d_rp2350a_m33.dts @@ -17,8 +17,3 @@ #include #include "../proves_flight_control_board_v5/proves_flight_control_board_v5.dtsi" - -&led0 { - gpios = <&gpio0 23 GPIO_ACTIVE_HIGH>; - label = "User LED GPIO23"; -};