From 5cfb45d12eff61c63cfeccad90c2232cb4d475fc Mon Sep 17 00:00:00 2001 From: Nate Gay Date: Sat, 6 Sep 2025 21:46:20 -0500 Subject: [PATCH 01/26] Use custom board definition --- .../Top/ReferenceDeploymentTopology.cpp | 2 +- .../Kconfig.defconfig | 14 ++ .../Kconfig.proves_flight_control_board_v5c | 5 + .../board.cmake | 20 +++ .../proves_flight_control_board_v5c/board.yml | 6 + ...oves_flight_control_board_v5c-pinctrl.dtsi | 20 +++ .../proves_flight_control_board_v5c.dtsi | 132 ++++++++++++++++++ ...s_flight_control_board_v5c_rp2350a_m33.dts | 19 +++ ..._flight_control_board_v5c_rp2350a_m33.yaml | 22 +++ ...ht_control_board_v5c_rp2350a_m33_defconfig | 13 ++ .../support/openocd.cfg | 11 ++ boards/rpi_pico.overlay | 11 -- boards/rpi_pico2_rp2350a_m33.overlay | 17 --- boards/teensy40.overlay | 15 -- boards/teensy41.overlay | 15 -- prj.conf | 33 ++++- settings.ini | 3 +- 17 files changed, 296 insertions(+), 62 deletions(-) create mode 100644 boards/bronco_space/proves_flight_control_board_v5c/Kconfig.defconfig create mode 100644 boards/bronco_space/proves_flight_control_board_v5c/Kconfig.proves_flight_control_board_v5c create mode 100644 boards/bronco_space/proves_flight_control_board_v5c/board.cmake create mode 100644 boards/bronco_space/proves_flight_control_board_v5c/board.yml create mode 100644 boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c-pinctrl.dtsi create mode 100644 boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c.dtsi create mode 100644 boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c_rp2350a_m33.dts create mode 100644 boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c_rp2350a_m33.yaml create mode 100644 boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c_rp2350a_m33_defconfig create mode 100644 boards/bronco_space/proves_flight_control_board_v5c/support/openocd.cfg delete mode 100644 boards/rpi_pico.overlay delete mode 100644 boards/rpi_pico2_rp2350a_m33.overlay delete mode 100644 boards/teensy40.overlay delete mode 100644 boards/teensy41.overlay diff --git a/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentTopology.cpp b/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentTopology.cpp index e9bfd734..4e3bb311 100644 --- a/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentTopology.cpp +++ b/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentTopology.cpp @@ -13,7 +13,7 @@ #include -static const struct gpio_dt_spec ledGpio = GPIO_DT_SPEC_GET(DT_ALIAS(led0), gpios); +static const struct gpio_dt_spec ledGpio = GPIO_DT_SPEC_GET(DT_NODELABEL(led0), gpios); // Allows easy reference to objects in FPP/autocoder required namespaces using namespace ReferenceDeployment; diff --git a/boards/bronco_space/proves_flight_control_board_v5c/Kconfig.defconfig b/boards/bronco_space/proves_flight_control_board_v5c/Kconfig.defconfig new file mode 100644 index 00000000..296c23fc --- /dev/null +++ b/boards/bronco_space/proves_flight_control_board_v5c/Kconfig.defconfig @@ -0,0 +1,14 @@ +# Copyright (c) 2024 Andrew Featherstone +# SPDX-License-Identifier: Apache-2.0 + +if PROVES_FLIGHT_CONTROL_BOARD_V5C + +config USB_SELF_POWERED + default n + +config USB_CDC_ACM_LOG_LEVEL + default 0 + +config USB_DEVICE_LOG_LEVEL + default 1 +endif # PROVES_FLIGHT_CONTROL_BOARD_V5C diff --git a/boards/bronco_space/proves_flight_control_board_v5c/Kconfig.proves_flight_control_board_v5c b/boards/bronco_space/proves_flight_control_board_v5c/Kconfig.proves_flight_control_board_v5c new file mode 100644 index 00000000..805f5070 --- /dev/null +++ b/boards/bronco_space/proves_flight_control_board_v5c/Kconfig.proves_flight_control_board_v5c @@ -0,0 +1,5 @@ +# Copyright (c) 2024 Andrew Featherstone +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_PROVES_FLIGHT_CONTROL_BOARD_V5C + select SOC_RP2350A_M33 if BOARD_PROVES_FLIGHT_CONTROL_BOARD_V5C_RP2350A_M33 diff --git a/boards/bronco_space/proves_flight_control_board_v5c/board.cmake b/boards/bronco_space/proves_flight_control_board_v5c/board.cmake new file mode 100644 index 00000000..dc6406b4 --- /dev/null +++ b/boards/bronco_space/proves_flight_control_board_v5c/board.cmake @@ -0,0 +1,20 @@ +# SPDX-License-Identifier: Apache-2.0 + +if("${RPI_PICO_DEBUG_ADAPTER}" STREQUAL "") + set(RPI_PICO_DEBUG_ADAPTER "cmsis-dap") +endif() + +board_runner_args(openocd --cmd-pre-init "source [find interface/${RPI_PICO_DEBUG_ADAPTER}.cfg]") +board_runner_args(openocd --cmd-pre-init "source [find target/rp2350.cfg]") + +# The adapter speed is expected to be set by interface configuration. +# The Raspberry Pi's OpenOCD fork doesn't, so match their documentation at +# https://www.raspberrypi.com/documentation/microcontrollers/debug-probe.html#debugging-with-swd +board_runner_args(openocd --cmd-pre-init "set_adapter_speed_if_not_set 5000") + +board_runner_args(jlink "--device=RP2350_M33_0") +board_runner_args(uf2 "--board-id=RP2350") + +include(${ZEPHYR_BASE}/boards/common/openocd.board.cmake) +include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) +include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) diff --git a/boards/bronco_space/proves_flight_control_board_v5c/board.yml b/boards/bronco_space/proves_flight_control_board_v5c/board.yml new file mode 100644 index 00000000..8fcf693e --- /dev/null +++ b/boards/bronco_space/proves_flight_control_board_v5c/board.yml @@ -0,0 +1,6 @@ +board: + name: proves_flight_control_board_v5c + full_name: PROVES Flight Control Board v5c + vendor: Bronco Space + socs: + - name: rp2350a diff --git a/boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c-pinctrl.dtsi b/boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c-pinctrl.dtsi new file mode 100644 index 00000000..012ca613 --- /dev/null +++ b/boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c-pinctrl.dtsi @@ -0,0 +1,20 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + pinmux = , ; + }; + + group2 { + pinmux = ; + input-enable; + }; + }; + i2c1_default: i2c1_default { + group1 { + pinmux = , ; + input-enable; + }; + }; +}; diff --git a/boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c.dtsi b/boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c.dtsi new file mode 100644 index 00000000..1583eaa0 --- /dev/null +++ b/boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c.dtsi @@ -0,0 +1,132 @@ +#include + +#include +#include + +#include "proves_flight_control_board_v5c-pinctrl.dtsi" + +/ { + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart0; + zephyr,shell-uart = &cdc_acm_uart0; + zephyr,code-partition = &code_partition; + }; + + aliases { + watchdog0 = &wdt0; + }; + + leds { + compatible = "gpio-leds"; + led0: led0 { + gpios = <&gpio0 24 GPIO_ACTIVE_HIGH>; + label = "User LED GPIO24"; + }; + }; +}; + +zephyr_udc0: &usbd { + status = "okay"; +}; + +&zephyr_udc0 { + cdc_acm_uart0: cdc_acm_uart0 { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; +}; + +&flash0 { + reg = <0x10000000 DT_SIZE_M(4)>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + /* Reserved memory for an image definition block. The block is much + * smaller than 256 bytes, but in practice the linker places the vector + * table at a much larger alignment offset. + */ + image_def: partition@0 { + label = "image_def"; + reg = <0x00000000 0x100>; + read-only; + }; + + /* + * Usable flash. Starts at 0x100, after the image definition block. + * The partition size is 4MB minus the 0x100 bytes taken by the + * image definition. + */ + code_partition: partition@100 { + label = "code-partition"; + reg = <0x100 (DT_SIZE_M(4) - 0x100)>; + read-only; + }; + }; +}; + +&timer0 { + status = "okay"; +}; + +&wdt0 { + status = "okay"; +}; + +&gpio0 { + status = "okay"; +}; + +&spi1 { + status = "okay"; + cs-gpios = <&gpio0 9 GPIO_ACTIVE_LOW>; + pinctrl-0 = <&spi1_default>; + pinctrl-names = "default"; + + lora0: sx1276@0 { + 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)>; + reset-gpios = <&gpio0 6 GPIO_ACTIVE_LOW>; + power-amplifier-output = "pa-boost"; + label = "HOPE_RF"; + }; +}; + +&i2c1 { + status = "okay"; + pinctrl-0 = <&i2c1_default>; + pinctrl-names = "default"; + clock-frequency = <100000>; + + lsm6dso0: lsm6dso0@6b { + compatible = "st,lsm6dso"; + reg = <0x6b>; + label = "LSM6DSO"; + }; + + lis2mdl: lis2mdl@1e { + compatible = "st,lis2mdl"; + reg = <0x1e>; + label = "LIS2MDL"; + }; + rv3028: rv3028@52 { + compatible = "microcrystal,rv3028"; + reg = <0x52>; + int-gpios = <&gpio0 27 GPIO_ACTIVE_HIGH>; + backup-switch-mode = "level"; + label = "RV3028"; + }; + ina219: ina219@40 { + compatible = "ti,ina219"; + reg = <0x40>; + shunt-milliohm = <2>; + lsb-microamp = <100>; + label = "INA219"; + }; +}; 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 new file mode 100644 index 00000000..dc57761a --- /dev/null +++ b/boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c_rp2350a_m33.dts @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2024 Andrew Featherstone + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; + +/* The build system assumes that there's a cpucluster-specific file. + * + * This file provides composition of the device tree: + * 1. The common features of the SoC + * 2. Core-specific configuration. + * 3. Board-specific configuration. + */ +#include +#include + +#include "proves_flight_control_board_v5c.dtsi" diff --git a/boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c_rp2350a_m33.yaml b/boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c_rp2350a_m33.yaml new file mode 100644 index 00000000..847a3eb5 --- /dev/null +++ b/boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c_rp2350a_m33.yaml @@ -0,0 +1,22 @@ +identifier: proves_flight_control_board_v5c/rp2350a/m33 +name: PROVES Flight Control Board v5c (RP2350, Cortex-M33) +type: mcu +arch: arm +flash: 4096 +ram: 520 +toolchain: + - zephyr + - gnuarmemb +supported: + - adc + - clock + - counter + - dma + - gpio + - hwinfo + - i2c + - pwm + - spi + - uart + - usbd + - watchdog diff --git a/boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c_rp2350a_m33_defconfig b/boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c_rp2350a_m33_defconfig new file mode 100644 index 00000000..ff74ead6 --- /dev/null +++ b/boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c_rp2350a_m33_defconfig @@ -0,0 +1,13 @@ +CONFIG_BUILD_OUTPUT_HEX=y +CONFIG_BUILD_OUTPUT_UF2=y +CONFIG_CLOCK_CONTROL=y +CONFIG_CONSOLE=y +CONFIG_GPIO=y +CONFIG_RESET=y +CONFIG_SERIAL=y +CONFIG_UART_CONSOLE=y +CONFIG_UART_INTERRUPT_DRIVEN=y +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_USB_DEVICE_STACK=y +CONFIG_USB_DEVICE_PRODUCT="PROVES Flight Control Board v5c" +CONFIG_USB_DEVICE_VID=0x0028 diff --git a/boards/bronco_space/proves_flight_control_board_v5c/support/openocd.cfg b/boards/bronco_space/proves_flight_control_board_v5c/support/openocd.cfg new file mode 100644 index 00000000..82666bb5 --- /dev/null +++ b/boards/bronco_space/proves_flight_control_board_v5c/support/openocd.cfg @@ -0,0 +1,11 @@ +# Copyright (c) 2024 TOKITA Hiroshi +# SPDX-License-Identifier: Apache-2.0 + +# Checking and set 'adapter speed'. +# Set the adaptor speed, if unset, and given as an argument. +proc set_adapter_speed_if_not_set { speed } { + puts "checking adapter speed..." + if { [catch {adapter speed} ret] } { + adapter speed $speed + } +} diff --git a/boards/rpi_pico.overlay b/boards/rpi_pico.overlay deleted file mode 100644 index 6abcbcfe..00000000 --- a/boards/rpi_pico.overlay +++ /dev/null @@ -1,11 +0,0 @@ -&zephyr_udc0 { - cdc_acm_uart0: cdc_acm_uart0 { - compatible = "zephyr,cdc-acm-uart"; - }; -}; - -/ { - chosen { - zephyr,console = &cdc_acm_uart0; - }; -}; diff --git a/boards/rpi_pico2_rp2350a_m33.overlay b/boards/rpi_pico2_rp2350a_m33.overlay deleted file mode 100644 index ea7ecb55..00000000 --- a/boards/rpi_pico2_rp2350a_m33.overlay +++ /dev/null @@ -1,17 +0,0 @@ -&zephyr_udc0 { - cdc_acm_uart0: cdc_acm_uart0 { - compatible = "zephyr,cdc-acm-uart"; - }; -}; - -/ { - chosen { - zephyr,console = &cdc_acm_uart0; - }; -}; - -/* Override the default LED definition to use GPIO 24 instead of GPIO 25 for PROVES FC board*/ -&led0 { - gpios = <&gpio0 24 GPIO_ACTIVE_HIGH>; - label = "User LED GPIO24"; -}; diff --git a/boards/teensy40.overlay b/boards/teensy40.overlay deleted file mode 100644 index 8f7d324b..00000000 --- a/boards/teensy40.overlay +++ /dev/null @@ -1,15 +0,0 @@ -&zephyr_udc0 { - cdc_acm_uart0: cdc_acm_uart0 { - compatible = "zephyr,cdc-acm-uart"; - }; -}; - -&lpuart1 { - status = "okay"; - current-speed = < 115200 >; -}; - -&lpuart2 { - status = "okay"; - current-speed = < 115200 >; -}; diff --git a/boards/teensy41.overlay b/boards/teensy41.overlay deleted file mode 100644 index 8f7d324b..00000000 --- a/boards/teensy41.overlay +++ /dev/null @@ -1,15 +0,0 @@ -&zephyr_udc0 { - cdc_acm_uart0: cdc_acm_uart0 { - compatible = "zephyr,cdc-acm-uart"; - }; -}; - -&lpuart1 { - status = "okay"; - current-speed = < 115200 >; -}; - -&lpuart2 { - status = "okay"; - current-speed = < 115200 >; -}; diff --git a/prj.conf b/prj.conf index 7bb63394..a6ec0633 100644 --- a/prj.conf +++ b/prj.conf @@ -35,8 +35,8 @@ CONFIG_SERIAL=y CONFIG_GPIO=y CONFIG_LED=y CONFIG_PWM=n -CONFIG_I2C=n -CONFIG_SPI=n +CONFIG_I2C=y +CONFIG_SPI=y CONFIG_PINCTRL=y CONFIG_ASSERT=y @@ -55,3 +55,32 @@ CONFIG_RING_BUFFER=y CONFIG_PRINTK=y CONFIG_UART_CONSOLE=y CONFIG_COMMON_LIBC_MALLOC=y + +# Sensors +CONFIG_SENSOR=y +CONFIG_LSM6DSO=y +CONFIG_LSM6DSO_ENABLE_TEMP=y +CONFIG_LIS2MDL=y +CONFIG_INA219=y + +# Zbus +# CONFIG_ZBUS=y +# CONFIG_ZBUS_CHANNEL_NAME=y +# CONFIG_ZBUS_OBSERVER_NAME=y +# CONFIG_ZBUS_MSG_SUBSCRIBER=y +# CONFIG_ZBUS_LOG_LEVEL_DBG=n +# CONFIG_ZBUS_LOG_LEVEL_INF=y + +# Lora +CONFIG_LORA=y +CONFIG_LORA_SX127X=y + +# RTC +CONFIG_RTC=y +CONFIG_RTC_RV3028=y + +# Logging +CONFIG_LOG=y +CONFIG_LOG_DEFAULT_LEVEL=3 +# Compiler settings +CONFIG_CBPRINTF_FP_SUPPORT=y diff --git a/settings.ini b/settings.ini index 888a8df8..d27e929f 100644 --- a/settings.ini +++ b/settings.ini @@ -6,4 +6,5 @@ default_toolchain: zephyr default_cmake_options: FPRIME_ENABLE_FRAMEWORK_UTS=OFF FPRIME_ENABLE_AUTOCODER_UTS=OFF - BOARD=rpi_pico2/rp2350a/m33 + BOARD_ROOT=. + BOARD=proves_flight_control_board_v5c/rp2350a/m33 From 74bf7a6c437b6f1aba00233a6162502a44b4e411 Mon Sep 17 00:00:00 2001 From: aychar Date: Thu, 28 Aug 2025 17:55:15 -0500 Subject: [PATCH 02/26] Initial IMU component generation lastFile:FprimeZephyrReference/Components/Imu/Imu.fpp --- .../Components/CMakeLists.txt | 1 + .../Components/Imu/CMakeLists.txt | 36 ++++++++++ FprimeZephyrReference/Components/Imu/Imu.cpp | 29 ++++++++ FprimeZephyrReference/Components/Imu/Imu.fpp | 34 ++++++++++ FprimeZephyrReference/Components/Imu/Imu.hpp | 43 ++++++++++++ .../Components/Imu/docs/sdd.md | 66 +++++++++++++++++++ .../Top/ReferenceDeploymentPackets.fppi | 4 ++ .../ReferenceDeployment/Top/instances.fpp | 2 + .../ReferenceDeployment/Top/topology.fpp | 6 ++ .../project/config/TlmPacketizerCfg.hpp | 2 +- 10 files changed, 222 insertions(+), 1 deletion(-) create mode 100644 FprimeZephyrReference/Components/Imu/CMakeLists.txt create mode 100644 FprimeZephyrReference/Components/Imu/Imu.cpp create mode 100644 FprimeZephyrReference/Components/Imu/Imu.fpp create mode 100644 FprimeZephyrReference/Components/Imu/Imu.hpp create mode 100644 FprimeZephyrReference/Components/Imu/docs/sdd.md diff --git a/FprimeZephyrReference/Components/CMakeLists.txt b/FprimeZephyrReference/Components/CMakeLists.txt index 10c9dad2..7b0d52e4 100644 --- a/FprimeZephyrReference/Components/CMakeLists.txt +++ b/FprimeZephyrReference/Components/CMakeLists.txt @@ -2,3 +2,4 @@ add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/FatalHandler") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Watchdog") +add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Imu/") diff --git a/FprimeZephyrReference/Components/Imu/CMakeLists.txt b/FprimeZephyrReference/Components/Imu/CMakeLists.txt new file mode 100644 index 00000000..93d3286b --- /dev/null +++ b/FprimeZephyrReference/Components/Imu/CMakeLists.txt @@ -0,0 +1,36 @@ +#### +# 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( + AUTOCODER_INPUTS + "${CMAKE_CURRENT_LIST_DIR}/Imu.fpp" + SOURCES + "${CMAKE_CURRENT_LIST_DIR}/Imu.cpp" +# DEPENDS +# MyPackage_MyOtherModule +) + +### Unit Tests ### +# register_fprime_ut( +# AUTOCODER_INPUTS +# "${CMAKE_CURRENT_LIST_DIR}/Imu.fpp" +# SOURCES +# "${CMAKE_CURRENT_LIST_DIR}/test/ut/ImuTestMain.cpp" +# "${CMAKE_CURRENT_LIST_DIR}/test/ut/ImuTester.cpp" +# DEPENDS +# STest # For rules-based testing +# UT_AUTO_HELPERS +# ) diff --git a/FprimeZephyrReference/Components/Imu/Imu.cpp b/FprimeZephyrReference/Components/Imu/Imu.cpp new file mode 100644 index 00000000..81ac1236 --- /dev/null +++ b/FprimeZephyrReference/Components/Imu/Imu.cpp @@ -0,0 +1,29 @@ +// ====================================================================== +// \title Imu.cpp +// \author aychar +// \brief cpp file for Imu component implementation class +// ====================================================================== + +#include "FprimeZephyrReference/Components/Imu/Imu.hpp" + +namespace Components { + +// ---------------------------------------------------------------------- +// Component construction and destruction +// ---------------------------------------------------------------------- + +Imu ::Imu(const char* const compName) : ImuComponentBase(compName) {} + +Imu ::~Imu() {} + +// ---------------------------------------------------------------------- +// Handler implementations for typed input ports +// ---------------------------------------------------------------------- + +void Imu ::run_handler(FwIndexType portNum, U32 context) { + this->imuCallCount++; + this->tlmWrite_ImuCalls(this->imuCallCount); + this->log_ACTIVITY_HI_ImuTestEvent(); +} + +} // namespace Components diff --git a/FprimeZephyrReference/Components/Imu/Imu.fpp b/FprimeZephyrReference/Components/Imu/Imu.fpp new file mode 100644 index 00000000..0e247bfe --- /dev/null +++ b/FprimeZephyrReference/Components/Imu/Imu.fpp @@ -0,0 +1,34 @@ +module Components { + @ Component for F Prime FSW framework. + passive component Imu { + sync input port run: Svc.Sched + + telemetry ImuCalls: U64 + + event ImuTestEvent() \ + severity activity high \ + format "WOAH WHATS HAPPENING IS THIS WORKING HELLO" + + ############################################################################### + # Standard AC Ports: Required for Channels, Events, Commands, and Parameters # + ############################################################################### + @ Port for requesting the current time + time get port timeCaller + + @ Port for sending textual representation of events + text event port logTextOut + + @ Port for sending events to downlink + event port logOut + + @ Port for sending telemetry channels to downlink + telemetry port tlmOut + + @ Port to return the value of a parameter + param get port prmGetOut + + @Port to set the value of a parameter + param set port prmSetOut + + } +} diff --git a/FprimeZephyrReference/Components/Imu/Imu.hpp b/FprimeZephyrReference/Components/Imu/Imu.hpp new file mode 100644 index 00000000..15b865a9 --- /dev/null +++ b/FprimeZephyrReference/Components/Imu/Imu.hpp @@ -0,0 +1,43 @@ +// ====================================================================== +// \title Imu.hpp +// \author aychar +// \brief hpp file for Imu component implementation class +// ====================================================================== + +#ifndef Components_Imu_HPP +#define Components_Imu_HPP + +#include "FprimeZephyrReference/Components/Imu/ImuComponentAc.hpp" + +namespace Components { + +class Imu final : public ImuComponentBase { + public: + // ---------------------------------------------------------------------- + // Component construction and destruction + // ---------------------------------------------------------------------- + + //! Construct Imu object + Imu(const char* const compName //!< The component name + ); + + //! Destroy Imu object + ~Imu(); + + private: + // ---------------------------------------------------------------------- + // Handler implementations for typed input ports + // ---------------------------------------------------------------------- + + //! Handler implementation for TODO + //! + //! TODO + U64 imuCallCount; + void run_handler(FwIndexType portNum, //!< The port number + U32 context //!< The call order + ) override; +}; + +} // namespace Components + +#endif diff --git a/FprimeZephyrReference/Components/Imu/docs/sdd.md b/FprimeZephyrReference/Components/Imu/docs/sdd.md new file mode 100644 index 00000000..bec1e6ac --- /dev/null +++ b/FprimeZephyrReference/Components/Imu/docs/sdd.md @@ -0,0 +1,66 @@ +# Components::Imu + +Component for F Prime FSW framework. + +## Usage Examples +Add usage examples here + +### Diagrams +Add diagrams here + +### Typical Usage +And the typical usage of the component here + +## Class Diagram +Add a class diagram here + +## Port Descriptions +| Name | Description | +|---|---| +|---|---| + +## Component States +Add component states in the chart below +| Name | Description | +|---|---| +|---|---| + +## Sequence Diagrams +Add sequence diagrams here + +## Parameters +| Name | Description | +|---|---| +|---|---| + +## Commands +| Name | Description | +|---|---| +|---|---| + +## Events +| Name | Description | +|---|---| +|---|---| + +## Telemetry +| Name | Description | +|---|---| +|---|---| + +## Unit Tests +Add unit test descriptions in the chart below +| Name | Description | Output | Coverage | +|---|---|---|---| +|---|---|---|---| + +## Requirements +Add requirements in the chart below +| Name | Description | Validation | +|---|---|---| +|---|---|---| + +## Change Log +| Date | Description | +|---|---| +|---| Initial Draft | \ No newline at end of file diff --git a/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi b/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi index fc1846de..02a55916 100644 --- a/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi +++ b/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi @@ -33,6 +33,10 @@ telemetry packets ReferenceDeploymentPackets { packet Led id 5 group 4 { ReferenceDeployment.watchdog.WatchdogTransitions } + + packet Imu id 6 group 4 { + ReferenceDeployment.imu.ImuCalls + } } omit { diff --git a/FprimeZephyrReference/ReferenceDeployment/Top/instances.fpp b/FprimeZephyrReference/ReferenceDeployment/Top/instances.fpp index d3bce3e6..1c0e018c 100644 --- a/FprimeZephyrReference/ReferenceDeployment/Top/instances.fpp +++ b/FprimeZephyrReference/ReferenceDeployment/Top/instances.fpp @@ -63,4 +63,6 @@ module ReferenceDeployment { instance gpioDriver: Zephyr.ZephyrGpioDriver base id 0x10015000 instance watchdog: Components.Watchdog base id 0x10016000 + + instance imu: Components.Imu base id 0x10017000 } diff --git a/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp b/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp index f1946b87..e74c16db 100644 --- a/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp +++ b/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp @@ -29,6 +29,7 @@ module ReferenceDeployment { instance gpioDriver instance watchdog instance prmDb + instance imu # ---------------------------------------------------------------------- # Pattern graph specifiers @@ -92,12 +93,17 @@ module ReferenceDeployment { rateGroup1Hz.RateGroupMemberOut[2] -> ComCcsds.commsBufferManager.schedIn rateGroup1Hz.RateGroupMemberOut[3] -> CdhCore.tlmSend.Run rateGroup1Hz.RateGroupMemberOut[4] -> watchdog.run + rateGroup1Hz.RateGroupMemberOut[5] -> imu.run } connections Watchdog { watchdog.gpioSet -> gpioDriver.gpioWrite } + # connections Imu { + + # } + connections ReferenceDeployment { } diff --git a/FprimeZephyrReference/project/config/TlmPacketizerCfg.hpp b/FprimeZephyrReference/project/config/TlmPacketizerCfg.hpp index 1a9daca1..7a6a374b 100644 --- a/FprimeZephyrReference/project/config/TlmPacketizerCfg.hpp +++ b/FprimeZephyrReference/project/config/TlmPacketizerCfg.hpp @@ -16,7 +16,7 @@ #include namespace Svc { -static const FwChanIdType MAX_PACKETIZER_PACKETS = 5; +static const FwChanIdType MAX_PACKETIZER_PACKETS = 6; static const FwChanIdType TLMPACKETIZER_NUM_TLM_HASH_SLOTS = 15; // !< Number of slots in the hash table. // Works best when set to about twice the number of components producing telemetry From b4203c9cb2a75d3ad1827a1e0a90a71b225681fc Mon Sep 17 00:00:00 2001 From: Nate Gay Date: Sat, 6 Sep 2025 22:27:04 -0500 Subject: [PATCH 03/26] Initial imu data pull --- FprimeZephyrReference/Components/Imu/Imu.cpp | 13 ++++++++++++- FprimeZephyrReference/Components/Imu/Imu.hpp | 11 ++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/FprimeZephyrReference/Components/Imu/Imu.cpp b/FprimeZephyrReference/Components/Imu/Imu.cpp index 81ac1236..7e22f877 100644 --- a/FprimeZephyrReference/Components/Imu/Imu.cpp +++ b/FprimeZephyrReference/Components/Imu/Imu.cpp @@ -6,13 +6,19 @@ #include "FprimeZephyrReference/Components/Imu/Imu.hpp" +#include + namespace Components { // ---------------------------------------------------------------------- // Component construction and destruction // ---------------------------------------------------------------------- -Imu ::Imu(const char* const compName) : ImuComponentBase(compName) {} +Imu ::Imu(const char* const compName) : ImuComponentBase(compName) { + lis2mdl = device_get_binding("LIS2MDL"); + FW_ASSERT(lis2mdl != nullptr); + FW_ASSERT(device_is_ready(lis2mdl)); +} Imu ::~Imu() {} @@ -24,6 +30,11 @@ void Imu ::run_handler(FwIndexType portNum, U32 context) { this->imuCallCount++; this->tlmWrite_ImuCalls(this->imuCallCount); this->log_ACTIVITY_HI_ImuTestEvent(); + + sensor_sample_fetch_chan(lis2mdl, SENSOR_CHAN_MAGN_XYZ); + sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_X, &magnetic_field_x); + sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_Y, &magnetic_field_y); + sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_Z, &magnetic_field_z); } } // namespace Components diff --git a/FprimeZephyrReference/Components/Imu/Imu.hpp b/FprimeZephyrReference/Components/Imu/Imu.hpp index 15b865a9..bf781b1c 100644 --- a/FprimeZephyrReference/Components/Imu/Imu.hpp +++ b/FprimeZephyrReference/Components/Imu/Imu.hpp @@ -9,6 +9,10 @@ #include "FprimeZephyrReference/Components/Imu/ImuComponentAc.hpp" +#include +#include +#include + namespace Components { class Imu final : public ImuComponentBase { @@ -32,10 +36,15 @@ class Imu final : public ImuComponentBase { //! Handler implementation for TODO //! //! TODO - U64 imuCallCount; void run_handler(FwIndexType portNum, //!< The port number U32 context //!< The call order ) override; + + U64 imuCallCount; + const struct device* lis2mdl; + struct sensor_value magnetic_field_x; + struct sensor_value magnetic_field_y; + struct sensor_value magnetic_field_z; }; } // namespace Components From f110ce256f6373f81632f26a88aec50141a84375 Mon Sep 17 00:00:00 2001 From: Nate Gay Date: Sat, 6 Sep 2025 22:49:37 -0500 Subject: [PATCH 04/26] Reading magnetic field data --- FprimeZephyrReference/Components/Imu/Imu.cpp | 25 +++++++++++++------ FprimeZephyrReference/Components/Imu/Imu.fpp | 11 ++++---- FprimeZephyrReference/Components/Imu/Imu.hpp | 4 --- .../Top/ReferenceDeploymentPackets.fppi | 4 +-- 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/FprimeZephyrReference/Components/Imu/Imu.cpp b/FprimeZephyrReference/Components/Imu/Imu.cpp index 7e22f877..42f8825e 100644 --- a/FprimeZephyrReference/Components/Imu/Imu.cpp +++ b/FprimeZephyrReference/Components/Imu/Imu.cpp @@ -27,14 +27,25 @@ Imu ::~Imu() {} // ---------------------------------------------------------------------- void Imu ::run_handler(FwIndexType portNum, U32 context) { - this->imuCallCount++; - this->tlmWrite_ImuCalls(this->imuCallCount); - this->log_ACTIVITY_HI_ImuTestEvent(); - + // Fetch new data sample sensor_sample_fetch_chan(lis2mdl, SENSOR_CHAN_MAGN_XYZ); - sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_X, &magnetic_field_x); - sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_Y, &magnetic_field_y); - sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_Z, &magnetic_field_z); + + // Extract the data from the sample + struct sensor_value magnetic_data_x; + struct sensor_value magnetic_data_y; + struct sensor_value magnetic_data_z; + sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_X, &magnetic_data_x); + sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_Y, &magnetic_data_y); + sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_Z, &magnetic_data_z); + + // Convert to float values in gauss + float magnetic_field_x = magnetic_data_x.val1 + magnetic_data_x.val2 / 1000000.0f; + float magnetic_field_y = magnetic_data_y.val1 + magnetic_data_y.val2 / 1000000.0f; + float magnetic_field_z = magnetic_data_z.val1 + magnetic_data_z.val2 / 1000000.0f; + + // Output the magnetic field values via telemetry + this->tlmWrite_MagneticField(Components::Imu_MagneticField( + static_cast(magnetic_field_x), static_cast(magnetic_field_y), static_cast(magnetic_field_z))); } } // namespace Components diff --git a/FprimeZephyrReference/Components/Imu/Imu.fpp b/FprimeZephyrReference/Components/Imu/Imu.fpp index 0e247bfe..b27d86c8 100644 --- a/FprimeZephyrReference/Components/Imu/Imu.fpp +++ b/FprimeZephyrReference/Components/Imu/Imu.fpp @@ -3,11 +3,12 @@ module Components { passive component Imu { sync input port run: Svc.Sched - telemetry ImuCalls: U64 - - event ImuTestEvent() \ - severity activity high \ - format "WOAH WHATS HAPPENING IS THIS WORKING HELLO" + struct MagneticField { + x: F64 + y: F64 + z: F64 + } + telemetry MagneticField: MagneticField ############################################################################### # Standard AC Ports: Required for Channels, Events, Commands, and Parameters # diff --git a/FprimeZephyrReference/Components/Imu/Imu.hpp b/FprimeZephyrReference/Components/Imu/Imu.hpp index bf781b1c..edfa1d97 100644 --- a/FprimeZephyrReference/Components/Imu/Imu.hpp +++ b/FprimeZephyrReference/Components/Imu/Imu.hpp @@ -40,11 +40,7 @@ class Imu final : public ImuComponentBase { U32 context //!< The call order ) override; - U64 imuCallCount; const struct device* lis2mdl; - struct sensor_value magnetic_field_x; - struct sensor_value magnetic_field_y; - struct sensor_value magnetic_field_z; }; } // namespace Components diff --git a/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi b/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi index 02a55916..22e6958c 100644 --- a/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi +++ b/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi @@ -33,9 +33,9 @@ telemetry packets ReferenceDeploymentPackets { packet Led id 5 group 4 { ReferenceDeployment.watchdog.WatchdogTransitions } - + packet Imu id 6 group 4 { - ReferenceDeployment.imu.ImuCalls + ReferenceDeployment.imu.MagneticField } From 8e30497897c23da50e4bb14824a121f2e910d38a Mon Sep 17 00:00:00 2001 From: Nate Gay Date: Sun, 7 Sep 2025 20:47:40 -0500 Subject: [PATCH 05/26] Add new telemetry for accel and angvel --- FprimeZephyrReference/Components/Imu/Imu.fpp | 14 ++++++++++++++ .../Top/ReferenceDeploymentPackets.fppi | 2 ++ .../ReferenceDeployment/Top/topology.fpp | 4 ---- .../project/config/TlmPacketizerCfg.hpp | 2 +- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/FprimeZephyrReference/Components/Imu/Imu.fpp b/FprimeZephyrReference/Components/Imu/Imu.fpp index b27d86c8..71ed14b9 100644 --- a/FprimeZephyrReference/Components/Imu/Imu.fpp +++ b/FprimeZephyrReference/Components/Imu/Imu.fpp @@ -10,6 +10,20 @@ module Components { } telemetry MagneticField: MagneticField + struct Acceleration { + x: F64 + y: F64 + z: F64 + } + telemetry Acceleration: Acceleration + + struct AngularVelocity { + x: F64 + y: F64 + z: F64 + } + telemetry AngularVelocity: AngularVelocity + ############################################################################### # Standard AC Ports: Required for Channels, Events, Commands, and Parameters # ############################################################################### diff --git a/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi b/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi index 22e6958c..d4ae48ab 100644 --- a/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi +++ b/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi @@ -35,6 +35,8 @@ telemetry packets ReferenceDeploymentPackets { } packet Imu id 6 group 4 { + ReferenceDeployment.imu.Acceleration + ReferenceDeployment.imu.AngularVelocity ReferenceDeployment.imu.MagneticField } diff --git a/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp b/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp index e74c16db..45563909 100644 --- a/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp +++ b/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp @@ -100,10 +100,6 @@ module ReferenceDeployment { watchdog.gpioSet -> gpioDriver.gpioWrite } - # connections Imu { - - # } - connections ReferenceDeployment { } diff --git a/FprimeZephyrReference/project/config/TlmPacketizerCfg.hpp b/FprimeZephyrReference/project/config/TlmPacketizerCfg.hpp index 7a6a374b..96f20246 100644 --- a/FprimeZephyrReference/project/config/TlmPacketizerCfg.hpp +++ b/FprimeZephyrReference/project/config/TlmPacketizerCfg.hpp @@ -24,7 +24,7 @@ static const FwChanIdType TLMPACKETIZER_HASH_MOD_VALUE = 999; // !< The modulo value of the hashing function. // Should be set to a little below the ID gaps to spread the entries around -static const FwChanIdType TLMPACKETIZER_HASH_BUCKETS = 40; // !< Buckets assignable to a hash slot. +static const FwChanIdType TLMPACKETIZER_HASH_BUCKETS = 80; // !< Buckets assignable to a hash slot. // Buckets must be >= number of telemetry channels in system static const FwChanIdType TLMPACKETIZER_MAX_MISSING_TLM_CHECK = 25; // !< Maximum number of missing telemetry channel checks From f4c903f20d3094b8f49041a8bcf0c73459bee1a8 Mon Sep 17 00:00:00 2001 From: Nate Gay Date: Sun, 7 Sep 2025 21:06:21 -0500 Subject: [PATCH 06/26] Acceleration and AngularVelocity telemetry working --- FprimeZephyrReference/Components/Imu/Imu.cpp | 69 +++++++++++++++---- FprimeZephyrReference/Components/Imu/Imu.hpp | 7 ++ .../Components/Imu/docs/sdd.md | 2 +- 3 files changed, 62 insertions(+), 16 deletions(-) diff --git a/FprimeZephyrReference/Components/Imu/Imu.cpp b/FprimeZephyrReference/Components/Imu/Imu.cpp index 42f8825e..200cc851 100644 --- a/FprimeZephyrReference/Components/Imu/Imu.cpp +++ b/FprimeZephyrReference/Components/Imu/Imu.cpp @@ -15,9 +15,18 @@ namespace Components { // ---------------------------------------------------------------------- Imu ::Imu(const char* const compName) : ImuComponentBase(compName) { + // Initialize the LIS2MDL sensor lis2mdl = device_get_binding("LIS2MDL"); - FW_ASSERT(lis2mdl != nullptr); FW_ASSERT(device_is_ready(lis2mdl)); + + // 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); } Imu ::~Imu() {} @@ -28,24 +37,54 @@ Imu ::~Imu() {} void Imu ::run_handler(FwIndexType portNum, U32 context) { // Fetch new data sample + sensor_sample_fetch_chan(lsm6dso, SENSOR_CHAN_ACCEL_XYZ); + sensor_sample_fetch_chan(lsm6dso, SENSOR_CHAN_GYRO_XYZ); sensor_sample_fetch_chan(lis2mdl, SENSOR_CHAN_MAGN_XYZ); - // Extract the data from the sample - struct sensor_value magnetic_data_x; - struct sensor_value magnetic_data_y; - struct sensor_value magnetic_data_z; - sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_X, &magnetic_data_x); - sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_Y, &magnetic_data_y); - sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_Z, &magnetic_data_z); + // Output the magnetic field values via telemetry + this->tlmWrite_Acceleration(this->get_acceleration()); + this->tlmWrite_AngularVelocity(this->get_angular_velocity()); + this->tlmWrite_MagneticField(this->get_magnetic_field()); +} - // Convert to float values in gauss - float magnetic_field_x = magnetic_data_x.val1 + magnetic_data_x.val2 / 1000000.0f; - float magnetic_field_y = magnetic_data_y.val1 + magnetic_data_y.val2 / 1000000.0f; - float magnetic_field_z = magnetic_data_z.val1 + magnetic_data_z.val2 / 1000000.0f; +F64 Imu ::sensor_value_to_f64(const struct sensor_value& val) { + return val.val1 + val.val2 / 1000000.0f; +} - // Output the magnetic field values via telemetry - this->tlmWrite_MagneticField(Components::Imu_MagneticField( - static_cast(magnetic_field_x), static_cast(magnetic_field_y), static_cast(magnetic_field_z))); +Components::Imu_Acceleration Imu ::get_acceleration() { + struct sensor_value x; + struct sensor_value y; + struct sensor_value z; + sensor_channel_get(lsm6dso, SENSOR_CHAN_ACCEL_X, &x); + sensor_channel_get(lsm6dso, SENSOR_CHAN_ACCEL_Y, &y); + sensor_channel_get(lsm6dso, SENSOR_CHAN_ACCEL_Z, &z); + + return Components::Imu_Acceleration(this->sensor_value_to_f64(x), this->sensor_value_to_f64(y), + this->sensor_value_to_f64(z)); +} + +Components::Imu_AngularVelocity Imu ::get_angular_velocity() { + struct sensor_value x; + struct sensor_value y; + struct sensor_value z; + sensor_channel_get(lsm6dso, SENSOR_CHAN_GYRO_X, &x); + sensor_channel_get(lsm6dso, SENSOR_CHAN_GYRO_Y, &y); + sensor_channel_get(lsm6dso, SENSOR_CHAN_GYRO_Z, &z); + + return Components::Imu_AngularVelocity(this->sensor_value_to_f64(x), this->sensor_value_to_f64(y), + this->sensor_value_to_f64(z)); +} + +Components::Imu_MagneticField Imu ::get_magnetic_field() { + struct sensor_value x; + struct sensor_value y; + struct sensor_value z; + sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_X, &x); + sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_Y, &y); + sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_Z, &z); + + return Components::Imu_MagneticField(this->sensor_value_to_f64(x), this->sensor_value_to_f64(y), + this->sensor_value_to_f64(z)); } } // namespace Components diff --git a/FprimeZephyrReference/Components/Imu/Imu.hpp b/FprimeZephyrReference/Components/Imu/Imu.hpp index edfa1d97..b91ec417 100644 --- a/FprimeZephyrReference/Components/Imu/Imu.hpp +++ b/FprimeZephyrReference/Components/Imu/Imu.hpp @@ -40,7 +40,14 @@ class Imu final : public ImuComponentBase { U32 context //!< The call order ) override; + F64 sensor_value_to_f64(const struct sensor_value& val); + + Components::Imu_Acceleration get_acceleration(); + Components::Imu_AngularVelocity get_angular_velocity(); + Components::Imu_MagneticField get_magnetic_field(); + const struct device* lis2mdl; + const struct device* lsm6dso; }; } // namespace Components diff --git a/FprimeZephyrReference/Components/Imu/docs/sdd.md b/FprimeZephyrReference/Components/Imu/docs/sdd.md index bec1e6ac..51c5ddf9 100644 --- a/FprimeZephyrReference/Components/Imu/docs/sdd.md +++ b/FprimeZephyrReference/Components/Imu/docs/sdd.md @@ -63,4 +63,4 @@ Add requirements in the chart below ## Change Log | Date | Description | |---|---| -|---| Initial Draft | \ No newline at end of file +|---| Initial Draft | From 4caa93ca729f2e3453720dcfe2eecdb57bc47914 Mon Sep 17 00:00:00 2001 From: Nate Gay Date: Mon, 8 Sep 2025 17:36:26 -0500 Subject: [PATCH 07/26] Add temp --- FprimeZephyrReference/Components/Imu/Imu.cpp | 7 +++++++ FprimeZephyrReference/Components/Imu/Imu.fpp | 2 ++ FprimeZephyrReference/Components/Imu/Imu.hpp | 1 + .../Top/ReferenceDeploymentPackets.fppi | 2 ++ 4 files changed, 12 insertions(+) diff --git a/FprimeZephyrReference/Components/Imu/Imu.cpp b/FprimeZephyrReference/Components/Imu/Imu.cpp index 200cc851..d8ec078a 100644 --- a/FprimeZephyrReference/Components/Imu/Imu.cpp +++ b/FprimeZephyrReference/Components/Imu/Imu.cpp @@ -40,11 +40,13 @@ void Imu ::run_handler(FwIndexType portNum, U32 context) { sensor_sample_fetch_chan(lsm6dso, SENSOR_CHAN_ACCEL_XYZ); sensor_sample_fetch_chan(lsm6dso, SENSOR_CHAN_GYRO_XYZ); sensor_sample_fetch_chan(lis2mdl, SENSOR_CHAN_MAGN_XYZ); + sensor_sample_fetch_chan(lsm6dso, SENSOR_CHAN_DIE_TEMP); // Output the magnetic field values via telemetry this->tlmWrite_Acceleration(this->get_acceleration()); this->tlmWrite_AngularVelocity(this->get_angular_velocity()); this->tlmWrite_MagneticField(this->get_magnetic_field()); + this->tlmWrite_Temperature(this->get_temperature()); } F64 Imu ::sensor_value_to_f64(const struct sensor_value& val) { @@ -87,4 +89,9 @@ Components::Imu_MagneticField Imu ::get_magnetic_field() { this->sensor_value_to_f64(z)); } +F64 Imu ::get_temperature() { + struct sensor_value temp; + sensor_channel_get(lsm6dso, SENSOR_CHAN_DIE_TEMP, &temp); + return this->sensor_value_to_f64(temp); +} } // namespace Components diff --git a/FprimeZephyrReference/Components/Imu/Imu.fpp b/FprimeZephyrReference/Components/Imu/Imu.fpp index 71ed14b9..ff3b937e 100644 --- a/FprimeZephyrReference/Components/Imu/Imu.fpp +++ b/FprimeZephyrReference/Components/Imu/Imu.fpp @@ -24,6 +24,8 @@ module Components { } telemetry AngularVelocity: AngularVelocity + telemetry Temperature: F64 + ############################################################################### # Standard AC Ports: Required for Channels, Events, Commands, and Parameters # ############################################################################### diff --git a/FprimeZephyrReference/Components/Imu/Imu.hpp b/FprimeZephyrReference/Components/Imu/Imu.hpp index b91ec417..f3f522eb 100644 --- a/FprimeZephyrReference/Components/Imu/Imu.hpp +++ b/FprimeZephyrReference/Components/Imu/Imu.hpp @@ -45,6 +45,7 @@ class Imu final : public ImuComponentBase { Components::Imu_Acceleration get_acceleration(); Components::Imu_AngularVelocity get_angular_velocity(); Components::Imu_MagneticField get_magnetic_field(); + F64 get_temperature(); const struct device* lis2mdl; const struct device* lsm6dso; diff --git a/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi b/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi index d4ae48ab..1e0b66be 100644 --- a/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi +++ b/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi @@ -63,4 +63,6 @@ telemetry packets ReferenceDeploymentPackets { CdhCore.version.CustomVersion08 CdhCore.version.CustomVersion09 CdhCore.version.CustomVersion10 + # Reserving temp telemetry for future use + ReferenceDeployment.imu.Temperature } From 55eeb0a30871c50ab92203e37d210e26245f2337 Mon Sep 17 00:00:00 2001 From: Nate Gay Date: Tue, 9 Sep 2025 00:33:55 -0500 Subject: [PATCH 08/26] Improve documentation --- FprimeZephyrReference/Components/Imu/Imu.cpp | 10 ++- FprimeZephyrReference/Components/Imu/Imu.fpp | 37 ++++---- FprimeZephyrReference/Components/Imu/Imu.hpp | 31 +++++-- .../Components/Imu/docs/sdd.md | 88 +++++++++++++------ 4 files changed, 109 insertions(+), 57 deletions(-) diff --git a/FprimeZephyrReference/Components/Imu/Imu.cpp b/FprimeZephyrReference/Components/Imu/Imu.cpp index d8ec078a..2af08aa3 100644 --- a/FprimeZephyrReference/Components/Imu/Imu.cpp +++ b/FprimeZephyrReference/Components/Imu/Imu.cpp @@ -1,6 +1,5 @@ // ====================================================================== // \title Imu.cpp -// \author aychar // \brief cpp file for Imu component implementation class // ====================================================================== @@ -36,13 +35,13 @@ Imu ::~Imu() {} // ---------------------------------------------------------------------- void Imu ::run_handler(FwIndexType portNum, U32 context) { - // Fetch new data sample + // Fetch new data samples from the sensors sensor_sample_fetch_chan(lsm6dso, SENSOR_CHAN_ACCEL_XYZ); sensor_sample_fetch_chan(lsm6dso, SENSOR_CHAN_GYRO_XYZ); sensor_sample_fetch_chan(lis2mdl, SENSOR_CHAN_MAGN_XYZ); sensor_sample_fetch_chan(lsm6dso, SENSOR_CHAN_DIE_TEMP); - // Output the magnetic field values via telemetry + // Output sensor values via telemetry this->tlmWrite_Acceleration(this->get_acceleration()); this->tlmWrite_AngularVelocity(this->get_angular_velocity()); this->tlmWrite_MagneticField(this->get_magnetic_field()); @@ -57,6 +56,7 @@ Components::Imu_Acceleration Imu ::get_acceleration() { struct sensor_value x; struct sensor_value y; struct sensor_value z; + sensor_channel_get(lsm6dso, SENSOR_CHAN_ACCEL_X, &x); sensor_channel_get(lsm6dso, SENSOR_CHAN_ACCEL_Y, &y); sensor_channel_get(lsm6dso, SENSOR_CHAN_ACCEL_Z, &z); @@ -69,6 +69,7 @@ Components::Imu_AngularVelocity Imu ::get_angular_velocity() { struct sensor_value x; struct sensor_value y; struct sensor_value z; + sensor_channel_get(lsm6dso, SENSOR_CHAN_GYRO_X, &x); sensor_channel_get(lsm6dso, SENSOR_CHAN_GYRO_Y, &y); sensor_channel_get(lsm6dso, SENSOR_CHAN_GYRO_Z, &z); @@ -81,6 +82,7 @@ Components::Imu_MagneticField Imu ::get_magnetic_field() { struct sensor_value x; struct sensor_value y; struct sensor_value z; + sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_X, &x); sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_Y, &y); sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_Z, &z); @@ -91,7 +93,9 @@ Components::Imu_MagneticField Imu ::get_magnetic_field() { F64 Imu ::get_temperature() { struct sensor_value temp; + sensor_channel_get(lsm6dso, SENSOR_CHAN_DIE_TEMP, &temp); + return this->sensor_value_to_f64(temp); } } // namespace Components diff --git a/FprimeZephyrReference/Components/Imu/Imu.fpp b/FprimeZephyrReference/Components/Imu/Imu.fpp index ff3b937e..56d12660 100644 --- a/FprimeZephyrReference/Components/Imu/Imu.fpp +++ b/FprimeZephyrReference/Components/Imu/Imu.fpp @@ -1,29 +1,39 @@ module Components { - @ Component for F Prime FSW framework. + @ IMU Component for F Prime FSW framework. passive component Imu { sync input port run: Svc.Sched - struct MagneticField { + @ Acceleration reading in m/s^2 + struct Acceleration { x: F64 y: F64 z: F64 } - telemetry MagneticField: MagneticField - struct Acceleration { + @ Telemetry channel for acceleration + telemetry Acceleration: Acceleration + + @ Angular velocity reading in rad/s + struct AngularVelocity { x: F64 y: F64 z: F64 } - telemetry Acceleration: Acceleration - struct AngularVelocity { + @ Telemetry channel for angular velocity + telemetry AngularVelocity: AngularVelocity + + @ Magnetic field reading in gauss + struct MagneticField { x: F64 y: F64 z: F64 } - telemetry AngularVelocity: AngularVelocity + @ Telemetry channel for magnetic field + telemetry MagneticField: MagneticField + + @ Telemetry channel for temperature in degrees Celsius telemetry Temperature: F64 ############################################################################### @@ -32,20 +42,7 @@ module Components { @ Port for requesting the current time time get port timeCaller - @ Port for sending textual representation of events - text event port logTextOut - - @ Port for sending events to downlink - event port logOut - @ Port for sending telemetry channels to downlink telemetry port tlmOut - - @ Port to return the value of a parameter - param get port prmGetOut - - @Port to set the value of a parameter - param set port prmSetOut - } } diff --git a/FprimeZephyrReference/Components/Imu/Imu.hpp b/FprimeZephyrReference/Components/Imu/Imu.hpp index f3f522eb..2484fdb2 100644 --- a/FprimeZephyrReference/Components/Imu/Imu.hpp +++ b/FprimeZephyrReference/Components/Imu/Imu.hpp @@ -1,6 +1,5 @@ // ====================================================================== // \title Imu.hpp -// \author aychar // \brief hpp file for Imu component implementation class // ====================================================================== @@ -22,8 +21,7 @@ class Imu final : public ImuComponentBase { // ---------------------------------------------------------------------- //! Construct Imu object - Imu(const char* const compName //!< The component name - ); + Imu(const char* const compName); //! Destroy Imu object ~Imu(); @@ -33,21 +31,42 @@ class Imu final : public ImuComponentBase { // Handler implementations for typed input ports // ---------------------------------------------------------------------- - //! Handler implementation for TODO - //! - //! TODO + //! Handler implementation void run_handler(FwIndexType portNum, //!< The port number U32 context //!< The call order ) override; + // ---------------------------------------------------------------------- + // Helper methods + // ---------------------------------------------------------------------- + + //! Convert a Zephyr sensor_value to an Fprime F64 F64 sensor_value_to_f64(const struct sensor_value& val); + // ---------------------------------------------------------------------- + // IMU access methods + // ---------------------------------------------------------------------- + + //! Get the acceleration reading from the IMU Components::Imu_Acceleration get_acceleration(); + + //! Get the angular velocity reading from the IMU Components::Imu_AngularVelocity get_angular_velocity(); + + //! Get the magnetic field reading from the IMU Components::Imu_MagneticField get_magnetic_field(); + + //! Get the temperature reading from the IMU F64 get_temperature(); + // ---------------------------------------------------------------------- + // Member variables + // ---------------------------------------------------------------------- + + //! Zephyr device stores the initialized LIS2MDL sensor const struct device* lis2mdl; + + //! Zephyr device stores the initialized LSM6DSO sensor const struct device* lsm6dso; }; diff --git a/FprimeZephyrReference/Components/Imu/docs/sdd.md b/FprimeZephyrReference/Components/Imu/docs/sdd.md index 51c5ddf9..c1597933 100644 --- a/FprimeZephyrReference/Components/Imu/docs/sdd.md +++ b/FprimeZephyrReference/Components/Imu/docs/sdd.md @@ -1,52 +1,81 @@ # Components::Imu -Component for F Prime FSW framework. +The IMU (Inertial Measurement Unit) component provides sensor data related to motion and orientation of the craft. It interfaces with two sensors: the LIS2MDL magnetometer and the LSM6DSO accelerometer/gyroscope to provide acceleration, angular velocity, magnetic field, and temperature measurements. ## Usage Examples -Add usage examples here + +The IMU component is designed to be scheduled periodically to collect sensor data and output telemetry. It operates as a passive component that responds to scheduler calls. ### Diagrams -Add diagrams here + +```mermaid +sequenceDiagram + participant Scheduler + participant IMU + participant Telemetry + + Scheduler->>IMU: run + IMU->>Telemetry: Output sensor data +``` ### Typical Usage -And the typical usage of the component here + +1. The component is instantiated and initialized during system startup +2. The scheduler calls the `run` port at regular intervals (configured at 12.5 Hz) +3. On each run call, the component: + - Fetches fresh sensor samples from both IMU sensors + - Converts sensor data to F Prime data structures + - Outputs telemetry for acceleration, angular velocity, magnetic field, and temperature ## Class Diagram -Add a class diagram here + +```mermaid +classDiagram + namespace Components { + class ImuComponentBase { + <> + } + class Imu { + - lis2mdl: device* + - lsm6dso: device* + + Imu(char* compName) + + ~Imu() + - run_handler(FwIndexType portNum, U32 context) + - sensor_value_to_f64(sensor_value* val): F64 + - get_acceleration(): Imu_Acceleration + - get_angular_velocity(): Imu_AngularVelocity + - get_magnetic_field(): Imu_MagneticField + - get_temperature(): F64 + } + } + ImuComponentBase <|-- Imu : inherits +``` + ## Port Descriptions -| Name | Description | -|---|---| -|---|---| +| Name | Type | Description | +|---|---|---| +| run | sync input | Scheduler port that triggers sensor data collection and telemetry output | +| timeCaller | time get | Port for requesting current system time | +| tlmOut | telemetry | Port for sending telemetry data to downlink | ## Component States -Add component states in the chart below | Name | Description | |---|---| -|---|---| +| Initialized | Component has been constructed and both IMU sensors are ready | +| Running | Component is actively collecting sensor data when scheduled | +| Error | One or both sensors failed initialization (assertion failure) | ## Sequence Diagrams Add sequence diagrams here -## Parameters -| Name | Description | -|---|---| -|---|---| - -## Commands -| Name | Description | -|---|---| -|---|---| - -## Events -| Name | Description | -|---|---| -|---|---| - ## Telemetry | Name | Description | |---|---| -|---|---| +| Acceleration | Telemetry channel for acceleration in m/s^2 | +| AngularVelocity | Telemetry channel for angular velocity in rad/s | +| MagneticField | Telemetry channel for magnetic field in gauss | +| Temperature | Telemetry channel for temperature in degrees Celsius | ## Unit Tests Add unit test descriptions in the chart below @@ -58,9 +87,12 @@ Add unit test descriptions in the chart below Add requirements in the chart below | Name | Description | Validation | |---|---|---| -|---|---|---| +| AccelerationTelemetry | The component shall provide acceleration telemetry in m/s^2 | Verify telemetry output matches expected values from sensor datasheet | +| AngularVelocityTelemetry | The component shall provide angular velocity telemetry in rad/s | Verify telemetry output matches expected values from sensor datasheet | +| MagneticFieldTelemetry | The component shall provide magnetic field telemetry in gauss | Verify telemetry output matches expected values from sensor datasheet | +| TemperatureTelemetry | The component shall provide temperature telemetry in degrees Celsius | Verify telemetry output matches expected values from sensor datasheet | ## Change Log | Date | Description | |---|---| -|---| Initial Draft | +| 2025-9-9 | Initial IMU component | From 981de3edcd9045df878277ad7af116ff9f677c59 Mon Sep 17 00:00:00 2001 From: Nate Gay Date: Tue, 9 Sep 2025 00:44:06 -0500 Subject: [PATCH 09/26] Update FprimeZephyrReference/Components/Imu/docs/sdd.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- FprimeZephyrReference/Components/Imu/docs/sdd.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FprimeZephyrReference/Components/Imu/docs/sdd.md b/FprimeZephyrReference/Components/Imu/docs/sdd.md index c1597933..b0bf7739 100644 --- a/FprimeZephyrReference/Components/Imu/docs/sdd.md +++ b/FprimeZephyrReference/Components/Imu/docs/sdd.md @@ -95,4 +95,4 @@ Add requirements in the chart below ## Change Log | Date | Description | |---|---| -| 2025-9-9 | Initial IMU component | +| 2025-09-09 | Initial IMU component | From e44fa63699d592280973f8823daec343b54a760e Mon Sep 17 00:00:00 2001 From: aychar Date: Thu, 18 Sep 2025 16:45:55 -0500 Subject: [PATCH 10/26] Add LIS2MDL driver & implement in Imu component (#16) * add lis2mdl driver and implement in imu component * fix formatting --- .../Components/CMakeLists.txt | 1 + FprimeZephyrReference/Components/Imu/Imu.cpp | 20 +----- FprimeZephyrReference/Components/Imu/Imu.fpp | 15 ++--- FprimeZephyrReference/Components/Imu/Imu.hpp | 6 -- .../Components/Lis2mdlDriver/CMakeLists.txt | 36 ++++++++++ .../Lis2mdlDriver/Lis2mdlDriver.cpp | 44 +++++++++++++ .../Lis2mdlDriver/Lis2mdlDriver.fpp | 24 +++++++ .../Lis2mdlDriver/Lis2mdlDriver.hpp | 52 +++++++++++++++ .../Components/Lis2mdlDriver/docs/sdd.md | 66 +++++++++++++++++++ .../Top/ReferenceDeploymentPackets.fppi | 1 - .../ReferenceDeployment/Top/instances.fpp | 2 + .../ReferenceDeployment/Top/topology.fpp | 5 ++ 12 files changed, 236 insertions(+), 36 deletions(-) create mode 100644 FprimeZephyrReference/Components/Lis2mdlDriver/CMakeLists.txt create mode 100644 FprimeZephyrReference/Components/Lis2mdlDriver/Lis2mdlDriver.cpp create mode 100644 FprimeZephyrReference/Components/Lis2mdlDriver/Lis2mdlDriver.fpp create mode 100644 FprimeZephyrReference/Components/Lis2mdlDriver/Lis2mdlDriver.hpp create mode 100644 FprimeZephyrReference/Components/Lis2mdlDriver/docs/sdd.md diff --git a/FprimeZephyrReference/Components/CMakeLists.txt b/FprimeZephyrReference/Components/CMakeLists.txt index 7b0d52e4..2a88e633 100644 --- a/FprimeZephyrReference/Components/CMakeLists.txt +++ b/FprimeZephyrReference/Components/CMakeLists.txt @@ -3,3 +3,4 @@ add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/FatalHandler") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Watchdog") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Imu/") +add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Lis2mdlDriver/") diff --git a/FprimeZephyrReference/Components/Imu/Imu.cpp b/FprimeZephyrReference/Components/Imu/Imu.cpp index 2af08aa3..5cbcc3d7 100644 --- a/FprimeZephyrReference/Components/Imu/Imu.cpp +++ b/FprimeZephyrReference/Components/Imu/Imu.cpp @@ -14,10 +14,6 @@ namespace Components { // ---------------------------------------------------------------------- Imu ::Imu(const char* const compName) : ImuComponentBase(compName) { - // Initialize the LIS2MDL sensor - lis2mdl = device_get_binding("LIS2MDL"); - FW_ASSERT(device_is_ready(lis2mdl)); - // Initialize the LSM6DSO sensor lsm6dso = DEVICE_DT_GET_ONE(st_lsm6dso); FW_ASSERT(device_is_ready(lsm6dso)); @@ -38,13 +34,12 @@ void Imu ::run_handler(FwIndexType portNum, U32 context) { // Fetch new data samples from the sensors sensor_sample_fetch_chan(lsm6dso, SENSOR_CHAN_ACCEL_XYZ); sensor_sample_fetch_chan(lsm6dso, SENSOR_CHAN_GYRO_XYZ); - sensor_sample_fetch_chan(lis2mdl, SENSOR_CHAN_MAGN_XYZ); sensor_sample_fetch_chan(lsm6dso, SENSOR_CHAN_DIE_TEMP); // Output sensor values via telemetry this->tlmWrite_Acceleration(this->get_acceleration()); this->tlmWrite_AngularVelocity(this->get_angular_velocity()); - this->tlmWrite_MagneticField(this->get_magnetic_field()); + this->tlmWrite_MagneticField(this->readMagneticField_out(0)); this->tlmWrite_Temperature(this->get_temperature()); } @@ -78,19 +73,6 @@ Components::Imu_AngularVelocity Imu ::get_angular_velocity() { this->sensor_value_to_f64(z)); } -Components::Imu_MagneticField Imu ::get_magnetic_field() { - struct sensor_value x; - struct sensor_value y; - struct sensor_value z; - - sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_X, &x); - sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_Y, &y); - sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_Z, &z); - - return Components::Imu_MagneticField(this->sensor_value_to_f64(x), this->sensor_value_to_f64(y), - this->sensor_value_to_f64(z)); -} - F64 Imu ::get_temperature() { struct sensor_value temp; diff --git a/FprimeZephyrReference/Components/Imu/Imu.fpp b/FprimeZephyrReference/Components/Imu/Imu.fpp index 56d12660..30a46fa5 100644 --- a/FprimeZephyrReference/Components/Imu/Imu.fpp +++ b/FprimeZephyrReference/Components/Imu/Imu.fpp @@ -3,6 +3,8 @@ module Components { passive component Imu { sync input port run: Svc.Sched + output port readMagneticField: MagneticFieldRead + @ Acceleration reading in m/s^2 struct Acceleration { x: F64 @@ -13,6 +15,9 @@ module Components { @ Telemetry channel for acceleration telemetry Acceleration: Acceleration + @ Telemetry channel for magnetic field + telemetry MagneticField: MagneticField + @ Angular velocity reading in rad/s struct AngularVelocity { x: F64 @@ -23,16 +28,6 @@ module Components { @ Telemetry channel for angular velocity telemetry AngularVelocity: AngularVelocity - @ Magnetic field reading in gauss - struct MagneticField { - x: F64 - y: F64 - z: F64 - } - - @ Telemetry channel for magnetic field - telemetry MagneticField: MagneticField - @ Telemetry channel for temperature in degrees Celsius telemetry Temperature: F64 diff --git a/FprimeZephyrReference/Components/Imu/Imu.hpp b/FprimeZephyrReference/Components/Imu/Imu.hpp index 2484fdb2..43ca3738 100644 --- a/FprimeZephyrReference/Components/Imu/Imu.hpp +++ b/FprimeZephyrReference/Components/Imu/Imu.hpp @@ -53,9 +53,6 @@ class Imu final : public ImuComponentBase { //! Get the angular velocity reading from the IMU Components::Imu_AngularVelocity get_angular_velocity(); - //! Get the magnetic field reading from the IMU - Components::Imu_MagneticField get_magnetic_field(); - //! Get the temperature reading from the IMU F64 get_temperature(); @@ -63,9 +60,6 @@ class Imu final : public ImuComponentBase { // Member variables // ---------------------------------------------------------------------- - //! Zephyr device stores the initialized LIS2MDL sensor - const struct device* lis2mdl; - //! Zephyr device stores the initialized LSM6DSO sensor const struct device* lsm6dso; }; diff --git a/FprimeZephyrReference/Components/Lis2mdlDriver/CMakeLists.txt b/FprimeZephyrReference/Components/Lis2mdlDriver/CMakeLists.txt new file mode 100644 index 00000000..ed403e6b --- /dev/null +++ b/FprimeZephyrReference/Components/Lis2mdlDriver/CMakeLists.txt @@ -0,0 +1,36 @@ +#### +# 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( + AUTOCODER_INPUTS + "${CMAKE_CURRENT_LIST_DIR}/Lis2mdlDriver.fpp" + SOURCES + "${CMAKE_CURRENT_LIST_DIR}/Lis2mdlDriver.cpp" +# DEPENDS +# MyPackage_MyOtherModule +) + +### Unit Tests ### +# register_fprime_ut( +# AUTOCODER_INPUTS +# "${CMAKE_CURRENT_LIST_DIR}/Lis2mdlDriver.fpp" +# SOURCES +# "${CMAKE_CURRENT_LIST_DIR}/test/ut/Lis2mdlDriverTestMain.cpp" +# "${CMAKE_CURRENT_LIST_DIR}/test/ut/Lis2mdlDriverTester.cpp" +# DEPENDS +# STest # For rules-based testing +# UT_AUTO_HELPERS +# ) diff --git a/FprimeZephyrReference/Components/Lis2mdlDriver/Lis2mdlDriver.cpp b/FprimeZephyrReference/Components/Lis2mdlDriver/Lis2mdlDriver.cpp new file mode 100644 index 00000000..9dacc1bd --- /dev/null +++ b/FprimeZephyrReference/Components/Lis2mdlDriver/Lis2mdlDriver.cpp @@ -0,0 +1,44 @@ +// ====================================================================== +// \title Lis2mdlDriver.cpp +// \author aychar +// \brief cpp file for Lis2mdlDriver component implementation class +// ====================================================================== + +#include "FprimeZephyrReference/Components/Lis2mdlDriver/Lis2mdlDriver.hpp" + +#include + +namespace Components { + +// ---------------------------------------------------------------------- +// Component construction and destruction +// ---------------------------------------------------------------------- + +Lis2mdlDriver ::Lis2mdlDriver(const char* const compName) : Lis2mdlDriverComponentBase(compName) { + lis2mdl = device_get_binding("LIS2MDL"); + FW_ASSERT(device_is_ready(lis2mdl)); +} + +Lis2mdlDriver ::~Lis2mdlDriver() {} + +F64 Lis2mdlDriver ::sensor_value_to_f64(const struct sensor_value& val) { + return val.val1 + val.val2 / 1000000.0f; +} + +Components::MagneticField Lis2mdlDriver ::getMagneticField_handler(FwIndexType portNum) { + // Fetch new data sample from sensors + sensor_sample_fetch_chan(lis2mdl, SENSOR_CHAN_MAGN_XYZ); + + struct sensor_value x; + struct sensor_value y; + struct sensor_value z; + + sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_X, &x); + sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_Y, &y); + sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_Z, &z); + + return Components::MagneticField(this->sensor_value_to_f64(x), this->sensor_value_to_f64(y), + this->sensor_value_to_f64(z)); +} + +} // namespace Components diff --git a/FprimeZephyrReference/Components/Lis2mdlDriver/Lis2mdlDriver.fpp b/FprimeZephyrReference/Components/Lis2mdlDriver/Lis2mdlDriver.fpp new file mode 100644 index 00000000..13a2f679 --- /dev/null +++ b/FprimeZephyrReference/Components/Lis2mdlDriver/Lis2mdlDriver.fpp @@ -0,0 +1,24 @@ +module Components { + @ Magnetic field reading in gauss + struct MagneticField { + x: F64 + y: F64 + z: F64 + } + + # Port definitions + port MagneticFieldRead -> MagneticField + + @ Component for F Prime FSW framework. + passive component Lis2mdlDriver { + + sync input port getMagneticField: MagneticFieldRead + + ############################################################################### + # Standard AC Ports: Required for Channels, Events, Commands, and Parameters # + ############################################################################### + @ Port for requesting the current time + time get port timeCaller + + } +} diff --git a/FprimeZephyrReference/Components/Lis2mdlDriver/Lis2mdlDriver.hpp b/FprimeZephyrReference/Components/Lis2mdlDriver/Lis2mdlDriver.hpp new file mode 100644 index 00000000..bbf289b6 --- /dev/null +++ b/FprimeZephyrReference/Components/Lis2mdlDriver/Lis2mdlDriver.hpp @@ -0,0 +1,52 @@ +// ====================================================================== +// \title Lis2mdlDriver.hpp +// \author aychar +// \brief hpp file for Lis2mdlDriver component implementation class +// ====================================================================== + +#ifndef Components_Lis2mdlDriver_HPP +#define Components_Lis2mdlDriver_HPP + +#include "FprimeZephyrReference/Components/Lis2mdlDriver/Lis2mdlDriverComponentAc.hpp" + +#include +#include +#include + +namespace Components { + +class Lis2mdlDriver final : public Lis2mdlDriverComponentBase { + public: + // ---------------------------------------------------------------------- + // Component construction and destruction + // ---------------------------------------------------------------------- + + //! Construct Lis2mdlDriver object + Lis2mdlDriver(const char* const compName //!< The component name + ); + + //! Destroy Lis2mdlDriver object + ~Lis2mdlDriver(); + + private: + //! Handler implementation + MagneticField getMagneticField_handler(FwIndexType portNum) override; + + // ---------------------------------------------------------------------- + // Helper methods + // ---------------------------------------------------------------------- + + //! Convert a Zephyr sensor_value to an Fprime F64 + F64 sensor_value_to_f64(const struct sensor_value& val); + + // ---------------------------------------------------------------------- + // Member variables + // ---------------------------------------------------------------------- + + //! Zephyr device stores the initialized LIS2MDL sensor + const struct device* lis2mdl; +}; + +} // namespace Components + +#endif diff --git a/FprimeZephyrReference/Components/Lis2mdlDriver/docs/sdd.md b/FprimeZephyrReference/Components/Lis2mdlDriver/docs/sdd.md new file mode 100644 index 00000000..7867637d --- /dev/null +++ b/FprimeZephyrReference/Components/Lis2mdlDriver/docs/sdd.md @@ -0,0 +1,66 @@ +# Components::Lis2mdlDriver + +Component for F Prime FSW framework. + +## Usage Examples +Add usage examples here + +### Diagrams +Add diagrams here + +### Typical Usage +And the typical usage of the component here + +## Class Diagram +Add a class diagram here + +## Port Descriptions +| Name | Description | +|---|---| +|---|---| + +## Component States +Add component states in the chart below +| Name | Description | +|---|---| +|---|---| + +## Sequence Diagrams +Add sequence diagrams here + +## Parameters +| Name | Description | +|---|---| +|---|---| + +## Commands +| Name | Description | +|---|---| +|---|---| + +## Events +| Name | Description | +|---|---| +|---|---| + +## Telemetry +| Name | Description | +|---|---| +|---|---| + +## Unit Tests +Add unit test descriptions in the chart below +| Name | Description | Output | Coverage | +|---|---|---|---| +|---|---|---|---| + +## Requirements +Add requirements in the chart below +| Name | Description | Validation | +|---|---|---| +|---|---|---| + +## Change Log +| Date | Description | +|---|---| +|---| Initial Draft | diff --git a/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi b/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi index 1e0b66be..b4491537 100644 --- a/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi +++ b/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi @@ -40,7 +40,6 @@ telemetry packets ReferenceDeploymentPackets { ReferenceDeployment.imu.MagneticField } - } omit { CdhCore.cmdDisp.CommandErrors # Only has one library, no custom versions diff --git a/FprimeZephyrReference/ReferenceDeployment/Top/instances.fpp b/FprimeZephyrReference/ReferenceDeployment/Top/instances.fpp index 1c0e018c..ca5f9bfe 100644 --- a/FprimeZephyrReference/ReferenceDeployment/Top/instances.fpp +++ b/FprimeZephyrReference/ReferenceDeployment/Top/instances.fpp @@ -65,4 +65,6 @@ module ReferenceDeployment { instance watchdog: Components.Watchdog base id 0x10016000 instance imu: Components.Imu base id 0x10017000 + + instance lis2mdlDriver: Components.Lis2mdlDriver base id 0x10018000 } diff --git a/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp b/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp index 45563909..e286f22e 100644 --- a/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp +++ b/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp @@ -30,6 +30,7 @@ module ReferenceDeployment { instance watchdog instance prmDb instance imu + instance lis2mdlDriver # ---------------------------------------------------------------------- # Pattern graph specifiers @@ -100,6 +101,10 @@ module ReferenceDeployment { watchdog.gpioSet -> gpioDriver.gpioWrite } + connections Imu { + imu.readMagneticField -> lis2mdlDriver.getMagneticField + } + connections ReferenceDeployment { } From 8478ca1df1249b422ab21d4fabc1567d8d38f7fb Mon Sep 17 00:00:00 2001 From: Aaron Siemsen <145521612+asiemsen@users.noreply.github.com> Date: Thu, 18 Sep 2025 17:03:58 -0500 Subject: [PATCH 11/26] Create lsm6dso driver component & implementation (#17) * Update README.md * Create lmsd6dsoDriver component * create ports for sensor reading output * fix port naming issue * Use custom board definition * Remove commented config * Moving prj.conf sensors to board definition * Add d board * Try referencing c definitions in d board * Making a common v5 board definition * Fix readme * Minor Makefile, Readme and cmake presets fixes * change lsm6dso internal structs to carry F64 and added output ports to imu * removed lmsdso init from imu constructor * remove old sensor reading from imu * add lms6dso driver to topology * change base id to allow for lis2mdl driver * remove line endings * add channel retrieval during sensor data * Ensure submodules are downloaded before venv is created * Fix infinit submodule make target recursion... --------- Co-authored-by: ineskhou <127782958+ineskhou@users.noreply.github.com> Co-authored-by: Nate Gay Co-authored-by: Nate Gay Co-authored-by: Saidi Adams Co-authored-by: Michael Pham <61564344+Mikefly123@users.noreply.github.com> --- CMakePresets.json | 6 +- .../Components/CMakeLists.txt | 1 + FprimeZephyrReference/Components/Imu/Imu.cpp | 60 +------- FprimeZephyrReference/Components/Imu/Imu.fpp | 23 +-- FprimeZephyrReference/Components/Imu/Imu.hpp | 31 ---- .../Components/lms6dsoDriver/CMakeLists.txt | 36 +++++ .../Components/lms6dsoDriver/docs/sdd.md | 66 +++++++++ .../lms6dsoDriver/lms6dsoDriver.cpp | 71 ++++++++++ .../lms6dsoDriver/lms6dsoDriver.fpp | 39 ++++++ .../lms6dsoDriver/lms6dsoDriver.hpp | 53 +++++++ .../ReferenceDeployment/Top/instances.fpp | 2 + .../ReferenceDeployment/Top/topology.fpp | 4 + Makefile | 46 ++---- README.md | 16 +-- .../Kconfig.defconfig | 12 ++ ...roves_flight_control_board_v5-pinctrl.dtsi | 20 +++ .../proves_flight_control_board_v5.dtsi | 132 ++++++++++++++++++ .../Kconfig.proves_flight_control_board_v5c | 6 +- ...s_flight_control_board_v5c_rp2350a_m33.dts | 2 +- ...ht_control_board_v5c_rp2350a_m33_defconfig | 14 ++ .../Kconfig.proves_flight_control_board_v5d | 5 + .../board.cmake | 20 +++ .../proves_flight_control_board_v5d/board.yml | 6 + ...s_flight_control_board_v5d_rp2350a_m33.dts | 24 ++++ ..._flight_control_board_v5d_rp2350a_m33.yaml | 22 +++ ...ht_control_board_v5d_rp2350a_m33_defconfig | 27 ++++ .../support/openocd.cfg | 11 ++ prj.conf | 32 +---- 28 files changed, 603 insertions(+), 184 deletions(-) create mode 100644 FprimeZephyrReference/Components/lms6dsoDriver/CMakeLists.txt create mode 100644 FprimeZephyrReference/Components/lms6dsoDriver/docs/sdd.md create mode 100644 FprimeZephyrReference/Components/lms6dsoDriver/lms6dsoDriver.cpp create mode 100644 FprimeZephyrReference/Components/lms6dsoDriver/lms6dsoDriver.fpp create mode 100644 FprimeZephyrReference/Components/lms6dsoDriver/lms6dsoDriver.hpp create mode 100644 boards/bronco_space/proves_flight_control_board_v5/Kconfig.defconfig create mode 100644 boards/bronco_space/proves_flight_control_board_v5/proves_flight_control_board_v5-pinctrl.dtsi create mode 100644 boards/bronco_space/proves_flight_control_board_v5/proves_flight_control_board_v5.dtsi create mode 100644 boards/bronco_space/proves_flight_control_board_v5d/Kconfig.proves_flight_control_board_v5d create mode 100644 boards/bronco_space/proves_flight_control_board_v5d/board.cmake create mode 100644 boards/bronco_space/proves_flight_control_board_v5d/board.yml create mode 100644 boards/bronco_space/proves_flight_control_board_v5d/proves_flight_control_board_v5d_rp2350a_m33.dts create mode 100644 boards/bronco_space/proves_flight_control_board_v5d/proves_flight_control_board_v5d_rp2350a_m33.yaml create mode 100644 boards/bronco_space/proves_flight_control_board_v5d/proves_flight_control_board_v5d_rp2350a_m33_defconfig create mode 100644 boards/bronco_space/proves_flight_control_board_v5d/support/openocd.cfg diff --git a/CMakePresets.json b/CMakePresets.json index ba50b3ba..685b8a2a 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -3,18 +3,18 @@ { "binaryDir": "${sourceDir}/build-fprime-automatic-zephyr", "cacheVariables": { - "BOARD": "teensy41", + "BOARD": "proves_flight_control_board_v5c/rp2350a/m33", "CMAKE_BUILD_TYPE": "Release", "CMAKE_EXPORT_COMPILE_COMMANDS": "ON" }, "description": "F\u00b4 release build using local fprime-venv", - "displayName": "F\u00b4 Zephyr (teensy41)", + "displayName": "F\u00b4 FPrime Zephyr PROVES", "environment": { "PATH": "$env{VIRTUAL_ENV}/bin:$penv{PATH}", "VIRTUAL_ENV": "${fileDir}/fprime-venv" }, "generator": "Ninja", - "name": "fprime-zephyr-teensy41", + "name": "fprime-zephyr-proves", "toolchainFile": "${fileDir}/lib/fprime-zephyr/cmake/toolchain/zephyr.cmake" } ], diff --git a/FprimeZephyrReference/Components/CMakeLists.txt b/FprimeZephyrReference/Components/CMakeLists.txt index 2a88e633..dce20754 100644 --- a/FprimeZephyrReference/Components/CMakeLists.txt +++ b/FprimeZephyrReference/Components/CMakeLists.txt @@ -3,4 +3,5 @@ add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/FatalHandler") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Watchdog") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Imu/") +add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/lms6dsoDriver/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Lis2mdlDriver/") diff --git a/FprimeZephyrReference/Components/Imu/Imu.cpp b/FprimeZephyrReference/Components/Imu/Imu.cpp index 5cbcc3d7..a9a2b1fe 100644 --- a/FprimeZephyrReference/Components/Imu/Imu.cpp +++ b/FprimeZephyrReference/Components/Imu/Imu.cpp @@ -13,16 +13,7 @@ namespace Components { // Component construction and destruction // ---------------------------------------------------------------------- -Imu ::Imu(const char* const compName) : ImuComponentBase(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); -} +Imu ::Imu(const char* const compName) : ImuComponentBase(compName) {} Imu ::~Imu() {} @@ -31,53 +22,10 @@ Imu ::~Imu() {} // ---------------------------------------------------------------------- void Imu ::run_handler(FwIndexType portNum, U32 context) { - // Fetch new data samples from the sensors - sensor_sample_fetch_chan(lsm6dso, SENSOR_CHAN_ACCEL_XYZ); - sensor_sample_fetch_chan(lsm6dso, SENSOR_CHAN_GYRO_XYZ); - sensor_sample_fetch_chan(lsm6dso, SENSOR_CHAN_DIE_TEMP); - - // Output sensor values via telemetry - this->tlmWrite_Acceleration(this->get_acceleration()); - this->tlmWrite_AngularVelocity(this->get_angular_velocity()); + this->tlmWrite_Acceleration(this->readAcceleration_out(0)); + this->tlmWrite_AngularVelocity(this->readAngularVelocity_out(0)); this->tlmWrite_MagneticField(this->readMagneticField_out(0)); - this->tlmWrite_Temperature(this->get_temperature()); -} - -F64 Imu ::sensor_value_to_f64(const struct sensor_value& val) { - return val.val1 + val.val2 / 1000000.0f; -} - -Components::Imu_Acceleration Imu ::get_acceleration() { - struct sensor_value x; - struct sensor_value y; - struct sensor_value z; - - sensor_channel_get(lsm6dso, SENSOR_CHAN_ACCEL_X, &x); - sensor_channel_get(lsm6dso, SENSOR_CHAN_ACCEL_Y, &y); - sensor_channel_get(lsm6dso, SENSOR_CHAN_ACCEL_Z, &z); - - return Components::Imu_Acceleration(this->sensor_value_to_f64(x), this->sensor_value_to_f64(y), - this->sensor_value_to_f64(z)); -} - -Components::Imu_AngularVelocity Imu ::get_angular_velocity() { - struct sensor_value x; - struct sensor_value y; - struct sensor_value z; - - sensor_channel_get(lsm6dso, SENSOR_CHAN_GYRO_X, &x); - sensor_channel_get(lsm6dso, SENSOR_CHAN_GYRO_Y, &y); - sensor_channel_get(lsm6dso, SENSOR_CHAN_GYRO_Z, &z); - - return Components::Imu_AngularVelocity(this->sensor_value_to_f64(x), this->sensor_value_to_f64(y), - this->sensor_value_to_f64(z)); + this->tlmWrite_Temperature(this->readTemperature_out(0)); } -F64 Imu ::get_temperature() { - struct sensor_value temp; - - sensor_channel_get(lsm6dso, SENSOR_CHAN_DIE_TEMP, &temp); - - return this->sensor_value_to_f64(temp); -} } // namespace Components diff --git a/FprimeZephyrReference/Components/Imu/Imu.fpp b/FprimeZephyrReference/Components/Imu/Imu.fpp index 30a46fa5..22446d9a 100644 --- a/FprimeZephyrReference/Components/Imu/Imu.fpp +++ b/FprimeZephyrReference/Components/Imu/Imu.fpp @@ -3,31 +3,20 @@ module Components { passive component Imu { sync input port run: Svc.Sched + output port readAcceleration: AccelerationRead + output port readAngularVelocity: AngularVelocityRead output port readMagneticField: MagneticFieldRead + output port readTemperature: TemperatureRead - @ Acceleration reading in m/s^2 - struct Acceleration { - x: F64 - y: F64 - z: F64 - } + @Telemetry channel for angular velocity + telemetry AngularVelocity: AngularVelocity - @ Telemetry channel for acceleration + @ Telemetry channel for Acceleration telemetry Acceleration: Acceleration @ Telemetry channel for magnetic field telemetry MagneticField: MagneticField - @ Angular velocity reading in rad/s - struct AngularVelocity { - x: F64 - y: F64 - z: F64 - } - - @ Telemetry channel for angular velocity - telemetry AngularVelocity: AngularVelocity - @ Telemetry channel for temperature in degrees Celsius telemetry Temperature: F64 diff --git a/FprimeZephyrReference/Components/Imu/Imu.hpp b/FprimeZephyrReference/Components/Imu/Imu.hpp index 43ca3738..c6384251 100644 --- a/FprimeZephyrReference/Components/Imu/Imu.hpp +++ b/FprimeZephyrReference/Components/Imu/Imu.hpp @@ -8,10 +8,6 @@ #include "FprimeZephyrReference/Components/Imu/ImuComponentAc.hpp" -#include -#include -#include - namespace Components { class Imu final : public ImuComponentBase { @@ -35,33 +31,6 @@ class Imu final : public ImuComponentBase { void run_handler(FwIndexType portNum, //!< The port number U32 context //!< The call order ) override; - - // ---------------------------------------------------------------------- - // Helper methods - // ---------------------------------------------------------------------- - - //! Convert a Zephyr sensor_value to an Fprime F64 - F64 sensor_value_to_f64(const struct sensor_value& val); - - // ---------------------------------------------------------------------- - // IMU access methods - // ---------------------------------------------------------------------- - - //! Get the acceleration reading from the IMU - Components::Imu_Acceleration get_acceleration(); - - //! Get the angular velocity reading from the IMU - Components::Imu_AngularVelocity get_angular_velocity(); - - //! Get the temperature reading from the IMU - F64 get_temperature(); - - // ---------------------------------------------------------------------- - // Member variables - // ---------------------------------------------------------------------- - - //! Zephyr device stores the initialized LSM6DSO sensor - const struct device* lsm6dso; }; } // namespace Components diff --git a/FprimeZephyrReference/Components/lms6dsoDriver/CMakeLists.txt b/FprimeZephyrReference/Components/lms6dsoDriver/CMakeLists.txt new file mode 100644 index 00000000..d87a2502 --- /dev/null +++ b/FprimeZephyrReference/Components/lms6dsoDriver/CMakeLists.txt @@ -0,0 +1,36 @@ +#### +# 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( + AUTOCODER_INPUTS + "${CMAKE_CURRENT_LIST_DIR}/lms6dsoDriver.fpp" + SOURCES + "${CMAKE_CURRENT_LIST_DIR}/lms6dsoDriver.cpp" +# DEPENDS +# MyPackage_MyOtherModule +) + +### Unit Tests ### +# register_fprime_ut( +# AUTOCODER_INPUTS +# "${CMAKE_CURRENT_LIST_DIR}/lms6dsoDriver.fpp" +# SOURCES +# "${CMAKE_CURRENT_LIST_DIR}/test/ut/lms6dsoDriverTestMain.cpp" +# "${CMAKE_CURRENT_LIST_DIR}/test/ut/lms6dsoDriverTester.cpp" +# DEPENDS +# STest # For rules-based testing +# UT_AUTO_HELPERS +# ) diff --git a/FprimeZephyrReference/Components/lms6dsoDriver/docs/sdd.md b/FprimeZephyrReference/Components/lms6dsoDriver/docs/sdd.md new file mode 100644 index 00000000..f36d6cf2 --- /dev/null +++ b/FprimeZephyrReference/Components/lms6dsoDriver/docs/sdd.md @@ -0,0 +1,66 @@ +# Components::lms6dsoDriver + +Initialize and control operation of the lms6dso device + +## Usage Examples +Add usage examples here + +### Diagrams +Add diagrams here + +### Typical Usage +And the typical usage of the component here + +## Class Diagram +Add a class diagram here + +## Port Descriptions +| Name | Description | +|---|---| +|---|---| + +## Component States +Add component states in the chart below +| Name | Description | +|---|---| +|---|---| + +## Sequence Diagrams +Add sequence diagrams here + +## Parameters +| Name | Description | +|---|---| +|---|---| + +## Commands +| Name | Description | +|---|---| +|---|---| + +## Events +| Name | Description | +|---|---| +|---|---| + +## Telemetry +| Name | Description | +|---|---| +|---|---| + +## Unit Tests +Add unit test descriptions in the chart below +| Name | Description | Output | Coverage | +|---|---|---|---| +|---|---|---|---| + +## Requirements +Add requirements in the chart below +| Name | Description | Validation | +|---|---|---| +|---|---|---| + +## Change Log +| Date | Description | +|---|---| +|---| Initial Draft | \ No newline at end of file diff --git a/FprimeZephyrReference/Components/lms6dsoDriver/lms6dsoDriver.cpp b/FprimeZephyrReference/Components/lms6dsoDriver/lms6dsoDriver.cpp new file mode 100644 index 00000000..9d4819f1 --- /dev/null +++ b/FprimeZephyrReference/Components/lms6dsoDriver/lms6dsoDriver.cpp @@ -0,0 +1,71 @@ +// ====================================================================== +// \title lms6dsoDriver.cpp +// \author aaron +// \brief cpp file for lms6dsoDriver component implementation class +// ====================================================================== + +#include "FprimeZephyrReference/Components/lms6dsoDriver/lms6dsoDriver.hpp" + +namespace Components { + +// ---------------------------------------------------------------------- +// Component construction and destruction +// ---------------------------------------------------------------------- + +lms6dsoDriver ::lms6dsoDriver(const char* const compName) : lms6dsoDriverComponentBase(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 + sensor_attr_set(lsm6dso, SENSOR_CHAN_ACCEL_XYZ, SENSOR_ATTR_SAMPLING_FREQUENCY, &odr); + sensor_attr_set(lsm6dso, SENSOR_CHAN_GYRO_XYZ, SENSOR_ATTR_SAMPLING_FREQUENCY, &odr); +} + +lms6dsoDriver ::~lms6dsoDriver() {} + +// ---------------------------------------------------------------------- +// Handler implementations for typed input ports +// ---------------------------------------------------------------------- + +Components::Acceleration lms6dsoDriver::getAcceleration_handler(FwIndexType portNum) { + struct sensor_value x; + struct sensor_value y; + struct sensor_value z; + sensor_sample_fetch_chan(lsm6dso, SENSOR_CHAN_ACCEL_XYZ); + + sensor_channel_get(lsm6dso, SENSOR_CHAN_ACCEL_X, &x); + sensor_channel_get(lsm6dso, SENSOR_CHAN_ACCEL_Y, &y); + sensor_channel_get(lsm6dso, SENSOR_CHAN_ACCEL_Z, &z); + + return Components::Acceleration(this->sensor_value_to_f64(x),this->sensor_value_to_f64(y), this->sensor_value_to_f64(z)); +} + +Components::AngularVelocity lms6dsoDriver::getAngularVelocity_handler(FwIndexType portNum) { + struct sensor_value x; + struct sensor_value y; + struct sensor_value z; + sensor_sample_fetch_chan(lsm6dso, SENSOR_CHAN_GYRO_XYZ); + + sensor_channel_get(lsm6dso, SENSOR_CHAN_GYRO_X, &x); + sensor_channel_get(lsm6dso, SENSOR_CHAN_GYRO_Y, &y); + sensor_channel_get(lsm6dso, SENSOR_CHAN_GYRO_Z, &z); + + return Components::AngularVelocity(this->sensor_value_to_f64(x),this->sensor_value_to_f64(y), this->sensor_value_to_f64(z)); +} + + +F64 lms6dsoDriver::getTemperature_handler(FwIndexType portNum) { + struct sensor_value temp; + + sensor_sample_fetch_chan(lsm6dso, SENSOR_CHAN_DIE_TEMP); + sensor_channel_get(lsm6dso, SENSOR_CHAN_DIE_TEMP, &temp); + + return this->sensor_value_to_f64(temp); +} + +F64 lms6dsoDriver::sensor_value_to_f64(const struct sensor_value& val) { + return val.val1 + val.val2 / 1000000.0f; +} + +} // namespace Components diff --git a/FprimeZephyrReference/Components/lms6dsoDriver/lms6dsoDriver.fpp b/FprimeZephyrReference/Components/lms6dsoDriver/lms6dsoDriver.fpp new file mode 100644 index 00000000..fc635010 --- /dev/null +++ b/FprimeZephyrReference/Components/lms6dsoDriver/lms6dsoDriver.fpp @@ -0,0 +1,39 @@ +module Components { + + @ Acceleration Reading in m/s^2 + struct Acceleration { + x: F64 + y: F64 + z: F64 + } + + @ Angular velocity reading in rad/s + struct AngularVelocity { + x: F64 + y: F64 + z: F64 + } + + port AccelerationRead() -> Acceleration + port AngularVelocityRead() -> AngularVelocity + port TemperatureRead() -> F64 + + @ Initialize and control operation of the lms6dso device + passive component lms6dsoDriver { + + @ Port for synchronously retrieving data + sync input port getAcceleration: AccelerationRead + sync input port getAngularVelocity: AngularVelocityRead + sync input port getTemperature: TemperatureRead + + ############################################################################### + # Standard AC Ports: Required for Channels, Events, Commands, and Parameters # + ############################################################################### + @ Port for requesting the current time + time get port timeCaller + + + + + } +} \ No newline at end of file diff --git a/FprimeZephyrReference/Components/lms6dsoDriver/lms6dsoDriver.hpp b/FprimeZephyrReference/Components/lms6dsoDriver/lms6dsoDriver.hpp new file mode 100644 index 00000000..b9c9fc46 --- /dev/null +++ b/FprimeZephyrReference/Components/lms6dsoDriver/lms6dsoDriver.hpp @@ -0,0 +1,53 @@ +// ====================================================================== +// \title lms6dsoDriver.hpp +// \author aaron +// \brief hpp file for lms6dsoDriver component implementation class +// ====================================================================== + +#ifndef Components_lms6dsoDriver_HPP +#define Components_lms6dsoDriver_HPP + +#include "FprimeZephyrReference/Components/lms6dsoDriver/lms6dsoDriverComponentAc.hpp" + + +#include +#include +#include + +namespace Components { + +class lms6dsoDriver final : public lms6dsoDriverComponentBase { + public: + // ---------------------------------------------------------------------- + // Component construction and destruction + // ---------------------------------------------------------------------- + + //! Construct lms6dsoDriver object + lms6dsoDriver(const char* const compName //!< The component name + ); + + //! Destroy lms6dsoDriver object + ~lms6dsoDriver(); + + private: + + // ---------------------------------------------------------------------- + // Handler implementations for typed input ports + // ---------------------------------------------------------------------- + Acceleration getAcceleration_handler(FwIndexType portNum) override; + + AngularVelocity getAngularVelocity_handler(FwIndexType portNum) override; + + F64 getTemperature_handler(FwIndexType portNum) override; + + F64 sensor_value_to_f64(const struct sensor_value &val); + + //! Zephyr device stores the initialized LSM6DSO sensor + const struct device* lsm6dso; + + +}; + +} // namespace Components + +#endif diff --git a/FprimeZephyrReference/ReferenceDeployment/Top/instances.fpp b/FprimeZephyrReference/ReferenceDeployment/Top/instances.fpp index ca5f9bfe..42c57dc4 100644 --- a/FprimeZephyrReference/ReferenceDeployment/Top/instances.fpp +++ b/FprimeZephyrReference/ReferenceDeployment/Top/instances.fpp @@ -67,4 +67,6 @@ module ReferenceDeployment { instance imu: Components.Imu base id 0x10017000 instance lis2mdlDriver: Components.Lis2mdlDriver base id 0x10018000 + + instance lms6dsoDriver: Components.lms6dsoDriver base id 0x10019000 } diff --git a/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp b/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp index e286f22e..4b0cb04c 100644 --- a/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp +++ b/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp @@ -31,6 +31,7 @@ module ReferenceDeployment { instance prmDb instance imu instance lis2mdlDriver + instance lms6dsoDriver # ---------------------------------------------------------------------- # Pattern graph specifiers @@ -102,7 +103,10 @@ module ReferenceDeployment { } connections Imu { + imu.readAcceleration -> lms6dsoDriver.getAcceleration + imu.readAngularVelocity -> lms6dsoDriver.getAngularVelocity imu.readMagneticField -> lis2mdlDriver.getMagneticField + imu.readTemperature -> lms6dsoDriver.getTemperature } connections ReferenceDeployment { diff --git a/Makefile b/Makefile index 542c0f43..1e9d030c 100644 --- a/Makefile +++ b/Makefile @@ -13,15 +13,14 @@ submodules: ## Initialize and update git submodules git submodule update --init --recursive export VIRTUAL_ENV ?= $(shell pwd)/fprime-venv -fprime-venv: uv ## Create a virtual environment - @test -s $(VIRTUAL_ENV) || { \ - echo "Creating virtual environment..."; \ - $(UV) venv fprime-venv; \ - $(UV) pip install --requirement requirements.txt; \ - } +fprime-venv: ## Create a virtual environment + @$(MAKE) uv + @echo "Creating virtual environment..." + @$(UV) venv fprime-venv + @$(UV) pip install --requirement requirements.txt .PHONY: zephyr-setup -zephyr-setup: uv ## Set up Zephyr environment +zephyr-setup: fprime-venv ## Set up Zephyr environment @test -s lib/zephyr-workspace/tools/edtt/.gitignore || { \ echo "Setting up Zephyr environment..."; \ cd lib/zephyr-workspace && \ @@ -34,18 +33,17 @@ zephyr-setup: uv ## Set up Zephyr environment ##@ Development .PHONY: pre-commit-install -pre-commit-install: uv - @echo "Installing pre-commit hooks..." +pre-commit-install: uv ## Install pre-commit hooks @$(UVX) pre-commit install > /dev/null .PHONY: fmt fmt: pre-commit-install ## Lint and format files - $(UVX) pre-commit run --all-files + @$(UVX) pre-commit run --all-files .PHONY: generate generate: submodules fprime-venv zephyr-setup ## Generate FPrime-Zephyr Proves Core Reference @echo "Generating FPrime-Zephyr Proves Core Reference..." - $(UV) run fprime-util generate --force + @$(UV) run fprime-util generate --force .PHONY: generate-if-needed BUILD_DIR ?= $(shell pwd)/build-fprime-automatic-zephyr @@ -53,26 +51,16 @@ generate-if-needed: @test -s $(BUILD_DIR) || $(MAKE) generate .PHONY: build -build: generate-if-needed ## Build FPrime-Zephyr Proves Core Reference - @echo "Building FPrime code..." +build: submodules zephyr-setup fprime-venv generate-if-needed ## Build FPrime-Zephyr Proves Core Reference + @echo "Building..." @$(UV) run fprime-util build -.PHONY: list-tty -list-tty: arduino-cli ## List available TTY ports - @echo "TTY ports:" - @$(ARDUINO_CLI) board list | grep "USB" | awk '{print $$1}' - -.PHONY: install -UF2 ?= $(BUILD_DIR)/zephyr/zephyr.uf2 -install: arduino-cli build ## Install the zephyr firmware onto a connected PROVES Kit, requires BOARD_DIR=[path-to-your-board] - @$(ARDUINO_CLI) config init || true - @$(ARDUINO_CLI) config add board_manager.additional_urls https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json - @$(ARDUINO_CLI) core install rp2040:rp2040@4.1.1 - @$(ARDUINO_CLI) upload -v -b 115200 --fqbn rp2040:rp2040:rpipico -p $(BOARD_DIR) -i $(UF2) - .PHONY: clean clean: ## Remove all gitignored files git clean -dfX + +.PHONY: clean-zephyr +clean-zephyr: ## Remove all Zephyr build files rm -rf lib/zephyr-workspace/bootloader lib/zephyr-workspace/modules lib/zephyr-workspace/tools ##@ Operations @@ -98,9 +86,3 @@ UVX ?= $(UV_DIR)/uvx uv: $(UV) ## Download uv $(UV): $(BIN_DIR) @test -s $(UV) || { mkdir -p $(UV_DIR); curl -LsSf https://astral.sh/uv/$(UV_VERSION)/install.sh | UV_INSTALL_DIR=$(UV_DIR) sh > /dev/null; } - -ARDUINO_CLI ?= $(BIN_DIR)/arduino-cli -.PHONY: arduino-cli -arduino-cli: $(ARDUINO_CLI) ## Download arduino-cli -$(ARDUINO_CLI): $(BIN_DIR) - @test -s $(ARDUINO_CLI) || curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | BINDIR=$(BIN_DIR) sh > /dev/null diff --git a/README.md b/README.md index 74d41fb3..7b591df2 100644 --- a/README.md +++ b/README.md @@ -36,14 +36,7 @@ make build ### Find the path to your board -Next, plug in your board! If you have previously installed a firmware on your board you may not see it show up as a drive. In that case you'll want to find it's `tty` port. - -To do this, run the following command -```shell -make list-tty -``` - -Otherwise, you want to find the location of the board on your computer. It should be called something like RP2350 but you want to find the path to it +Next, plug in your board! If you have previously installed a firmware on your board you may not see it show up as a drive. In that case you'll want to put the board into boot loader mode. Then you'll be able to find the location of the board on your computer. It should be called something like RP2350 but you want to find the path to it For Mac: ```shell @@ -63,6 +56,13 @@ Now you want to install the firmware to the board. make install BOARD_DIR=[path-to-your-board] ``` +or +``` +cp build-fprime-automatic-zephyr/zephyr/zephyr.uf2 [path-to-your-board] +``` +to copy the uf2 if the make install isn't working + + Finally, run the fprime-gds. ```shell make gds diff --git a/boards/bronco_space/proves_flight_control_board_v5/Kconfig.defconfig b/boards/bronco_space/proves_flight_control_board_v5/Kconfig.defconfig new file mode 100644 index 00000000..53c0c734 --- /dev/null +++ b/boards/bronco_space/proves_flight_control_board_v5/Kconfig.defconfig @@ -0,0 +1,12 @@ +config SOC_RP2350A_M33 + bool "Enable Arm cores" + default y + +config USB_SELF_POWERED + default n + +config USB_CDC_ACM_LOG_LEVEL + default 0 + +config USB_DEVICE_LOG_LEVEL + default 1 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 new file mode 100644 index 00000000..012ca613 --- /dev/null +++ b/boards/bronco_space/proves_flight_control_board_v5/proves_flight_control_board_v5-pinctrl.dtsi @@ -0,0 +1,20 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + pinmux = , ; + }; + + group2 { + pinmux = ; + input-enable; + }; + }; + i2c1_default: i2c1_default { + group1 { + 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 new file mode 100644 index 00000000..cc25572f --- /dev/null +++ b/boards/bronco_space/proves_flight_control_board_v5/proves_flight_control_board_v5.dtsi @@ -0,0 +1,132 @@ +#include + +#include +#include + +#include "proves_flight_control_board_v5-pinctrl.dtsi" + +/ { + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart0; + zephyr,shell-uart = &cdc_acm_uart0; + zephyr,code-partition = &code_partition; + }; + + aliases { + watchdog0 = &wdt0; + }; + + leds { + compatible = "gpio-leds"; + led0: led0 { + gpios = <&gpio0 24 GPIO_ACTIVE_HIGH>; + label = "User LED GPIO24"; + }; + }; +}; + +zephyr_udc0: &usbd { + status = "okay"; +}; + +&zephyr_udc0 { + cdc_acm_uart0: cdc_acm_uart0 { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; +}; + +&flash0 { + reg = <0x10000000 DT_SIZE_M(4)>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + /* Reserved memory for an image definition block. The block is much + * smaller than 256 bytes, but in practice the linker places the vector + * table at a much larger alignment offset. + */ + image_def: partition@0 { + label = "image_def"; + reg = <0x00000000 0x100>; + read-only; + }; + + /* + * Usable flash. Starts at 0x100, after the image definition block. + * The partition size is 4MB minus the 0x100 bytes taken by the + * image definition. + */ + code_partition: partition@100 { + label = "code-partition"; + reg = <0x100 (DT_SIZE_M(4) - 0x100)>; + read-only; + }; + }; +}; + +&timer0 { + status = "okay"; +}; + +&wdt0 { + status = "okay"; +}; + +&gpio0 { + status = "okay"; +}; + +&spi1 { + status = "okay"; + cs-gpios = <&gpio0 9 GPIO_ACTIVE_LOW>; + pinctrl-0 = <&spi1_default>; + pinctrl-names = "default"; + + lora0: sx1276@0 { + 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)>; + reset-gpios = <&gpio0 6 GPIO_ACTIVE_LOW>; + power-amplifier-output = "pa-boost"; + label = "HOPE_RF"; + }; +}; + +&i2c1 { + status = "okay"; + pinctrl-0 = <&i2c1_default>; + pinctrl-names = "default"; + clock-frequency = <100000>; + + lsm6dso0: lsm6dso0@6b { + compatible = "st,lsm6dso"; + reg = <0x6b>; + label = "LSM6DSO"; + }; + + lis2mdl: lis2mdl@1e { + compatible = "st,lis2mdl"; + reg = <0x1e>; + label = "LIS2MDL"; + }; + rv3028: rv3028@52 { + compatible = "microcrystal,rv3028"; + reg = <0x52>; + int-gpios = <&gpio0 27 GPIO_ACTIVE_HIGH>; + backup-switch-mode = "level"; + label = "RV3028"; + }; + ina219: ina219@40 { + compatible = "ti,ina219"; + reg = <0x40>; + shunt-milliohm = <2>; + lsb-microamp = <100>; + label = "INA219"; + }; +}; diff --git a/boards/bronco_space/proves_flight_control_board_v5c/Kconfig.proves_flight_control_board_v5c b/boards/bronco_space/proves_flight_control_board_v5c/Kconfig.proves_flight_control_board_v5c index 805f5070..ce2e6e17 100644 --- a/boards/bronco_space/proves_flight_control_board_v5c/Kconfig.proves_flight_control_board_v5c +++ b/boards/bronco_space/proves_flight_control_board_v5c/Kconfig.proves_flight_control_board_v5c @@ -1,5 +1 @@ -# Copyright (c) 2024 Andrew Featherstone -# SPDX-License-Identifier: Apache-2.0 - -config BOARD_PROVES_FLIGHT_CONTROL_BOARD_V5C - select SOC_RP2350A_M33 if BOARD_PROVES_FLIGHT_CONTROL_BOARD_V5C_RP2350A_M33 +source "../../../boards/bronco_space/proves_flight_control_board_v5/Kconfig.defconfig" 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 dc57761a..e4290dd6 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 @@ -16,4 +16,4 @@ #include #include -#include "proves_flight_control_board_v5c.dtsi" +#include "../proves_flight_control_board_v5/proves_flight_control_board_v5.dtsi" diff --git a/boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c_rp2350a_m33_defconfig b/boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c_rp2350a_m33_defconfig index ff74ead6..02bb4603 100644 --- a/boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c_rp2350a_m33_defconfig +++ b/boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c_rp2350a_m33_defconfig @@ -11,3 +11,17 @@ CONFIG_USE_DT_CODE_PARTITION=y CONFIG_USB_DEVICE_STACK=y CONFIG_USB_DEVICE_PRODUCT="PROVES Flight Control Board v5c" CONFIG_USB_DEVICE_VID=0x0028 + +# Sensors +CONFIG_LSM6DSO=y +CONFIG_LSM6DSO_ENABLE_TEMP=y +CONFIG_LIS2MDL=y +CONFIG_INA219=y + +# Radio +CONFIG_LORA=y +CONFIG_LORA_SX127X=y + +# RTC +CONFIG_RTC=y +CONFIG_RTC_RV3028=y diff --git a/boards/bronco_space/proves_flight_control_board_v5d/Kconfig.proves_flight_control_board_v5d b/boards/bronco_space/proves_flight_control_board_v5d/Kconfig.proves_flight_control_board_v5d new file mode 100644 index 00000000..b3bd39fa --- /dev/null +++ b/boards/bronco_space/proves_flight_control_board_v5d/Kconfig.proves_flight_control_board_v5d @@ -0,0 +1,5 @@ +config BOARD_PROVES_FLIGHT_CONTROL_BOARD_V5D + bool "PROVES Flight Control Board v5d" + default y + +source "../../../boards/bronco_space/proves_flight_control_board_v5/Kconfig.defconfig" diff --git a/boards/bronco_space/proves_flight_control_board_v5d/board.cmake b/boards/bronco_space/proves_flight_control_board_v5d/board.cmake new file mode 100644 index 00000000..dc6406b4 --- /dev/null +++ b/boards/bronco_space/proves_flight_control_board_v5d/board.cmake @@ -0,0 +1,20 @@ +# SPDX-License-Identifier: Apache-2.0 + +if("${RPI_PICO_DEBUG_ADAPTER}" STREQUAL "") + set(RPI_PICO_DEBUG_ADAPTER "cmsis-dap") +endif() + +board_runner_args(openocd --cmd-pre-init "source [find interface/${RPI_PICO_DEBUG_ADAPTER}.cfg]") +board_runner_args(openocd --cmd-pre-init "source [find target/rp2350.cfg]") + +# The adapter speed is expected to be set by interface configuration. +# The Raspberry Pi's OpenOCD fork doesn't, so match their documentation at +# https://www.raspberrypi.com/documentation/microcontrollers/debug-probe.html#debugging-with-swd +board_runner_args(openocd --cmd-pre-init "set_adapter_speed_if_not_set 5000") + +board_runner_args(jlink "--device=RP2350_M33_0") +board_runner_args(uf2 "--board-id=RP2350") + +include(${ZEPHYR_BASE}/boards/common/openocd.board.cmake) +include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) +include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) diff --git a/boards/bronco_space/proves_flight_control_board_v5d/board.yml b/boards/bronco_space/proves_flight_control_board_v5d/board.yml new file mode 100644 index 00000000..32c6ada0 --- /dev/null +++ b/boards/bronco_space/proves_flight_control_board_v5d/board.yml @@ -0,0 +1,6 @@ +board: + name: proves_flight_control_board_v5d + full_name: PROVES Flight Control Board v5d + vendor: Bronco Space + socs: + - name: rp2350a 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 new file mode 100644 index 00000000..e265d05f --- /dev/null +++ b/boards/bronco_space/proves_flight_control_board_v5d/proves_flight_control_board_v5d_rp2350a_m33.dts @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2024 Andrew Featherstone + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; + +/* The build system assumes that there's a cpucluster-specific file. + * + * This file provides composition of the device tree: + * 1. The common features of the SoC + * 2. Core-specific configuration. + * 3. Board-specific configuration. + */ +#include +#include + +#include "../proves_flight_control_board_v5/proves_flight_control_board_v5.dtsi" + +&led0 { + gpios = <&gpio0 23 GPIO_ACTIVE_HIGH>; + label = "User LED GPIO23"; +}; diff --git a/boards/bronco_space/proves_flight_control_board_v5d/proves_flight_control_board_v5d_rp2350a_m33.yaml b/boards/bronco_space/proves_flight_control_board_v5d/proves_flight_control_board_v5d_rp2350a_m33.yaml new file mode 100644 index 00000000..6880c0c1 --- /dev/null +++ b/boards/bronco_space/proves_flight_control_board_v5d/proves_flight_control_board_v5d_rp2350a_m33.yaml @@ -0,0 +1,22 @@ +identifier: proves_flight_control_board_v5d/rp2350a/m33 +name: PROVES Flight Control Board v5d (RP2350, Cortex-M33) +type: mcu +arch: arm +flash: 4096 +ram: 520 +toolchain: + - zephyr + - gnuarmemb +supported: + - adc + - clock + - counter + - dma + - gpio + - hwinfo + - i2c + - pwm + - spi + - uart + - usbd + - watchdog diff --git a/boards/bronco_space/proves_flight_control_board_v5d/proves_flight_control_board_v5d_rp2350a_m33_defconfig b/boards/bronco_space/proves_flight_control_board_v5d/proves_flight_control_board_v5d_rp2350a_m33_defconfig new file mode 100644 index 00000000..fccf5b0f --- /dev/null +++ b/boards/bronco_space/proves_flight_control_board_v5d/proves_flight_control_board_v5d_rp2350a_m33_defconfig @@ -0,0 +1,27 @@ +CONFIG_BUILD_OUTPUT_HEX=y +CONFIG_BUILD_OUTPUT_UF2=y +CONFIG_CLOCK_CONTROL=y +CONFIG_CONSOLE=y +CONFIG_GPIO=y +CONFIG_RESET=y +CONFIG_SERIAL=y +CONFIG_UART_CONSOLE=y +CONFIG_UART_INTERRUPT_DRIVEN=y +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_USB_DEVICE_STACK=y +CONFIG_USB_DEVICE_PRODUCT="PROVES Flight Control Board v5d" +CONFIG_USB_DEVICE_VID=0x0028 + +# Sensors +CONFIG_LSM6DSO=y +CONFIG_LSM6DSO_ENABLE_TEMP=y +CONFIG_LIS2MDL=y +CONFIG_INA219=y + +# Radio +CONFIG_LORA=y +CONFIG_LORA_SX127X=y + +# RTC +CONFIG_RTC=y +CONFIG_RTC_RV3028=y diff --git a/boards/bronco_space/proves_flight_control_board_v5d/support/openocd.cfg b/boards/bronco_space/proves_flight_control_board_v5d/support/openocd.cfg new file mode 100644 index 00000000..82666bb5 --- /dev/null +++ b/boards/bronco_space/proves_flight_control_board_v5d/support/openocd.cfg @@ -0,0 +1,11 @@ +# Copyright (c) 2024 TOKITA Hiroshi +# SPDX-License-Identifier: Apache-2.0 + +# Checking and set 'adapter speed'. +# Set the adaptor speed, if unset, and given as an argument. +proc set_adapter_speed_if_not_set { speed } { + puts "checking adapter speed..." + if { [catch {adapter speed} ret] } { + adapter speed $speed + } +} diff --git a/prj.conf b/prj.conf index a6ec0633..96d07ad7 100644 --- a/prj.conf +++ b/prj.conf @@ -1,17 +1,9 @@ #### Configure Device VID and PID --> Uncomment the desired device definitions #### -#### From Teensy41 USB definitions #### -# CONFIG_USB_DEVICE_VID=0x16C0 -# CONFIG_USB_DEVICE_PID=0x0483 - #### From Raspberry Pi Pico2 USB Definitions #### CONFIG_USB_DEVICE_PID=0x000F CONFIG_USB_DEVICE_VID=0x2E8A -#### From Raspberry Pi Pico USB Definitions #### -# CONFIG_USB_DEVICE_PID=0x0003 -# CONFIG_USB_DEVICE_VID=0x2E8A - #### F Prime C++ Dependencies #### CONFIG_CPP=y CONFIG_REQUIRES_FULL_LIBCPP=y @@ -56,31 +48,9 @@ CONFIG_PRINTK=y CONFIG_UART_CONSOLE=y CONFIG_COMMON_LIBC_MALLOC=y -# Sensors CONFIG_SENSOR=y -CONFIG_LSM6DSO=y -CONFIG_LSM6DSO_ENABLE_TEMP=y -CONFIG_LIS2MDL=y -CONFIG_INA219=y - -# Zbus -# CONFIG_ZBUS=y -# CONFIG_ZBUS_CHANNEL_NAME=y -# CONFIG_ZBUS_OBSERVER_NAME=y -# CONFIG_ZBUS_MSG_SUBSCRIBER=y -# CONFIG_ZBUS_LOG_LEVEL_DBG=n -# CONFIG_ZBUS_LOG_LEVEL_INF=y -# Lora -CONFIG_LORA=y -CONFIG_LORA_SX127X=y - -# RTC -CONFIG_RTC=y -CONFIG_RTC_RV3028=y - -# Logging CONFIG_LOG=y CONFIG_LOG_DEFAULT_LEVEL=3 -# Compiler settings + CONFIG_CBPRINTF_FP_SUPPORT=y From d064a099f3a0ebce21c5013e2ade3fad80fef1bc Mon Sep 17 00:00:00 2001 From: Nate Gay Date: Thu, 18 Sep 2025 17:20:07 -0500 Subject: [PATCH 12/26] Spit out common helpers and types from drivers, standardize port name schema, update SDDs --- .../Components/CMakeLists.txt | 5 +- .../Components/Drv/CMakeLists.txt | 6 + .../{Imu => Drv/Helpers}/CMakeLists.txt | 10 +- .../Components/Drv/Helpers/Helpers.cpp | 16 +++ .../Components/Drv/Helpers/Helpers.fpp | 0 .../Components/Drv/Helpers/Helpers.hpp | 19 ++++ .../{ => Drv}/Lis2mdlDriver/CMakeLists.txt | 4 +- .../{ => Drv}/Lis2mdlDriver/Lis2mdlDriver.cpp | 27 +++-- .../Drv/Lis2mdlDriver/Lis2mdlDriver.fpp | 28 +++++ .../{ => Drv}/Lis2mdlDriver/Lis2mdlDriver.hpp | 24 ++-- .../Components/Drv/Lis2mdlDriver/docs/sdd.md | 67 +++++++++++ .../Drv/Lsm6dsoDriver/CMakeLists.txt | 36 ++++++ .../Lsm6dsoDriver/Lsm6dsoDriver.cpp} | 55 +++++---- .../Drv/Lsm6dsoDriver/Lsm6dsoDriver.fpp | 36 ++++++ .../Drv/Lsm6dsoDriver/Lsm6dsoDriver.hpp | 60 ++++++++++ .../Components/Drv/Lsm6dsoDriver/docs/sdd.md | 105 ++++++++++++++++++ .../Components/Drv/Types/CMakeLists.txt | 36 ++++++ .../Components/Drv/Types/Types.fpp | 23 ++++ FprimeZephyrReference/Components/Imu/Imu.fpp | 32 ------ .../Components/Imu/docs/sdd.md | 98 ---------------- .../CMakeLists.txt | 10 +- .../Imu.cpp => ImuManager/ImuManager.cpp} | 21 ++-- .../Components/ImuManager/ImuManager.fpp | 39 +++++++ .../Imu.hpp => ImuManager/ImuManager.hpp} | 20 ++-- .../Components/ImuManager/docs/sdd.md | 83 ++++++++++++++ .../Lis2mdlDriver/Lis2mdlDriver.fpp | 24 ---- .../Components/Lis2mdlDriver/docs/sdd.md | 66 ----------- .../Components/lms6dsoDriver/docs/sdd.md | 66 ----------- .../lms6dsoDriver/lms6dsoDriver.fpp | 39 ------- .../lms6dsoDriver/lms6dsoDriver.hpp | 53 --------- .../Top/ReferenceDeploymentPackets.fppi | 8 +- .../ReferenceDeployment/Top/instances.fpp | 6 +- .../ReferenceDeployment/Top/topology.fpp | 16 +-- 33 files changed, 665 insertions(+), 473 deletions(-) create mode 100644 FprimeZephyrReference/Components/Drv/CMakeLists.txt rename FprimeZephyrReference/Components/{Imu => Drv/Helpers}/CMakeLists.txt (75%) create mode 100644 FprimeZephyrReference/Components/Drv/Helpers/Helpers.cpp create mode 100644 FprimeZephyrReference/Components/Drv/Helpers/Helpers.fpp create mode 100644 FprimeZephyrReference/Components/Drv/Helpers/Helpers.hpp rename FprimeZephyrReference/Components/{ => Drv}/Lis2mdlDriver/CMakeLists.txt (94%) rename FprimeZephyrReference/Components/{ => Drv}/Lis2mdlDriver/Lis2mdlDriver.cpp (59%) create mode 100644 FprimeZephyrReference/Components/Drv/Lis2mdlDriver/Lis2mdlDriver.fpp rename FprimeZephyrReference/Components/{ => Drv}/Lis2mdlDriver/Lis2mdlDriver.hpp (67%) create mode 100644 FprimeZephyrReference/Components/Drv/Lis2mdlDriver/docs/sdd.md create mode 100644 FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/CMakeLists.txt rename FprimeZephyrReference/Components/{lms6dsoDriver/lms6dsoDriver.cpp => Drv/Lsm6dsoDriver/Lsm6dsoDriver.cpp} (52%) create mode 100644 FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriver.fpp create mode 100644 FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriver.hpp create mode 100644 FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/docs/sdd.md create mode 100644 FprimeZephyrReference/Components/Drv/Types/CMakeLists.txt create mode 100644 FprimeZephyrReference/Components/Drv/Types/Types.fpp delete mode 100644 FprimeZephyrReference/Components/Imu/Imu.fpp delete mode 100644 FprimeZephyrReference/Components/Imu/docs/sdd.md rename FprimeZephyrReference/Components/{lms6dsoDriver => ImuManager}/CMakeLists.txt (73%) rename FprimeZephyrReference/Components/{Imu/Imu.cpp => ImuManager/ImuManager.cpp} (51%) create mode 100644 FprimeZephyrReference/Components/ImuManager/ImuManager.fpp rename FprimeZephyrReference/Components/{Imu/Imu.hpp => ImuManager/ImuManager.hpp} (66%) create mode 100644 FprimeZephyrReference/Components/ImuManager/docs/sdd.md delete mode 100644 FprimeZephyrReference/Components/Lis2mdlDriver/Lis2mdlDriver.fpp delete mode 100644 FprimeZephyrReference/Components/Lis2mdlDriver/docs/sdd.md delete mode 100644 FprimeZephyrReference/Components/lms6dsoDriver/docs/sdd.md delete mode 100644 FprimeZephyrReference/Components/lms6dsoDriver/lms6dsoDriver.fpp delete mode 100644 FprimeZephyrReference/Components/lms6dsoDriver/lms6dsoDriver.hpp diff --git a/FprimeZephyrReference/Components/CMakeLists.txt b/FprimeZephyrReference/Components/CMakeLists.txt index dce20754..79100334 100644 --- a/FprimeZephyrReference/Components/CMakeLists.txt +++ b/FprimeZephyrReference/Components/CMakeLists.txt @@ -1,7 +1,6 @@ # Include project-wide components here +add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Drv/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/FatalHandler") +add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/ImuManager/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Watchdog") -add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Imu/") -add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/lms6dsoDriver/") -add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Lis2mdlDriver/") diff --git a/FprimeZephyrReference/Components/Drv/CMakeLists.txt b/FprimeZephyrReference/Components/Drv/CMakeLists.txt new file mode 100644 index 00000000..c85b7be5 --- /dev/null +++ b/FprimeZephyrReference/Components/Drv/CMakeLists.txt @@ -0,0 +1,6 @@ +# 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}/Types/") diff --git a/FprimeZephyrReference/Components/Imu/CMakeLists.txt b/FprimeZephyrReference/Components/Drv/Helpers/CMakeLists.txt similarity index 75% rename from FprimeZephyrReference/Components/Imu/CMakeLists.txt rename to FprimeZephyrReference/Components/Drv/Helpers/CMakeLists.txt index 93d3286b..d4fca52e 100644 --- a/FprimeZephyrReference/Components/Imu/CMakeLists.txt +++ b/FprimeZephyrReference/Components/Drv/Helpers/CMakeLists.txt @@ -16,9 +16,9 @@ register_fprime_library( AUTOCODER_INPUTS - "${CMAKE_CURRENT_LIST_DIR}/Imu.fpp" + "${CMAKE_CURRENT_LIST_DIR}/Helpers.fpp" SOURCES - "${CMAKE_CURRENT_LIST_DIR}/Imu.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Helpers.cpp" # DEPENDS # MyPackage_MyOtherModule ) @@ -26,10 +26,10 @@ register_fprime_library( ### Unit Tests ### # register_fprime_ut( # AUTOCODER_INPUTS -# "${CMAKE_CURRENT_LIST_DIR}/Imu.fpp" +# "${CMAKE_CURRENT_LIST_DIR}/Helpers.fpp" # SOURCES -# "${CMAKE_CURRENT_LIST_DIR}/test/ut/ImuTestMain.cpp" -# "${CMAKE_CURRENT_LIST_DIR}/test/ut/ImuTester.cpp" +# "${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 new file mode 100644 index 00000000..900ed97f --- /dev/null +++ b/FprimeZephyrReference/Components/Drv/Helpers/Helpers.cpp @@ -0,0 +1,16 @@ +// ====================================================================== +// \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.fpp b/FprimeZephyrReference/Components/Drv/Helpers/Helpers.fpp new file mode 100644 index 00000000..e69de29b diff --git a/FprimeZephyrReference/Components/Drv/Helpers/Helpers.hpp b/FprimeZephyrReference/Components/Drv/Helpers/Helpers.hpp new file mode 100644 index 00000000..02c9325d --- /dev/null +++ b/FprimeZephyrReference/Components/Drv/Helpers/Helpers.hpp @@ -0,0 +1,19 @@ +// ====================================================================== +// \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/Lis2mdlDriver/CMakeLists.txt b/FprimeZephyrReference/Components/Drv/Lis2mdlDriver/CMakeLists.txt similarity index 94% rename from FprimeZephyrReference/Components/Lis2mdlDriver/CMakeLists.txt rename to FprimeZephyrReference/Components/Drv/Lis2mdlDriver/CMakeLists.txt index ed403e6b..8ddaf7ae 100644 --- a/FprimeZephyrReference/Components/Lis2mdlDriver/CMakeLists.txt +++ b/FprimeZephyrReference/Components/Drv/Lis2mdlDriver/CMakeLists.txt @@ -19,8 +19,8 @@ register_fprime_library( "${CMAKE_CURRENT_LIST_DIR}/Lis2mdlDriver.fpp" SOURCES "${CMAKE_CURRENT_LIST_DIR}/Lis2mdlDriver.cpp" -# DEPENDS -# MyPackage_MyOtherModule + DEPENDS + FprimeZephyrReference_Components_Drv_Helpers ) ### Unit Tests ### diff --git a/FprimeZephyrReference/Components/Lis2mdlDriver/Lis2mdlDriver.cpp b/FprimeZephyrReference/Components/Drv/Lis2mdlDriver/Lis2mdlDriver.cpp similarity index 59% rename from FprimeZephyrReference/Components/Lis2mdlDriver/Lis2mdlDriver.cpp rename to FprimeZephyrReference/Components/Drv/Lis2mdlDriver/Lis2mdlDriver.cpp index 9dacc1bd..8b2de64b 100644 --- a/FprimeZephyrReference/Components/Lis2mdlDriver/Lis2mdlDriver.cpp +++ b/FprimeZephyrReference/Components/Drv/Lis2mdlDriver/Lis2mdlDriver.cpp @@ -1,44 +1,47 @@ // ====================================================================== // \title Lis2mdlDriver.cpp -// \author aychar // \brief cpp file for Lis2mdlDriver component implementation class // ====================================================================== -#include "FprimeZephyrReference/Components/Lis2mdlDriver/Lis2mdlDriver.hpp" +#include "FprimeZephyrReference/Components/Drv/Lis2mdlDriver/Lis2mdlDriver.hpp" #include -namespace Components { +namespace Drv { // ---------------------------------------------------------------------- // Component construction and destruction // ---------------------------------------------------------------------- Lis2mdlDriver ::Lis2mdlDriver(const char* const compName) : Lis2mdlDriverComponentBase(compName) { + // Initialize the lis2mdl sensor lis2mdl = device_get_binding("LIS2MDL"); FW_ASSERT(device_is_ready(lis2mdl)); } Lis2mdlDriver ::~Lis2mdlDriver() {} -F64 Lis2mdlDriver ::sensor_value_to_f64(const struct sensor_value& val) { - return val.val1 + val.val2 / 1000000.0f; -} +// ---------------------------------------------------------------------- +// Handler implementations for typed input ports +// ---------------------------------------------------------------------- -Components::MagneticField Lis2mdlDriver ::getMagneticField_handler(FwIndexType portNum) { - // Fetch new data sample from sensors - sensor_sample_fetch_chan(lis2mdl, SENSOR_CHAN_MAGN_XYZ); +Drv::MagneticField Lis2mdlDriver ::magneticFieldRead_handler(FwIndexType portNum) { + if (!device_is_ready(lis2mdl)) { + this->log_WARNING_HI_DeviceNotReady(); + return Drv::MagneticField(0.0, 0.0, 0.0); + } struct sensor_value x; struct sensor_value y; struct sensor_value z; + sensor_sample_fetch_chan(lis2mdl, SENSOR_CHAN_MAGN_XYZ); + sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_X, &x); sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_Y, &y); sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_Z, &z); - return Components::MagneticField(this->sensor_value_to_f64(x), this->sensor_value_to_f64(y), - this->sensor_value_to_f64(z)); + return Drv::MagneticField(Drv::sensor_value_to_f64(x), Drv::sensor_value_to_f64(y), Drv::sensor_value_to_f64(z)); } -} // namespace Components +} // namespace Drv diff --git a/FprimeZephyrReference/Components/Drv/Lis2mdlDriver/Lis2mdlDriver.fpp b/FprimeZephyrReference/Components/Drv/Lis2mdlDriver/Lis2mdlDriver.fpp new file mode 100644 index 00000000..9c00f65f --- /dev/null +++ b/FprimeZephyrReference/Components/Drv/Lis2mdlDriver/Lis2mdlDriver.fpp @@ -0,0 +1,28 @@ +# Port definition +module Drv { + port MagneticFieldRead -> MagneticField +} + +# Component definition +module Drv { + @ LIS2MDL Driver Component for F Prime FSW framework. + passive component Lis2mdlDriver { + @ 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 + + ############################################################################### + # Standard AC Ports: Required for Channels, Events, Commands, and Parameters # + ############################################################################### + @ Port for requesting the current time + time get port timeCaller + + @ Port for sending textual representation of events + text event port logTextOut + + @ Port for sending events to downlink + event port logOut + } +} diff --git a/FprimeZephyrReference/Components/Lis2mdlDriver/Lis2mdlDriver.hpp b/FprimeZephyrReference/Components/Drv/Lis2mdlDriver/Lis2mdlDriver.hpp similarity index 67% rename from FprimeZephyrReference/Components/Lis2mdlDriver/Lis2mdlDriver.hpp rename to FprimeZephyrReference/Components/Drv/Lis2mdlDriver/Lis2mdlDriver.hpp index bbf289b6..195d4551 100644 --- a/FprimeZephyrReference/Components/Lis2mdlDriver/Lis2mdlDriver.hpp +++ b/FprimeZephyrReference/Components/Drv/Lis2mdlDriver/Lis2mdlDriver.hpp @@ -1,19 +1,22 @@ // ====================================================================== // \title Lis2mdlDriver.hpp -// \author aychar // \brief hpp file for Lis2mdlDriver component implementation class // ====================================================================== #ifndef Components_Lis2mdlDriver_HPP #define Components_Lis2mdlDriver_HPP -#include "FprimeZephyrReference/Components/Lis2mdlDriver/Lis2mdlDriverComponentAc.hpp" +// clang-format off +// Keep the includes in this order +#include "FprimeZephyrReference/Components/Drv/Lis2mdlDriver/Lis2mdlDriverComponentAc.hpp" +#include "FprimeZephyrReference/Components/Drv/Helpers/Helpers.hpp" +// clang-format on #include #include #include -namespace Components { +namespace Drv { class Lis2mdlDriver final : public Lis2mdlDriverComponentBase { public: @@ -22,22 +25,19 @@ class Lis2mdlDriver final : public Lis2mdlDriverComponentBase { // ---------------------------------------------------------------------- //! Construct Lis2mdlDriver object - Lis2mdlDriver(const char* const compName //!< The component name - ); + Lis2mdlDriver(const char* const compName); //! Destroy Lis2mdlDriver object ~Lis2mdlDriver(); private: - //! Handler implementation - MagneticField getMagneticField_handler(FwIndexType portNum) override; - // ---------------------------------------------------------------------- - // Helper methods + // Handler implementations for typed input ports // ---------------------------------------------------------------------- - //! Convert a Zephyr sensor_value to an Fprime F64 - F64 sensor_value_to_f64(const struct sensor_value& val); + //! Get the magnetic field reading from the LIS2MDL sensor + Drv::MagneticField magneticFieldRead_handler(const FwIndexType portNum //!< The port number + ) override; // ---------------------------------------------------------------------- // Member variables @@ -47,6 +47,6 @@ class Lis2mdlDriver final : public Lis2mdlDriverComponentBase { const struct device* lis2mdl; }; -} // namespace Components +} // namespace Drv #endif diff --git a/FprimeZephyrReference/Components/Drv/Lis2mdlDriver/docs/sdd.md b/FprimeZephyrReference/Components/Drv/Lis2mdlDriver/docs/sdd.md new file mode 100644 index 00000000..de376344 --- /dev/null +++ b/FprimeZephyrReference/Components/Drv/Lis2mdlDriver/docs/sdd.md @@ -0,0 +1,67 @@ +# Components::Lis2mdlDriver + +The LIS2MDL Driver 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. + +### Typical Usage + +1. The component is instantiated and initialized during system startup +2. A manager calls the `MagneticFieldRead` port +3. On each call, the component: + - Fetches fresh sensor samples from the sensor + - Converts sensor data to F Prime data structures + - Returns data in SI units + +## Class Diagram + +```mermaid +classDiagram + namespace Components { + class Lis2mdlDriverComponentBase { + <> + } + class Lis2mdlDriver { + - lis2mdl: device* + + Lis2mdlDriver(char* compName) + + ~Lis2mdlDriver() + - magneticFieldRead_handler(FwIndexType portNum): Drv::MagneticField + } + } + Lis2mdlDriverComponentBase <|-- Lis2mdlDriver : inherits +``` + +## Port Descriptions +| Name | Type | Description | +|---|---|---| +| MagneticFieldRead | sync input | Triggers magnetic field data collection and returns a MagneticField struct | + +## Sequence Diagrams + +```mermaid +sequenceDiagram + participant Manager + participant LIS2MDL Driver + participant Zephyr Sensor API + participant LIS2MDL Sensor + + Manager-->>LIS2MDL Driver: Call MagneticFieldRead synchronous input port + LIS2MDL Driver->>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 +``` + +## Requirements +Add requirements in the chart below +| Name | Description | Validation | +|---|---|---| +| MagneticFieldRead Port | The component shall provide access magnetic field sensor data and return in MagneticField struct, readings will be in gauss | Verify output matches expected values from sensor datasheet | + +## Change Log +| Date | Description | +|---|---| +| 2025-9-15 | Initial LIS2MDL Driver component | diff --git a/FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/CMakeLists.txt b/FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/CMakeLists.txt new file mode 100644 index 00000000..506cfda0 --- /dev/null +++ b/FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/CMakeLists.txt @@ -0,0 +1,36 @@ +#### +# 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( + AUTOCODER_INPUTS + "${CMAKE_CURRENT_LIST_DIR}/Lsm6dsoDriver.fpp" + SOURCES + "${CMAKE_CURRENT_LIST_DIR}/Lsm6dsoDriver.cpp" + DEPENDS + FprimeZephyrReference_Components_Drv_Helpers +) + +### Unit Tests ### +# register_fprime_ut( +# AUTOCODER_INPUTS +# "${CMAKE_CURRENT_LIST_DIR}/Lsm6dsoDriver.fpp" +# SOURCES +# "${CMAKE_CURRENT_LIST_DIR}/test/ut/Lsm6dsoDriverTestMain.cpp" +# "${CMAKE_CURRENT_LIST_DIR}/test/ut/Lsm6dsoDriverTester.cpp" +# DEPENDS +# STest # For rules-based testing +# UT_AUTO_HELPERS +# ) diff --git a/FprimeZephyrReference/Components/lms6dsoDriver/lms6dsoDriver.cpp b/FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriver.cpp similarity index 52% rename from FprimeZephyrReference/Components/lms6dsoDriver/lms6dsoDriver.cpp rename to FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriver.cpp index 9d4819f1..3aa699f8 100644 --- a/FprimeZephyrReference/Components/lms6dsoDriver/lms6dsoDriver.cpp +++ b/FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriver.cpp @@ -1,71 +1,86 @@ // ====================================================================== -// \title lms6dsoDriver.cpp -// \author aaron -// \brief cpp file for lms6dsoDriver component implementation class +// \title Lsm6dsoDriver.cpp +// \brief cpp file for Lsm6dsoDriver component implementation class // ====================================================================== -#include "FprimeZephyrReference/Components/lms6dsoDriver/lms6dsoDriver.hpp" +#include "FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriver.hpp" -namespace Components { +#include + +namespace Drv { // ---------------------------------------------------------------------- // Component construction and destruction // ---------------------------------------------------------------------- -lms6dsoDriver ::lms6dsoDriver(const char* const compName) : lms6dsoDriverComponentBase(compName) { +Lsm6dsoDriver ::Lsm6dsoDriver(const char* const compName) : Lsm6dsoDriverComponentBase(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 - sensor_attr_set(lsm6dso, SENSOR_CHAN_ACCEL_XYZ, SENSOR_ATTR_SAMPLING_FREQUENCY, &odr); - sensor_attr_set(lsm6dso, SENSOR_CHAN_GYRO_XYZ, SENSOR_ATTR_SAMPLING_FREQUENCY, &odr); + 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); } -lms6dsoDriver ::~lms6dsoDriver() {} +Lsm6dsoDriver ::~Lsm6dsoDriver() {} // ---------------------------------------------------------------------- // Handler implementations for typed input ports // ---------------------------------------------------------------------- -Components::Acceleration lms6dsoDriver::getAcceleration_handler(FwIndexType portNum) { +Drv::Acceleration Lsm6dsoDriver ::accelerationRead_handler(FwIndexType portNum) { + if (!device_is_ready(lsm6dso)) { + this->log_WARNING_HI_DeviceNotReady(); + return Drv::Acceleration(0.0, 0.0, 0.0); + } + struct sensor_value x; struct sensor_value y; struct sensor_value z; + sensor_sample_fetch_chan(lsm6dso, SENSOR_CHAN_ACCEL_XYZ); sensor_channel_get(lsm6dso, SENSOR_CHAN_ACCEL_X, &x); sensor_channel_get(lsm6dso, SENSOR_CHAN_ACCEL_Y, &y); sensor_channel_get(lsm6dso, SENSOR_CHAN_ACCEL_Z, &z); - return Components::Acceleration(this->sensor_value_to_f64(x),this->sensor_value_to_f64(y), this->sensor_value_to_f64(z)); + return Drv::Acceleration(Drv::sensor_value_to_f64(x), Drv::sensor_value_to_f64(y), Drv::sensor_value_to_f64(z)); } -Components::AngularVelocity lms6dsoDriver::getAngularVelocity_handler(FwIndexType portNum) { +Drv::AngularVelocity Lsm6dsoDriver ::angularVelocityRead_handler(FwIndexType portNum) { + if (!device_is_ready(lsm6dso)) { + this->log_WARNING_HI_DeviceNotReady(); + return Drv::AngularVelocity(0.0, 0.0, 0.0); + } + struct sensor_value x; struct sensor_value y; struct sensor_value z; + sensor_sample_fetch_chan(lsm6dso, SENSOR_CHAN_GYRO_XYZ); sensor_channel_get(lsm6dso, SENSOR_CHAN_GYRO_X, &x); sensor_channel_get(lsm6dso, SENSOR_CHAN_GYRO_Y, &y); sensor_channel_get(lsm6dso, SENSOR_CHAN_GYRO_Z, &z); - return Components::AngularVelocity(this->sensor_value_to_f64(x),this->sensor_value_to_f64(y), this->sensor_value_to_f64(z)); + return Drv::AngularVelocity(Drv::sensor_value_to_f64(x), Drv::sensor_value_to_f64(y), Drv::sensor_value_to_f64(z)); } +F64 Lsm6dsoDriver ::temperatureRead_handler(FwIndexType portNum) { + if (!device_is_ready(lsm6dso)) { + this->log_WARNING_HI_DeviceNotReady(); + return 0; + } -F64 lms6dsoDriver::getTemperature_handler(FwIndexType portNum) { struct sensor_value temp; sensor_sample_fetch_chan(lsm6dso, SENSOR_CHAN_DIE_TEMP); - sensor_channel_get(lsm6dso, SENSOR_CHAN_DIE_TEMP, &temp); - return this->sensor_value_to_f64(temp); -} + sensor_channel_get(lsm6dso, SENSOR_CHAN_DIE_TEMP, &temp); -F64 lms6dsoDriver::sensor_value_to_f64(const struct sensor_value& val) { - return val.val1 + val.val2 / 1000000.0f; + return Drv::sensor_value_to_f64(temp); } -} // namespace Components +} // namespace Drv diff --git a/FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriver.fpp b/FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriver.fpp new file mode 100644 index 00000000..638e9279 --- /dev/null +++ b/FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriver.fpp @@ -0,0 +1,36 @@ +# Port definition +module Drv { + port AccelerationRead -> Acceleration + port AngularVelocityRead -> AngularVelocity + port TemperatureRead -> F64 +} + +# Component definition +module Drv { + @ LSM6DSO Driver Component for F Prime FSW framework. + passive component Lsm6dsoDriver { + @ Port to read the current acceleration in m/s^2. + sync input port accelerationRead: AccelerationRead + + @ Port to read the current angular velocity in rad/s. + sync input port angularVelocityRead: AngularVelocityRead + + @ Port to read the current temperature in degrees celsius. + sync input port temperatureRead: TemperatureRead + + @ Event for reporting LSM6DSO not ready error + event DeviceNotReady() severity warning high format "LSM6DSO device not ready" throttle 5 + + ############################################################################### + # Standard AC Ports: Required for Channels, Events, Commands, and Parameters # + ############################################################################### + @ Port for requesting the current time + time get port timeCaller + + @ Port for sending textual representation of events + text event port logTextOut + + @ Port for sending events to downlink + event port logOut + } +} diff --git a/FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriver.hpp b/FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriver.hpp new file mode 100644 index 00000000..d114cc04 --- /dev/null +++ b/FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriver.hpp @@ -0,0 +1,60 @@ +// ====================================================================== +// \title Lsm6dsoDriver.hpp +// \brief hpp file for Lsm6dsoDriver component implementation class +// ====================================================================== + +#ifndef Components_Lsm6dsoDriver_HPP +#define Components_Lsm6dsoDriver_HPP + +// clang-format off +// Keep the includes in this order +#include "FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriverComponentAc.hpp" +#include "FprimeZephyrReference/Components/Drv/Helpers/Helpers.hpp" +// clang-format on + +#include +#include +#include + +namespace Drv { + +class Lsm6dsoDriver final : public Lsm6dsoDriverComponentBase { + public: + // ---------------------------------------------------------------------- + // Component construction and destruction + // ---------------------------------------------------------------------- + + //! Construct Lsm6dsoDriver object + Lsm6dsoDriver(const char* const compName); + + //! Destroy Lsm6dsoDriver object + ~Lsm6dsoDriver(); + + private: + // ---------------------------------------------------------------------- + // Handler implementations for typed input ports + // ---------------------------------------------------------------------- + + //! Get the acceleration reading from the LSM6DSO sensor + Drv::Acceleration accelerationRead_handler(const FwIndexType portNum //!< The port number + ) override; + + //! Get the angular velocity reading from the LSM6DSO sensor + Drv::AngularVelocity angularVelocityRead_handler(const FwIndexType portNum //!< The port number + ) override; + + //! Get the temperature reading from the LSM6DSO sensor + F64 temperatureRead_handler(const FwIndexType portNum //!< The port number + ) override; + + // ---------------------------------------------------------------------- + // Member variables + // ---------------------------------------------------------------------- + + //! Zephyr device stores the initialized LSM6DSO sensor + const struct device* lsm6dso; +}; + +} // namespace Drv + +#endif diff --git a/FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/docs/sdd.md b/FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/docs/sdd.md new file mode 100644 index 00000000..20a678a5 --- /dev/null +++ b/FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/docs/sdd.md @@ -0,0 +1,105 @@ +# Components::Lsm6dsoDriver + +The LSM6DSO Driver component interfaces with the LIS2MDL magnetometer to provide acceleration, angular velocity, and temperature measurements. + +## Usage Examples + +The LSM6DSO 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. + +### Typical Usage + +1. The component is instantiated and initialized during system startup +2. A manager calls any of the input ports: `AccelerationRead`, `AngularVelocityRead`, or `TemperatureRead` (No faster than 12.5 Hz) +3. On each call, the component: + - Fetches fresh sensor samples from the sensor + - Converts sensor data to F Prime data structures + - Returns data in SI units + +## Class Diagram +```mermaid +classDiagram + namespace Components { + class Lsm6dsoDriverComponentBase { + <> + } + class Lsm6dsoDriver { + - lsm6dso: device* + + Lsm6dsoDriver(char* compName) + + ~Lsm6dsoDriver() + - accelerationRead_handler(FwIndexType portNum): Drv::Acceleration + - angularVelocityRead_handler(FwIndexType portNum): Drv::AngularVelocity + - temperatureRead_handler(FwIndexType portNum): F64 + } + } + Lsm6dsoDriverComponentBase <|-- Lsm6dsoDriver : inherits +``` + +## Port Descriptions +| Name | Type | Description | +|---|---|---| +| AccelerationRead | sync input | Triggers acceleration data collection and returns an Acceleration struct | +| AngularVelocityRead | sync input | Triggers angular velocity data collection and returns an AngularVelocity struct | +| TemperatureRead | sync input | Triggers temperature data collection and returns temperature in degrees Celsius | + +## Sequence Diagrams + +### AccelerationRead +```mermaid +sequenceDiagram + participant Manager + participant LSM6DSO Driver + participant Zephyr Sensor API + participant LSM6DSO Sensor + + Manager-->>LSM6DSO Driver: Call the Acceleration synchronous input port + LSM6DSO Driver->>Zephyr Sensor API: Fetch sensor data + Zephyr Sensor API->>LSM6DSO Sensor: Read sensor + LSM6DSO Sensor->>Zephyr Sensor API: Return sensor data + Zephyr Sensor API->>LSM6DSO Driver: Return x, y, z sensor_value structs + LSM6DSO Driver-->>Manager: Return an Acceleration struct +``` + +### AngularVelocityRead +```mermaid +sequenceDiagram + participant Manager + participant LSM6DSO Driver + participant Zephyr Sensor API + participant LSM6DSO Sensor + + Manager-->>LSM6DSO Driver: Call the AngularVelocity synchronous input port + LSM6DSO Driver->>Zephyr Sensor API: Fetch sensor data + Zephyr Sensor API->>LSM6DSO Sensor: Read sensor + LSM6DSO Sensor->>Zephyr Sensor API: Return sensor data + Zephyr Sensor API->>LSM6DSO Driver: Return x, y, z sensor_value structs + LSM6DSO Driver-->>Manager: Return an AngularVelocity struct +``` + +### TemperatureRead +```mermaid +sequenceDiagram + participant Manager + participant LSM6DSO Driver + participant Zephyr Sensor API + participant LSM6DSO Sensor + + Manager-->>LSM6DSO Driver: Call the Temperature synchronous input port + LSM6DSO Driver->>Zephyr Sensor API: Fetch sensor data + Zephyr Sensor API->>LSM6DSO Sensor: Read sensor + LSM6DSO Sensor->>Zephyr Sensor API: Return sensor data + Zephyr Sensor API->>LSM6DSO Driver: Return temperature sensor_value struct + LSM6DSO Driver-->>Manager: Return an F64 temperature in degrees Celsius +``` + +## Requirements +Add requirements in the chart below +| Name | Description | Validation | +|---|---|---| +| AccelerationRead Port | The component shall provide access to acceleration sensor data and return in Acceleration struct, readings will be in m/s^2 | Verify output matches expected values from sensor datasheet | +| AngularVelocityRead Port | The component shall provide access to angular velocity sensor data and return in AngularVelocity struct, readings will be in rad/s | Verify output matches expected values from sensor datasheet | +| TemperatureRead Port | The component shall provide access to temperature sensor data and return in degrees Celsius | Verify output matches expected values from sensor datasheet | + +## Change Log +| Date | Description | +|---|---| +| 2025-9-17 | Initial LSM6DSO Driver component | diff --git a/FprimeZephyrReference/Components/Drv/Types/CMakeLists.txt b/FprimeZephyrReference/Components/Drv/Types/CMakeLists.txt new file mode 100644 index 00000000..dcbbe126 --- /dev/null +++ b/FprimeZephyrReference/Components/Drv/Types/CMakeLists.txt @@ -0,0 +1,36 @@ +#### +# 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( + AUTOCODER_INPUTS + "${CMAKE_CURRENT_LIST_DIR}/Types.fpp" +# SOURCES +# "${CMAKE_CURRENT_LIST_DIR}/Helpers.cpp" +# DEPENDS +# MyPackage_MyOtherModule +) + +### 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/Types/Types.fpp b/FprimeZephyrReference/Components/Drv/Types/Types.fpp new file mode 100644 index 00000000..e129beea --- /dev/null +++ b/FprimeZephyrReference/Components/Drv/Types/Types.fpp @@ -0,0 +1,23 @@ +# Type definitions for sensor readings data structures +module Drv { + @ Acceleration reading in m/s^2 + struct Acceleration { + x: F64 @< Acceleration in m/s^2 in the X direction. + y: F64 @< Acceleration in m/s^2 in the Y direction. + z: F64 @< Acceleration in m/s^2 in the Z direction. + } + + @ Angular velocity reading in rad/s + struct AngularVelocity { + x: F64 @< Angular velocity in rad/s in the X direction. + y: F64 @< Angular velocity in rad/s in the Y direction. + z: F64 @< Angular velocity in rad/s in the Z direction. + } + + @ Magnetic field in gauss. + struct MagneticField { + x: F64 @< Magnetic field in gauss in the X direction. + y: F64 @< Magnetic field in gauss in the Y direction. + z: F64 @< Magnetic field in gauss in the Z direction. + } +} diff --git a/FprimeZephyrReference/Components/Imu/Imu.fpp b/FprimeZephyrReference/Components/Imu/Imu.fpp deleted file mode 100644 index 22446d9a..00000000 --- a/FprimeZephyrReference/Components/Imu/Imu.fpp +++ /dev/null @@ -1,32 +0,0 @@ -module Components { - @ IMU Component for F Prime FSW framework. - passive component Imu { - sync input port run: Svc.Sched - - output port readAcceleration: AccelerationRead - output port readAngularVelocity: AngularVelocityRead - output port readMagneticField: MagneticFieldRead - output port readTemperature: TemperatureRead - - @Telemetry channel for angular velocity - telemetry AngularVelocity: AngularVelocity - - @ Telemetry channel for Acceleration - telemetry Acceleration: Acceleration - - @ Telemetry channel for magnetic field - telemetry MagneticField: 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/Imu/docs/sdd.md b/FprimeZephyrReference/Components/Imu/docs/sdd.md deleted file mode 100644 index b0bf7739..00000000 --- a/FprimeZephyrReference/Components/Imu/docs/sdd.md +++ /dev/null @@ -1,98 +0,0 @@ -# Components::Imu - -The IMU (Inertial Measurement Unit) component provides sensor data related to motion and orientation of the craft. It interfaces with two sensors: the LIS2MDL magnetometer and the LSM6DSO accelerometer/gyroscope to provide acceleration, angular velocity, magnetic field, and temperature measurements. - -## Usage Examples - -The IMU component is designed to be scheduled periodically to collect sensor data and output telemetry. It operates as a passive component that responds to scheduler calls. - -### Diagrams - -```mermaid -sequenceDiagram - participant Scheduler - participant IMU - participant Telemetry - - Scheduler->>IMU: run - IMU->>Telemetry: Output sensor data -``` - -### Typical Usage - -1. The component is instantiated and initialized during system startup -2. The scheduler calls the `run` port at regular intervals (configured at 12.5 Hz) -3. On each run call, the component: - - Fetches fresh sensor samples from both IMU sensors - - Converts sensor data to F Prime data structures - - Outputs telemetry for acceleration, angular velocity, magnetic field, and temperature - -## Class Diagram - -```mermaid -classDiagram - namespace Components { - class ImuComponentBase { - <> - } - class Imu { - - lis2mdl: device* - - lsm6dso: device* - + Imu(char* compName) - + ~Imu() - - run_handler(FwIndexType portNum, U32 context) - - sensor_value_to_f64(sensor_value* val): F64 - - get_acceleration(): Imu_Acceleration - - get_angular_velocity(): Imu_AngularVelocity - - get_magnetic_field(): Imu_MagneticField - - get_temperature(): F64 - } - } - ImuComponentBase <|-- Imu : inherits -``` - - -## Port Descriptions -| Name | Type | Description | -|---|---|---| -| run | sync input | Scheduler port that triggers sensor data collection and telemetry output | -| timeCaller | time get | Port for requesting current system time | -| tlmOut | telemetry | Port for sending telemetry data to downlink | - -## Component States -| Name | Description | -|---|---| -| Initialized | Component has been constructed and both IMU sensors are ready | -| Running | Component is actively collecting sensor data when scheduled | -| Error | One or both sensors failed initialization (assertion failure) | - -## Sequence Diagrams -Add sequence diagrams here - -## Telemetry -| Name | Description | -|---|---| -| Acceleration | Telemetry channel for acceleration in m/s^2 | -| AngularVelocity | Telemetry channel for angular velocity in rad/s | -| MagneticField | Telemetry channel for magnetic field in gauss | -| Temperature | Telemetry channel for temperature in degrees Celsius | - -## Unit Tests -Add unit test descriptions in the chart below -| Name | Description | Output | Coverage | -|---|---|---|---| -|---|---|---|---| - -## Requirements -Add requirements in the chart below -| Name | Description | Validation | -|---|---|---| -| AccelerationTelemetry | The component shall provide acceleration telemetry in m/s^2 | Verify telemetry output matches expected values from sensor datasheet | -| AngularVelocityTelemetry | The component shall provide angular velocity telemetry in rad/s | Verify telemetry output matches expected values from sensor datasheet | -| MagneticFieldTelemetry | The component shall provide magnetic field telemetry in gauss | Verify telemetry output matches expected values from sensor datasheet | -| TemperatureTelemetry | The component shall provide temperature telemetry in degrees Celsius | Verify telemetry output matches expected values from sensor datasheet | - -## Change Log -| Date | Description | -|---|---| -| 2025-09-09 | Initial IMU component | diff --git a/FprimeZephyrReference/Components/lms6dsoDriver/CMakeLists.txt b/FprimeZephyrReference/Components/ImuManager/CMakeLists.txt similarity index 73% rename from FprimeZephyrReference/Components/lms6dsoDriver/CMakeLists.txt rename to FprimeZephyrReference/Components/ImuManager/CMakeLists.txt index d87a2502..19006128 100644 --- a/FprimeZephyrReference/Components/lms6dsoDriver/CMakeLists.txt +++ b/FprimeZephyrReference/Components/ImuManager/CMakeLists.txt @@ -16,9 +16,9 @@ register_fprime_library( AUTOCODER_INPUTS - "${CMAKE_CURRENT_LIST_DIR}/lms6dsoDriver.fpp" + "${CMAKE_CURRENT_LIST_DIR}/ImuManager.fpp" SOURCES - "${CMAKE_CURRENT_LIST_DIR}/lms6dsoDriver.cpp" + "${CMAKE_CURRENT_LIST_DIR}/ImuManager.cpp" # DEPENDS # MyPackage_MyOtherModule ) @@ -26,10 +26,10 @@ register_fprime_library( ### Unit Tests ### # register_fprime_ut( # AUTOCODER_INPUTS -# "${CMAKE_CURRENT_LIST_DIR}/lms6dsoDriver.fpp" +# "${CMAKE_CURRENT_LIST_DIR}/ImuManager.fpp" # SOURCES -# "${CMAKE_CURRENT_LIST_DIR}/test/ut/lms6dsoDriverTestMain.cpp" -# "${CMAKE_CURRENT_LIST_DIR}/test/ut/lms6dsoDriverTester.cpp" +# "${CMAKE_CURRENT_LIST_DIR}/test/ut/ImuManagerTestMain.cpp" +# "${CMAKE_CURRENT_LIST_DIR}/test/ut/ImuManagerTester.cpp" # DEPENDS # STest # For rules-based testing # UT_AUTO_HELPERS diff --git a/FprimeZephyrReference/Components/Imu/Imu.cpp b/FprimeZephyrReference/Components/ImuManager/ImuManager.cpp similarity index 51% rename from FprimeZephyrReference/Components/Imu/Imu.cpp rename to FprimeZephyrReference/Components/ImuManager/ImuManager.cpp index a9a2b1fe..44a1c72e 100644 --- a/FprimeZephyrReference/Components/Imu/Imu.cpp +++ b/FprimeZephyrReference/Components/ImuManager/ImuManager.cpp @@ -1,9 +1,9 @@ // ====================================================================== -// \title Imu.cpp -// \brief cpp file for Imu component implementation class +// \title ImuManager.cpp +// \brief cpp file for ImuManager component implementation class // ====================================================================== -#include "FprimeZephyrReference/Components/Imu/Imu.hpp" +#include "FprimeZephyrReference/Components/ImuManager/ImuManager.hpp" #include @@ -13,19 +13,18 @@ namespace Components { // Component construction and destruction // ---------------------------------------------------------------------- -Imu ::Imu(const char* const compName) : ImuComponentBase(compName) {} +ImuManager ::ImuManager(const char* const compName) : ImuManagerComponentBase(compName) {} -Imu ::~Imu() {} +ImuManager ::~ImuManager() {} // ---------------------------------------------------------------------- // Handler implementations for typed input ports // ---------------------------------------------------------------------- -void Imu ::run_handler(FwIndexType portNum, U32 context) { - this->tlmWrite_Acceleration(this->readAcceleration_out(0)); - this->tlmWrite_AngularVelocity(this->readAngularVelocity_out(0)); - this->tlmWrite_MagneticField(this->readMagneticField_out(0)); - this->tlmWrite_Temperature(this->readTemperature_out(0)); +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)); } - } // namespace Components diff --git a/FprimeZephyrReference/Components/ImuManager/ImuManager.fpp b/FprimeZephyrReference/Components/ImuManager/ImuManager.fpp new file mode 100644 index 00000000..2ef559b5 --- /dev/null +++ b/FprimeZephyrReference/Components/ImuManager/ImuManager.fpp @@ -0,0 +1,39 @@ +module Components { + @ IMU Manager Component for F Prime FSW framework. + passive component ImuManager { + sync input port run: Svc.Sched + + @ Port for sending accelerationRead calls to the LSM6DSO driver + output port accelerationRead: Drv.AccelerationRead + + @ Port for sending angularVelocityRead calls to the LSM6DSO driver + output port angularVelocityRead: Drv.AngularVelocityRead + + @ Port for sending magneticFieldRead calls to the LIS2MDL driver + output port magneticFieldRead: Drv.MagneticFieldRead + + @ 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/Imu/Imu.hpp b/FprimeZephyrReference/Components/ImuManager/ImuManager.hpp similarity index 66% rename from FprimeZephyrReference/Components/Imu/Imu.hpp rename to FprimeZephyrReference/Components/ImuManager/ImuManager.hpp index c6384251..14bec238 100644 --- a/FprimeZephyrReference/Components/Imu/Imu.hpp +++ b/FprimeZephyrReference/Components/ImuManager/ImuManager.hpp @@ -1,26 +1,26 @@ // ====================================================================== -// \title Imu.hpp -// \brief hpp file for Imu component implementation class +// \title ImuManager.hpp +// \brief hpp file for ImuManager component implementation class // ====================================================================== -#ifndef Components_Imu_HPP -#define Components_Imu_HPP +#ifndef Components_ImuManager_HPP +#define Components_ImuManager_HPP -#include "FprimeZephyrReference/Components/Imu/ImuComponentAc.hpp" +#include "FprimeZephyrReference/Components/ImuManager/ImuManagerComponentAc.hpp" namespace Components { -class Imu final : public ImuComponentBase { +class ImuManager final : public ImuManagerComponentBase { public: // ---------------------------------------------------------------------- // Component construction and destruction // ---------------------------------------------------------------------- - //! Construct Imu object - Imu(const char* const compName); + //! Construct ImuManager object + ImuManager(const char* const compName); - //! Destroy Imu object - ~Imu(); + //! Destroy ImuManager object + ~ImuManager(); private: // ---------------------------------------------------------------------- diff --git a/FprimeZephyrReference/Components/ImuManager/docs/sdd.md b/FprimeZephyrReference/Components/ImuManager/docs/sdd.md new file mode 100644 index 00000000..33f3ff69 --- /dev/null +++ b/FprimeZephyrReference/Components/ImuManager/docs/sdd.md @@ -0,0 +1,83 @@ +# 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. + +## Usage Examples + +The IMU Manager component is designed to be scheduled periodically to collect sensor data and output telemetry. It operates as a passive component that responds to scheduler calls. + +### Typical Usage + +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 + - Outputs telemetry for acceleration, angular velocity, magnetic field, and temperature + +## Class Diagram + +```mermaid +classDiagram + namespace Components { + class ImuManagerComponentBase { + <> + } + class ImuManager { + + ImuManager(char* compName) + + ~ImuManager() + - run_handler(FwIndexType portNum, U32 context): void + } + } + ImuManagerComponentBase <|-- ImuManager : inherits +``` + +## Port Descriptions +| Name | Type | Description | +|---|---|---| +| run | sync input | Scheduler port that triggers sensor data collection and telemetry output | +| timeCaller | time get | Port for requesting current system time | +| tlmOut | telemetry | Port for sending telemetry data to downlink | + +## Sequence Diagrams +```mermaid +sequenceDiagram + participant Scheduler + participant IMU Manager + participant LIS2MDL Driver + participant LSM6DSO Driver + participant Telemetry + + Scheduler-->>IMU Manager: run + IMU Manager->>LIS2MDL Driver: MagneticFieldRead + LIS2MDL Driver->>IMU Manager: MagneticField struct + IMU Manager->>LSM6DSO Driver: AccelerationRead + LSM6DSO Driver->>IMU Manager: Acceleration struct + IMU Manager->>LSM6DSO Driver: AngularVelocityRead + LSM6DSO Driver->>IMU Manager: AngularVelocity struct + IMU Manager->>LSM6DSO Driver: TemperatureRead + LSM6DSO Driver->>IMU Manager: F64 temperature + IMU Manager->>Telemetry: Output sensor data as telemetry +``` + +## Telemetry +| Name | Description | +|---|---| +| Acceleration | Telemetry channel for acceleration in m/s^2 | +| AngularVelocity | Telemetry channel for angular velocity in rad/s | +| MagneticField | Telemetry channel for magnetic field in gauss | +| Temperature | Telemetry channel for temperature in degrees Celsius | + +## Requirements +Add requirements in the chart below +| Name | Description | Validation | +|---|---|---| +| Acceleration Telemetry | The component shall provide acceleration telemetry in m/s^2 | Verify telemetry output matches expected values from sensor datasheet | +| Angular Velocity Telemetry | The component shall provide angular velocity telemetry in rad/s | Verify telemetry output matches expected values from sensor datasheet | +| Magnetic Field Telemetry | The component shall provide magnetic field telemetry in gauss | Verify telemetry output matches expected values from sensor datasheet | +| Temperature Telemetry | The component shall provide temperature telemetry in degrees Celsius | Verify telemetry output matches expected values from sensor datasheet | + +## Change Log +| Date | Description | +|---|---| +| 2025-9-9 | Initial IMU Manager component | +| 2025-9-18 | Extracted Zephyr calls to discrete LIS2MDL Driver and LSM6DSO Driver | diff --git a/FprimeZephyrReference/Components/Lis2mdlDriver/Lis2mdlDriver.fpp b/FprimeZephyrReference/Components/Lis2mdlDriver/Lis2mdlDriver.fpp deleted file mode 100644 index 13a2f679..00000000 --- a/FprimeZephyrReference/Components/Lis2mdlDriver/Lis2mdlDriver.fpp +++ /dev/null @@ -1,24 +0,0 @@ -module Components { - @ Magnetic field reading in gauss - struct MagneticField { - x: F64 - y: F64 - z: F64 - } - - # Port definitions - port MagneticFieldRead -> MagneticField - - @ Component for F Prime FSW framework. - passive component Lis2mdlDriver { - - sync input port getMagneticField: MagneticFieldRead - - ############################################################################### - # Standard AC Ports: Required for Channels, Events, Commands, and Parameters # - ############################################################################### - @ Port for requesting the current time - time get port timeCaller - - } -} diff --git a/FprimeZephyrReference/Components/Lis2mdlDriver/docs/sdd.md b/FprimeZephyrReference/Components/Lis2mdlDriver/docs/sdd.md deleted file mode 100644 index 7867637d..00000000 --- a/FprimeZephyrReference/Components/Lis2mdlDriver/docs/sdd.md +++ /dev/null @@ -1,66 +0,0 @@ -# Components::Lis2mdlDriver - -Component for F Prime FSW framework. - -## Usage Examples -Add usage examples here - -### Diagrams -Add diagrams here - -### Typical Usage -And the typical usage of the component here - -## Class Diagram -Add a class diagram here - -## Port Descriptions -| Name | Description | -|---|---| -|---|---| - -## Component States -Add component states in the chart below -| Name | Description | -|---|---| -|---|---| - -## Sequence Diagrams -Add sequence diagrams here - -## Parameters -| Name | Description | -|---|---| -|---|---| - -## Commands -| Name | Description | -|---|---| -|---|---| - -## Events -| Name | Description | -|---|---| -|---|---| - -## Telemetry -| Name | Description | -|---|---| -|---|---| - -## Unit Tests -Add unit test descriptions in the chart below -| Name | Description | Output | Coverage | -|---|---|---|---| -|---|---|---|---| - -## Requirements -Add requirements in the chart below -| Name | Description | Validation | -|---|---|---| -|---|---|---| - -## Change Log -| Date | Description | -|---|---| -|---| Initial Draft | diff --git a/FprimeZephyrReference/Components/lms6dsoDriver/docs/sdd.md b/FprimeZephyrReference/Components/lms6dsoDriver/docs/sdd.md deleted file mode 100644 index f36d6cf2..00000000 --- a/FprimeZephyrReference/Components/lms6dsoDriver/docs/sdd.md +++ /dev/null @@ -1,66 +0,0 @@ -# Components::lms6dsoDriver - -Initialize and control operation of the lms6dso device - -## Usage Examples -Add usage examples here - -### Diagrams -Add diagrams here - -### Typical Usage -And the typical usage of the component here - -## Class Diagram -Add a class diagram here - -## Port Descriptions -| Name | Description | -|---|---| -|---|---| - -## Component States -Add component states in the chart below -| Name | Description | -|---|---| -|---|---| - -## Sequence Diagrams -Add sequence diagrams here - -## Parameters -| Name | Description | -|---|---| -|---|---| - -## Commands -| Name | Description | -|---|---| -|---|---| - -## Events -| Name | Description | -|---|---| -|---|---| - -## Telemetry -| Name | Description | -|---|---| -|---|---| - -## Unit Tests -Add unit test descriptions in the chart below -| Name | Description | Output | Coverage | -|---|---|---|---| -|---|---|---|---| - -## Requirements -Add requirements in the chart below -| Name | Description | Validation | -|---|---|---| -|---|---|---| - -## Change Log -| Date | Description | -|---|---| -|---| Initial Draft | \ No newline at end of file diff --git a/FprimeZephyrReference/Components/lms6dsoDriver/lms6dsoDriver.fpp b/FprimeZephyrReference/Components/lms6dsoDriver/lms6dsoDriver.fpp deleted file mode 100644 index fc635010..00000000 --- a/FprimeZephyrReference/Components/lms6dsoDriver/lms6dsoDriver.fpp +++ /dev/null @@ -1,39 +0,0 @@ -module Components { - - @ Acceleration Reading in m/s^2 - struct Acceleration { - x: F64 - y: F64 - z: F64 - } - - @ Angular velocity reading in rad/s - struct AngularVelocity { - x: F64 - y: F64 - z: F64 - } - - port AccelerationRead() -> Acceleration - port AngularVelocityRead() -> AngularVelocity - port TemperatureRead() -> F64 - - @ Initialize and control operation of the lms6dso device - passive component lms6dsoDriver { - - @ Port for synchronously retrieving data - sync input port getAcceleration: AccelerationRead - sync input port getAngularVelocity: AngularVelocityRead - sync input port getTemperature: TemperatureRead - - ############################################################################### - # Standard AC Ports: Required for Channels, Events, Commands, and Parameters # - ############################################################################### - @ Port for requesting the current time - time get port timeCaller - - - - - } -} \ No newline at end of file diff --git a/FprimeZephyrReference/Components/lms6dsoDriver/lms6dsoDriver.hpp b/FprimeZephyrReference/Components/lms6dsoDriver/lms6dsoDriver.hpp deleted file mode 100644 index b9c9fc46..00000000 --- a/FprimeZephyrReference/Components/lms6dsoDriver/lms6dsoDriver.hpp +++ /dev/null @@ -1,53 +0,0 @@ -// ====================================================================== -// \title lms6dsoDriver.hpp -// \author aaron -// \brief hpp file for lms6dsoDriver component implementation class -// ====================================================================== - -#ifndef Components_lms6dsoDriver_HPP -#define Components_lms6dsoDriver_HPP - -#include "FprimeZephyrReference/Components/lms6dsoDriver/lms6dsoDriverComponentAc.hpp" - - -#include -#include -#include - -namespace Components { - -class lms6dsoDriver final : public lms6dsoDriverComponentBase { - public: - // ---------------------------------------------------------------------- - // Component construction and destruction - // ---------------------------------------------------------------------- - - //! Construct lms6dsoDriver object - lms6dsoDriver(const char* const compName //!< The component name - ); - - //! Destroy lms6dsoDriver object - ~lms6dsoDriver(); - - private: - - // ---------------------------------------------------------------------- - // Handler implementations for typed input ports - // ---------------------------------------------------------------------- - Acceleration getAcceleration_handler(FwIndexType portNum) override; - - AngularVelocity getAngularVelocity_handler(FwIndexType portNum) override; - - F64 getTemperature_handler(FwIndexType portNum) override; - - F64 sensor_value_to_f64(const struct sensor_value &val); - - //! Zephyr device stores the initialized LSM6DSO sensor - const struct device* lsm6dso; - - -}; - -} // namespace Components - -#endif diff --git a/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi b/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi index b4491537..9596d5ef 100644 --- a/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi +++ b/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi @@ -35,9 +35,9 @@ telemetry packets ReferenceDeploymentPackets { } packet Imu id 6 group 4 { - ReferenceDeployment.imu.Acceleration - ReferenceDeployment.imu.AngularVelocity - ReferenceDeployment.imu.MagneticField + ReferenceDeployment.imuManager.Acceleration + ReferenceDeployment.imuManager.AngularVelocity + ReferenceDeployment.imuManager.MagneticField } } omit { @@ -63,5 +63,5 @@ telemetry packets ReferenceDeploymentPackets { CdhCore.version.CustomVersion09 CdhCore.version.CustomVersion10 # Reserving temp telemetry for future use - ReferenceDeployment.imu.Temperature + ReferenceDeployment.imuManager.Temperature } diff --git a/FprimeZephyrReference/ReferenceDeployment/Top/instances.fpp b/FprimeZephyrReference/ReferenceDeployment/Top/instances.fpp index 42c57dc4..1bcb6199 100644 --- a/FprimeZephyrReference/ReferenceDeployment/Top/instances.fpp +++ b/FprimeZephyrReference/ReferenceDeployment/Top/instances.fpp @@ -64,9 +64,9 @@ module ReferenceDeployment { instance watchdog: Components.Watchdog base id 0x10016000 - instance imu: Components.Imu base id 0x10017000 + instance imuManager: Components.ImuManager base id 0x10017000 - instance lis2mdlDriver: Components.Lis2mdlDriver base id 0x10018000 + instance lis2mdlDriver: Drv.Lis2mdlDriver base id 0x10018000 - instance lms6dsoDriver: Components.lms6dsoDriver base id 0x10019000 + instance lsm6dsoDriver: Drv.Lsm6dsoDriver base id 0x10019000 } diff --git a/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp b/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp index 4b0cb04c..420f44f2 100644 --- a/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp +++ b/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp @@ -29,9 +29,9 @@ module ReferenceDeployment { instance gpioDriver instance watchdog instance prmDb - instance imu + instance imuManager instance lis2mdlDriver - instance lms6dsoDriver + instance lsm6dsoDriver # ---------------------------------------------------------------------- # Pattern graph specifiers @@ -95,18 +95,18 @@ module ReferenceDeployment { rateGroup1Hz.RateGroupMemberOut[2] -> ComCcsds.commsBufferManager.schedIn rateGroup1Hz.RateGroupMemberOut[3] -> CdhCore.tlmSend.Run rateGroup1Hz.RateGroupMemberOut[4] -> watchdog.run - rateGroup1Hz.RateGroupMemberOut[5] -> imu.run + rateGroup1Hz.RateGroupMemberOut[5] -> imuManager.run } connections Watchdog { watchdog.gpioSet -> gpioDriver.gpioWrite } - connections Imu { - imu.readAcceleration -> lms6dsoDriver.getAcceleration - imu.readAngularVelocity -> lms6dsoDriver.getAngularVelocity - imu.readMagneticField -> lis2mdlDriver.getMagneticField - imu.readTemperature -> lms6dsoDriver.getTemperature + connections imuManager { + imuManager.accelerationRead -> lsm6dsoDriver.accelerationRead + imuManager.angularVelocityRead -> lsm6dsoDriver.angularVelocityRead + imuManager.magneticFieldRead -> lis2mdlDriver.magneticFieldRead + imuManager.temperatureRead -> lsm6dsoDriver.temperatureRead } connections ReferenceDeployment { From d66c949ae9b9a4c3762f9f92e592abc222c65327 Mon Sep 17 00:00:00 2001 From: Nate Gay Date: Thu, 18 Sep 2025 17:36:50 -0500 Subject: [PATCH 13/26] Remove unnecessary board files --- .../Kconfig.defconfig | 14 -- ...oves_flight_control_board_v5c-pinctrl.dtsi | 20 --- .../proves_flight_control_board_v5c.dtsi | 132 ------------------ 3 files changed, 166 deletions(-) delete mode 100644 boards/bronco_space/proves_flight_control_board_v5c/Kconfig.defconfig delete mode 100644 boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c-pinctrl.dtsi delete mode 100644 boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c.dtsi diff --git a/boards/bronco_space/proves_flight_control_board_v5c/Kconfig.defconfig b/boards/bronco_space/proves_flight_control_board_v5c/Kconfig.defconfig deleted file mode 100644 index 296c23fc..00000000 --- a/boards/bronco_space/proves_flight_control_board_v5c/Kconfig.defconfig +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright (c) 2024 Andrew Featherstone -# SPDX-License-Identifier: Apache-2.0 - -if PROVES_FLIGHT_CONTROL_BOARD_V5C - -config USB_SELF_POWERED - default n - -config USB_CDC_ACM_LOG_LEVEL - default 0 - -config USB_DEVICE_LOG_LEVEL - default 1 -endif # PROVES_FLIGHT_CONTROL_BOARD_V5C diff --git a/boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c-pinctrl.dtsi b/boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c-pinctrl.dtsi deleted file mode 100644 index 012ca613..00000000 --- a/boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c-pinctrl.dtsi +++ /dev/null @@ -1,20 +0,0 @@ -#include - -&pinctrl { - spi1_default: spi1_default { - group1 { - pinmux = , ; - }; - - group2 { - pinmux = ; - input-enable; - }; - }; - i2c1_default: i2c1_default { - group1 { - pinmux = , ; - input-enable; - }; - }; -}; diff --git a/boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c.dtsi b/boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c.dtsi deleted file mode 100644 index 1583eaa0..00000000 --- a/boards/bronco_space/proves_flight_control_board_v5c/proves_flight_control_board_v5c.dtsi +++ /dev/null @@ -1,132 +0,0 @@ -#include - -#include -#include - -#include "proves_flight_control_board_v5c-pinctrl.dtsi" - -/ { - chosen { - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart0; - zephyr,shell-uart = &cdc_acm_uart0; - zephyr,code-partition = &code_partition; - }; - - aliases { - watchdog0 = &wdt0; - }; - - leds { - compatible = "gpio-leds"; - led0: led0 { - gpios = <&gpio0 24 GPIO_ACTIVE_HIGH>; - label = "User LED GPIO24"; - }; - }; -}; - -zephyr_udc0: &usbd { - status = "okay"; -}; - -&zephyr_udc0 { - cdc_acm_uart0: cdc_acm_uart0 { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; -}; - -&flash0 { - reg = <0x10000000 DT_SIZE_M(4)>; - - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; - - /* Reserved memory for an image definition block. The block is much - * smaller than 256 bytes, but in practice the linker places the vector - * table at a much larger alignment offset. - */ - image_def: partition@0 { - label = "image_def"; - reg = <0x00000000 0x100>; - read-only; - }; - - /* - * Usable flash. Starts at 0x100, after the image definition block. - * The partition size is 4MB minus the 0x100 bytes taken by the - * image definition. - */ - code_partition: partition@100 { - label = "code-partition"; - reg = <0x100 (DT_SIZE_M(4) - 0x100)>; - read-only; - }; - }; -}; - -&timer0 { - status = "okay"; -}; - -&wdt0 { - status = "okay"; -}; - -&gpio0 { - status = "okay"; -}; - -&spi1 { - status = "okay"; - cs-gpios = <&gpio0 9 GPIO_ACTIVE_LOW>; - pinctrl-0 = <&spi1_default>; - pinctrl-names = "default"; - - lora0: sx1276@0 { - 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)>; - reset-gpios = <&gpio0 6 GPIO_ACTIVE_LOW>; - power-amplifier-output = "pa-boost"; - label = "HOPE_RF"; - }; -}; - -&i2c1 { - status = "okay"; - pinctrl-0 = <&i2c1_default>; - pinctrl-names = "default"; - clock-frequency = <100000>; - - lsm6dso0: lsm6dso0@6b { - compatible = "st,lsm6dso"; - reg = <0x6b>; - label = "LSM6DSO"; - }; - - lis2mdl: lis2mdl@1e { - compatible = "st,lis2mdl"; - reg = <0x1e>; - label = "LIS2MDL"; - }; - rv3028: rv3028@52 { - compatible = "microcrystal,rv3028"; - reg = <0x52>; - int-gpios = <&gpio0 27 GPIO_ACTIVE_HIGH>; - backup-switch-mode = "level"; - label = "RV3028"; - }; - ina219: ina219@40 { - compatible = "ti,ina219"; - reg = <0x40>; - shunt-milliohm = <2>; - lsb-microamp = <100>; - label = "INA219"; - }; -}; From 4ad69fc74f735d53e1d3606915f5003f45a1824a Mon Sep 17 00:00:00 2001 From: asiemsen Date: Mon, 22 Sep 2025 18:00:43 -0500 Subject: [PATCH 14/26] remove fpp helper file --- FprimeZephyrReference/Components/Drv/Helpers/Helpers.fpp | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 FprimeZephyrReference/Components/Drv/Helpers/Helpers.fpp diff --git a/FprimeZephyrReference/Components/Drv/Helpers/Helpers.fpp b/FprimeZephyrReference/Components/Drv/Helpers/Helpers.fpp deleted file mode 100644 index e69de29b..00000000 From 36d52780d821d72ad4975a153f7a31e11f00257e Mon Sep 17 00:00:00 2001 From: asiemsen Date: Mon, 22 Sep 2025 18:48:40 -0500 Subject: [PATCH 15/26] finished renaming to build --- .../Components/Drv/CMakeLists.txt | 5 ++-- .../Components/Drv/Helpers/CMakeLists.txt | 6 ++-- .../CMakeLists.txt | 10 +++---- .../Lis2mdlManager.cpp} | 12 ++++---- .../Lis2mdlManager.fpp} | 4 +-- .../Lis2mdlManager.hpp} | 20 ++++++------- .../docs/sdd.md | 28 +++++++++---------- .../CMakeLists.txt | 10 +++---- .../Lsm6dsoManager.cpp} | 16 +++++------ .../Lsm6dsoManager.fpp} | 2 +- .../Lsm6dsoManager.hpp} | 20 ++++++------- .../docs/sdd.md | 12 ++++---- .../Components/ImuManager/ImuManager.fpp | 8 +++--- .../Components/ImuManager/docs/sdd.md | 12 ++++---- .../ReferenceDeployment/Top/instances.fpp | 4 +-- .../ReferenceDeployment/Top/topology.fpp | 8 +++--- 16 files changed, 87 insertions(+), 90 deletions(-) rename FprimeZephyrReference/Components/Drv/{Lis2mdlDriver => Lis2mdlManager}/CMakeLists.txt (73%) rename FprimeZephyrReference/Components/Drv/{Lis2mdlDriver/Lis2mdlDriver.cpp => Lis2mdlManager/Lis2mdlManager.cpp} (76%) rename FprimeZephyrReference/Components/Drv/{Lis2mdlDriver/Lis2mdlDriver.fpp => Lis2mdlManager/Lis2mdlManager.fpp} (90%) rename FprimeZephyrReference/Components/Drv/{Lis2mdlDriver/Lis2mdlDriver.hpp => Lis2mdlManager/Lis2mdlManager.hpp} (73%) rename FprimeZephyrReference/Components/Drv/{Lis2mdlDriver => Lis2mdlManager}/docs/sdd.md (60%) rename FprimeZephyrReference/Components/Drv/{Lsm6dsoDriver => Lsm6dsoManager}/CMakeLists.txt (73%) rename FprimeZephyrReference/Components/Drv/{Lsm6dsoDriver/Lsm6dsoDriver.cpp => Lsm6dsoManager/Lsm6dsoManager.cpp} (81%) rename FprimeZephyrReference/Components/Drv/{Lsm6dsoDriver/Lsm6dsoDriver.fpp => Lsm6dsoManager/Lsm6dsoManager.fpp} (97%) rename FprimeZephyrReference/Components/Drv/{Lsm6dsoDriver/Lsm6dsoDriver.hpp => Lsm6dsoManager/Lsm6dsoManager.hpp} (78%) rename FprimeZephyrReference/Components/Drv/{Lsm6dsoDriver => Lsm6dsoManager}/docs/sdd.md (94%) 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/Lis2mdlDriver/CMakeLists.txt b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/CMakeLists.txt similarity index 73% rename from FprimeZephyrReference/Components/Drv/Lis2mdlDriver/CMakeLists.txt rename to FprimeZephyrReference/Components/Drv/Lis2mdlManager/CMakeLists.txt index 8ddaf7ae..1bdafd80 100644 --- a/FprimeZephyrReference/Components/Drv/Lis2mdlDriver/CMakeLists.txt +++ b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/CMakeLists.txt @@ -16,9 +16,9 @@ register_fprime_library( AUTOCODER_INPUTS - "${CMAKE_CURRENT_LIST_DIR}/Lis2mdlDriver.fpp" + "${CMAKE_CURRENT_LIST_DIR}/Lis2mdlManager.fpp" SOURCES - "${CMAKE_CURRENT_LIST_DIR}/Lis2mdlDriver.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}/Lis2mdlDriver.fpp" +# "${CMAKE_CURRENT_LIST_DIR}/Lis2mdlManager.fpp" # SOURCES -# "${CMAKE_CURRENT_LIST_DIR}/test/ut/Lis2mdlDriverTestMain.cpp" -# "${CMAKE_CURRENT_LIST_DIR}/test/ut/Lis2mdlDriverTester.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 76% rename from FprimeZephyrReference/Components/Drv/Lis2mdlDriver/Lis2mdlDriver.cpp rename to FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp index 8b2de64b..67939e35 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,19 +13,19 @@ 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); diff --git a/FprimeZephyrReference/Components/Drv/Lis2mdlDriver/Lis2mdlDriver.fpp b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.fpp similarity index 90% rename from FprimeZephyrReference/Components/Drv/Lis2mdlDriver/Lis2mdlDriver.fpp rename to FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.fpp index 9c00f65f..bb66d280 100644 --- a/FprimeZephyrReference/Components/Drv/Lis2mdlDriver/Lis2mdlDriver.fpp +++ b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.fpp @@ -5,8 +5,8 @@ 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 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/Lsm6dsoDriver/CMakeLists.txt b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/CMakeLists.txt similarity index 73% rename from FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/CMakeLists.txt rename to FprimeZephyrReference/Components/Drv/Lsm6dsoManager/CMakeLists.txt index 506cfda0..9ec411e3 100644 --- a/FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/CMakeLists.txt +++ b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/CMakeLists.txt @@ -16,9 +16,9 @@ register_fprime_library( AUTOCODER_INPUTS - "${CMAKE_CURRENT_LIST_DIR}/Lsm6dsoDriver.fpp" + "${CMAKE_CURRENT_LIST_DIR}/Lsm6dsoManager.fpp" SOURCES - "${CMAKE_CURRENT_LIST_DIR}/Lsm6dsoDriver.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}/Lsm6dsoDriver.fpp" +# "${CMAKE_CURRENT_LIST_DIR}/Lsm6dsoManager.fpp" # SOURCES -# "${CMAKE_CURRENT_LIST_DIR}/test/ut/Lsm6dsoDriverTestMain.cpp" -# "${CMAKE_CURRENT_LIST_DIR}/test/ut/Lsm6dsoDriverTester.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 81% rename from FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriver.cpp rename to FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.cpp index 3aa699f8..5b20a32b 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,7 +13,7 @@ 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)); @@ -24,13 +24,13 @@ Lsm6dsoDriver ::Lsm6dsoDriver(const char* const compName) : Lsm6dsoDriverCompone 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); @@ -49,7 +49,7 @@ Drv::Acceleration Lsm6dsoDriver ::accelerationRead_handler(FwIndexType portNum) return Drv::Acceleration(Drv::sensor_value_to_f64(x), Drv::sensor_value_to_f64(y), Drv::sensor_value_to_f64(z)); } -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); @@ -68,7 +68,7 @@ Drv::AngularVelocity Lsm6dsoDriver ::angularVelocityRead_handler(FwIndexType por return Drv::AngularVelocity(Drv::sensor_value_to_f64(x), Drv::sensor_value_to_f64(y), Drv::sensor_value_to_f64(z)); } -F64 Lsm6dsoDriver ::temperatureRead_handler(FwIndexType portNum) { +F64 Lsm6dsoManager ::temperatureRead_handler(FwIndexType portNum) { if (!device_is_ready(lsm6dso)) { this->log_WARNING_HI_DeviceNotReady(); return 0; diff --git a/FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriver.fpp b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.fpp similarity index 97% rename from FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriver.fpp rename to FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.fpp index 638e9279..c42fde65 100644 --- a/FprimeZephyrReference/Components/Drv/Lsm6dsoDriver/Lsm6dsoDriver.fpp +++ b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.fpp @@ -8,7 +8,7 @@ module Drv { # Component definition module Drv { @ LSM6DSO Driver Component for F Prime FSW framework. - passive component Lsm6dsoDriver { + passive component Lsm6dsoManager { @ Port to read the current acceleration in m/s^2. sync input port accelerationRead: AccelerationRead 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.fpp b/FprimeZephyrReference/Components/ImuManager/ImuManager.fpp index 2ef559b5..e105357e 100644 --- a/FprimeZephyrReference/Components/ImuManager/ImuManager.fpp +++ b/FprimeZephyrReference/Components/ImuManager/ImuManager.fpp @@ -3,16 +3,16 @@ 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 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/instances.fpp b/FprimeZephyrReference/ReferenceDeployment/Top/instances.fpp index 1bcb6199..70e056d7 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 lis2mdlDriver: 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..1ef1a9d5 100644 --- a/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp +++ b/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp @@ -31,7 +31,7 @@ module ReferenceDeployment { instance prmDb instance imuManager instance lis2mdlDriver - instance lsm6dsoDriver + instance Lsm6dsoManager # ---------------------------------------------------------------------- # Pattern graph specifiers @@ -103,10 +103,10 @@ module ReferenceDeployment { } connections imuManager { - imuManager.accelerationRead -> lsm6dsoDriver.accelerationRead - imuManager.angularVelocityRead -> lsm6dsoDriver.angularVelocityRead + imuManager.accelerationRead -> Lsm6dsoManager.accelerationRead + imuManager.angularVelocityRead -> Lsm6dsoManager.angularVelocityRead imuManager.magneticFieldRead -> lis2mdlDriver.magneticFieldRead - imuManager.temperatureRead -> lsm6dsoDriver.temperatureRead + imuManager.temperatureRead -> Lsm6dsoManager.temperatureRead } connections ReferenceDeployment { From d8fce1f910f58c18e1964c11041f201d5f2e68ee Mon Sep 17 00:00:00 2001 From: asiemsen Date: Mon, 22 Sep 2025 18:51:54 -0500 Subject: [PATCH 16/26] add parentheses for clearer intentions --- FprimeZephyrReference/Components/Drv/Helpers/Helpers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 516d730f315318a2e957371bb50fa58cc3dd0210 Mon Sep 17 00:00:00 2001 From: asiemsen Date: Mon, 22 Sep 2025 18:58:47 -0500 Subject: [PATCH 17/26] remove FW_ASSERTs --- .../Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp | 1 - .../Components/Drv/Lsm6dsoManager/Lsm6dsoManager.cpp | 3 --- 2 files changed, 4 deletions(-) diff --git a/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp index 67939e35..26e40b8d 100644 --- a/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp +++ b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp @@ -16,7 +16,6 @@ namespace Drv { Lis2mdlManager ::Lis2mdlManager(const char* const compName) : Lis2mdlManagerComponentBase(compName) { // Initialize the lis2mdl sensor lis2mdl = device_get_binding("LIS2MDL"); - FW_ASSERT(device_is_ready(lis2mdl)); } Lis2mdlManager ::~Lis2mdlManager() {} diff --git a/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.cpp b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.cpp index 5b20a32b..c9dd1984 100644 --- a/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.cpp +++ b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.cpp @@ -16,12 +16,9 @@ namespace Drv { 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); } Lsm6dsoManager ::~Lsm6dsoManager() {} From 8e4e8d21841ae4a1173f729ae005cc28c739b569 Mon Sep 17 00:00:00 2001 From: asiemsen Date: Mon, 22 Sep 2025 19:02:48 -0500 Subject: [PATCH 18/26] clear throttle after successful device ready check --- .../Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp index 26e40b8d..93c4a24b 100644 --- a/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp +++ b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp @@ -29,6 +29,7 @@ Drv::MagneticField Lis2mdlManager ::magneticFieldRead_handler(FwIndexType portNu 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; From 991b010baa99e8ca7291fff7ef1bda2e15e685f6 Mon Sep 17 00:00:00 2001 From: asiemsen Date: Mon, 22 Sep 2025 19:50:47 -0500 Subject: [PATCH 19/26] adding telemetry to lis2mdlManager --- .../Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp | 8 ++++++-- .../Components/Drv/Lis2mdlManager/Lis2mdlManager.fpp | 7 +++++++ .../Components/ImuManager/ImuManager.cpp | 4 +++- .../Top/ReferenceDeploymentPackets.fppi | 4 +++- .../ReferenceDeployment/Top/instances.fpp | 4 ++-- .../ReferenceDeployment/Top/topology.fpp | 8 ++++---- 6 files changed, 25 insertions(+), 10 deletions(-) diff --git a/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp index 93c4a24b..1fa34bba 100644 --- a/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp +++ b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp @@ -29,7 +29,7 @@ Drv::MagneticField Lis2mdlManager ::magneticFieldRead_handler(FwIndexType portNu this->log_WARNING_HI_DeviceNotReady(); return Drv::MagneticField(0.0, 0.0, 0.0); } - this->log_WARNING_HI_DeviceNotReady_ThrottleClear() + this->log_WARNING_HI_DeviceNotReady_ThrottleClear(); struct sensor_value x; struct sensor_value y; @@ -41,7 +41,11 @@ Drv::MagneticField Lis2mdlManager ::magneticFieldRead_handler(FwIndexType portNu 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/Lis2mdlManager/Lis2mdlManager.fpp b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.fpp index bb66d280..8e722107 100644 --- a/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.fpp +++ b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.fpp @@ -13,6 +13,10 @@ module Drv { @ 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/ImuManager/ImuManager.cpp b/FprimeZephyrReference/Components/ImuManager/ImuManager.cpp index 44a1c72e..d8e59d3d 100644 --- a/FprimeZephyrReference/Components/ImuManager/ImuManager.cpp +++ b/FprimeZephyrReference/Components/ImuManager/ImuManager.cpp @@ -24,7 +24,9 @@ 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_MagneticField(this->magneticFieldRead_out(0)); this->tlmWrite_Temperature(this->temperatureRead_out(0)); + + this->magneticFieldRead_out(0); } } // namespace Components diff --git a/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi b/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi index 9596d5ef..b08e279a 100644 --- a/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi +++ b/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi @@ -37,9 +37,11 @@ telemetry packets ReferenceDeploymentPackets { packet Imu id 6 group 4 { ReferenceDeployment.imuManager.Acceleration ReferenceDeployment.imuManager.AngularVelocity - ReferenceDeployment.imuManager.MagneticField + ReferenceDeployment.lsm6dsoManager.MagneticField } + + } omit { CdhCore.cmdDisp.CommandErrors # Only has one library, no custom versions diff --git a/FprimeZephyrReference/ReferenceDeployment/Top/instances.fpp b/FprimeZephyrReference/ReferenceDeployment/Top/instances.fpp index 70e056d7..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.Lis2mdlManager base id 0x10018000 + instance lis2mdlManager: Drv.Lis2mdlManager base id 0x10018000 - instance Lsm6dsoManager: Drv.Lsm6dsoManager 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 1ef1a9d5..88ea7322 100644 --- a/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp +++ b/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp @@ -103,10 +103,10 @@ module ReferenceDeployment { } connections imuManager { - imuManager.accelerationRead -> Lsm6dsoManager.accelerationRead - imuManager.angularVelocityRead -> Lsm6dsoManager.angularVelocityRead - imuManager.magneticFieldRead -> lis2mdlDriver.magneticFieldRead - imuManager.temperatureRead -> Lsm6dsoManager.temperatureRead + imuManager.accelerationRead -> lsm6dsoManager.accelerationRead + imuManager.angularVelocityRead -> lsm6dsoManager.angularVelocityRead + imuManager.magneticFieldRead -> Lis2mdlManager.magneticFieldRead + imuManager.temperatureRead -> lsm6dsoManager.temperatureRead } connections ReferenceDeployment { From cac1bfca9028d5e8be7d5e2c35028d7c427f0d8f Mon Sep 17 00:00:00 2001 From: aychar Date: Fri, 26 Sep 2025 17:24:53 -0500 Subject: [PATCH 20/26] fix fprime files to match new names & telemetry structure --- .../Drv/Lsm6dsoManager/Lsm6dsoManager.cpp | 5 ++++- .../Drv/Lsm6dsoManager/Lsm6dsoManager.fpp | 14 ++++++++++++++ .../Components/ImuManager/ImuManager.fpp | 16 +--------------- .../Top/ReferenceDeploymentPackets.fppi | 9 ++++----- .../ReferenceDeployment/Top/topology.fpp | 6 +++--- 5 files changed, 26 insertions(+), 24 deletions(-) diff --git a/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.cpp b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.cpp index c9dd1984..b14ce171 100644 --- a/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.cpp +++ b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.cpp @@ -62,7 +62,10 @@ Drv::AngularVelocity Lsm6dsoManager ::angularVelocityRead_handler(FwIndexType po 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)); + + return angular_velocity; } F64 Lsm6dsoManager ::temperatureRead_handler(FwIndexType portNum) { diff --git a/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.fpp b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.fpp index c42fde65..669b4eb8 100644 --- a/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.fpp +++ b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.fpp @@ -9,6 +9,7 @@ module Drv { module Drv { @ LSM6DSO Driver Component for F Prime FSW framework. 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/ImuManager/ImuManager.fpp b/FprimeZephyrReference/Components/ImuManager/ImuManager.fpp index e105357e..b4a06fdd 100644 --- a/FprimeZephyrReference/Components/ImuManager/ImuManager.fpp +++ b/FprimeZephyrReference/Components/ImuManager/ImuManager.fpp @@ -15,25 +15,11 @@ module Components { @ 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/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi b/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi index b08e279a..4a0e736f 100644 --- a/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi +++ b/FprimeZephyrReference/ReferenceDeployment/Top/ReferenceDeploymentPackets.fppi @@ -35,9 +35,10 @@ telemetry packets ReferenceDeploymentPackets { } packet Imu id 6 group 4 { - ReferenceDeployment.imuManager.Acceleration - ReferenceDeployment.imuManager.AngularVelocity - ReferenceDeployment.lsm6dsoManager.MagneticField + ReferenceDeployment.lsm6dsoManager.Acceleration + ReferenceDeployment.lsm6dsoManager.AngularVelocity + ReferenceDeployment.lsm6dsoManager.Temperature + ReferenceDeployment.lis2mdlManager.MagneticField } @@ -64,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/topology.fpp b/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp index 88ea7322..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 Lsm6dsoManager + instance lis2mdlManager + instance lsm6dsoManager # ---------------------------------------------------------------------- # Pattern graph specifiers @@ -105,7 +105,7 @@ module ReferenceDeployment { connections imuManager { imuManager.accelerationRead -> lsm6dsoManager.accelerationRead imuManager.angularVelocityRead -> lsm6dsoManager.angularVelocityRead - imuManager.magneticFieldRead -> Lis2mdlManager.magneticFieldRead + imuManager.magneticFieldRead -> lis2mdlManager.magneticFieldRead imuManager.temperatureRead -> lsm6dsoManager.temperatureRead } From 8a395c2b12eaa5317337205728363da9d5ca0606 Mon Sep 17 00:00:00 2001 From: aychar Date: Fri, 26 Sep 2025 17:42:59 -0500 Subject: [PATCH 21/26] edit cpp implementation files to output telemetry --- .../Components/Drv/Lsm6dsoManager/Lsm6dsoManager.cpp | 9 ++++++++- .../Components/ImuManager/ImuManager.cpp | 9 +++++---- .../Components/ImuManager/ImuManager.fpp | 1 - 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.cpp b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.cpp index b14ce171..d62596c2 100644 --- a/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.cpp +++ b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.cpp @@ -43,7 +43,11 @@ Drv::Acceleration Lsm6dsoManager ::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 Lsm6dsoManager ::angularVelocityRead_handler(FwIndexType portNum) { @@ -65,6 +69,7 @@ Drv::AngularVelocity Lsm6dsoManager ::angularVelocityRead_handler(FwIndexType po 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; } @@ -80,6 +85,8 @@ F64 Lsm6dsoManager ::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/ImuManager/ImuManager.cpp b/FprimeZephyrReference/Components/ImuManager/ImuManager.cpp index d8e59d3d..a6989f6f 100644 --- a/FprimeZephyrReference/Components/ImuManager/ImuManager.cpp +++ b/FprimeZephyrReference/Components/ImuManager/ImuManager.cpp @@ -22,11 +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 b4a06fdd..4d880301 100644 --- a/FprimeZephyrReference/Components/ImuManager/ImuManager.fpp +++ b/FprimeZephyrReference/Components/ImuManager/ImuManager.fpp @@ -20,6 +20,5 @@ module Components { ############################################################################### @ Port for requesting the current time time get port timeCaller - } } From ac7fd7b01f86dff460dff9618b1168baa740a40a Mon Sep 17 00:00:00 2001 From: aychar Date: Fri, 26 Sep 2025 17:57:44 -0500 Subject: [PATCH 22/26] formatting --- .../Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp index 1fa34bba..1df2fd39 100644 --- a/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp +++ b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp @@ -41,7 +41,8 @@ Drv::MagneticField Lis2mdlManager ::magneticFieldRead_handler(FwIndexType portNu sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_Y, &y); sensor_channel_get(lis2mdl, 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 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); From 8fed4e38552f871fbebc5b586652aeb082553fe8 Mon Sep 17 00:00:00 2001 From: Nate Gay Date: Sat, 27 Sep 2025 16:38:21 -0500 Subject: [PATCH 23/26] clear throttle, configure lsm6 sensor, read->get --- .../Drv/Lis2mdlManager/Lis2mdlManager.cpp | 15 ++-- .../Drv/Lis2mdlManager/Lis2mdlManager.fpp | 4 +- .../Drv/Lis2mdlManager/Lis2mdlManager.hpp | 6 +- .../Components/Drv/Lis2mdlManager/docs/sdd.md | 20 +++--- .../Drv/Lsm6dsoManager/Lsm6dsoManager.cpp | 48 ++++++++----- .../Drv/Lsm6dsoManager/Lsm6dsoManager.fpp | 18 +++-- .../Drv/Lsm6dsoManager/Lsm6dsoManager.hpp | 14 ++-- .../Components/Drv/Lsm6dsoManager/docs/sdd.md | 70 ++++++++++--------- .../Components/ImuManager/ImuManager.cpp | 8 +-- .../Components/ImuManager/ImuManager.fpp | 16 ++--- .../Components/ImuManager/docs/sdd.md | 42 ++++------- .../ReferenceDeployment/Top/topology.fpp | 8 +-- 12 files changed, 138 insertions(+), 131 deletions(-) diff --git a/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp index 1df2fd39..e0b133f5 100644 --- a/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp +++ b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp @@ -14,8 +14,7 @@ namespace Drv { // ---------------------------------------------------------------------- Lis2mdlManager ::Lis2mdlManager(const char* const compName) : Lis2mdlManagerComponentBase(compName) { - // Initialize the lis2mdl sensor - lis2mdl = device_get_binding("LIS2MDL"); + dev = device_get_binding("LIS2MDL"); } Lis2mdlManager ::~Lis2mdlManager() {} @@ -24,8 +23,8 @@ Lis2mdlManager ::~Lis2mdlManager() {} // Handler implementations for typed input ports // ---------------------------------------------------------------------- -Drv::MagneticField Lis2mdlManager ::magneticFieldRead_handler(FwIndexType portNum) { - if (!device_is_ready(lis2mdl)) { +Drv::MagneticField Lis2mdlManager ::magneticFieldGet_handler(FwIndexType portNum) { + if (!device_is_ready(dev)) { this->log_WARNING_HI_DeviceNotReady(); return Drv::MagneticField(0.0, 0.0, 0.0); } @@ -35,11 +34,11 @@ Drv::MagneticField Lis2mdlManager ::magneticFieldRead_handler(FwIndexType portNu struct sensor_value y; struct sensor_value z; - sensor_sample_fetch_chan(lis2mdl, SENSOR_CHAN_MAGN_XYZ); + sensor_sample_fetch_chan(dev, SENSOR_CHAN_MAGN_XYZ); - sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_X, &x); - sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_Y, &y); - sensor_channel_get(lis2mdl, SENSOR_CHAN_MAGN_Z, &z); + 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); Drv::MagneticField magnetic_readings = Drv::MagneticField(Drv::sensor_value_to_f64(x), Drv::sensor_value_to_f64(y), Drv::sensor_value_to_f64(z)); diff --git a/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.fpp b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.fpp index 8e722107..84a1ac56 100644 --- a/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.fpp +++ b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.fpp @@ -1,6 +1,6 @@ # Port definition module Drv { - port MagneticFieldRead -> MagneticField + port MagneticFieldGet -> MagneticField } # Component definition @@ -8,7 +8,7 @@ module Drv { @ 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 + sync input port magneticFieldGet: MagneticFieldGet @ Event for reporting LSM6DSO not ready error event DeviceNotReady() severity warning high format "LIS2MDL device not ready" throttle 5 diff --git a/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.hpp b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.hpp index 42607ecc..34f5de33 100644 --- a/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.hpp +++ b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.hpp @@ -36,15 +36,15 @@ class Lis2mdlManager final : public Lis2mdlManagerComponentBase { // ---------------------------------------------------------------------- //! Get the magnetic field reading from the LIS2MDL sensor - Drv::MagneticField magneticFieldRead_handler(const FwIndexType portNum //!< The port number - ) override; + Drv::MagneticField magneticFieldGet_handler(const FwIndexType portNum //!< The port number + ) override; // ---------------------------------------------------------------------- // Member variables // ---------------------------------------------------------------------- //! Zephyr device stores the initialized LIS2MDL sensor - const struct device* lis2mdl; + const struct device* dev; }; } // namespace Drv diff --git a/FprimeZephyrReference/Components/Drv/Lis2mdlManager/docs/sdd.md b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/docs/sdd.md index 83b76489..45346137 100644 --- a/FprimeZephyrReference/Components/Drv/Lis2mdlManager/docs/sdd.md +++ b/FprimeZephyrReference/Components/Drv/Lis2mdlManager/docs/sdd.md @@ -1,4 +1,4 @@ -# Components::Lis2mdlManager +# Drv::Lis2mdlManager The LIS2MDL Manager component interfaces with the LIS2MDL magnetometer to provide magnetic field measurements. @@ -9,25 +9,26 @@ The LIS2MDL Manager component is designed to be called periodically to collect a ### Typical Usage 1. The component is instantiated and initialized during system startup -2. A manager calls the `MagneticFieldRead` port +2. A manager calls the `MagneticFieldGet` port 3. On each call, the component: - Fetches fresh sensor samples from the sensor - Converts sensor data to F Prime data structures + - Writes telemetry data - Returns data in SI units ## Class Diagram ```mermaid classDiagram - namespace Components { + namespace Drv { class Lis2mdlManagerComponentBase { <> } class Lis2mdlManager { - - lis2mdl: device* - + Lis2mdlManager(char* compName) + - lis2mdl: const struct device* + + Lis2mdlManager(const char* compName) + ~Lis2mdlManager() - - magneticFieldRead_handler(FwIndexType portNum): Drv::MagneticField + - magneticFieldGet_handler(const FwIndexType portNum): Drv::MagneticField } } Lis2mdlManagerComponentBase <|-- Lis2mdlManager : inherits @@ -36,7 +37,7 @@ classDiagram ## Port Descriptions | Name | Type | Description | |---|---|---| -| MagneticFieldRead | sync input | Triggers magnetic field data collection and returns a MagneticField struct | +| MagneticFieldGet | sync input | Triggers magnetic field data collection and returns a MagneticField struct | ## Sequence Diagrams @@ -47,11 +48,12 @@ sequenceDiagram participant Zephyr Sensor API participant LIS2MDL Sensor - Manager-->>LIS2MDL Manager: Call MagneticFieldRead synchronous input port + Manager-->>LIS2MDL Manager: Call MagneticFieldGet 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 Manager: Return x, y, z sensor_value structs + LIS2MDL Manager->>LIS2MDL Manager: Write telemetry LIS2MDL Manager-->>Manager: Return MagneticField struct ``` @@ -59,7 +61,7 @@ sequenceDiagram Add requirements in the chart below | Name | Description | Validation | |---|---|---| -| MagneticFieldRead Port | The component shall provide access magnetic field sensor data and return in MagneticField struct, readings will be in gauss | Verify output matches expected values from sensor datasheet | +| MagneticFieldGet Port | The component shall provide access magnetic field sensor data and return in MagneticField struct, readings will be in gauss | Verify output matches expected values from sensor datasheet | ## Change Log | Date | Description | diff --git a/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.cpp b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.cpp index d62596c2..a0d219c8 100644 --- a/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.cpp +++ b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.cpp @@ -14,11 +14,18 @@ namespace Drv { // ---------------------------------------------------------------------- Lsm6dsoManager ::Lsm6dsoManager(const char* const compName) : Lsm6dsoManagerComponentBase(compName) { - // Initialize the LSM6DSO sensor - lsm6dso = DEVICE_DT_GET_ONE(st_lsm6dso); + dev = DEVICE_DT_GET_ONE(st_lsm6dso); - // Configure the LSM6DSO sensor + // 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) { + this->log_WARNING_HI_AccelerometerSamplingFrequencyNotConfigured(); + } + + if (sensor_attr_set(dev, SENSOR_CHAN_GYRO_XYZ, SENSOR_ATTR_SAMPLING_FREQUENCY, &odr) != 0) { + this->log_WARNING_HI_GyroscopeSamplingFrequencyNotConfigured(); + } } Lsm6dsoManager ::~Lsm6dsoManager() {} @@ -27,21 +34,22 @@ Lsm6dsoManager ::~Lsm6dsoManager() {} // Handler implementations for typed input ports // ---------------------------------------------------------------------- -Drv::Acceleration Lsm6dsoManager ::accelerationRead_handler(FwIndexType portNum) { - if (!device_is_ready(lsm6dso)) { +Drv::Acceleration Lsm6dsoManager ::accelerationGet_handler(FwIndexType portNum) { + if (!device_is_ready(dev)) { this->log_WARNING_HI_DeviceNotReady(); return Drv::Acceleration(0.0, 0.0, 0.0); } + this->log_WARNING_HI_DeviceNotReady_ThrottleClear(); struct sensor_value x; struct sensor_value y; struct sensor_value z; - sensor_sample_fetch_chan(lsm6dso, SENSOR_CHAN_ACCEL_XYZ); + sensor_sample_fetch_chan(dev, SENSOR_CHAN_ACCEL_XYZ); - sensor_channel_get(lsm6dso, SENSOR_CHAN_ACCEL_X, &x); - sensor_channel_get(lsm6dso, SENSOR_CHAN_ACCEL_Y, &y); - sensor_channel_get(lsm6dso, SENSOR_CHAN_ACCEL_Z, &z); + 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); Drv::Acceleration acceleration = Drv::Acceleration(Drv::sensor_value_to_f64(x), Drv::sensor_value_to_f64(y), Drv::sensor_value_to_f64(z)); @@ -50,21 +58,22 @@ Drv::Acceleration Lsm6dsoManager ::accelerationRead_handler(FwIndexType portNum) return acceleration; } -Drv::AngularVelocity Lsm6dsoManager ::angularVelocityRead_handler(FwIndexType portNum) { - if (!device_is_ready(lsm6dso)) { +Drv::AngularVelocity Lsm6dsoManager ::angularVelocityGet_handler(FwIndexType portNum) { + if (!device_is_ready(dev)) { this->log_WARNING_HI_DeviceNotReady(); return Drv::AngularVelocity(0.0, 0.0, 0.0); } + this->log_WARNING_HI_DeviceNotReady_ThrottleClear(); struct sensor_value x; struct sensor_value y; struct sensor_value z; - sensor_sample_fetch_chan(lsm6dso, SENSOR_CHAN_GYRO_XYZ); + sensor_sample_fetch_chan(dev, SENSOR_CHAN_GYRO_XYZ); - sensor_channel_get(lsm6dso, SENSOR_CHAN_GYRO_X, &x); - sensor_channel_get(lsm6dso, SENSOR_CHAN_GYRO_Y, &y); - sensor_channel_get(lsm6dso, SENSOR_CHAN_GYRO_Z, &z); + 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); Drv::AngularVelocity angular_velocity = Drv::AngularVelocity(Drv::sensor_value_to_f64(x), Drv::sensor_value_to_f64(y), Drv::sensor_value_to_f64(z)); @@ -73,17 +82,18 @@ Drv::AngularVelocity Lsm6dsoManager ::angularVelocityRead_handler(FwIndexType po return angular_velocity; } -F64 Lsm6dsoManager ::temperatureRead_handler(FwIndexType portNum) { - if (!device_is_ready(lsm6dso)) { +F64 Lsm6dsoManager ::temperatureGet_handler(FwIndexType portNum) { + if (!device_is_ready(dev)) { this->log_WARNING_HI_DeviceNotReady(); return 0; } + this->log_WARNING_HI_DeviceNotReady_ThrottleClear(); struct sensor_value temp; - sensor_sample_fetch_chan(lsm6dso, SENSOR_CHAN_DIE_TEMP); + sensor_sample_fetch_chan(dev, SENSOR_CHAN_DIE_TEMP); - sensor_channel_get(lsm6dso, SENSOR_CHAN_DIE_TEMP, &temp); + sensor_channel_get(dev, SENSOR_CHAN_DIE_TEMP, &temp); this->tlmWrite_Temperature(Drv::sensor_value_to_f64(temp)); diff --git a/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.fpp b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.fpp index 669b4eb8..63d676e0 100644 --- a/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.fpp +++ b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.fpp @@ -1,8 +1,8 @@ # Port definition module Drv { - port AccelerationRead -> Acceleration - port AngularVelocityRead -> AngularVelocity - port TemperatureRead -> F64 + port AccelerationGet -> Acceleration + port AngularVelocityGet -> AngularVelocity + port TemperatureGet -> F64 } # Component definition @@ -11,13 +11,13 @@ module Drv { passive component Lsm6dsoManager { # Ports @ Port to read the current acceleration in m/s^2. - sync input port accelerationRead: AccelerationRead + sync input port accelerationGet: AccelerationGet @ Port to read the current angular velocity in rad/s. - sync input port angularVelocityRead: AngularVelocityRead + sync input port angularVelocityGet: AngularVelocityGet @ Port to read the current temperature in degrees celsius. - sync input port temperatureRead: TemperatureRead + sync input port temperatureGet: TemperatureGet # Telemetry channels @ Telemetry channel for current acceleration in m/s^2. @@ -32,6 +32,12 @@ module Drv { @ Event for reporting LSM6DSO not ready error event DeviceNotReady() severity warning high format "LSM6DSO device not ready" throttle 5 + @ Event for reporting LSM6DSO accelerometer sampling frequency not configured error + event AccelerometerSamplingFrequencyNotConfigured() severity warning high format "LSM6DSO accelerometer sampling frequency not configured" + + @ Event for reporting LSM6DSO gyroscope sampling frequency not configured error + event GyroscopeSamplingFrequencyNotConfigured() severity warning high format "LSM6DSO gyroscope sampling frequency not configured" + ############################################################################### # Standard AC Ports: Required for Channels, Events, Commands, and Parameters # ############################################################################### diff --git a/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.hpp b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.hpp index e996f72e..2a15c39b 100644 --- a/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.hpp +++ b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/Lsm6dsoManager.hpp @@ -36,23 +36,23 @@ class Lsm6dsoManager final : public Lsm6dsoManagerComponentBase { // ---------------------------------------------------------------------- //! Get the acceleration reading from the LSM6DSO sensor - Drv::Acceleration accelerationRead_handler(const FwIndexType portNum //!< The port number - ) override; + Drv::Acceleration accelerationGet_handler(const FwIndexType portNum //!< The port number + ) override; //! Get the angular velocity reading from the LSM6DSO sensor - Drv::AngularVelocity angularVelocityRead_handler(const FwIndexType portNum //!< The port number - ) override; + Drv::AngularVelocity angularVelocityGet_handler(const FwIndexType portNum //!< The port number + ) override; //! Get the temperature reading from the LSM6DSO sensor - F64 temperatureRead_handler(const FwIndexType portNum //!< The port number - ) override; + F64 temperatureGet_handler(const FwIndexType portNum //!< The port number + ) override; // ---------------------------------------------------------------------- // Member variables // ---------------------------------------------------------------------- //! Zephyr device stores the initialized LSM6DSO sensor - const struct device* lsm6dso; + const struct device* dev; }; } // namespace Drv diff --git a/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/docs/sdd.md b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/docs/sdd.md index 58c4e79b..efaf5fb9 100644 --- a/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/docs/sdd.md +++ b/FprimeZephyrReference/Components/Drv/Lsm6dsoManager/docs/sdd.md @@ -1,6 +1,6 @@ -# Components::Lsm6dsoManager +# Drv::Lsm6dsoManager -The LSM6DSO Driver component interfaces with the LIS2MDL magnetometer to provide acceleration, angular velocity, and temperature measurements. +The LSM6DSO Manager component interfaces with the LSM6DSO sensor to provide acceleration, angular velocity, and temperature measurements. ## Usage Examples @@ -9,26 +9,27 @@ The LSM6DSO Driver component is designed to be called periodically to collect an ### Typical Usage 1. The component is instantiated and initialized during system startup -2. A manager calls any of the input ports: `AccelerationRead`, `AngularVelocityRead`, or `TemperatureRead` (No faster than 12.5 Hz) +2. A manager calls any of the input ports: `AccelerationGet`, `AngularVelocityGet`, or `TemperatureGet` 3. On each call, the component: - Fetches fresh sensor samples from the sensor - Converts sensor data to F Prime data structures + - Writes telemetry data - Returns data in SI units ## Class Diagram ```mermaid classDiagram - namespace Components { + namespace Drv { class Lsm6dsoManagerComponentBase { <> } class Lsm6dsoManager { - - lsm6dso: device* - + Lsm6dsoManager(char* compName) + - lsm6dso: const struct device* + + Lsm6dsoManager(const char* compName) + ~Lsm6dsoManager() - - accelerationRead_handler(FwIndexType portNum): Drv::Acceleration - - angularVelocityRead_handler(FwIndexType portNum): Drv::AngularVelocity - - temperatureRead_handler(FwIndexType portNum): F64 + - accelerationGet_handler(const FwIndexType portNum): Drv::Acceleration + - angularVelocityGet_handler(const FwIndexType portNum): Drv::AngularVelocity + - temperatureGet_handler(const FwIndexType portNum): F64 } } Lsm6dsoManagerComponentBase <|-- Lsm6dsoManager : inherits @@ -37,67 +38,70 @@ classDiagram ## Port Descriptions | Name | Type | Description | |---|---|---| -| AccelerationRead | sync input | Triggers acceleration data collection and returns an Acceleration struct | -| AngularVelocityRead | sync input | Triggers angular velocity data collection and returns an AngularVelocity struct | -| TemperatureRead | sync input | Triggers temperature data collection and returns temperature in degrees Celsius | +| AccelerationGet | sync input | Triggers acceleration data collection and returns an Acceleration struct | +| AngularVelocityGet | sync input | Triggers angular velocity data collection and returns an AngularVelocity struct | +| TemperatureGet | sync input | Triggers temperature data collection and returns temperature in degrees Celsius | ## Sequence Diagrams -### AccelerationRead +### AccelerationGet ```mermaid sequenceDiagram participant Manager - participant LSM6DSO Driver + participant LSM6DSO Manager participant Zephyr Sensor API participant LSM6DSO Sensor - Manager-->>LSM6DSO Driver: Call the Acceleration synchronous input port - LSM6DSO Driver->>Zephyr Sensor API: Fetch sensor data + Manager-->>LSM6DSO Manager: Call the Acceleration synchronous input port + LSM6DSO Manager->>Zephyr Sensor API: Fetch sensor data Zephyr Sensor API->>LSM6DSO Sensor: Read sensor LSM6DSO Sensor->>Zephyr Sensor API: Return sensor data - Zephyr Sensor API->>LSM6DSO Driver: Return x, y, z sensor_value structs - LSM6DSO Driver-->>Manager: Return an Acceleration struct + Zephyr Sensor API->>LSM6DSO Manager: Return x, y, z sensor_value structs + LSM6DSO Manager->>LSM6DSO Manager: Write telemetry + LSM6DSO Manager-->>Manager: Return an Acceleration struct ``` -### AngularVelocityRead +### AngularVelocityGet ```mermaid sequenceDiagram participant Manager - participant LSM6DSO Driver + participant LSM6DSO Manager participant Zephyr Sensor API participant LSM6DSO Sensor - Manager-->>LSM6DSO Driver: Call the AngularVelocity synchronous input port - LSM6DSO Driver->>Zephyr Sensor API: Fetch sensor data + Manager-->>LSM6DSO Manager: Call the AngularVelocity synchronous input port + LSM6DSO Manager->>Zephyr Sensor API: Fetch sensor data Zephyr Sensor API->>LSM6DSO Sensor: Read sensor LSM6DSO Sensor->>Zephyr Sensor API: Return sensor data - Zephyr Sensor API->>LSM6DSO Driver: Return x, y, z sensor_value structs - LSM6DSO Driver-->>Manager: Return an AngularVelocity struct + Zephyr Sensor API->>LSM6DSO Manager: Return x, y, z sensor_value structs + LSM6DSO Manager->>LSM6DSO Manager: Write telemetry + LSM6DSO Manager-->>Manager: Return an AngularVelocity struct ``` -### TemperatureRead +### TemperatureGet ```mermaid sequenceDiagram participant Manager - participant LSM6DSO Driver + participant LSM6DSO Manager participant Zephyr Sensor API participant LSM6DSO Sensor - Manager-->>LSM6DSO Driver: Call the Temperature synchronous input port - LSM6DSO Driver->>Zephyr Sensor API: Fetch sensor data + Manager-->>LSM6DSO Manager: Call the Temperature synchronous input port + LSM6DSO Manager->>Zephyr Sensor API: Fetch sensor data Zephyr Sensor API->>LSM6DSO Sensor: Read sensor LSM6DSO Sensor->>Zephyr Sensor API: Return sensor data - Zephyr Sensor API->>LSM6DSO Driver: Return temperature sensor_value struct - LSM6DSO Driver-->>Manager: Return an F64 temperature in degrees Celsius + Zephyr Sensor API->>LSM6DSO Manager: Return temperature sensor_value struct + LSM6DSO Manager->>LSM6DSO Manager: Write telemetry + LSM6DSO Manager-->>Manager: Return an F64 temperature in degrees Celsius ``` ## Requirements Add requirements in the chart below | Name | Description | Validation | |---|---|---| -| AccelerationRead Port | The component shall provide access to acceleration sensor data and return in Acceleration struct, readings will be in m/s^2 | Verify output matches expected values from sensor datasheet | -| AngularVelocityRead Port | The component shall provide access to angular velocity sensor data and return in AngularVelocity struct, readings will be in rad/s | Verify output matches expected values from sensor datasheet | -| TemperatureRead Port | The component shall provide access to temperature sensor data and return in degrees Celsius | Verify output matches expected values from sensor datasheet | +| AccelerationGet Port | The component shall provide access to acceleration sensor data and return in Acceleration struct, readings will be in m/s^2 | Verify output matches expected values from sensor datasheet | +| AngularVelocityGet Port | The component shall provide access to angular velocity sensor data and return in AngularVelocity struct, readings will be in rad/s | Verify output matches expected values from sensor datasheet | +| TemperatureGet Port | The component shall provide access to temperature sensor data and return in degrees Celsius | Verify output matches expected values from sensor datasheet | ## Change Log | Date | Description | diff --git a/FprimeZephyrReference/Components/ImuManager/ImuManager.cpp b/FprimeZephyrReference/Components/ImuManager/ImuManager.cpp index a6989f6f..24e520a7 100644 --- a/FprimeZephyrReference/Components/ImuManager/ImuManager.cpp +++ b/FprimeZephyrReference/Components/ImuManager/ImuManager.cpp @@ -23,11 +23,11 @@ ImuManager ::~ImuManager() {} void ImuManager ::run_handler(FwIndexType portNum, U32 context) { // Read from Lsm6dsoManager - this->accelerationRead_out(0); - this->angularVelocityRead_out(0); - this->temperatureRead_out(0); + this->accelerationGet_out(0); + this->angularVelocityGet_out(0); + this->temperatureGet_out(0); // Read from Lis2mdlManager - this->magneticFieldRead_out(0); + this->magneticFieldGet_out(0); } } // namespace Components diff --git a/FprimeZephyrReference/Components/ImuManager/ImuManager.fpp b/FprimeZephyrReference/Components/ImuManager/ImuManager.fpp index 4d880301..ae6973c2 100644 --- a/FprimeZephyrReference/Components/ImuManager/ImuManager.fpp +++ b/FprimeZephyrReference/Components/ImuManager/ImuManager.fpp @@ -3,17 +3,17 @@ module Components { passive component ImuManager { sync input port run: Svc.Sched - @ Port for sending accelerationRead calls to the LSM6DSO Driver - output port accelerationRead: Drv.AccelerationRead + @ Port for sending accelerationGet calls to the LSM6DSO Driver + output port accelerationGet: Drv.AccelerationGet - @ Port for sending angularVelocityRead calls to the LSM6DSO Driver - output port angularVelocityRead: Drv.AngularVelocityRead + @ Port for sending angularVelocityGet calls to the LSM6DSO Driver + output port angularVelocityGet: Drv.AngularVelocityGet - @ Port for sending magneticFieldRead calls to the LIS2MDL Manager - output port magneticFieldRead: Drv.MagneticFieldRead + @ Port for sending magneticFieldGet calls to the LIS2MDL Manager + output port magneticFieldGet: Drv.MagneticFieldGet - @ Port for sending temperatureRead calls to the LSM6DSO Driver - output port temperatureRead: Drv.TemperatureRead + @ Port for sending temperatureGet calls to the LSM6DSO Driver + output port temperatureGet: Drv.TemperatureGet ############################################################################### # Standard AC Ports: Required for Channels, Events, Commands, and Parameters # diff --git a/FprimeZephyrReference/Components/ImuManager/docs/sdd.md b/FprimeZephyrReference/Components/ImuManager/docs/sdd.md index 2b3aee94..db12b255 100644 --- a/FprimeZephyrReference/Components/ImuManager/docs/sdd.md +++ b/FprimeZephyrReference/Components/ImuManager/docs/sdd.md @@ -4,7 +4,7 @@ The IMU Manager (Inertial Measurement Unit) component provides sensor data relat ## Usage Examples -The IMU Manager component is designed to be scheduled periodically to collect sensor data and output telemetry. It operates as a passive component that responds to scheduler calls. +The IMU Manager component is designed to be scheduled periodically to trigger collection of sensor data and telemetering. It operates as a passive component that responds to scheduler calls. ### Typical Usage @@ -23,7 +23,7 @@ classDiagram <> } class ImuManager { - + ImuManager(char* compName) + + ImuManager(const char* compName) + ~ImuManager() - run_handler(FwIndexType portNum, U32 context): void } @@ -34,9 +34,12 @@ classDiagram ## Port Descriptions | Name | Type | Description | |---|---|---| -| run | sync input | Scheduler port that triggers sensor data collection and telemetry output | +| run | sync input | Scheduler port that triggers sensor data collection | +| accelerationGet | output | Port for calling accelerationGet on the LSM6DSO Manager | +| angularVelocityGet | output | Port for calling angularVelocityGet on the LSM6DSO Manager | +| magneticFieldGet | output | Port for calling magneticFieldGet on the LIS2MDL Manager | +| temperatureGet | output | Port for calling temperatureGet on the LSM6DSO Manager | | timeCaller | time get | Port for requesting current system time | -| tlmOut | telemetry | Port for sending telemetry data to downlink | ## Sequence Diagrams ```mermaid @@ -44,37 +47,20 @@ sequenceDiagram participant Scheduler participant IMU Manager participant LIS2MDL Manager - participant LSM6DSO Driver - participant Telemetry + participant LSM6DSO Manager Scheduler-->>IMU Manager: run - 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 - LSM6DSO Driver->>IMU Manager: AngularVelocity struct - IMU Manager->>LSM6DSO Driver: TemperatureRead - LSM6DSO Driver->>IMU Manager: F64 temperature - IMU Manager->>Telemetry: Output sensor data as telemetry + IMU Manager->>LSM6DSO Manager: AccelerationGet + IMU Manager->>LSM6DSO Manager: AngularVelocityGet + IMU Manager->>LSM6DSO Manager: TemperatureGet + IMU Manager->>LIS2MDL Manager: MagneticFieldGet ``` -## Telemetry -| Name | Description | -|---|---| -| Acceleration | Telemetry channel for acceleration in m/s^2 | -| AngularVelocity | Telemetry channel for angular velocity in rad/s | -| MagneticField | Telemetry channel for magnetic field in gauss | -| Temperature | Telemetry channel for temperature in degrees Celsius | - ## Requirements -Add requirements in the chart below | Name | Description | Validation | |---|---|---| -| Acceleration Telemetry | The component shall provide acceleration telemetry in m/s^2 | Verify telemetry output matches expected values from sensor datasheet | -| Angular Velocity Telemetry | The component shall provide angular velocity telemetry in rad/s | Verify telemetry output matches expected values from sensor datasheet | -| Magnetic Field Telemetry | The component shall provide magnetic field telemetry in gauss | Verify telemetry output matches expected values from sensor datasheet | -| Temperature Telemetry | The component shall provide temperature telemetry in degrees Celsius | Verify telemetry output matches expected values from sensor datasheet | +| Sensor Data Collection | The component shall trigger data collection from both LSM6DSO and LIS2MDL sensors when run is called | Verify all sensor manager output ports are called | +| Periodic Operation | The component shall operate as a scheduled component responding to scheduler calls | Verify component responds correctly to scheduler input | ## Change Log | Date | Description | diff --git a/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp b/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp index a0ade236..60afd964 100644 --- a/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp +++ b/FprimeZephyrReference/ReferenceDeployment/Top/topology.fpp @@ -103,10 +103,10 @@ module ReferenceDeployment { } connections imuManager { - imuManager.accelerationRead -> lsm6dsoManager.accelerationRead - imuManager.angularVelocityRead -> lsm6dsoManager.angularVelocityRead - imuManager.magneticFieldRead -> lis2mdlManager.magneticFieldRead - imuManager.temperatureRead -> lsm6dsoManager.temperatureRead + imuManager.accelerationGet -> lsm6dsoManager.accelerationGet + imuManager.angularVelocityGet -> lsm6dsoManager.angularVelocityGet + imuManager.magneticFieldGet -> lis2mdlManager.magneticFieldGet + imuManager.temperatureGet -> lsm6dsoManager.temperatureGet } connections ReferenceDeployment { From adf6b8eb492178e3b6e77cd4220e67a791e74033 Mon Sep 17 00:00:00 2001 From: Nate Gay Date: Sat, 27 Sep 2025 18:15:35 -0500 Subject: [PATCH 24/26] Add IMU tests --- .../test/int/imu_manager_test.py | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 FprimeZephyrReference/test/int/imu_manager_test.py diff --git a/FprimeZephyrReference/test/int/imu_manager_test.py b/FprimeZephyrReference/test/int/imu_manager_test.py new file mode 100644 index 00000000..34a3de5f --- /dev/null +++ b/FprimeZephyrReference/test/int/imu_manager_test.py @@ -0,0 +1,59 @@ +""" +imu_manager_test.py: + +Simple integration tests for the Watchdog component. +Tests are ordered so that stop tests run last. +""" + +import pytest + + +@pytest.fixture(autouse=True) +def send_packet(fprime_test_api): + """Fixture to clear histories and send the IMU packet before each test""" + fprime_test_api.clear_histories() + fprime_test_api.send_and_assert_command("CdhCore.tlmSend.SEND_PKT", ["6"], max_delay=2) + + +def test_01_acceleration_telemetry(fprime_test_api): + """Test that we can get Acceleration telemetry""" + result = fprime_test_api.assert_telemetry( + "ReferenceDeployment.lsm6dsoManager.Acceleration", + start="NOW", timeout=3 + ) + + reading = result.get_val() + assert all(reading[k] != 0 for k in ("x", "y", "z")), f"Acceleration values should be non-zero, got {reading}" + + +def test_02_angular_velocity_telemetry(fprime_test_api): + """Test that we can get AngularVelocity telemetry""" + result = fprime_test_api.assert_telemetry( + "ReferenceDeployment.lsm6dsoManager.AngularVelocity", + start="NOW", timeout=3 + ) + + reading = result.get_val() + assert all(reading[k] != 0 for k in ("x", "y", "z")), f"Acceleration values should be non-zero, got {reading}" + + +def test_03_temperature_telemetry(fprime_test_api): + """Test that we can get Temperature telemetry""" + result = fprime_test_api.assert_telemetry( + "ReferenceDeployment.lsm6dsoManager.Temperature", + start="NOW", timeout=3 + ) + + reading = result.get_val() + assert result.get_val() != 0, f"Temperature reading should be non-zero" + + +def test_04_magnetic_field_telemetry(fprime_test_api): + """Test that we can get MagneticField telemetry""" + result = fprime_test_api.assert_telemetry( + "ReferenceDeployment.lis2mdlManager.MagneticField", + start="NOW", timeout=3 + ) + + reading = result.get_val() + assert all(reading[k] != 0 for k in ("x", "y", "z")), f"Acceleration values should be non-zero, got {reading}" From 19042fb62cf274daec1701097dbed08296871ceb Mon Sep 17 00:00:00 2001 From: Nate Gay Date: Sun, 28 Sep 2025 00:06:14 -0500 Subject: [PATCH 25/26] Add type hinting --- .../test/int/imu_manager_test.py | 60 ++++++++++--------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/FprimeZephyrReference/test/int/imu_manager_test.py b/FprimeZephyrReference/test/int/imu_manager_test.py index 34a3de5f..68f631fe 100644 --- a/FprimeZephyrReference/test/int/imu_manager_test.py +++ b/FprimeZephyrReference/test/int/imu_manager_test.py @@ -1,59 +1,65 @@ """ imu_manager_test.py: -Simple integration tests for the Watchdog component. +Simple integration tests for the IMU Manager component. Tests are ordered so that stop tests run last. """ import pytest +from fprime_gds.common.data_types.ch_data import ChData +from fprime_gds.common.testing_fw.api import IntegrationTestAPI @pytest.fixture(autouse=True) -def send_packet(fprime_test_api): +def send_packet(fprime_test_api: IntegrationTestAPI): """Fixture to clear histories and send the IMU packet before each test""" fprime_test_api.clear_histories() - fprime_test_api.send_and_assert_command("CdhCore.tlmSend.SEND_PKT", ["6"], max_delay=2) + fprime_test_api.send_and_assert_command( + "CdhCore.tlmSend.SEND_PKT", ["6"], max_delay=2 + ) -def test_01_acceleration_telemetry(fprime_test_api): +def test_01_acceleration_telemetry(fprime_test_api: IntegrationTestAPI): """Test that we can get Acceleration telemetry""" - result = fprime_test_api.assert_telemetry( - "ReferenceDeployment.lsm6dsoManager.Acceleration", - start="NOW", timeout=3 + result: ChData = fprime_test_api.assert_telemetry( + "ReferenceDeployment.lsm6dsoManager.Acceleration", start="NOW", timeout=3 ) - reading = result.get_val() - assert all(reading[k] != 0 for k in ("x", "y", "z")), f"Acceleration values should be non-zero, got {reading}" + reading: dict[float] = result.get_val() + assert all(reading[k] != 0 for k in ("x", "y", "z")), ( + "Acceleration reading should be non-zero" + ) -def test_02_angular_velocity_telemetry(fprime_test_api): +def test_02_angular_velocity_telemetry(fprime_test_api: IntegrationTestAPI): """Test that we can get AngularVelocity telemetry""" - result = fprime_test_api.assert_telemetry( - "ReferenceDeployment.lsm6dsoManager.AngularVelocity", - start="NOW", timeout=3 + result: ChData = fprime_test_api.assert_telemetry( + "ReferenceDeployment.lsm6dsoManager.AngularVelocity", start="NOW", timeout=3 ) - reading = result.get_val() - assert all(reading[k] != 0 for k in ("x", "y", "z")), f"Acceleration values should be non-zero, got {reading}" + reading: dict[float] = result.get_val() + assert all(reading[k] != 0 for k in ("x", "y", "z")), ( + "AngularVelocity reading should be non-zero" + ) -def test_03_temperature_telemetry(fprime_test_api): +def test_03_temperature_telemetry(fprime_test_api: IntegrationTestAPI): """Test that we can get Temperature telemetry""" - result = fprime_test_api.assert_telemetry( - "ReferenceDeployment.lsm6dsoManager.Temperature", - start="NOW", timeout=3 + result: ChData = fprime_test_api.assert_telemetry( + "ReferenceDeployment.lsm6dsoManager.Temperature", start="NOW", timeout=3 ) - reading = result.get_val() - assert result.get_val() != 0, f"Temperature reading should be non-zero" + reading: int = result.get_val() + assert reading != 0, "Temperature reading should be non-zero" -def test_04_magnetic_field_telemetry(fprime_test_api): +def test_04_magnetic_field_telemetry(fprime_test_api: IntegrationTestAPI): """Test that we can get MagneticField telemetry""" - result = fprime_test_api.assert_telemetry( - "ReferenceDeployment.lis2mdlManager.MagneticField", - start="NOW", timeout=3 + result: ChData = fprime_test_api.assert_telemetry( + "ReferenceDeployment.lis2mdlManager.MagneticField", start="NOW", timeout=3 ) - reading = result.get_val() - assert all(reading[k] != 0 for k in ("x", "y", "z")), f"Acceleration values should be non-zero, got {reading}" + reading: dict[float] = result.get_val() + assert all(reading[k] != 0 for k in ("x", "y", "z")), ( + "MagneticField reading should be non-zero" + ) From 5b41b971ad457b48f7df254349f55172b35cff49 Mon Sep 17 00:00:00 2001 From: Nate Gay Date: Sun, 28 Sep 2025 00:14:43 -0500 Subject: [PATCH 26/26] Comment fix --- FprimeZephyrReference/test/int/imu_manager_test.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/FprimeZephyrReference/test/int/imu_manager_test.py b/FprimeZephyrReference/test/int/imu_manager_test.py index 68f631fe..ee98b6f0 100644 --- a/FprimeZephyrReference/test/int/imu_manager_test.py +++ b/FprimeZephyrReference/test/int/imu_manager_test.py @@ -1,8 +1,7 @@ """ imu_manager_test.py: -Simple integration tests for the IMU Manager component. -Tests are ordered so that stop tests run last. +Integration tests for the IMU Manager component. """ import pytest