From 2a5dba39de076ec7af3739aba42d321bf67ab5c5 Mon Sep 17 00:00:00 2001 From: Shivaly Date: Wed, 27 Mar 2024 18:37:58 -0700 Subject: [PATCH 01/37] 2604: SDD in Progress --- Svc/CMakeLists.txt | 1 + Svc/Version/CMakeLists.txt | 22 ++++++++++++ Svc/Version/Version.cpp | 29 ++++++++++++++++ Svc/Version/Version.fpp | 55 ++++++++++++++++++++++++++++++ Svc/Version/Version.hpp | 36 ++++++++++++++++++++ Svc/Version/docs/sdd.md | 70 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 213 insertions(+) create mode 100644 Svc/Version/CMakeLists.txt create mode 100644 Svc/Version/Version.cpp create mode 100644 Svc/Version/Version.fpp create mode 100644 Svc/Version/Version.hpp create mode 100644 Svc/Version/docs/sdd.md diff --git a/Svc/CMakeLists.txt b/Svc/CMakeLists.txt index 175654cccc..0783471c41 100644 --- a/Svc/CMakeLists.txt +++ b/Svc/CMakeLists.txt @@ -56,3 +56,4 @@ if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux" OR ${CMAKE_SYSTEM_NAME} STREQUAL "Darwi add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/PosixTime/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/LinuxTimer/") endif() +add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Version/") diff --git a/Svc/Version/CMakeLists.txt b/Svc/Version/CMakeLists.txt new file mode 100644 index 0000000000..3a52208a05 --- /dev/null +++ b/Svc/Version/CMakeLists.txt @@ -0,0 +1,22 @@ +#### +# F prime CMakeLists.txt: +# +# SOURCE_FILES: combined list of source and autocoding files +# MOD_DEPS: (optional) module dependencies +# UT_SOURCE_FILES: list of source files for unit tests +# +#### +set(SOURCE_FILES + "${CMAKE_CURRENT_LIST_DIR}/Version.fpp" + "${CMAKE_CURRENT_LIST_DIR}/Version.cpp" +) + +# Uncomment and add any modules that this component depends on, else +# they might not be available when cmake tries to build this component. + +set(MOD_DEPS + Os + version +) + +register_fprime_module() diff --git a/Svc/Version/Version.cpp b/Svc/Version/Version.cpp new file mode 100644 index 0000000000..8077fc3061 --- /dev/null +++ b/Svc/Version/Version.cpp @@ -0,0 +1,29 @@ +// ====================================================================== +// \title Version.cpp +// \author sreddy +// \brief cpp file for Version component implementation class +// ====================================================================== + +#include "FpConfig.hpp" +#include "Svc/Version/Version.hpp" + +namespace Svc { + + // ---------------------------------------------------------------------- + // Component construction and destruction + // ---------------------------------------------------------------------- + + Version :: + Version(const char* const compName) : + VersionComponentBase(compName) + { + + } + + Version :: + ~Version() + { + + } + +} diff --git a/Svc/Version/Version.fpp b/Svc/Version/Version.fpp new file mode 100644 index 0000000000..12a9d622ec --- /dev/null +++ b/Svc/Version/Version.fpp @@ -0,0 +1,55 @@ +module Svc { + @ Tracks veramework, user defined versions etc + passive component Version { + + ############################################################################## + #### Uncomment the following examples to start customizing your component #### + ############################################################################## + + # @ Example async command + # async command COMMAND_NAME(param_name: U32) + + # @ Example telemetry counter + # telemetry ExampleCounter: U64 + + # @ Example event + # event ExampleStateEvent(example_state: Fw.On) severity activity high id 0 format "State set to {}" + + # @ Example port: receiving calls from the rate group + # sync input port run: Svc.Sched + + # @ Example parameter + # param PARAMETER_NAME: U32 + + ############################################################################### + # Standard AC Ports: Required for Channels, Events, Commands, and Parameters # + ############################################################################### + @ Port for requesting the current time + time get port timeCaller + + @ Port for sending command registrations + command reg port cmdRegOut + + @ Port for receiving commands + command recv port cmdIn + + @ Port for sending command responses + command resp port cmdResponseOut + + @ 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 + + } +} \ No newline at end of file diff --git a/Svc/Version/Version.hpp b/Svc/Version/Version.hpp new file mode 100644 index 0000000000..191c1099fd --- /dev/null +++ b/Svc/Version/Version.hpp @@ -0,0 +1,36 @@ +// ====================================================================== +// \title Version.hpp +// \author sreddy +// \brief hpp file for Version component implementation class +// ====================================================================== + +#ifndef Svc_Version_HPP +#define Svc_Version_HPP + +#include "Svc/Version/VersionComponentAc.hpp" + +namespace Svc { + + class Version : + public VersionComponentBase + { + + public: + + // ---------------------------------------------------------------------- + // Component construction and destruction + // ---------------------------------------------------------------------- + + //! Construct Version object + Version( + const char* const compName //!< The component name + ); + + //! Destroy Version object + ~Version(); + + }; + +} + +#endif diff --git a/Svc/Version/docs/sdd.md b/Svc/Version/docs/sdd.md new file mode 100644 index 0000000000..e0b5c84b29 --- /dev/null +++ b/Svc/Version/docs/sdd.md @@ -0,0 +1,70 @@ +# Svc::Version + +Tracks versions for framework,project, libraries and user defined project specific versions. + +## 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 + +| Name | Description | Validation | +|---|---|---| +|SVC-VERSION-001|`Svc::Version` shall create an EVR indicating versions of framework, project and libary at start-up and on command| This is to provide transparency to users on versions being used| +|SVC-VERSION-002|`Svc::Version` shall provide a telemetry channel on framework version| Accessiblity to versions being used| +|SVC-VERSION-003|`Svc::Version` shall provide a telemetry channel on project version| Accessiblity to versions being used| +|SVC-VERSION-004|`Svc::Version` shall provide a telemetry channel on library version| Accessiblity to versions being used| +|SVC-VERSION-005|`Svc::Version` shall provide an interface for users to set custom versions.| Enables projects to set hardware and FPGA versions as needed| + +## Change Log +| Date | Description | +|---|---| +|---| Initial Draft | \ No newline at end of file From 2e6715497faeac669501e403658ca7b057d33d59 Mon Sep 17 00:00:00 2001 From: Shivaly Date: Tue, 9 Apr 2024 18:28:57 -0700 Subject: [PATCH 02/37] 2604: Fixed bug in version --- .../Python/src/fprime_ac/utils/version.py | 8 ++- Svc/Version/Version.cpp | 53 ++++++++++++++++- Svc/Version/Version.fpp | 59 ++++++++++++++----- Svc/Version/Version.hpp | 37 ++++++++++++ cmake/target/version.cmake | 2 +- .../target/version/generate_version_header.py | 3 +- 6 files changed, 141 insertions(+), 21 deletions(-) diff --git a/Autocoders/Python/src/fprime_ac/utils/version.py b/Autocoders/Python/src/fprime_ac/utils/version.py index 6fe5104d30..bad88ae5f5 100644 --- a/Autocoders/Python/src/fprime_ac/utils/version.py +++ b/Autocoders/Python/src/fprime_ac/utils/version.py @@ -20,6 +20,8 @@ def get_version_str(working_dir, fallback=FALLBACK_VERSION): output = subprocess.check_output( ["git", "describe", "--tags", "--always"], cwd=working_dir ) + #print ("Msg3: output string : ",output) + #print ("Msg4: output string reformatted: ",output.strip().decode("ascii")) return output.strip().decode("ascii") except Exception: return fallback @@ -35,8 +37,9 @@ def get_fprime_version(): Version of fprime framework """ fprime_directory = os.environ.get( - "FPRIME_FRAMEWORK_PATH", os.path.dirname(__file__) - ) + "FPRIME_FRAMEWORK_PATH", os.path.dirname(__file__)) + #print("Msg1: fprime_directory for version: ", fprime_directory) + return get_version_str(working_dir=fprime_directory, fallback=FALLBACK_VERSION) @@ -53,4 +56,5 @@ def get_project_version(fallback=FALLBACK_VERSION): Version of fprime framework """ fprime_directory = os.environ.get("FPRIME_PROJECT_ROOT", os.path.dirname(__file__)) + #print("Msg1: fprime_directory for project : ", fprime_directory, "and _file_ : ",__file__) return get_version_str(working_dir=fprime_directory, fallback=fallback) diff --git a/Svc/Version/Version.cpp b/Svc/Version/Version.cpp index 8077fc3061..05aca609b0 100644 --- a/Svc/Version/Version.cpp +++ b/Svc/Version/Version.cpp @@ -6,6 +6,7 @@ #include "FpConfig.hpp" #include "Svc/Version/Version.hpp" +#include //autogenerated file containing hardcoded project and framework versions namespace Svc { @@ -15,7 +16,7 @@ namespace Svc { Version :: Version(const char* const compName) : - VersionComponentBase(compName) + VersionComponentBase(compName), m_enable(true) { } @@ -26,4 +27,54 @@ namespace Svc { } +// ---------------------------------------------------------------------- +// Handler implementations for user-defined typed input ports +// ---------------------------------------------------------------------- + +void Version ::run_handler(const NATIVE_INT_TYPE portNum, U32 context) { + if(m_enable) { + Version_tlm(); + } +} + + // ---------------------------------------------------------------------- + // Handler implementations for commands + // ---------------------------------------------------------------------- + + void Version :: + ENABLE_cmdHandler( + FwOpcodeType opCode, + U32 cmdSeq, + Svc::VersionEnabled enable + ) + { + m_enable = (enable == VersionEnabled::ENABLED); + this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); + } + + //Command handler to EVR versions + void Version :: + VERSION_cmdHandler( + FwOpcodeType opCode, + U32 cmdSeq + ) + { + Fw::LogStringArg version_string(FRAMEWORK_VERSION); + this->log_ACTIVITY_LO_FRAMEWORK_VERSION(version_string); + + version_string = PROJECT_VERSION; + this->log_ACTIVITY_LO_PROJECT_VERSION(version_string); + + this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); + } + + //function to log tlm on versions + void Version :: Version_tlm() { + Fw::TlmString version_string(FRAMEWORK_VERSION); + this->tlmWrite_FRAMEWORK_VERSION(version_string); + + version_string = PROJECT_VERSION; + this->tlmWrite_PROJECT_VERSION(version_string); + } + } diff --git a/Svc/Version/Version.fpp b/Svc/Version/Version.fpp index 12a9d622ec..1f92073f85 100644 --- a/Svc/Version/Version.fpp +++ b/Svc/Version/Version.fpp @@ -1,25 +1,52 @@ module Svc { - @ Tracks veramework, user defined versions etc + + @ Tracks versions for project, framework and user defined versions etc + + enum VersionEnabled { + DISABLED = 0 + ENABLED = 1 + } + passive component Version { ############################################################################## #### Uncomment the following examples to start customizing your component #### ############################################################################## - - # @ Example async command - # async command COMMAND_NAME(param_name: U32) - - # @ Example telemetry counter - # telemetry ExampleCounter: U64 - - # @ Example event - # event ExampleStateEvent(example_state: Fw.On) severity activity high id 0 format "State set to {}" - - # @ Example port: receiving calls from the rate group - # sync input port run: Svc.Sched - - # @ Example parameter - # param PARAMETER_NAME: U32 + + @ Run port + guarded input port run: [1] Svc.Sched + + @ A command to enable or disable Version telemetry + guarded command ENABLE( + enable: VersionEnabled @< whether or not Version telemetry is enabled + ) \ + opcode 0 + + @ Report version as EVR + guarded command VERSION \ + opcode 1 + + @ Version of the git repository. + event FRAMEWORK_VERSION( + version: string size 40 @< version string + ) \ + severity activity low \ + id 0 \ + format "Framework Version: [{}]" + + @ Version of the git repository. + event PROJECT_VERSION( + version: string size 40 @< version string + ) \ + severity activity low \ + id 1 \ + format "Project Version: [{}]" + + @ Software framework version + telemetry FRAMEWORK_VERSION: string size 40 id 0 + + @ Software project version + telemetry PROJECT_VERSION: string size 40 id 1 ############################################################################### # Standard AC Ports: Required for Channels, Events, Commands, and Parameters # diff --git a/Svc/Version/Version.hpp b/Svc/Version/Version.hpp index 191c1099fd..52a74feba2 100644 --- a/Svc/Version/Version.hpp +++ b/Svc/Version/Version.hpp @@ -29,6 +29,43 @@ namespace Svc { //! Destroy Version object ~Version(); + PRIVATE: + // ---------------------------------------------------------------------- + // Handler implementations for user-defined typed input ports + // ---------------------------------------------------------------------- + + //! Handler implementation for run + //! + void + run_handler(const NATIVE_INT_TYPE portNum, /*!< The port number*/ + U32 context /*!< The call order*/ + ) override; + + private: + // ---------------------------------------------------------------------- + // Handler implementations for commands + // ---------------------------------------------------------------------- + + //! Handler implementation for command ENABLE + //! + //! A command to enable or disable Version telemetry + void ENABLE_cmdHandler( + FwOpcodeType opCode, //!< The opcode + U32 cmdSeq, //!< The command sequence number + Svc::VersionEnabled enable //!< whether or not Version telemetry is enabled + ) override; + + //! Handler implementation for command VERSION + //! + //! Report version as EVR + void VERSION_cmdHandler( + FwOpcodeType opCode, //!< The opcode + U32 cmdSeq //!< The command sequence number + ) override; + + private: + void Version_tlm(); + bool m_enable; /*!*/ }; } diff --git a/cmake/target/version.cmake b/cmake/target/version.cmake index 6d21cfd325..edbfec06b1 100644 --- a/cmake/target/version.cmake +++ b/cmake/target/version.cmake @@ -14,7 +14,7 @@ function(version_add_global_target TARGET) endif() add_custom_target("${TARGET}" ALL BYPRODUCTS "${OUTPUT_FILE}" COMMAND "${CMAKE_COMMAND}" -E env "PYTHONPATH=${PYTHONPATH}:${FPRIME_FRAMEWORK_PATH}/Autocoders/Python/src" - "${FPRIME_VERSION_SCRIPT}" "${OUTPUT_FILE}.tmp" "${OPTIONAL_CHECK_ARG}" + "FPRIME_PROJECT_ROOT=${FPRIME_PROJECT_ROOT}" "FPRIME_FRAMEWORK_PATH=${FPRIME_FRAMEWORK_PATH}" "${FPRIME_VERSION_SCRIPT}" "${OUTPUT_FILE}.tmp" "${OPTIONAL_CHECK_ARG}" COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${OUTPUT_FILE}.tmp" "${OUTPUT_FILE}" WORKING_DIRECTORY "${FPRIME_PROJECT_ROOT}" ) diff --git a/cmake/target/version/generate_version_header.py b/cmake/target/version/generate_version_header.py index 9ed5bafe1c..5428040c85 100755 --- a/cmake/target/version/generate_version_header.py +++ b/cmake/target/version/generate_version_header.py @@ -47,7 +47,7 @@ def create_version_file(fid, framework_version, project_version): fid.write( 'static const char* FRAMEWORK_VERSION = "{}";\n'.format(framework_version) ) - fid.write('static const char* PROJECT_VERSION = "{}";\n'.format(framework_version)) + fid.write('static const char* PROJECT_VERSION = "{}";\n'.format(project_version)) fid.write("\n") fid.write("#endif\n") fid.write("\n") @@ -76,6 +76,7 @@ def main(): # Build the version output fprime_version = get_fprime_version() project_version = get_project_version() + #print("Project Version: ",project_version) create_version_file(args.output, fprime_version, project_version) # Check version if asked to do so From 25ede54f21c03c46eac0af78d27661ee11663146 Mon Sep 17 00:00:00 2001 From: Shivaly Date: Tue, 23 Apr 2024 17:25:24 -0700 Subject: [PATCH 03/37] 2604: Updates to user defined versions --- Svc/Version/Version.cpp | 32 +++++++++++++++++++++++++++++++- Svc/Version/Version.fpp | 19 +++++++++++++++++++ Svc/Version/Version.hpp | 35 ++++++++++++++++++++++++++++++++++- config/CMakeLists.txt | 1 + config/VersionCfg.fpp | 34 ++++++++++++++++++++++++++++++++++ 5 files changed, 119 insertions(+), 2 deletions(-) create mode 100644 config/VersionCfg.fpp diff --git a/Svc/Version/Version.cpp b/Svc/Version/Version.cpp index 05aca609b0..94582c8ece 100644 --- a/Svc/Version/Version.cpp +++ b/Svc/Version/Version.cpp @@ -18,7 +18,10 @@ namespace Svc { Version(const char* const compName) : VersionComponentBase(compName), m_enable(true) { - + // initialize all entries to stale + for (FwIndexType id = 0; id < Svc::VersionCfg::VersionEnum::NUM_CONSTANTS; id++) { + this->verId_db[id].status = VersionStatus::FAILURE; + } } Version :: @@ -37,6 +40,33 @@ void Version ::run_handler(const NATIVE_INT_TYPE portNum, U32 context) { } } +void Version :: + getVersion_handler( + FwIndexType portNum, + const Svc::VersionCfg::VersionEnum& version_id, + Svc::VersPortStrings::StringSize80& version_string, + Svc::VersionStatus& status + ) + { + FW_ASSERT(version_id.isValid(),version_id.e); + version_string = this->verId_db[version_id.e].val; + status = this->verId_db[version_id.e].status ; + + } + + void Version :: + setVersion_handler( + FwIndexType portNum, + const Svc::VersionCfg::VersionEnum& version_id, + Svc::VersPortStrings::StringSize80& version_string, + Svc::VersionStatus& status + ) + { + FW_ASSERT(version_id.isValid(),version_id.e); + this->verId_db[version_id.e].val = version_string; + this->verId_db[version_id.e].status = status; + + } // ---------------------------------------------------------------------- // Handler implementations for commands // ---------------------------------------------------------------------- diff --git a/Svc/Version/Version.fpp b/Svc/Version/Version.fpp index 1f92073f85..7f51c0235d 100644 --- a/Svc/Version/Version.fpp +++ b/Svc/Version/Version.fpp @@ -6,7 +6,20 @@ module Svc { DISABLED = 0 ENABLED = 1 } + + @ An enumeration for version status + enum VersionStatus { + OK = 0 @< Version was good + FAILURE = 1 @< Failure to get version + } + @ Port for setting and getting Versions + port Vers( + version_id: VersionCfg.VersionEnum @< The entry to access + ref version_string: string @< The value to be passed + ref status: VersionStatus @< The command response argument + ) + passive component Version { ############################################################################## @@ -15,6 +28,12 @@ module Svc { @ Run port guarded input port run: [1] Svc.Sched + + @ Mutexed Port to get values + guarded input port getVersion: Svc.Vers + + @ Mutexed Port to set values + guarded input port setVersion: Svc.Vers @ A command to enable or disable Version telemetry guarded command ENABLE( diff --git a/Svc/Version/Version.hpp b/Svc/Version/Version.hpp index 52a74feba2..3e10ca971e 100644 --- a/Svc/Version/Version.hpp +++ b/Svc/Version/Version.hpp @@ -22,7 +22,7 @@ namespace Svc { // ---------------------------------------------------------------------- //! Construct Version object - Version( + explicit Version( const char* const compName //!< The component name ); @@ -40,7 +40,40 @@ namespace Svc { run_handler(const NATIVE_INT_TYPE portNum, /*!< The port number*/ U32 context /*!< The call order*/ ) override; + + //! Handler implementation for getVersion + //! + //! Mutexed Port to get values + void getVersion_handler( + FwIndexType portNum, //!< The port number + const Svc::VersionCfg::VersionEnum& version_id, //!< The entry to access + Svc::VersPortStrings::StringSize80& version_string, //!< The value to be passed + Svc::VersionStatus& status //!< The command response argument + ) override; + + //! Handler implementation for setVersion + //! + //! Mutexed Port to set values + void setVersion_handler( + FwIndexType portNum, //!< The port number + const Svc::VersionCfg::VersionEnum& version_id, //!< The entry to access + Svc::VersPortStrings::StringSize80& version_string, //!< The value to be passed + Svc::VersionStatus& status //!< The command response argument + ) override; + + //! \struct t_dbStruct + //! \brief PolyDb database structure + //! + //! This structure stores the latest values of the measurements. + //! The statuses are all initialized to MeasurementStatus::STALE by the constructor. + //! + + struct verArr { + VersionStatus status; //!< last status of measurement + VersPortStrings::StringSize80 val; //!< the last value of the measurement + } verId_db[Svc::VersionCfg::VersionEnum::NUM_CONSTANTS]; + private: // ---------------------------------------------------------------------- // Handler implementations for commands diff --git a/config/CMakeLists.txt b/config/CMakeLists.txt index e45152b631..a63d68471d 100644 --- a/config/CMakeLists.txt +++ b/config/CMakeLists.txt @@ -8,5 +8,6 @@ set(SOURCE_FILES "${CMAKE_CURRENT_LIST_DIR}/DpCfg.fpp" "${CMAKE_CURRENT_LIST_DIR}/FpConfig.fpp" "${CMAKE_CURRENT_LIST_DIR}/PolyDbCfg.fpp" + "${CMAKE_CURRENT_LIST_DIR}/VersionCfg.fpp" ) register_fprime_module(config) diff --git a/config/VersionCfg.fpp b/config/VersionCfg.fpp new file mode 100644 index 0000000000..b990d8f699 --- /dev/null +++ b/config/VersionCfg.fpp @@ -0,0 +1,34 @@ +# ====================================================================== +# FPP file for Version configuration +# ====================================================================== + +module Svc { + + module VersionCfg { + + @ Define a set of PolyDb entries on a project-specific + @ basis. + enum VersionEnum: U32 { + @ Entry 0 + PROJECT_VERSION_00 + @ Entry 1 + PROJECT_VERSION_01 + @ Entry 2 + PROJECT_VERSION_03 + @ Entry 4 + PROJECT_VERSION_04 + @ Entry 5 + PROJECT_VERSION_05 + @ Entry 6 + PROJECT_VERSION_06 + @ Entry 7 + PROJECT_VERSION_07 + @ Entry 8 + PROJECT_VERSION_08 + @ Entry 9 + PROJECT_VERSION_09 + } + + } + +} \ No newline at end of file From 8d30c55ae2f103d952ef4b8a1dd81f0db3851f07 Mon Sep 17 00:00:00 2001 From: Shivaly Date: Thu, 9 May 2024 17:31:50 -0700 Subject: [PATCH 04/37] FP-2604: Updates to Version module and UTs --- Svc/Version/CMakeLists.txt | 8 + Svc/Version/Version.cpp | 8 + Svc/Version/Version.fpp | 9 + Svc/Version/Version.hpp | 1 + Svc/Version/test/ut/VersionTestMain.cpp | 27 +++ Svc/Version/test/ut/VersionTester.cpp | 168 +++++++++++++++++++ Svc/Version/test/ut/VersionTester.hpp | 91 ++++++++++ Svc/Version/test/ut/VersionTesterHelpers.cpp | 82 +++++++++ config/VersionCfg.fpp | 2 + 9 files changed, 396 insertions(+) create mode 100644 Svc/Version/test/ut/VersionTestMain.cpp create mode 100644 Svc/Version/test/ut/VersionTester.cpp create mode 100644 Svc/Version/test/ut/VersionTester.hpp create mode 100644 Svc/Version/test/ut/VersionTesterHelpers.cpp diff --git a/Svc/Version/CMakeLists.txt b/Svc/Version/CMakeLists.txt index 3a52208a05..49072b3df7 100644 --- a/Svc/Version/CMakeLists.txt +++ b/Svc/Version/CMakeLists.txt @@ -20,3 +20,11 @@ set(MOD_DEPS ) register_fprime_module() + +set(UT_SOURCE_FILES + "${CMAKE_CURRENT_LIST_DIR}/Version.fpp" + "${CMAKE_CURRENT_LIST_DIR}/test/ut/VersionTester.cpp" + "${CMAKE_CURRENT_LIST_DIR}/test/ut/VersionTestMain.cpp" +) +set (UT_AUTO_HELPERS ON) +register_fprime_ut() diff --git a/Svc/Version/Version.cpp b/Svc/Version/Version.cpp index 94582c8ece..c8f956e55c 100644 --- a/Svc/Version/Version.cpp +++ b/Svc/Version/Version.cpp @@ -18,8 +18,11 @@ namespace Svc { Version(const char* const compName) : VersionComponentBase(compName), m_enable(true) { + startup_done = false; + Svc::VersPortStrings::StringSize80 ver_str = "no_ver"; // initialize all entries to stale for (FwIndexType id = 0; id < Svc::VersionCfg::VersionEnum::NUM_CONSTANTS; id++) { + this->verId_db[id].val = ver_str; this->verId_db[id].status = VersionStatus::FAILURE; } } @@ -37,6 +40,11 @@ namespace Svc { void Version ::run_handler(const NATIVE_INT_TYPE portNum, U32 context) { if(m_enable) { Version_tlm(); + //TODO: Need to add libraries and user defined versions here as well + if (startup_done == false) { //Send EVR once at startup + this->log_ACTIVITY_LO_STARTUP_EVR((PROJECT_VERSION),(FRAMEWORK_VERSION)); + startup_done = true; + } } } diff --git a/Svc/Version/Version.fpp b/Svc/Version/Version.fpp index 7f51c0235d..5b4677a59b 100644 --- a/Svc/Version/Version.fpp +++ b/Svc/Version/Version.fpp @@ -45,6 +45,15 @@ module Svc { guarded command VERSION \ opcode 1 + @ Version of the git repository. + event STARTUP_EVR( + proj_version: string size 40 @< project version + frm_version: string size 40 @< framework version + ) \ + severity activity low \ + id 2 \ + format "Project Version: [{}] Framework Version: [{}]" + @ Version of the git repository. event FRAMEWORK_VERSION( version: string size 40 @< version string diff --git a/Svc/Version/Version.hpp b/Svc/Version/Version.hpp index 3e10ca971e..5ebd5b12ac 100644 --- a/Svc/Version/Version.hpp +++ b/Svc/Version/Version.hpp @@ -99,6 +99,7 @@ namespace Svc { private: void Version_tlm(); bool m_enable; /*!*/ + bool startup_done; }; } diff --git a/Svc/Version/test/ut/VersionTestMain.cpp b/Svc/Version/test/ut/VersionTestMain.cpp new file mode 100644 index 0000000000..b90ab2bdfe --- /dev/null +++ b/Svc/Version/test/ut/VersionTestMain.cpp @@ -0,0 +1,27 @@ +// ====================================================================== +// \title VersionTestMain.cpp +// \author sreddy +// \brief cpp file for Version component test main function +// ====================================================================== + +#include "VersionTester.hpp" + +TEST(Nominal, test_startup) { + Svc::VersionTester tester; + tester.test_startup(); +} + +TEST(Nominal, test_ports) { + Svc::VersionTester tester; + tester.test_ports(); +} + +TEST(Nominal, test_cmds) { + Svc::VersionTester tester; + tester.test_commands(); +} + +int main(int argc, char** argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/Svc/Version/test/ut/VersionTester.cpp b/Svc/Version/test/ut/VersionTester.cpp new file mode 100644 index 0000000000..0b321fa599 --- /dev/null +++ b/Svc/Version/test/ut/VersionTester.cpp @@ -0,0 +1,168 @@ +// ====================================================================== +// \title VersionTester.cpp +// \author sreddy +// \brief cpp file for Version component test harness implementation class +// ====================================================================== + +#include "VersionTester.hpp" +#include + +namespace Svc { + + // ---------------------------------------------------------------------- + // Construction and destruction + // ---------------------------------------------------------------------- + + VersionTester :: + VersionTester() : + VersionGTestBase("VersionTester", VersionTester::MAX_HISTORY_SIZE), + component("Version") + { + this->initComponents(); + this->connectPorts(); + } + + VersionTester :: + ~VersionTester() + { + + } + + // ---------------------------------------------------------------------- + // Tests + // ---------------------------------------------------------------------- + + // ---------------------------------------------------------------------- + // Test STARTUP + // ---------------------------------------------------------------------- + void VersionTester :: test_startup() { + this->invoke_to_run(0,0); + ASSERT_EVENTS_STARTUP_EVR_SIZE(1); + ASSERT_EVENTS_STARTUP_EVR(0,FRAMEWORK_VERSION,PROJECT_VERSION); + } + + // ---------------------------------------------------------------------- + // Test Commands + // ---------------------------------------------------------------------- + void VersionTester :: + test_enable() + { + U32 cmd_seq = 9; + this->sendCmd_ENABLE(0,cmd_seq,VersionEnabled::DISABLED); + this->invoke_to_run(0,0); + ASSERT_CMD_RESPONSE (0, 0, 9, Fw::CmdResponse::OK); + + cmd_seq = 9; + this->sendCmd_ENABLE(0,cmd_seq,VersionEnabled::ENABLED); + this->invoke_to_run(0,0); + ASSERT_CMD_RESPONSE (0, 0, 9, Fw::CmdResponse::OK); + ASSERT_TLM_FRAMEWORK_VERSION(0, FRAMEWORK_VERSION); + ASSERT_TLM_PROJECT_VERSION(0, PROJECT_VERSION); + } + + void VersionTester :: + test_versions() + { + U32 cmd_seq = 9; + this->sendCmd_VERSION(0,cmd_seq); + this->invoke_to_run(0,0); + ASSERT_CMD_RESPONSE (0, 0, 9, Fw::CmdResponse::OK); + ASSERT_EVENTS_FRAMEWORK_VERSION_SIZE(1); + ASSERT_EVENTS_FRAMEWORK_VERSION(0, FRAMEWORK_VERSION); + } + + void VersionTester :: test_commands() { + this->test_enable(); + this->test_versions(); + } + + // ---------------------------------------------------------------------- + // Test User Ports + // ---------------------------------------------------------------------- + + void VersionTester :: test_setVer() { + + Svc::VersionStatus status = Svc::VersionStatus::OK; + Svc::VersPortStrings::StringSize80 set_ver_0 = "ver_0"; + Svc::VersPortStrings::StringSize80 set_ver_6 = "ver_6"; + Svc::VersPortStrings::StringSize80 set_ver_3 = "ver_3"; + Svc::VersPortStrings::StringSize80 set_ver_9 = "ver_9"; + + this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_00, set_ver_0, status); + status = Svc::VersionStatus::FAILURE; + this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_03, set_ver_3, status); + this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_06, set_ver_6, status); + status = Svc::VersionStatus::OK; + this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_09, set_ver_9, status); + } + + void VersionTester :: test_getVer() { + + Svc::VersionStatus status; + Svc::VersPortStrings::StringSize80 get_ver; + + this->invoke_to_getVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_00, get_ver, status); + ASSERT_EQ(get_ver,"ver_0"); + ASSERT_EQ(status,Svc::VersionStatus::OK); + + this->invoke_to_getVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_03, get_ver, status); + ASSERT_EQ(get_ver,"ver_3"); + ASSERT_EQ(status,Svc::VersionStatus::FAILURE); + + this->invoke_to_getVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_06, get_ver, status); + ASSERT_EQ(get_ver,"ver_6"); + ASSERT_EQ(status,Svc::VersionStatus::FAILURE); + + this->invoke_to_getVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_09, get_ver, status); + ASSERT_EQ(get_ver,"ver_9"); + ASSERT_EQ(status,Svc::VersionStatus::OK); + + this->invoke_to_getVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_05, get_ver, status); + ASSERT_EQ(get_ver,"no_ver"); + ASSERT_EQ(status,Svc::VersionStatus::FAILURE); + } + + void VersionTester::test_ports() { + this->test_setVer(); + this->test_getVer(); + } + + +// ---------------------------------------------------------------------- +// Helper methods +// ---------------------------------------------------------------------- + /* + void VersionTester::connectPorts() { + // Connect custom ports + this->connect_to_run(0, this->component.get_run_InputPort(0)); + this->connect_to_getVersion (0, this->component.get_getVersion_InputPort(0)); + this->connect_to_setVersion (0, this->component.get_setVersion_InputPort(0)); + + // CmdIn + this->connect_to_cmdIn (0, this->component.get_cmdIn_InputPort(0)); + + // CmdReg + this->component.set_cmdRegOut_OutputPort(0,this->get_from_cmdRegOut(0)); + + // CmdStatus + this->component.set_cmdResponseOut_OutputPort(0, this->get_from_cmdResponseOut(0)); + + // Tlm + this->component.set_tlmOut_OutputPort(0, this->get_from_tlmOut(0)); + + // Time + this->component.set_timeCaller_OutputPort(0, this->get_from_timeCaller(0)); + + // Log + this->component.set_logOut_OutputPort(0, this->get_from_logOut(0)); + + // LogText + this->component.set_logTextOut_OutputPort(0, this->get_from_logTextOut(0)); + } + + void VersionTester::initComponents() { + this->init(); + this->component.init(0); + } + */ +} \ No newline at end of file diff --git a/Svc/Version/test/ut/VersionTester.hpp b/Svc/Version/test/ut/VersionTester.hpp new file mode 100644 index 0000000000..e96aaeb8c3 --- /dev/null +++ b/Svc/Version/test/ut/VersionTester.hpp @@ -0,0 +1,91 @@ +// ====================================================================== +// \title VersionTester.hpp +// \author sreddy +// \brief hpp file for Version component test harness implementation class +// ====================================================================== + +#ifndef Svc_VersionTester_HPP +#define Svc_VersionTester_HPP + +#include "Svc/Version/VersionGTestBase.hpp" +#include "Svc/Version/Version.hpp" + +namespace Svc { + + class VersionTester : + public VersionGTestBase + { + + public: + + // ---------------------------------------------------------------------- + // Constants + // ---------------------------------------------------------------------- + + // Maximum size of histories storing events, telemetry, and port outputs + static const FwSizeType MAX_HISTORY_SIZE = 10; + + // Instance ID supplied to the component instance under test + static const FwEnumStoreType TEST_INSTANCE_ID = 0; + + public: + + // ---------------------------------------------------------------------- + // Construction and destruction + // ---------------------------------------------------------------------- + + //! Construct object VersionTester + VersionTester(); + + //! Destroy object VersionTester + ~VersionTester(); + + public: + + // ---------------------------------------------------------------------- + // Tests + // ---------------------------------------------------------------------- + + //! test startup EVR + void test_startup(); + + //! test enable command + void test_enable(); + //! test version command + void test_versions(); + //! test all commands + void test_commands(); + + //! test get version + void test_getVer(); + //! test set version + void test_setVer(); + //!test all ports + void test_ports(); + + private: + + // ---------------------------------------------------------------------- + // Helper functions + // ---------------------------------------------------------------------- + + //! Connect ports + void connectPorts(); + + //! Initialize components + void initComponents(); + + private: + + // ---------------------------------------------------------------------- + // Member variables + // ---------------------------------------------------------------------- + + //! The component under test + Version component; + + }; + +} + +#endif diff --git a/Svc/Version/test/ut/VersionTesterHelpers.cpp b/Svc/Version/test/ut/VersionTesterHelpers.cpp new file mode 100644 index 0000000000..dcced4dbde --- /dev/null +++ b/Svc/Version/test/ut/VersionTesterHelpers.cpp @@ -0,0 +1,82 @@ +// ====================================================================== +// \title VersionTesterHelpers.cpp +// \author Generated by fpp-to-cpp +// \brief cpp file for Version component test harness helper functions +// ====================================================================== + +#include "VersionTester.hpp" + +namespace Svc { + + // ---------------------------------------------------------------------- + // Helper functions + // ---------------------------------------------------------------------- + + void VersionTester :: + connectPorts() + { + // Connect special input ports + + this->connect_to_cmdIn( + 0, + this->component.get_cmdIn_InputPort(0) + ); + + // Connect special output ports + + this->component.set_cmdRegOut_OutputPort( + 0, + this->get_from_cmdRegOut(0) + ); + + this->component.set_cmdResponseOut_OutputPort( + 0, + this->get_from_cmdResponseOut(0) + ); + + this->component.set_logOut_OutputPort( + 0, + this->get_from_logOut(0) + ); + + this->component.set_logTextOut_OutputPort( + 0, + this->get_from_logTextOut(0) + ); + + this->component.set_timeCaller_OutputPort( + 0, + this->get_from_timeCaller(0) + ); + + this->component.set_tlmOut_OutputPort( + 0, + this->get_from_tlmOut(0) + ); + + // Connect typed input ports + + this->connect_to_getVersion( + 0, + this->component.get_getVersion_InputPort(0) + ); + + this->connect_to_run( + 0, + this->component.get_run_InputPort(0) + ); + + this->connect_to_setVersion( + 0, + this->component.get_setVersion_InputPort(0) + ); + } + + void VersionTester :: + initComponents() + { + this->init(); + this->component.init(VersionTester::TEST_INSTANCE_ID); + } + +} diff --git a/config/VersionCfg.fpp b/config/VersionCfg.fpp index b990d8f699..09795464ff 100644 --- a/config/VersionCfg.fpp +++ b/config/VersionCfg.fpp @@ -14,6 +14,8 @@ module Svc { @ Entry 1 PROJECT_VERSION_01 @ Entry 2 + PROJECT_VERSION_02 + @ Entry 3 PROJECT_VERSION_03 @ Entry 4 PROJECT_VERSION_04 From d1c48ca3227258b7232ba1637859d7482420a769 Mon Sep 17 00:00:00 2001 From: Shivaly Date: Thu, 9 May 2024 19:25:53 -0700 Subject: [PATCH 05/37] FP-2604 : Updates based on changes made by Thomas to version.hpp --- Svc/Version/Version.cpp | 12 ++++++------ Svc/Version/test/ut/VersionTester.cpp | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Svc/Version/Version.cpp b/Svc/Version/Version.cpp index c8f956e55c..628f10889c 100644 --- a/Svc/Version/Version.cpp +++ b/Svc/Version/Version.cpp @@ -6,7 +6,7 @@ #include "FpConfig.hpp" #include "Svc/Version/Version.hpp" -#include //autogenerated file containing hardcoded project and framework versions +#include "versions/version.hpp" //autogenerated file containing hardcoded project and framework versions namespace Svc { @@ -42,7 +42,7 @@ void Version ::run_handler(const NATIVE_INT_TYPE portNum, U32 context) { Version_tlm(); //TODO: Need to add libraries and user defined versions here as well if (startup_done == false) { //Send EVR once at startup - this->log_ACTIVITY_LO_STARTUP_EVR((PROJECT_VERSION),(FRAMEWORK_VERSION)); + this->log_ACTIVITY_LO_STARTUP_EVR(Fw::LogStringArg(Project::Version::PROJECT_VERSION),Fw::LogStringArg(Project::Version::FRAMEWORK_VERSION)); startup_done = true; } } @@ -97,10 +97,10 @@ void Version :: U32 cmdSeq ) { - Fw::LogStringArg version_string(FRAMEWORK_VERSION); + Fw::LogStringArg version_string(Project::Version::FRAMEWORK_VERSION); this->log_ACTIVITY_LO_FRAMEWORK_VERSION(version_string); - version_string = PROJECT_VERSION; + version_string = Project::Version::PROJECT_VERSION; this->log_ACTIVITY_LO_PROJECT_VERSION(version_string); this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); @@ -108,10 +108,10 @@ void Version :: //function to log tlm on versions void Version :: Version_tlm() { - Fw::TlmString version_string(FRAMEWORK_VERSION); + Fw::TlmString version_string(Project::Version::FRAMEWORK_VERSION); this->tlmWrite_FRAMEWORK_VERSION(version_string); - version_string = PROJECT_VERSION; + version_string = Project::Version::PROJECT_VERSION; this->tlmWrite_PROJECT_VERSION(version_string); } diff --git a/Svc/Version/test/ut/VersionTester.cpp b/Svc/Version/test/ut/VersionTester.cpp index 0b321fa599..5d1f9edad1 100644 --- a/Svc/Version/test/ut/VersionTester.cpp +++ b/Svc/Version/test/ut/VersionTester.cpp @@ -5,7 +5,7 @@ // ====================================================================== #include "VersionTester.hpp" -#include +#include "versions/version.hpp" namespace Svc { @@ -38,7 +38,7 @@ namespace Svc { void VersionTester :: test_startup() { this->invoke_to_run(0,0); ASSERT_EVENTS_STARTUP_EVR_SIZE(1); - ASSERT_EVENTS_STARTUP_EVR(0,FRAMEWORK_VERSION,PROJECT_VERSION); + ASSERT_EVENTS_STARTUP_EVR(0,Project::Version::FRAMEWORK_VERSION,Project::Version::PROJECT_VERSION); } // ---------------------------------------------------------------------- @@ -56,8 +56,8 @@ namespace Svc { this->sendCmd_ENABLE(0,cmd_seq,VersionEnabled::ENABLED); this->invoke_to_run(0,0); ASSERT_CMD_RESPONSE (0, 0, 9, Fw::CmdResponse::OK); - ASSERT_TLM_FRAMEWORK_VERSION(0, FRAMEWORK_VERSION); - ASSERT_TLM_PROJECT_VERSION(0, PROJECT_VERSION); + ASSERT_TLM_FRAMEWORK_VERSION(0, Project::Version::FRAMEWORK_VERSION); + ASSERT_TLM_PROJECT_VERSION(0, Project::Version::PROJECT_VERSION); } void VersionTester :: @@ -68,7 +68,7 @@ namespace Svc { this->invoke_to_run(0,0); ASSERT_CMD_RESPONSE (0, 0, 9, Fw::CmdResponse::OK); ASSERT_EVENTS_FRAMEWORK_VERSION_SIZE(1); - ASSERT_EVENTS_FRAMEWORK_VERSION(0, FRAMEWORK_VERSION); + ASSERT_EVENTS_FRAMEWORK_VERSION(0, Project::Version::FRAMEWORK_VERSION); } void VersionTester :: test_commands() { From 5d50140f585c819e4933e7792ee431873a713086 Mon Sep 17 00:00:00 2001 From: Shivaly Date: Tue, 21 May 2024 14:04:03 -0700 Subject: [PATCH 06/37] FP-2604: Updates to Version based on conversations with Tim and Michael --- Ref/Top/RefTopology.cpp | 2 + Svc/Version/Version.cpp | 212 +++++++++++++++++++++++++++++++++++----- Svc/Version/Version.fpp | 85 +++++++++++++--- Svc/Version/Version.hpp | 54 +++++++--- 4 files changed, 306 insertions(+), 47 deletions(-) diff --git a/Ref/Top/RefTopology.cpp b/Ref/Top/RefTopology.cpp index 3627ca9b15..8b3025d1cd 100644 --- a/Ref/Top/RefTopology.cpp +++ b/Ref/Top/RefTopology.cpp @@ -156,6 +156,8 @@ void setupTopology(const TopologyState& state) { loadParameters(); // Autocoded task kick-off (active components). Function provided by autocoder. startTasks(state); + // Startup TLM and Config verbosity for Versions + Version.Config(true); // Initialize socket client communication if and only if there is a valid specification if (state.hostname != nullptr && state.port != 0) { Os::TaskString name("ReceiveTask"); diff --git a/Svc/Version/Version.cpp b/Svc/Version/Version.cpp index 628f10889c..35fb6e2b76 100644 --- a/Svc/Version/Version.cpp +++ b/Svc/Version/Version.cpp @@ -16,14 +16,17 @@ namespace Svc { Version :: Version(const char* const compName) : - VersionComponentBase(compName), m_enable(true) + VersionComponentBase(compName) { startup_done = false; + num_lib_elem = 0; + num_cus_elem = 0; Svc::VersPortStrings::StringSize80 ver_str = "no_ver"; - // initialize all entries to stale + // initialize all entries for (FwIndexType id = 0; id < Svc::VersionCfg::VersionEnum::NUM_CONSTANTS; id++) { - this->verId_db[id].val = ver_str; - this->verId_db[id].status = VersionStatus::FAILURE; + //setver_enum is by default set to the first enum value, so not setting it here + verId_db[id].setver_val(ver_str); + verId_db[id].setver_status(VersionStatus::FAILURE); } } @@ -32,11 +35,22 @@ namespace Svc { { } + + void Version::Config(bool enable) { + //Set Verbosity for custom versions + m_enable = enable; + + //Setup and send startup TLM + this->proc_libver(); + this->FwVer_tlm(); + this->ProjVer_tlm(); + this->LibVer_tlm(); + } // ---------------------------------------------------------------------- // Handler implementations for user-defined typed input ports // ---------------------------------------------------------------------- - +/* void Version ::run_handler(const NATIVE_INT_TYPE portNum, U32 context) { if(m_enable) { Version_tlm(); @@ -47,6 +61,7 @@ void Version ::run_handler(const NATIVE_INT_TYPE portNum, U32 context) { } } } +*/ void Version :: getVersion_handler( @@ -57,9 +72,9 @@ void Version :: ) { FW_ASSERT(version_id.isValid(),version_id.e); - version_string = this->verId_db[version_id.e].val; - status = this->verId_db[version_id.e].status ; - + version_string = this->verId_db[version_id.e].getver_val(); + status = this->verId_db[version_id.e].getver_status() ; + this->CusVer_tlm(); } void Version :: @@ -71,9 +86,11 @@ void Version :: ) { FW_ASSERT(version_id.isValid(),version_id.e); - this->verId_db[version_id.e].val = version_string; - this->verId_db[version_id.e].status = status; - + this->verId_db[version_id.e].setver_enum(version_id); + this->verId_db[version_id.e].setver_val(version_string); + this->verId_db[version_id.e].setver_status(status); + this->proc_cusver(); + this->CusVer_tlm(); } // ---------------------------------------------------------------------- // Handler implementations for commands @@ -94,25 +111,174 @@ void Version :: void Version :: VERSION_cmdHandler( FwOpcodeType opCode, - U32 cmdSeq + U32 cmdSeq, + Svc::VersionType version_type ) { - Fw::LogStringArg version_string(Project::Version::FRAMEWORK_VERSION); - this->log_ACTIVITY_LO_FRAMEWORK_VERSION(version_string); - - version_string = Project::Version::PROJECT_VERSION; - this->log_ACTIVITY_LO_PROJECT_VERSION(version_string); + //FW_ASSERT(version_type <= Svc::VersionType::ALL); + switch(version_type) { + case (Svc::VersionType::PROJECT): + this->ProjVer_tlm(); + break; + + case (Svc::VersionType::FRAMEWORK): + this->FwVer_tlm(); + break; + + case (Svc::VersionType::LIBRARY): + this->LibVer_tlm(); + break; + + case (Svc::VersionType::CUSTOM): + this->CusVer_tlm(); + break; + + case (Svc::VersionType::ALL): + this->ProjVer_tlm(); + this->FwVer_tlm(); + this->LibVer_tlm(); + this->CusVer_tlm(); + break; + default: + FW_ASSERT(0,version_type); + break; + } this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); } + // ---------------------------------------------------------------------- + // implementations for internal functions + // ---------------------------------------------------------------------- + //Process libs + void Version :: proc_libver() { + num_lib_elem = sizeof(Project::Version::LIBRARY_VERSIONS)/sizeof(Project::Version::LIBRARY_VERSIONS[0]); + /* + //Store lib array locally + for(U8 i = 0; i < num_lib_elem ; i++) { + lib_ver_arr[i] = Project::Version::LIBRARY_VERSIONS[i]; + } + */ + } + + //Process Custom Versions + void Version :: proc_cusver() { + num_cus_elem = sizeof(this->verId_db)/sizeof(this->verId_db[0]); + } - //function to log tlm on versions - void Version :: Version_tlm() { - Fw::TlmString version_string(Project::Version::FRAMEWORK_VERSION); - this->tlmWrite_FRAMEWORK_VERSION(version_string); + //functions to log tlm on versions + void Version :: FwVer_tlm() { + Fw::LogStringArg fw_evr = (Project::Version::FRAMEWORK_VERSION); + this->log_ACTIVITY_LO_FRAMEWORK_VERSION(fw_evr); + Fw::TlmString fw_eha = (Project::Version::FRAMEWORK_VERSION); + this->tlmWrite_FRAMEWORK_VERSION(fw_eha); + } - version_string = Project::Version::PROJECT_VERSION; - this->tlmWrite_PROJECT_VERSION(version_string); + void Version :: ProjVer_tlm() { + Fw::LogStringArg proj_evr = Project::Version::PROJECT_VERSION; + this->log_ACTIVITY_LO_PROJECT_VERSION(proj_evr); + Fw::TlmString proj_eha= Project::Version::PROJECT_VERSION; + this->tlmWrite_PROJECT_VERSION(proj_eha); + } + + void Version :: LibVer_tlm() { + + for (U8 i = 0; i < num_lib_elem; i++) { + //Emit EVR TLM on library versions + this->log_ACTIVITY_LO_LIBRARY_VERSIONS(Fw::LogStringArg(Project::Version::LIBRARY_VERSIONS[i])); + + //Write to EHAs + switch(i) { + case VER_SLOT_00: + this->tlmWrite_LIBRARY_VERSION_01(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i])); + break; + case VER_SLOT_01: + this->tlmWrite_LIBRARY_VERSION_02(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i])); + break; + case VER_SLOT_02: + this->tlmWrite_LIBRARY_VERSION_03(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i])); + break; + case VER_SLOT_03: + this->tlmWrite_LIBRARY_VERSION_04(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i])); + break; + case VER_SLOT_04: + this->tlmWrite_LIBRARY_VERSION_05(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i])); + break; + case VER_SLOT_05: + this->tlmWrite_LIBRARY_VERSION_06(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i])); + break; + case VER_SLOT_06: + this->tlmWrite_LIBRARY_VERSION_07(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i])); + break; + case VER_SLOT_07: + this->tlmWrite_LIBRARY_VERSION_08(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i])); + break; + case VER_SLOT_08: + this->tlmWrite_LIBRARY_VERSION_09(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i])); + break; + case VER_SLOT_09: + this->tlmWrite_LIBRARY_VERSION_10(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i])); + break; + default: + //It is possible to have more than 10 library versions; however design agreed to only + // provide 10 TLM channels for it + break; + } + } + + } + + void Version :: CusVer_tlm() { + + //Process custom version TLM only if verbosity is enabled and there are any valid writes to it; + // it doesn't necessarily have to be consecutive + for ( U8 i = 0; + (m_enable == true) && (num_cus_elem != 0) && (i < Svc::VersionCfg::VersionEnum::NUM_CONSTANTS); + i++) { + + if(this->verId_db[i].getver_val() != "no_ver") { //Write TLM for valid writes + + //Emit EVR TLM on library versions + this->log_ACTIVITY_LO_CUSTOM_VERSIONS(this->verId_db[i].getver_enum(), this->verId_db[i].getver_val()); + + //Write to EHAs + switch(i) { + case VER_SLOT_00: + this->tlmWrite_CUSTOM_VERSION_01(verId_db[i]); + break; + case VER_SLOT_01: + this->tlmWrite_CUSTOM_VERSION_02(verId_db[i]); + break; + case VER_SLOT_02: + this->tlmWrite_CUSTOM_VERSION_03(verId_db[i]); + break; + case VER_SLOT_03: + this->tlmWrite_CUSTOM_VERSION_04(verId_db[i]); + break; + case VER_SLOT_04: + this->tlmWrite_CUSTOM_VERSION_05(verId_db[i]); + break; + case VER_SLOT_05: + this->tlmWrite_CUSTOM_VERSION_06(verId_db[i]); + break; + case VER_SLOT_06: + this->tlmWrite_CUSTOM_VERSION_07(verId_db[i]); + break; + case VER_SLOT_07: + this->tlmWrite_CUSTOM_VERSION_08(verId_db[i]); + break; + case VER_SLOT_08: + this->tlmWrite_CUSTOM_VERSION_09(verId_db[i]); + break; + case VER_SLOT_09: + this->tlmWrite_CUSTOM_VERSION_10(verId_db[i]); + break; + default: + //There are only 10 enum slots available, so can assert here + FW_ASSERT(0,i); + break; + } + } + } } } diff --git a/Svc/Version/Version.fpp b/Svc/Version/Version.fpp index 5b4677a59b..7d50c68d2f 100644 --- a/Svc/Version/Version.fpp +++ b/Svc/Version/Version.fpp @@ -13,13 +13,30 @@ module Svc { FAILURE = 1 @< Failure to get version } + @ An enumeration for Version Type + enum VersionType { + PROJECT = 0 @< project version + FRAMEWORK = 1 + LIBRARY = 2 + CUSTOM = 3 + ALL = 4 + } + + @ Port for setting and getting Versions port Vers( version_id: VersionCfg.VersionEnum @< The entry to access ref version_string: string @< The value to be passed ref status: VersionStatus @< The command response argument - ) + ) + @Data Structure for custom version Tlm + struct CusVerDb { + ver_enum: VersionCfg.VersionEnum + ver_val: string size 80 + ver_status : VersionStatus + } + passive component Version { ############################################################################## @@ -27,7 +44,7 @@ module Svc { ############################################################################## @ Run port - guarded input port run: [1] Svc.Sched + #guarded input port run: [1] Svc.Sched @ Mutexed Port to get values guarded input port getVersion: Svc.Vers @@ -35,24 +52,26 @@ module Svc { @ Mutexed Port to set values guarded input port setVersion: Svc.Vers - @ A command to enable or disable Version telemetry + @ A command to enable or disable EVR verbosity and Telemetry guarded command ENABLE( enable: VersionEnabled @< whether or not Version telemetry is enabled ) \ opcode 0 @ Report version as EVR - guarded command VERSION \ - opcode 1 + guarded command VERSION( + version_type: VersionType @*/ bool startup_done; + U32 num_lib_elem; //number of library versions + U32 num_cus_elem; //number of custom versions + //const char* lib_ver_arr[]; // Store library versions internally + + // An enumeration for TLM slot access + enum VerSlot { + VER_SLOT_00 = 0, + VER_SLOT_01, + VER_SLOT_02, + VER_SLOT_03, + VER_SLOT_04, + VER_SLOT_05, + VER_SLOT_06, + VER_SLOT_07, + VER_SLOT_08, + VER_SLOT_09 + }; + }; } From 9b1cd590bb4f24f593e15b157833809a6b1b03ae Mon Sep 17 00:00:00 2001 From: Shivaly Date: Fri, 24 May 2024 15:39:04 -0700 Subject: [PATCH 07/37] FP-2604: Updates to UTs and respective code changes --- Svc/Version/Version.cpp | 110 ++++--- Svc/Version/Version.hpp | 31 +- Svc/Version/docs/sdd.md | 21 +- Svc/Version/test/ut/VersionTestMain.cpp | 8 +- Svc/Version/test/ut/VersionTester.cpp | 289 +++++++++++++++++-- Svc/Version/test/ut/VersionTester.hpp | 10 +- Svc/Version/test/ut/VersionTesterHelpers.cpp | 4 +- Svc/Version/test/ut/versions/version.hpp | 30 ++ config/VersionCfg.fpp | 2 +- 9 files changed, 403 insertions(+), 102 deletions(-) create mode 100644 Svc/Version/test/ut/versions/version.hpp diff --git a/Svc/Version/Version.cpp b/Svc/Version/Version.cpp index 35fb6e2b76..bd1f430d51 100644 --- a/Svc/Version/Version.cpp +++ b/Svc/Version/Version.cpp @@ -6,7 +6,12 @@ #include "FpConfig.hpp" #include "Svc/Version/Version.hpp" -#include "versions/version.hpp" //autogenerated file containing hardcoded project and framework versions + +#ifdef BUILD_UT + #include "test/ut/versions/version.hpp" //autogenerated file containing hardcoded project and framework versions +#else + #include "versions/version.hpp" //autogenerated file containing hardcoded project and framework versions +#endif namespace Svc { @@ -37,12 +42,11 @@ namespace Svc { } void Version::Config(bool enable) { - //Set Verbosity for custom versions m_enable = enable; + //Setup and send startup TLM - this->proc_libver(); this->FwVer_tlm(); this->ProjVer_tlm(); this->LibVer_tlm(); @@ -72,9 +76,9 @@ void Version :: ) { FW_ASSERT(version_id.isValid(),version_id.e); - version_string = this->verId_db[version_id.e].getver_val(); - status = this->verId_db[version_id.e].getver_status() ; - this->CusVer_tlm(); + U8 ver_slot = VerSlot(version_id.e); + version_string = this->verId_db[ver_slot].getver_val(); + status = this->verId_db[ver_slot].getver_status() ; } void Version :: @@ -86,12 +90,14 @@ void Version :: ) { FW_ASSERT(version_id.isValid(),version_id.e); - this->verId_db[version_id.e].setver_enum(version_id); - this->verId_db[version_id.e].setver_val(version_string); - this->verId_db[version_id.e].setver_status(status); - this->proc_cusver(); - this->CusVer_tlm(); + VerSlot ver_slot = VerSlot(version_id.e); + this->verId_db[ver_slot].setver_enum(version_id); + this->verId_db[ver_slot].setver_val(version_string); + this->verId_db[ver_slot].setver_status(status); + this->num_cus_elem++; + this->CusVer_tlm(ver_slot); } + // ---------------------------------------------------------------------- // Handler implementations for commands // ---------------------------------------------------------------------- @@ -104,6 +110,8 @@ void Version :: ) { m_enable = (enable == VersionEnabled::ENABLED); + //printf("Test m_enable when disabled: %d\n\n", m_enable); + this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); } @@ -130,14 +138,14 @@ void Version :: break; case (Svc::VersionType::CUSTOM): - this->CusVer_tlm(); + this->CusVer_tlm_all(); break; case (Svc::VersionType::ALL): this->ProjVer_tlm(); this->FwVer_tlm(); this->LibVer_tlm(); - this->CusVer_tlm(); + this->CusVer_tlm_all(); break; default: FW_ASSERT(0,version_type); @@ -151,20 +159,20 @@ void Version :: // ---------------------------------------------------------------------- //Process libs void Version :: proc_libver() { - num_lib_elem = sizeof(Project::Version::LIBRARY_VERSIONS)/sizeof(Project::Version::LIBRARY_VERSIONS[0]); - /* - //Store lib array locally - for(U8 i = 0; i < num_lib_elem ; i++) { - lib_ver_arr[i] = Project::Version::LIBRARY_VERSIONS[i]; - } - */ + num_lib_elem = sizeof(Project::Version::LIBRARY_VERSIONS)/sizeof(Project::Version::LIBRARY_VERSIONS[0]); + //printf( "num of lib elements before : %d\n\n",num_lib_elem); + if(Project::Version::LIBRARY_VERSIONS[0] == nullptr) { + num_lib_elem = 0; + } + //printf( "num of lib elements : %d\n\n",num_lib_elem); + /* + //Store lib array locally + for(U8 i = 0; i < num_lib_elem ; i++) { + lib_ver_arr[i] = Project::Version::LIBRARY_VERSIONS[i]; + } + */ } - //Process Custom Versions - void Version :: proc_cusver() { - num_cus_elem = sizeof(this->verId_db)/sizeof(this->verId_db[0]); - } - //functions to log tlm on versions void Version :: FwVer_tlm() { Fw::LogStringArg fw_evr = (Project::Version::FRAMEWORK_VERSION); @@ -181,11 +189,13 @@ void Version :: } void Version :: LibVer_tlm() { + //Process libraries array + this->proc_libver(); for (U8 i = 0; i < num_lib_elem; i++) { //Emit EVR TLM on library versions + //printf("lib versions are: %s",Project::Version::LIBRARY_VERSIONS[i]); this->log_ACTIVITY_LO_LIBRARY_VERSIONS(Fw::LogStringArg(Project::Version::LIBRARY_VERSIONS[i])); - //Write to EHAs switch(i) { case VER_SLOT_00: @@ -227,58 +237,64 @@ void Version :: } - void Version :: CusVer_tlm() { - - //Process custom version TLM only if verbosity is enabled and there are any valid writes to it; - // it doesn't necessarily have to be consecutive + void Version :: CusVer_tlm_all() { + //printf("m_enable : %d , num_cus_elem : %d\n\n",m_enable,num_cus_elem); for ( U8 i = 0; (m_enable == true) && (num_cus_elem != 0) && (i < Svc::VersionCfg::VersionEnum::NUM_CONSTANTS); i++) { - - if(this->verId_db[i].getver_val() != "no_ver") { //Write TLM for valid writes + Version::CusVer_tlm(VerSlot(i)); + } + } + + void Version :: CusVer_tlm(VerSlot cus_slot) { + + //Process custom version TLM only if verbosity is enabled and there are any valid writes to it; + // it doesn't necessarily have to be consecutive + if( (this->verId_db[cus_slot].getver_val() != "no_ver") + && m_enable == true + && (num_cus_elem > 0)) { //Write TLM for valid writes //Emit EVR TLM on library versions - this->log_ACTIVITY_LO_CUSTOM_VERSIONS(this->verId_db[i].getver_enum(), this->verId_db[i].getver_val()); + this->log_ACTIVITY_LO_CUSTOM_VERSIONS(this->verId_db[cus_slot].getver_enum(), this->verId_db[cus_slot].getver_val()); //Write to EHAs - switch(i) { + switch(cus_slot) { case VER_SLOT_00: - this->tlmWrite_CUSTOM_VERSION_01(verId_db[i]); + this->tlmWrite_CUSTOM_VERSION_01(verId_db[cus_slot]); break; case VER_SLOT_01: - this->tlmWrite_CUSTOM_VERSION_02(verId_db[i]); + this->tlmWrite_CUSTOM_VERSION_02(verId_db[cus_slot]); break; case VER_SLOT_02: - this->tlmWrite_CUSTOM_VERSION_03(verId_db[i]); + this->tlmWrite_CUSTOM_VERSION_03(verId_db[cus_slot]); break; case VER_SLOT_03: - this->tlmWrite_CUSTOM_VERSION_04(verId_db[i]); + this->tlmWrite_CUSTOM_VERSION_04(verId_db[cus_slot]); break; case VER_SLOT_04: - this->tlmWrite_CUSTOM_VERSION_05(verId_db[i]); + this->tlmWrite_CUSTOM_VERSION_05(verId_db[cus_slot]); break; case VER_SLOT_05: - this->tlmWrite_CUSTOM_VERSION_06(verId_db[i]); + this->tlmWrite_CUSTOM_VERSION_06(verId_db[cus_slot]); break; case VER_SLOT_06: - this->tlmWrite_CUSTOM_VERSION_07(verId_db[i]); + this->tlmWrite_CUSTOM_VERSION_07(verId_db[cus_slot]); break; case VER_SLOT_07: - this->tlmWrite_CUSTOM_VERSION_08(verId_db[i]); + this->tlmWrite_CUSTOM_VERSION_08(verId_db[cus_slot]); break; case VER_SLOT_08: - this->tlmWrite_CUSTOM_VERSION_09(verId_db[i]); + this->tlmWrite_CUSTOM_VERSION_09(verId_db[cus_slot]); break; case VER_SLOT_09: - this->tlmWrite_CUSTOM_VERSION_10(verId_db[i]); + this->tlmWrite_CUSTOM_VERSION_10(verId_db[cus_slot]); break; default: - //There are only 10 enum slots available, so can assert here - FW_ASSERT(0,i); + //There are only 10 custom slots available + FW_ASSERT(0,cus_slot); break; } } } - } } diff --git a/Svc/Version/Version.hpp b/Svc/Version/Version.hpp index 1ad879f637..8c03392e18 100644 --- a/Svc/Version/Version.hpp +++ b/Svc/Version/Version.hpp @@ -103,20 +103,9 @@ namespace Svc { Svc::VersionType version_type //!< which version type EVR is requested ) override; - private: - void proc_libver(); - void proc_cusver(); - void FwVer_tlm(); - void ProjVer_tlm(); - void LibVer_tlm(); - void CusVer_tlm(); - bool m_enable; /*!*/ - bool startup_done; - U32 num_lib_elem; //number of library versions - U32 num_cus_elem; //number of custom versions - //const char* lib_ver_arr[]; // Store library versions internally - - // An enumeration for TLM slot access + PRIVATE: + + // An enumeration for TLM slot access enum VerSlot { VER_SLOT_00 = 0, VER_SLOT_01, @@ -130,6 +119,20 @@ namespace Svc { VER_SLOT_09 }; + void proc_libver(); + void proc_cusver(); + void FwVer_tlm(); + void ProjVer_tlm(); + void LibVer_tlm(); + void CusVer_tlm(VerSlot cus_slot); + void CusVer_tlm_all(); + bool m_enable; /*!*/ + bool startup_done; + U32 num_lib_elem; //number of library versions + U32 num_cus_elem; //number of custom versions + //const char* lib_ver_arr[]; // Store library versions internally + + }; } diff --git a/Svc/Version/docs/sdd.md b/Svc/Version/docs/sdd.md index e0b5c84b29..f4b948ad99 100644 --- a/Svc/Version/docs/sdd.md +++ b/Svc/Version/docs/sdd.md @@ -58,11 +58,22 @@ Add unit test descriptions in the chart below | Name | Description | Validation | |---|---|---| -|SVC-VERSION-001|`Svc::Version` shall create an EVR indicating versions of framework, project and libary at start-up and on command| This is to provide transparency to users on versions being used| -|SVC-VERSION-002|`Svc::Version` shall provide a telemetry channel on framework version| Accessiblity to versions being used| -|SVC-VERSION-003|`Svc::Version` shall provide a telemetry channel on project version| Accessiblity to versions being used| -|SVC-VERSION-004|`Svc::Version` shall provide a telemetry channel on library version| Accessiblity to versions being used| -|SVC-VERSION-005|`Svc::Version` shall provide an interface for users to set custom versions.| Enables projects to set hardware and FPGA versions as needed| +|SVC-VERSION-001|`Svc::Version` upon startup shall generate an event and a telemetry channel with version for framework.| This is to provide transparency on framework version being used| +|SVC-VERSION-002|`Svc::Version` upon startup shall generate an event and a telemetry channel with version for project | This is to provide transparency on project version being used| +|SVC-VERSION-003|`Svc::Version` upon startup shall generate events and telemetry channels (upto 10) with versions for libary.| Transparency on different library versions| +|SVC-VERSION-004|`Svc::Version` upon startup shall make verbosity on custom versions configurable.| Transparency on different library versions| +|SVC-VERSION-005|`Svc::Version` shall provide a ground command to request events and telemetry on framework version| Accessiblity on demand| +|SVC-VERSION-006|`Svc::Version` shall provide a ground command to request events and telemetry on project version| Accessiblity on demand| +|SVC-VERSION-007|`Svc::Version` shall provide a ground command to request events and telemetry channels (upto 10) on library versions| Accessiblity on demand| +|SVC-VERSION-008|`Svc::Version` shall provide a ground command to request events and telemetry channels (upto 10) on custom versions| Accessiblity on demand| +|SVC-VERSION-009|`Svc::Version` shall provide a ground command to enable/disable verbosity on custom versions| Accessiblity on demand| +|SVC-VERSION-010|`Svc::Version` shall provide a telemetry channel on framework version| Accessiblity to versions being used| +|SVC-VERSION-011|`Svc::Version` shall provide a telemetry channel on project version| Accessiblity to versions being used| +|SVC-VERSION-012|`Svc::Version` shall provide upto 10 telemetry channels on library versions| Accessiblity to versions being used| +|SVC-VERSION-013|`Svc::Version` shall provide upto 10 telemetry channels on custom versions| Accessiblity to versions being used| +|SVC-VERSION-014|`Svc::Version` shall provide an interface for other components to set custom versions.| Enables projects to set hardware and FPGA versions, say, as needed. Also generates EVRs/EHAs| +|SVC-VERSION-015|`Svc::Version` shall provide an interface for other components to get custom versions.| Also generates EVRs/EHAs| + ## Change Log | Date | Description | diff --git a/Svc/Version/test/ut/VersionTestMain.cpp b/Svc/Version/test/ut/VersionTestMain.cpp index b90ab2bdfe..1da68afea0 100644 --- a/Svc/Version/test/ut/VersionTestMain.cpp +++ b/Svc/Version/test/ut/VersionTestMain.cpp @@ -11,14 +11,14 @@ TEST(Nominal, test_startup) { tester.test_startup(); } -TEST(Nominal, test_ports) { +TEST(Nominal, test_cmds) { Svc::VersionTester tester; - tester.test_ports(); + tester.test_commands(); } -TEST(Nominal, test_cmds) { +TEST(Nominal, test_ports) { Svc::VersionTester tester; - tester.test_commands(); + tester.test_ports(); } int main(int argc, char** argv) { diff --git a/Svc/Version/test/ut/VersionTester.cpp b/Svc/Version/test/ut/VersionTester.cpp index 5d1f9edad1..99966df825 100644 --- a/Svc/Version/test/ut/VersionTester.cpp +++ b/Svc/Version/test/ut/VersionTester.cpp @@ -31,44 +31,190 @@ namespace Svc { // ---------------------------------------------------------------------- // Tests // ---------------------------------------------------------------------- + //Clear/init test + void VersionTester :: clear_all() { + this->clearHistory(); + ASSERT_EVENTS_FRAMEWORK_VERSION_SIZE(0); + ASSERT_EVENTS_PROJECT_VERSION_SIZE(0); + ASSERT_EVENTS_LIBRARY_VERSIONS_SIZE(0); + ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(0); + ASSERT_TLM_FRAMEWORK_VERSION_SIZE(0); + ASSERT_TLM_PROJECT_VERSION_SIZE(0); + ASSERT_TLM_LIBRARY_VERSION_01_SIZE(0); + ASSERT_TLM_LIBRARY_VERSION_02_SIZE(0); + ASSERT_TLM_LIBRARY_VERSION_03_SIZE(0); + ASSERT_TLM_LIBRARY_VERSION_04_SIZE(0); + ASSERT_TLM_LIBRARY_VERSION_05_SIZE(0); + ASSERT_TLM_LIBRARY_VERSION_06_SIZE(0); + ASSERT_TLM_LIBRARY_VERSION_07_SIZE(0); + ASSERT_TLM_LIBRARY_VERSION_08_SIZE(0); + ASSERT_TLM_LIBRARY_VERSION_09_SIZE(0); + ASSERT_TLM_LIBRARY_VERSION_10_SIZE(0); + ASSERT_TLM_CUSTOM_VERSION_01_SIZE(0); + ASSERT_TLM_CUSTOM_VERSION_02_SIZE(0); + ASSERT_TLM_CUSTOM_VERSION_03_SIZE(0); + ASSERT_TLM_CUSTOM_VERSION_04_SIZE(0); + ASSERT_TLM_CUSTOM_VERSION_05_SIZE(0); + ASSERT_TLM_CUSTOM_VERSION_06_SIZE(0); + ASSERT_TLM_CUSTOM_VERSION_07_SIZE(0); + ASSERT_TLM_CUSTOM_VERSION_08_SIZE(0); + ASSERT_TLM_CUSTOM_VERSION_09_SIZE(0); + ASSERT_TLM_CUSTOM_VERSION_10_SIZE(0); + } // ---------------------------------------------------------------------- // Test STARTUP // ---------------------------------------------------------------------- void VersionTester :: test_startup() { - this->invoke_to_run(0,0); - ASSERT_EVENTS_STARTUP_EVR_SIZE(1); - ASSERT_EVENTS_STARTUP_EVR(0,Project::Version::FRAMEWORK_VERSION,Project::Version::PROJECT_VERSION); + //this->invoke_to_run(0,0); //No longer running version on a scheduler but invoked after starttask() in RefTopology.cpp + //ASSERT_EVENTS_STARTUP_EVR_SIZE(1); + //ASSERT_EVENTS_STARTUP_EVR(0,Project::Version::FRAMEWORK_VERSION,Project::Version::PROJECT_VERSION); + this->component.Config(true); + ASSERT_TLM_FRAMEWORK_VERSION(0, Project::Version::FRAMEWORK_VERSION); + ASSERT_TLM_PROJECT_VERSION(0, Project::Version::PROJECT_VERSION); + ASSERT_EVENTS_FRAMEWORK_VERSION_SIZE(1); + ASSERT_EVENTS_FRAMEWORK_VERSION(0, Project::Version::FRAMEWORK_VERSION); + ASSERT_EVENTS_PROJECT_VERSION_SIZE(1); + ASSERT_EVENTS_PROJECT_VERSION(0, Project::Version::FRAMEWORK_VERSION); + //Library versions currently set to a null pointer + //TODO: Need to figure out how to put in artifical sets to test them + ASSERT_EVENTS_LIBRARY_VERSIONS_SIZE(12); + ASSERT_EVENTS_LIBRARY_VERSIONS(0, "blah0 @ blah0"); } // ---------------------------------------------------------------------- // Test Commands // ---------------------------------------------------------------------- + void VersionTester :: test_enable() { U32 cmd_seq = 9; this->sendCmd_ENABLE(0,cmd_seq,VersionEnabled::DISABLED); - this->invoke_to_run(0,0); ASSERT_CMD_RESPONSE (0, 0, 9, Fw::CmdResponse::OK); + VersionTester::test_setVer(false); + ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(0); + cmd_seq = 9; this->sendCmd_ENABLE(0,cmd_seq,VersionEnabled::ENABLED); - this->invoke_to_run(0,0); ASSERT_CMD_RESPONSE (0, 0, 9, Fw::CmdResponse::OK); - ASSERT_TLM_FRAMEWORK_VERSION(0, Project::Version::FRAMEWORK_VERSION); - ASSERT_TLM_PROJECT_VERSION(0, Project::Version::PROJECT_VERSION); + VersionTester::test_setVer(true); + ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(10); + } void VersionTester :: test_versions() { U32 cmd_seq = 9; - this->sendCmd_VERSION(0,cmd_seq); - this->invoke_to_run(0,0); - ASSERT_CMD_RESPONSE (0, 0, 9, Fw::CmdResponse::OK); + this->clear_all(); + this->sendCmd_VERSION(0,cmd_seq,Svc::VersionType::FRAMEWORK); + ASSERT_CMD_RESPONSE (0, 1, 9, Fw::CmdResponse::OK); + ASSERT_TLM_FRAMEWORK_VERSION_SIZE(1); + ASSERT_TLM_FRAMEWORK_VERSION(0, Project::Version::FRAMEWORK_VERSION); ASSERT_EVENTS_FRAMEWORK_VERSION_SIZE(1); ASSERT_EVENTS_FRAMEWORK_VERSION(0, Project::Version::FRAMEWORK_VERSION); + + this->clear_all(); + this->sendCmd_VERSION(0,cmd_seq,Svc::VersionType::PROJECT); + ASSERT_CMD_RESPONSE (0, 1, 9, Fw::CmdResponse::OK); + ASSERT_TLM_PROJECT_VERSION_SIZE(1); + ASSERT_TLM_PROJECT_VERSION(0, Project::Version::FRAMEWORK_VERSION); + ASSERT_EVENTS_PROJECT_VERSION_SIZE(1); + ASSERT_EVENTS_PROJECT_VERSION(0, Project::Version::FRAMEWORK_VERSION); + + this->clear_all(); + this->sendCmd_VERSION(0,cmd_seq,Svc::VersionType::LIBRARY); + ASSERT_CMD_RESPONSE (0, 1, 9, Fw::CmdResponse::OK); + //printf ("\nfirst lib element : %s\n\n", Project::Version::LIBRARY_VERSIONS[0]); + ASSERT_EVENTS_LIBRARY_VERSIONS_SIZE(12); + + ASSERT_TLM_LIBRARY_VERSION_01_SIZE(1); + ASSERT_TLM_LIBRARY_VERSION_01(0, "blah0 @ blah0"); + ASSERT_EVENTS_LIBRARY_VERSIONS(0, "blah0 @ blah0"); + + ASSERT_TLM_LIBRARY_VERSION_02_SIZE(1); + ASSERT_TLM_LIBRARY_VERSION_02(0, "blah1 @ blah1"); + ASSERT_EVENTS_LIBRARY_VERSIONS(1, "blah1 @ blah1"); + + ASSERT_TLM_LIBRARY_VERSION_03_SIZE(1); + ASSERT_TLM_LIBRARY_VERSION_03(0, "blah2 @ blah2"); + ASSERT_EVENTS_LIBRARY_VERSIONS(2, "blah2 @ blah2"); + + ASSERT_TLM_LIBRARY_VERSION_04_SIZE(1); + ASSERT_TLM_LIBRARY_VERSION_04(0, "blah3 @ blah3"); + ASSERT_EVENTS_LIBRARY_VERSIONS(3, "blah3 @ blah3"); + + ASSERT_TLM_LIBRARY_VERSION_05_SIZE(1); + ASSERT_TLM_LIBRARY_VERSION_05(0, "blah4 @ blah4"); + ASSERT_EVENTS_LIBRARY_VERSIONS(4, "blah4 @ blah4"); + + ASSERT_TLM_LIBRARY_VERSION_06_SIZE(1); + ASSERT_TLM_LIBRARY_VERSION_06(0, "blah5 @ blah5"); + ASSERT_EVENTS_LIBRARY_VERSIONS(5, "blah5 @ blah5"); + + ASSERT_TLM_LIBRARY_VERSION_07_SIZE(1); + ASSERT_TLM_LIBRARY_VERSION_07(0, "blah6 @ blah6"); + ASSERT_EVENTS_LIBRARY_VERSIONS(6, "blah6 @ blah6"); + + ASSERT_TLM_LIBRARY_VERSION_08_SIZE(1); + ASSERT_TLM_LIBRARY_VERSION_08(0, "blah7 @ blah7"); + ASSERT_EVENTS_LIBRARY_VERSIONS(7, "blah7 @ blah7"); + + ASSERT_TLM_LIBRARY_VERSION_09_SIZE(1); + ASSERT_TLM_LIBRARY_VERSION_09(0, "blah8 @ blah8"); + ASSERT_EVENTS_LIBRARY_VERSIONS(8, "blah8 @ blah8"); + + ASSERT_TLM_LIBRARY_VERSION_10_SIZE(1); + ASSERT_TLM_LIBRARY_VERSION_10(0, "blah9 @ blah9"); + ASSERT_EVENTS_LIBRARY_VERSIONS(9, "blah9 @ blah9"); + + ASSERT_EVENTS_LIBRARY_VERSIONS(10, "blah10 @ blah10"); + + ASSERT_EVENTS_LIBRARY_VERSIONS(11, "blah11 @ blah11"); + + + this->clear_all(); + Svc::CusVerDb cus_data_struct; + this->test_setVer(false); + this->clear_all(); + this->sendCmd_VERSION(0,cmd_seq,Svc::VersionType::CUSTOM); + ASSERT_CMD_RESPONSE (0, 1, 9, Fw::CmdResponse::OK); + + ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(10); + + ASSERT_EVENTS_CUSTOM_VERSIONS(2,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_02,"ver_2"); + cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_02, "ver_2", Svc::VersionStatus::OK); + ASSERT_TLM_CUSTOM_VERSION_03(0, cus_data_struct); + ASSERT_TLM_CUSTOM_VERSION_03_SIZE(1); + + ASSERT_EVENTS_CUSTOM_VERSIONS(3,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_03,"ver_3"); + cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_03, "ver_3", Svc::VersionStatus::FAILURE); + ASSERT_TLM_CUSTOM_VERSION_04(0, cus_data_struct); + ASSERT_TLM_CUSTOM_VERSION_04_SIZE(1); + + ASSERT_EVENTS_CUSTOM_VERSIONS(6,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_06,"ver_6"); + cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_06, "ver_6", Svc::VersionStatus::FAILURE); + ASSERT_TLM_CUSTOM_VERSION_07(0, cus_data_struct); + ASSERT_TLM_CUSTOM_VERSION_07_SIZE(1); + + ASSERT_EVENTS_CUSTOM_VERSIONS(9,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_09,"ver_9"); + cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_09, "ver_9", Svc::VersionStatus::OK); + ASSERT_TLM_CUSTOM_VERSION_10(0, cus_data_struct); + ASSERT_TLM_CUSTOM_VERSION_10_SIZE(1); + + this->clear_all(); + this->sendCmd_VERSION(0,cmd_seq,Svc::VersionType::ALL); + ASSERT_CMD_RESPONSE (0, 1, 9, Fw::CmdResponse::OK); + ASSERT_TLM_FRAMEWORK_VERSION(0, Project::Version::FRAMEWORK_VERSION); + ASSERT_TLM_PROJECT_VERSION(0, Project::Version::PROJECT_VERSION); + ASSERT_EVENTS_FRAMEWORK_VERSION_SIZE(1); + ASSERT_EVENTS_FRAMEWORK_VERSION(0, Project::Version::FRAMEWORK_VERSION); + ASSERT_EVENTS_PROJECT_VERSION_SIZE(1); + ASSERT_EVENTS_PROJECT_VERSION(0, Project::Version::FRAMEWORK_VERSION); + ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(10); + ASSERT_EVENTS_LIBRARY_VERSIONS_SIZE(12); } void VersionTester :: test_commands() { @@ -80,29 +226,122 @@ namespace Svc { // Test User Ports // ---------------------------------------------------------------------- - void VersionTester :: test_setVer() { + void VersionTester :: test_setVer(bool is_enabled) { Svc::VersionStatus status = Svc::VersionStatus::OK; - Svc::VersPortStrings::StringSize80 set_ver_0 = "ver_0"; - Svc::VersPortStrings::StringSize80 set_ver_6 = "ver_6"; - Svc::VersPortStrings::StringSize80 set_ver_3 = "ver_3"; - Svc::VersPortStrings::StringSize80 set_ver_9 = "ver_9"; + Svc::VersPortStrings::StringSize80 set_ver = "ver_2"; + + //Create a db to compare against set values + Svc::CusVerDb cus_data_struct; + //printf("\nTesting the very first port invocation\n"); + + //Start Clean + this->clear_all(); + + //this->sendCmd_ENABLE(0,9,VersionEnabled::ENABLED); + set_ver = "ver_0"; + this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_00, set_ver, status); + if(is_enabled == true) { + ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(1); + ASSERT_EVENTS_CUSTOM_VERSIONS(0,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_00,"ver_0"); + cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_00, set_ver, Svc::VersionStatus::OK); + ASSERT_TLM_CUSTOM_VERSION_01(0, cus_data_struct); + } - this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_00, set_ver_0, status); + set_ver = "ver_1"; + this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_01, set_ver, status); + if(is_enabled == true) { + ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(2); + ASSERT_EVENTS_CUSTOM_VERSIONS(1,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_01,"ver_1"); + cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_01, set_ver, Svc::VersionStatus::OK); + ASSERT_TLM_CUSTOM_VERSION_02(0, cus_data_struct); + } + + set_ver = "ver_2"; + this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_02, set_ver, status); + if(is_enabled == true) { + ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(3); + ASSERT_EVENTS_CUSTOM_VERSIONS(2,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_02,"ver_2"); + cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_02, set_ver, Svc::VersionStatus::OK); + ASSERT_TLM_CUSTOM_VERSION_03(0, cus_data_struct); + } + status = Svc::VersionStatus::FAILURE; - this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_03, set_ver_3, status); - this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_06, set_ver_6, status); + + set_ver = "ver_3"; + this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_03, set_ver, status); + if(is_enabled == true) { + ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(4); + ASSERT_EVENTS_CUSTOM_VERSIONS(3,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_03,"ver_3"); + cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_03, set_ver, Svc::VersionStatus::FAILURE); + ASSERT_TLM_CUSTOM_VERSION_04(0, cus_data_struct); + } + + set_ver = "ver_4"; + this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_04, set_ver, status); + if(is_enabled == true) { + ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(5); + ASSERT_EVENTS_CUSTOM_VERSIONS(4,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_04,"ver_4"); + cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_04, set_ver, Svc::VersionStatus::FAILURE); + ASSERT_TLM_CUSTOM_VERSION_05(0, cus_data_struct); + } + + set_ver = "ver_5"; + this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_05, set_ver, status); + if(is_enabled == true) { + ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(6); + ASSERT_EVENTS_CUSTOM_VERSIONS(5,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_05,"ver_5"); + cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_05, set_ver, Svc::VersionStatus::FAILURE); + ASSERT_TLM_CUSTOM_VERSION_06(0, cus_data_struct); + } + + set_ver = "ver_6"; + this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_06, set_ver, status); + if(is_enabled == true) { + ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(7); + ASSERT_EVENTS_CUSTOM_VERSIONS(6,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_06,"ver_6"); + cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_06, set_ver, Svc::VersionStatus::FAILURE); + ASSERT_TLM_CUSTOM_VERSION_07(0, cus_data_struct); + } + status = Svc::VersionStatus::OK; - this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_09, set_ver_9, status); + + set_ver = "ver_7"; + this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_07, set_ver, status); + if(is_enabled == true) { + ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(8); + ASSERT_EVENTS_CUSTOM_VERSIONS(7,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_07,"ver_7"); + cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_07, set_ver, Svc::VersionStatus::OK); + ASSERT_TLM_CUSTOM_VERSION_08(0, cus_data_struct); + } + + set_ver = "ver_8"; + this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_08, set_ver, status); + if(is_enabled == true) { + ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(9); + ASSERT_EVENTS_CUSTOM_VERSIONS(8,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_08,"ver_8"); + cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_08, set_ver, Svc::VersionStatus::OK); + ASSERT_TLM_CUSTOM_VERSION_09(0, cus_data_struct); + } + + set_ver = "ver_9"; + this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_09, set_ver, status); + if(is_enabled == true) { + ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(10); + ASSERT_EVENTS_CUSTOM_VERSIONS(9,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_09,"ver_9"); + cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_09, set_ver, Svc::VersionStatus::OK); + ASSERT_TLM_CUSTOM_VERSION_10(0, cus_data_struct); + } + } void VersionTester :: test_getVer() { Svc::VersionStatus status; Svc::VersPortStrings::StringSize80 get_ver; - - this->invoke_to_getVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_00, get_ver, status); - ASSERT_EQ(get_ver,"ver_0"); + + this->invoke_to_getVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_02, get_ver, status); + ASSERT_EQ(get_ver,"ver_2"); ASSERT_EQ(status,Svc::VersionStatus::OK); this->invoke_to_getVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_03, get_ver, status); @@ -118,16 +357,16 @@ namespace Svc { ASSERT_EQ(status,Svc::VersionStatus::OK); this->invoke_to_getVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_05, get_ver, status); - ASSERT_EQ(get_ver,"no_ver"); + ASSERT_EQ(get_ver,"ver_5"); ASSERT_EQ(status,Svc::VersionStatus::FAILURE); } void VersionTester::test_ports() { - this->test_setVer(); + this->sendCmd_ENABLE(0,9,VersionEnabled::ENABLED); + this->test_setVer(true); this->test_getVer(); } - // ---------------------------------------------------------------------- // Helper methods // ---------------------------------------------------------------------- diff --git a/Svc/Version/test/ut/VersionTester.hpp b/Svc/Version/test/ut/VersionTester.hpp index e96aaeb8c3..b36b3dd07e 100644 --- a/Svc/Version/test/ut/VersionTester.hpp +++ b/Svc/Version/test/ut/VersionTester.hpp @@ -23,7 +23,7 @@ namespace Svc { // ---------------------------------------------------------------------- // Maximum size of histories storing events, telemetry, and port outputs - static const FwSizeType MAX_HISTORY_SIZE = 10; + static const FwSizeType MAX_HISTORY_SIZE = 100; // Instance ID supplied to the component instance under test static const FwEnumStoreType TEST_INSTANCE_ID = 0; @@ -48,9 +48,10 @@ namespace Svc { //! test startup EVR void test_startup(); - + //! test enable command void test_enable(); + //! test version command void test_versions(); //! test all commands @@ -59,10 +60,11 @@ namespace Svc { //! test get version void test_getVer(); //! test set version - void test_setVer(); + void test_setVer(bool is_enabled); //!test all ports void test_ports(); - + //clear history + void clear_all(); private: // ---------------------------------------------------------------------- diff --git a/Svc/Version/test/ut/VersionTesterHelpers.cpp b/Svc/Version/test/ut/VersionTesterHelpers.cpp index dcced4dbde..8bf832ae08 100644 --- a/Svc/Version/test/ut/VersionTesterHelpers.cpp +++ b/Svc/Version/test/ut/VersionTesterHelpers.cpp @@ -60,12 +60,12 @@ namespace Svc { 0, this->component.get_getVersion_InputPort(0) ); - +/* this->connect_to_run( 0, this->component.get_run_InputPort(0) ); - +*/ this->connect_to_setVersion( 0, this->component.get_setVersion_InputPort(0) diff --git a/Svc/Version/test/ut/versions/version.hpp b/Svc/Version/test/ut/versions/version.hpp new file mode 100644 index 0000000000..ca483df727 --- /dev/null +++ b/Svc/Version/test/ut/versions/version.hpp @@ -0,0 +1,30 @@ +/* + This file is a replica of version.hpp generated using [generate_version_info.py]. + Replicated to have a fixed size and values for +*/ +#ifndef _VERSION_TESTER_HPP_ +#define _VERSION_TESTER_HPP_ + +namespace Project { + +struct Version { + static constexpr const char* const FRAMEWORK_VERSION = "v3.4.3-66-g5d50140f5"; + static constexpr const char* const PROJECT_VERSION = "v3.4.3-66-g5d50140f5"; + static constexpr const char* const LIBRARY_VERSIONS[] = { + "blah0 @ blah0" , + "blah1 @ blah1" , + "blah2 @ blah2" , + "blah3 @ blah3" , + "blah4 @ blah4" , + "blah5 @ blah5" , + "blah6 @ blah6" , + "blah7 @ blah7" , + "blah8 @ blah8" , + "blah9 @ blah9" , + "blah10 @ blah10" , + "blah11 @ blah11" , + }; +}; + +} // namespace Project +#endif diff --git a/config/VersionCfg.fpp b/config/VersionCfg.fpp index 09795464ff..6a7806c47a 100644 --- a/config/VersionCfg.fpp +++ b/config/VersionCfg.fpp @@ -6,7 +6,7 @@ module Svc { module VersionCfg { - @ Define a set of PolyDb entries on a project-specific + @ Define a set of Version entries on a project-specific @ basis. enum VersionEnum: U32 { @ Entry 0 From 3f0d2db2c8c0358d4da435ccbd800e739903a129 Mon Sep 17 00:00:00 2001 From: Shivaly Date: Thu, 20 Jun 2024 17:44:33 -0700 Subject: [PATCH 08/37] Revert "FP-2604: Updates to UTs and respective code changes" This reverts commit 9b1cd590bb4f24f593e15b157833809a6b1b03ae. --- Svc/Version/Version.cpp | 110 +++---- Svc/Version/Version.hpp | 31 +- Svc/Version/docs/sdd.md | 21 +- Svc/Version/test/ut/VersionTestMain.cpp | 8 +- Svc/Version/test/ut/VersionTester.cpp | 289 ++----------------- Svc/Version/test/ut/VersionTester.hpp | 10 +- Svc/Version/test/ut/VersionTesterHelpers.cpp | 4 +- Svc/Version/test/ut/versions/version.hpp | 30 -- config/VersionCfg.fpp | 2 +- 9 files changed, 102 insertions(+), 403 deletions(-) delete mode 100644 Svc/Version/test/ut/versions/version.hpp diff --git a/Svc/Version/Version.cpp b/Svc/Version/Version.cpp index bd1f430d51..35fb6e2b76 100644 --- a/Svc/Version/Version.cpp +++ b/Svc/Version/Version.cpp @@ -6,12 +6,7 @@ #include "FpConfig.hpp" #include "Svc/Version/Version.hpp" - -#ifdef BUILD_UT - #include "test/ut/versions/version.hpp" //autogenerated file containing hardcoded project and framework versions -#else - #include "versions/version.hpp" //autogenerated file containing hardcoded project and framework versions -#endif +#include "versions/version.hpp" //autogenerated file containing hardcoded project and framework versions namespace Svc { @@ -42,11 +37,12 @@ namespace Svc { } void Version::Config(bool enable) { + //Set Verbosity for custom versions m_enable = enable; - //Setup and send startup TLM + this->proc_libver(); this->FwVer_tlm(); this->ProjVer_tlm(); this->LibVer_tlm(); @@ -76,9 +72,9 @@ void Version :: ) { FW_ASSERT(version_id.isValid(),version_id.e); - U8 ver_slot = VerSlot(version_id.e); - version_string = this->verId_db[ver_slot].getver_val(); - status = this->verId_db[ver_slot].getver_status() ; + version_string = this->verId_db[version_id.e].getver_val(); + status = this->verId_db[version_id.e].getver_status() ; + this->CusVer_tlm(); } void Version :: @@ -90,14 +86,12 @@ void Version :: ) { FW_ASSERT(version_id.isValid(),version_id.e); - VerSlot ver_slot = VerSlot(version_id.e); - this->verId_db[ver_slot].setver_enum(version_id); - this->verId_db[ver_slot].setver_val(version_string); - this->verId_db[ver_slot].setver_status(status); - this->num_cus_elem++; - this->CusVer_tlm(ver_slot); + this->verId_db[version_id.e].setver_enum(version_id); + this->verId_db[version_id.e].setver_val(version_string); + this->verId_db[version_id.e].setver_status(status); + this->proc_cusver(); + this->CusVer_tlm(); } - // ---------------------------------------------------------------------- // Handler implementations for commands // ---------------------------------------------------------------------- @@ -110,8 +104,6 @@ void Version :: ) { m_enable = (enable == VersionEnabled::ENABLED); - //printf("Test m_enable when disabled: %d\n\n", m_enable); - this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); } @@ -138,14 +130,14 @@ void Version :: break; case (Svc::VersionType::CUSTOM): - this->CusVer_tlm_all(); + this->CusVer_tlm(); break; case (Svc::VersionType::ALL): this->ProjVer_tlm(); this->FwVer_tlm(); this->LibVer_tlm(); - this->CusVer_tlm_all(); + this->CusVer_tlm(); break; default: FW_ASSERT(0,version_type); @@ -159,20 +151,20 @@ void Version :: // ---------------------------------------------------------------------- //Process libs void Version :: proc_libver() { - num_lib_elem = sizeof(Project::Version::LIBRARY_VERSIONS)/sizeof(Project::Version::LIBRARY_VERSIONS[0]); - //printf( "num of lib elements before : %d\n\n",num_lib_elem); - if(Project::Version::LIBRARY_VERSIONS[0] == nullptr) { - num_lib_elem = 0; - } - //printf( "num of lib elements : %d\n\n",num_lib_elem); - /* - //Store lib array locally - for(U8 i = 0; i < num_lib_elem ; i++) { - lib_ver_arr[i] = Project::Version::LIBRARY_VERSIONS[i]; - } - */ + num_lib_elem = sizeof(Project::Version::LIBRARY_VERSIONS)/sizeof(Project::Version::LIBRARY_VERSIONS[0]); + /* + //Store lib array locally + for(U8 i = 0; i < num_lib_elem ; i++) { + lib_ver_arr[i] = Project::Version::LIBRARY_VERSIONS[i]; + } + */ } + //Process Custom Versions + void Version :: proc_cusver() { + num_cus_elem = sizeof(this->verId_db)/sizeof(this->verId_db[0]); + } + //functions to log tlm on versions void Version :: FwVer_tlm() { Fw::LogStringArg fw_evr = (Project::Version::FRAMEWORK_VERSION); @@ -189,13 +181,11 @@ void Version :: } void Version :: LibVer_tlm() { - //Process libraries array - this->proc_libver(); for (U8 i = 0; i < num_lib_elem; i++) { //Emit EVR TLM on library versions - //printf("lib versions are: %s",Project::Version::LIBRARY_VERSIONS[i]); this->log_ACTIVITY_LO_LIBRARY_VERSIONS(Fw::LogStringArg(Project::Version::LIBRARY_VERSIONS[i])); + //Write to EHAs switch(i) { case VER_SLOT_00: @@ -237,64 +227,58 @@ void Version :: } - void Version :: CusVer_tlm_all() { - //printf("m_enable : %d , num_cus_elem : %d\n\n",m_enable,num_cus_elem); - for ( U8 i = 0; - (m_enable == true) && (num_cus_elem != 0) && (i < Svc::VersionCfg::VersionEnum::NUM_CONSTANTS); - i++) { - Version::CusVer_tlm(VerSlot(i)); - } - } - - void Version :: CusVer_tlm(VerSlot cus_slot) { + void Version :: CusVer_tlm() { //Process custom version TLM only if verbosity is enabled and there are any valid writes to it; // it doesn't necessarily have to be consecutive - if( (this->verId_db[cus_slot].getver_val() != "no_ver") - && m_enable == true - && (num_cus_elem > 0)) { //Write TLM for valid writes + for ( U8 i = 0; + (m_enable == true) && (num_cus_elem != 0) && (i < Svc::VersionCfg::VersionEnum::NUM_CONSTANTS); + i++) { + + if(this->verId_db[i].getver_val() != "no_ver") { //Write TLM for valid writes //Emit EVR TLM on library versions - this->log_ACTIVITY_LO_CUSTOM_VERSIONS(this->verId_db[cus_slot].getver_enum(), this->verId_db[cus_slot].getver_val()); + this->log_ACTIVITY_LO_CUSTOM_VERSIONS(this->verId_db[i].getver_enum(), this->verId_db[i].getver_val()); //Write to EHAs - switch(cus_slot) { + switch(i) { case VER_SLOT_00: - this->tlmWrite_CUSTOM_VERSION_01(verId_db[cus_slot]); + this->tlmWrite_CUSTOM_VERSION_01(verId_db[i]); break; case VER_SLOT_01: - this->tlmWrite_CUSTOM_VERSION_02(verId_db[cus_slot]); + this->tlmWrite_CUSTOM_VERSION_02(verId_db[i]); break; case VER_SLOT_02: - this->tlmWrite_CUSTOM_VERSION_03(verId_db[cus_slot]); + this->tlmWrite_CUSTOM_VERSION_03(verId_db[i]); break; case VER_SLOT_03: - this->tlmWrite_CUSTOM_VERSION_04(verId_db[cus_slot]); + this->tlmWrite_CUSTOM_VERSION_04(verId_db[i]); break; case VER_SLOT_04: - this->tlmWrite_CUSTOM_VERSION_05(verId_db[cus_slot]); + this->tlmWrite_CUSTOM_VERSION_05(verId_db[i]); break; case VER_SLOT_05: - this->tlmWrite_CUSTOM_VERSION_06(verId_db[cus_slot]); + this->tlmWrite_CUSTOM_VERSION_06(verId_db[i]); break; case VER_SLOT_06: - this->tlmWrite_CUSTOM_VERSION_07(verId_db[cus_slot]); + this->tlmWrite_CUSTOM_VERSION_07(verId_db[i]); break; case VER_SLOT_07: - this->tlmWrite_CUSTOM_VERSION_08(verId_db[cus_slot]); + this->tlmWrite_CUSTOM_VERSION_08(verId_db[i]); break; case VER_SLOT_08: - this->tlmWrite_CUSTOM_VERSION_09(verId_db[cus_slot]); + this->tlmWrite_CUSTOM_VERSION_09(verId_db[i]); break; case VER_SLOT_09: - this->tlmWrite_CUSTOM_VERSION_10(verId_db[cus_slot]); + this->tlmWrite_CUSTOM_VERSION_10(verId_db[i]); break; default: - //There are only 10 custom slots available - FW_ASSERT(0,cus_slot); + //There are only 10 enum slots available, so can assert here + FW_ASSERT(0,i); break; } } } + } } diff --git a/Svc/Version/Version.hpp b/Svc/Version/Version.hpp index 8c03392e18..1ad879f637 100644 --- a/Svc/Version/Version.hpp +++ b/Svc/Version/Version.hpp @@ -103,9 +103,20 @@ namespace Svc { Svc::VersionType version_type //!< which version type EVR is requested ) override; - PRIVATE: - - // An enumeration for TLM slot access + private: + void proc_libver(); + void proc_cusver(); + void FwVer_tlm(); + void ProjVer_tlm(); + void LibVer_tlm(); + void CusVer_tlm(); + bool m_enable; /*!*/ + bool startup_done; + U32 num_lib_elem; //number of library versions + U32 num_cus_elem; //number of custom versions + //const char* lib_ver_arr[]; // Store library versions internally + + // An enumeration for TLM slot access enum VerSlot { VER_SLOT_00 = 0, VER_SLOT_01, @@ -119,20 +130,6 @@ namespace Svc { VER_SLOT_09 }; - void proc_libver(); - void proc_cusver(); - void FwVer_tlm(); - void ProjVer_tlm(); - void LibVer_tlm(); - void CusVer_tlm(VerSlot cus_slot); - void CusVer_tlm_all(); - bool m_enable; /*!*/ - bool startup_done; - U32 num_lib_elem; //number of library versions - U32 num_cus_elem; //number of custom versions - //const char* lib_ver_arr[]; // Store library versions internally - - }; } diff --git a/Svc/Version/docs/sdd.md b/Svc/Version/docs/sdd.md index f4b948ad99..e0b5c84b29 100644 --- a/Svc/Version/docs/sdd.md +++ b/Svc/Version/docs/sdd.md @@ -58,22 +58,11 @@ Add unit test descriptions in the chart below | Name | Description | Validation | |---|---|---| -|SVC-VERSION-001|`Svc::Version` upon startup shall generate an event and a telemetry channel with version for framework.| This is to provide transparency on framework version being used| -|SVC-VERSION-002|`Svc::Version` upon startup shall generate an event and a telemetry channel with version for project | This is to provide transparency on project version being used| -|SVC-VERSION-003|`Svc::Version` upon startup shall generate events and telemetry channels (upto 10) with versions for libary.| Transparency on different library versions| -|SVC-VERSION-004|`Svc::Version` upon startup shall make verbosity on custom versions configurable.| Transparency on different library versions| -|SVC-VERSION-005|`Svc::Version` shall provide a ground command to request events and telemetry on framework version| Accessiblity on demand| -|SVC-VERSION-006|`Svc::Version` shall provide a ground command to request events and telemetry on project version| Accessiblity on demand| -|SVC-VERSION-007|`Svc::Version` shall provide a ground command to request events and telemetry channels (upto 10) on library versions| Accessiblity on demand| -|SVC-VERSION-008|`Svc::Version` shall provide a ground command to request events and telemetry channels (upto 10) on custom versions| Accessiblity on demand| -|SVC-VERSION-009|`Svc::Version` shall provide a ground command to enable/disable verbosity on custom versions| Accessiblity on demand| -|SVC-VERSION-010|`Svc::Version` shall provide a telemetry channel on framework version| Accessiblity to versions being used| -|SVC-VERSION-011|`Svc::Version` shall provide a telemetry channel on project version| Accessiblity to versions being used| -|SVC-VERSION-012|`Svc::Version` shall provide upto 10 telemetry channels on library versions| Accessiblity to versions being used| -|SVC-VERSION-013|`Svc::Version` shall provide upto 10 telemetry channels on custom versions| Accessiblity to versions being used| -|SVC-VERSION-014|`Svc::Version` shall provide an interface for other components to set custom versions.| Enables projects to set hardware and FPGA versions, say, as needed. Also generates EVRs/EHAs| -|SVC-VERSION-015|`Svc::Version` shall provide an interface for other components to get custom versions.| Also generates EVRs/EHAs| - +|SVC-VERSION-001|`Svc::Version` shall create an EVR indicating versions of framework, project and libary at start-up and on command| This is to provide transparency to users on versions being used| +|SVC-VERSION-002|`Svc::Version` shall provide a telemetry channel on framework version| Accessiblity to versions being used| +|SVC-VERSION-003|`Svc::Version` shall provide a telemetry channel on project version| Accessiblity to versions being used| +|SVC-VERSION-004|`Svc::Version` shall provide a telemetry channel on library version| Accessiblity to versions being used| +|SVC-VERSION-005|`Svc::Version` shall provide an interface for users to set custom versions.| Enables projects to set hardware and FPGA versions as needed| ## Change Log | Date | Description | diff --git a/Svc/Version/test/ut/VersionTestMain.cpp b/Svc/Version/test/ut/VersionTestMain.cpp index 1da68afea0..b90ab2bdfe 100644 --- a/Svc/Version/test/ut/VersionTestMain.cpp +++ b/Svc/Version/test/ut/VersionTestMain.cpp @@ -11,14 +11,14 @@ TEST(Nominal, test_startup) { tester.test_startup(); } -TEST(Nominal, test_cmds) { +TEST(Nominal, test_ports) { Svc::VersionTester tester; - tester.test_commands(); + tester.test_ports(); } -TEST(Nominal, test_ports) { +TEST(Nominal, test_cmds) { Svc::VersionTester tester; - tester.test_ports(); + tester.test_commands(); } int main(int argc, char** argv) { diff --git a/Svc/Version/test/ut/VersionTester.cpp b/Svc/Version/test/ut/VersionTester.cpp index 99966df825..5d1f9edad1 100644 --- a/Svc/Version/test/ut/VersionTester.cpp +++ b/Svc/Version/test/ut/VersionTester.cpp @@ -31,190 +31,44 @@ namespace Svc { // ---------------------------------------------------------------------- // Tests // ---------------------------------------------------------------------- - //Clear/init test - void VersionTester :: clear_all() { - this->clearHistory(); - ASSERT_EVENTS_FRAMEWORK_VERSION_SIZE(0); - ASSERT_EVENTS_PROJECT_VERSION_SIZE(0); - ASSERT_EVENTS_LIBRARY_VERSIONS_SIZE(0); - ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(0); - ASSERT_TLM_FRAMEWORK_VERSION_SIZE(0); - ASSERT_TLM_PROJECT_VERSION_SIZE(0); - ASSERT_TLM_LIBRARY_VERSION_01_SIZE(0); - ASSERT_TLM_LIBRARY_VERSION_02_SIZE(0); - ASSERT_TLM_LIBRARY_VERSION_03_SIZE(0); - ASSERT_TLM_LIBRARY_VERSION_04_SIZE(0); - ASSERT_TLM_LIBRARY_VERSION_05_SIZE(0); - ASSERT_TLM_LIBRARY_VERSION_06_SIZE(0); - ASSERT_TLM_LIBRARY_VERSION_07_SIZE(0); - ASSERT_TLM_LIBRARY_VERSION_08_SIZE(0); - ASSERT_TLM_LIBRARY_VERSION_09_SIZE(0); - ASSERT_TLM_LIBRARY_VERSION_10_SIZE(0); - ASSERT_TLM_CUSTOM_VERSION_01_SIZE(0); - ASSERT_TLM_CUSTOM_VERSION_02_SIZE(0); - ASSERT_TLM_CUSTOM_VERSION_03_SIZE(0); - ASSERT_TLM_CUSTOM_VERSION_04_SIZE(0); - ASSERT_TLM_CUSTOM_VERSION_05_SIZE(0); - ASSERT_TLM_CUSTOM_VERSION_06_SIZE(0); - ASSERT_TLM_CUSTOM_VERSION_07_SIZE(0); - ASSERT_TLM_CUSTOM_VERSION_08_SIZE(0); - ASSERT_TLM_CUSTOM_VERSION_09_SIZE(0); - ASSERT_TLM_CUSTOM_VERSION_10_SIZE(0); - } // ---------------------------------------------------------------------- // Test STARTUP // ---------------------------------------------------------------------- void VersionTester :: test_startup() { - //this->invoke_to_run(0,0); //No longer running version on a scheduler but invoked after starttask() in RefTopology.cpp - //ASSERT_EVENTS_STARTUP_EVR_SIZE(1); - //ASSERT_EVENTS_STARTUP_EVR(0,Project::Version::FRAMEWORK_VERSION,Project::Version::PROJECT_VERSION); - this->component.Config(true); - ASSERT_TLM_FRAMEWORK_VERSION(0, Project::Version::FRAMEWORK_VERSION); - ASSERT_TLM_PROJECT_VERSION(0, Project::Version::PROJECT_VERSION); - ASSERT_EVENTS_FRAMEWORK_VERSION_SIZE(1); - ASSERT_EVENTS_FRAMEWORK_VERSION(0, Project::Version::FRAMEWORK_VERSION); - ASSERT_EVENTS_PROJECT_VERSION_SIZE(1); - ASSERT_EVENTS_PROJECT_VERSION(0, Project::Version::FRAMEWORK_VERSION); - //Library versions currently set to a null pointer - //TODO: Need to figure out how to put in artifical sets to test them - ASSERT_EVENTS_LIBRARY_VERSIONS_SIZE(12); - ASSERT_EVENTS_LIBRARY_VERSIONS(0, "blah0 @ blah0"); + this->invoke_to_run(0,0); + ASSERT_EVENTS_STARTUP_EVR_SIZE(1); + ASSERT_EVENTS_STARTUP_EVR(0,Project::Version::FRAMEWORK_VERSION,Project::Version::PROJECT_VERSION); } // ---------------------------------------------------------------------- // Test Commands // ---------------------------------------------------------------------- - void VersionTester :: test_enable() { U32 cmd_seq = 9; this->sendCmd_ENABLE(0,cmd_seq,VersionEnabled::DISABLED); + this->invoke_to_run(0,0); ASSERT_CMD_RESPONSE (0, 0, 9, Fw::CmdResponse::OK); - VersionTester::test_setVer(false); - ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(0); - cmd_seq = 9; this->sendCmd_ENABLE(0,cmd_seq,VersionEnabled::ENABLED); + this->invoke_to_run(0,0); ASSERT_CMD_RESPONSE (0, 0, 9, Fw::CmdResponse::OK); - VersionTester::test_setVer(true); - ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(10); - + ASSERT_TLM_FRAMEWORK_VERSION(0, Project::Version::FRAMEWORK_VERSION); + ASSERT_TLM_PROJECT_VERSION(0, Project::Version::PROJECT_VERSION); } void VersionTester :: test_versions() { U32 cmd_seq = 9; - this->clear_all(); - this->sendCmd_VERSION(0,cmd_seq,Svc::VersionType::FRAMEWORK); - ASSERT_CMD_RESPONSE (0, 1, 9, Fw::CmdResponse::OK); - ASSERT_TLM_FRAMEWORK_VERSION_SIZE(1); - ASSERT_TLM_FRAMEWORK_VERSION(0, Project::Version::FRAMEWORK_VERSION); - ASSERT_EVENTS_FRAMEWORK_VERSION_SIZE(1); - ASSERT_EVENTS_FRAMEWORK_VERSION(0, Project::Version::FRAMEWORK_VERSION); - - this->clear_all(); - this->sendCmd_VERSION(0,cmd_seq,Svc::VersionType::PROJECT); - ASSERT_CMD_RESPONSE (0, 1, 9, Fw::CmdResponse::OK); - ASSERT_TLM_PROJECT_VERSION_SIZE(1); - ASSERT_TLM_PROJECT_VERSION(0, Project::Version::FRAMEWORK_VERSION); - ASSERT_EVENTS_PROJECT_VERSION_SIZE(1); - ASSERT_EVENTS_PROJECT_VERSION(0, Project::Version::FRAMEWORK_VERSION); - - this->clear_all(); - this->sendCmd_VERSION(0,cmd_seq,Svc::VersionType::LIBRARY); - ASSERT_CMD_RESPONSE (0, 1, 9, Fw::CmdResponse::OK); - //printf ("\nfirst lib element : %s\n\n", Project::Version::LIBRARY_VERSIONS[0]); - ASSERT_EVENTS_LIBRARY_VERSIONS_SIZE(12); - - ASSERT_TLM_LIBRARY_VERSION_01_SIZE(1); - ASSERT_TLM_LIBRARY_VERSION_01(0, "blah0 @ blah0"); - ASSERT_EVENTS_LIBRARY_VERSIONS(0, "blah0 @ blah0"); - - ASSERT_TLM_LIBRARY_VERSION_02_SIZE(1); - ASSERT_TLM_LIBRARY_VERSION_02(0, "blah1 @ blah1"); - ASSERT_EVENTS_LIBRARY_VERSIONS(1, "blah1 @ blah1"); - - ASSERT_TLM_LIBRARY_VERSION_03_SIZE(1); - ASSERT_TLM_LIBRARY_VERSION_03(0, "blah2 @ blah2"); - ASSERT_EVENTS_LIBRARY_VERSIONS(2, "blah2 @ blah2"); - - ASSERT_TLM_LIBRARY_VERSION_04_SIZE(1); - ASSERT_TLM_LIBRARY_VERSION_04(0, "blah3 @ blah3"); - ASSERT_EVENTS_LIBRARY_VERSIONS(3, "blah3 @ blah3"); - - ASSERT_TLM_LIBRARY_VERSION_05_SIZE(1); - ASSERT_TLM_LIBRARY_VERSION_05(0, "blah4 @ blah4"); - ASSERT_EVENTS_LIBRARY_VERSIONS(4, "blah4 @ blah4"); - - ASSERT_TLM_LIBRARY_VERSION_06_SIZE(1); - ASSERT_TLM_LIBRARY_VERSION_06(0, "blah5 @ blah5"); - ASSERT_EVENTS_LIBRARY_VERSIONS(5, "blah5 @ blah5"); - - ASSERT_TLM_LIBRARY_VERSION_07_SIZE(1); - ASSERT_TLM_LIBRARY_VERSION_07(0, "blah6 @ blah6"); - ASSERT_EVENTS_LIBRARY_VERSIONS(6, "blah6 @ blah6"); - - ASSERT_TLM_LIBRARY_VERSION_08_SIZE(1); - ASSERT_TLM_LIBRARY_VERSION_08(0, "blah7 @ blah7"); - ASSERT_EVENTS_LIBRARY_VERSIONS(7, "blah7 @ blah7"); - - ASSERT_TLM_LIBRARY_VERSION_09_SIZE(1); - ASSERT_TLM_LIBRARY_VERSION_09(0, "blah8 @ blah8"); - ASSERT_EVENTS_LIBRARY_VERSIONS(8, "blah8 @ blah8"); - - ASSERT_TLM_LIBRARY_VERSION_10_SIZE(1); - ASSERT_TLM_LIBRARY_VERSION_10(0, "blah9 @ blah9"); - ASSERT_EVENTS_LIBRARY_VERSIONS(9, "blah9 @ blah9"); - - ASSERT_EVENTS_LIBRARY_VERSIONS(10, "blah10 @ blah10"); - - ASSERT_EVENTS_LIBRARY_VERSIONS(11, "blah11 @ blah11"); - - - this->clear_all(); - Svc::CusVerDb cus_data_struct; - this->test_setVer(false); - this->clear_all(); - this->sendCmd_VERSION(0,cmd_seq,Svc::VersionType::CUSTOM); - ASSERT_CMD_RESPONSE (0, 1, 9, Fw::CmdResponse::OK); - - ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(10); - - ASSERT_EVENTS_CUSTOM_VERSIONS(2,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_02,"ver_2"); - cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_02, "ver_2", Svc::VersionStatus::OK); - ASSERT_TLM_CUSTOM_VERSION_03(0, cus_data_struct); - ASSERT_TLM_CUSTOM_VERSION_03_SIZE(1); - - ASSERT_EVENTS_CUSTOM_VERSIONS(3,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_03,"ver_3"); - cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_03, "ver_3", Svc::VersionStatus::FAILURE); - ASSERT_TLM_CUSTOM_VERSION_04(0, cus_data_struct); - ASSERT_TLM_CUSTOM_VERSION_04_SIZE(1); - - ASSERT_EVENTS_CUSTOM_VERSIONS(6,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_06,"ver_6"); - cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_06, "ver_6", Svc::VersionStatus::FAILURE); - ASSERT_TLM_CUSTOM_VERSION_07(0, cus_data_struct); - ASSERT_TLM_CUSTOM_VERSION_07_SIZE(1); - - ASSERT_EVENTS_CUSTOM_VERSIONS(9,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_09,"ver_9"); - cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_09, "ver_9", Svc::VersionStatus::OK); - ASSERT_TLM_CUSTOM_VERSION_10(0, cus_data_struct); - ASSERT_TLM_CUSTOM_VERSION_10_SIZE(1); - - this->clear_all(); - this->sendCmd_VERSION(0,cmd_seq,Svc::VersionType::ALL); - ASSERT_CMD_RESPONSE (0, 1, 9, Fw::CmdResponse::OK); - ASSERT_TLM_FRAMEWORK_VERSION(0, Project::Version::FRAMEWORK_VERSION); - ASSERT_TLM_PROJECT_VERSION(0, Project::Version::PROJECT_VERSION); + this->sendCmd_VERSION(0,cmd_seq); + this->invoke_to_run(0,0); + ASSERT_CMD_RESPONSE (0, 0, 9, Fw::CmdResponse::OK); ASSERT_EVENTS_FRAMEWORK_VERSION_SIZE(1); ASSERT_EVENTS_FRAMEWORK_VERSION(0, Project::Version::FRAMEWORK_VERSION); - ASSERT_EVENTS_PROJECT_VERSION_SIZE(1); - ASSERT_EVENTS_PROJECT_VERSION(0, Project::Version::FRAMEWORK_VERSION); - ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(10); - ASSERT_EVENTS_LIBRARY_VERSIONS_SIZE(12); } void VersionTester :: test_commands() { @@ -226,122 +80,29 @@ namespace Svc { // Test User Ports // ---------------------------------------------------------------------- - void VersionTester :: test_setVer(bool is_enabled) { + void VersionTester :: test_setVer() { Svc::VersionStatus status = Svc::VersionStatus::OK; - Svc::VersPortStrings::StringSize80 set_ver = "ver_2"; - - //Create a db to compare against set values - Svc::CusVerDb cus_data_struct; - //printf("\nTesting the very first port invocation\n"); - - //Start Clean - this->clear_all(); - - //this->sendCmd_ENABLE(0,9,VersionEnabled::ENABLED); - set_ver = "ver_0"; - this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_00, set_ver, status); - if(is_enabled == true) { - ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(1); - ASSERT_EVENTS_CUSTOM_VERSIONS(0,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_00,"ver_0"); - cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_00, set_ver, Svc::VersionStatus::OK); - ASSERT_TLM_CUSTOM_VERSION_01(0, cus_data_struct); - } + Svc::VersPortStrings::StringSize80 set_ver_0 = "ver_0"; + Svc::VersPortStrings::StringSize80 set_ver_6 = "ver_6"; + Svc::VersPortStrings::StringSize80 set_ver_3 = "ver_3"; + Svc::VersPortStrings::StringSize80 set_ver_9 = "ver_9"; - set_ver = "ver_1"; - this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_01, set_ver, status); - if(is_enabled == true) { - ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(2); - ASSERT_EVENTS_CUSTOM_VERSIONS(1,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_01,"ver_1"); - cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_01, set_ver, Svc::VersionStatus::OK); - ASSERT_TLM_CUSTOM_VERSION_02(0, cus_data_struct); - } - - set_ver = "ver_2"; - this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_02, set_ver, status); - if(is_enabled == true) { - ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(3); - ASSERT_EVENTS_CUSTOM_VERSIONS(2,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_02,"ver_2"); - cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_02, set_ver, Svc::VersionStatus::OK); - ASSERT_TLM_CUSTOM_VERSION_03(0, cus_data_struct); - } - + this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_00, set_ver_0, status); status = Svc::VersionStatus::FAILURE; - - set_ver = "ver_3"; - this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_03, set_ver, status); - if(is_enabled == true) { - ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(4); - ASSERT_EVENTS_CUSTOM_VERSIONS(3,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_03,"ver_3"); - cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_03, set_ver, Svc::VersionStatus::FAILURE); - ASSERT_TLM_CUSTOM_VERSION_04(0, cus_data_struct); - } - - set_ver = "ver_4"; - this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_04, set_ver, status); - if(is_enabled == true) { - ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(5); - ASSERT_EVENTS_CUSTOM_VERSIONS(4,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_04,"ver_4"); - cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_04, set_ver, Svc::VersionStatus::FAILURE); - ASSERT_TLM_CUSTOM_VERSION_05(0, cus_data_struct); - } - - set_ver = "ver_5"; - this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_05, set_ver, status); - if(is_enabled == true) { - ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(6); - ASSERT_EVENTS_CUSTOM_VERSIONS(5,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_05,"ver_5"); - cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_05, set_ver, Svc::VersionStatus::FAILURE); - ASSERT_TLM_CUSTOM_VERSION_06(0, cus_data_struct); - } - - set_ver = "ver_6"; - this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_06, set_ver, status); - if(is_enabled == true) { - ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(7); - ASSERT_EVENTS_CUSTOM_VERSIONS(6,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_06,"ver_6"); - cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_06, set_ver, Svc::VersionStatus::FAILURE); - ASSERT_TLM_CUSTOM_VERSION_07(0, cus_data_struct); - } - + this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_03, set_ver_3, status); + this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_06, set_ver_6, status); status = Svc::VersionStatus::OK; - - set_ver = "ver_7"; - this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_07, set_ver, status); - if(is_enabled == true) { - ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(8); - ASSERT_EVENTS_CUSTOM_VERSIONS(7,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_07,"ver_7"); - cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_07, set_ver, Svc::VersionStatus::OK); - ASSERT_TLM_CUSTOM_VERSION_08(0, cus_data_struct); - } - - set_ver = "ver_8"; - this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_08, set_ver, status); - if(is_enabled == true) { - ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(9); - ASSERT_EVENTS_CUSTOM_VERSIONS(8,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_08,"ver_8"); - cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_08, set_ver, Svc::VersionStatus::OK); - ASSERT_TLM_CUSTOM_VERSION_09(0, cus_data_struct); - } - - set_ver = "ver_9"; - this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_09, set_ver, status); - if(is_enabled == true) { - ASSERT_EVENTS_CUSTOM_VERSIONS_SIZE(10); - ASSERT_EVENTS_CUSTOM_VERSIONS(9,Svc::VersionCfg::VersionEnum::PROJECT_VERSION_09,"ver_9"); - cus_data_struct.set(Svc::VersionCfg::VersionEnum::PROJECT_VERSION_09, set_ver, Svc::VersionStatus::OK); - ASSERT_TLM_CUSTOM_VERSION_10(0, cus_data_struct); - } - + this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_09, set_ver_9, status); } void VersionTester :: test_getVer() { Svc::VersionStatus status; Svc::VersPortStrings::StringSize80 get_ver; - - this->invoke_to_getVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_02, get_ver, status); - ASSERT_EQ(get_ver,"ver_2"); + + this->invoke_to_getVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_00, get_ver, status); + ASSERT_EQ(get_ver,"ver_0"); ASSERT_EQ(status,Svc::VersionStatus::OK); this->invoke_to_getVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_03, get_ver, status); @@ -357,16 +118,16 @@ namespace Svc { ASSERT_EQ(status,Svc::VersionStatus::OK); this->invoke_to_getVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_05, get_ver, status); - ASSERT_EQ(get_ver,"ver_5"); + ASSERT_EQ(get_ver,"no_ver"); ASSERT_EQ(status,Svc::VersionStatus::FAILURE); } void VersionTester::test_ports() { - this->sendCmd_ENABLE(0,9,VersionEnabled::ENABLED); - this->test_setVer(true); + this->test_setVer(); this->test_getVer(); } + // ---------------------------------------------------------------------- // Helper methods // ---------------------------------------------------------------------- diff --git a/Svc/Version/test/ut/VersionTester.hpp b/Svc/Version/test/ut/VersionTester.hpp index b36b3dd07e..e96aaeb8c3 100644 --- a/Svc/Version/test/ut/VersionTester.hpp +++ b/Svc/Version/test/ut/VersionTester.hpp @@ -23,7 +23,7 @@ namespace Svc { // ---------------------------------------------------------------------- // Maximum size of histories storing events, telemetry, and port outputs - static const FwSizeType MAX_HISTORY_SIZE = 100; + static const FwSizeType MAX_HISTORY_SIZE = 10; // Instance ID supplied to the component instance under test static const FwEnumStoreType TEST_INSTANCE_ID = 0; @@ -48,10 +48,9 @@ namespace Svc { //! test startup EVR void test_startup(); - + //! test enable command void test_enable(); - //! test version command void test_versions(); //! test all commands @@ -60,11 +59,10 @@ namespace Svc { //! test get version void test_getVer(); //! test set version - void test_setVer(bool is_enabled); + void test_setVer(); //!test all ports void test_ports(); - //clear history - void clear_all(); + private: // ---------------------------------------------------------------------- diff --git a/Svc/Version/test/ut/VersionTesterHelpers.cpp b/Svc/Version/test/ut/VersionTesterHelpers.cpp index 8bf832ae08..dcced4dbde 100644 --- a/Svc/Version/test/ut/VersionTesterHelpers.cpp +++ b/Svc/Version/test/ut/VersionTesterHelpers.cpp @@ -60,12 +60,12 @@ namespace Svc { 0, this->component.get_getVersion_InputPort(0) ); -/* + this->connect_to_run( 0, this->component.get_run_InputPort(0) ); -*/ + this->connect_to_setVersion( 0, this->component.get_setVersion_InputPort(0) diff --git a/Svc/Version/test/ut/versions/version.hpp b/Svc/Version/test/ut/versions/version.hpp deleted file mode 100644 index ca483df727..0000000000 --- a/Svc/Version/test/ut/versions/version.hpp +++ /dev/null @@ -1,30 +0,0 @@ -/* - This file is a replica of version.hpp generated using [generate_version_info.py]. - Replicated to have a fixed size and values for -*/ -#ifndef _VERSION_TESTER_HPP_ -#define _VERSION_TESTER_HPP_ - -namespace Project { - -struct Version { - static constexpr const char* const FRAMEWORK_VERSION = "v3.4.3-66-g5d50140f5"; - static constexpr const char* const PROJECT_VERSION = "v3.4.3-66-g5d50140f5"; - static constexpr const char* const LIBRARY_VERSIONS[] = { - "blah0 @ blah0" , - "blah1 @ blah1" , - "blah2 @ blah2" , - "blah3 @ blah3" , - "blah4 @ blah4" , - "blah5 @ blah5" , - "blah6 @ blah6" , - "blah7 @ blah7" , - "blah8 @ blah8" , - "blah9 @ blah9" , - "blah10 @ blah10" , - "blah11 @ blah11" , - }; -}; - -} // namespace Project -#endif diff --git a/config/VersionCfg.fpp b/config/VersionCfg.fpp index 6a7806c47a..09795464ff 100644 --- a/config/VersionCfg.fpp +++ b/config/VersionCfg.fpp @@ -6,7 +6,7 @@ module Svc { module VersionCfg { - @ Define a set of Version entries on a project-specific + @ Define a set of PolyDb entries on a project-specific @ basis. enum VersionEnum: U32 { @ Entry 0 From 1a000c236b48de8bc314fd27c2f017bc7bd76027 Mon Sep 17 00:00:00 2001 From: Shivaly Date: Thu, 20 Jun 2024 17:46:00 -0700 Subject: [PATCH 09/37] Revert "FP-2604: Updates to Version based on conversations with Tim and Michael" This reverts commit 5d50140f585c819e4933e7792ee431873a713086. --- Ref/Top/RefTopology.cpp | 2 - Svc/Version/Version.cpp | 212 +++++----------------------------------- Svc/Version/Version.fpp | 85 +++------------- Svc/Version/Version.hpp | 54 +++------- 4 files changed, 47 insertions(+), 306 deletions(-) diff --git a/Ref/Top/RefTopology.cpp b/Ref/Top/RefTopology.cpp index 1290e59dd1..7ad61e0ef0 100644 --- a/Ref/Top/RefTopology.cpp +++ b/Ref/Top/RefTopology.cpp @@ -156,8 +156,6 @@ void setupTopology(const TopologyState& state) { loadParameters(); // Autocoded task kick-off (active components). Function provided by autocoder. startTasks(state); - // Startup TLM and Config verbosity for Versions - Version.Config(true); // Initialize socket client communication if and only if there is a valid specification if (state.hostname != nullptr && state.port != 0) { Os::TaskString name("ReceiveTask"); diff --git a/Svc/Version/Version.cpp b/Svc/Version/Version.cpp index 35fb6e2b76..628f10889c 100644 --- a/Svc/Version/Version.cpp +++ b/Svc/Version/Version.cpp @@ -16,17 +16,14 @@ namespace Svc { Version :: Version(const char* const compName) : - VersionComponentBase(compName) + VersionComponentBase(compName), m_enable(true) { startup_done = false; - num_lib_elem = 0; - num_cus_elem = 0; Svc::VersPortStrings::StringSize80 ver_str = "no_ver"; - // initialize all entries + // initialize all entries to stale for (FwIndexType id = 0; id < Svc::VersionCfg::VersionEnum::NUM_CONSTANTS; id++) { - //setver_enum is by default set to the first enum value, so not setting it here - verId_db[id].setver_val(ver_str); - verId_db[id].setver_status(VersionStatus::FAILURE); + this->verId_db[id].val = ver_str; + this->verId_db[id].status = VersionStatus::FAILURE; } } @@ -35,22 +32,11 @@ namespace Svc { { } - - void Version::Config(bool enable) { - //Set Verbosity for custom versions - m_enable = enable; - - //Setup and send startup TLM - this->proc_libver(); - this->FwVer_tlm(); - this->ProjVer_tlm(); - this->LibVer_tlm(); - } // ---------------------------------------------------------------------- // Handler implementations for user-defined typed input ports // ---------------------------------------------------------------------- -/* + void Version ::run_handler(const NATIVE_INT_TYPE portNum, U32 context) { if(m_enable) { Version_tlm(); @@ -61,7 +47,6 @@ void Version ::run_handler(const NATIVE_INT_TYPE portNum, U32 context) { } } } -*/ void Version :: getVersion_handler( @@ -72,9 +57,9 @@ void Version :: ) { FW_ASSERT(version_id.isValid(),version_id.e); - version_string = this->verId_db[version_id.e].getver_val(); - status = this->verId_db[version_id.e].getver_status() ; - this->CusVer_tlm(); + version_string = this->verId_db[version_id.e].val; + status = this->verId_db[version_id.e].status ; + } void Version :: @@ -86,11 +71,9 @@ void Version :: ) { FW_ASSERT(version_id.isValid(),version_id.e); - this->verId_db[version_id.e].setver_enum(version_id); - this->verId_db[version_id.e].setver_val(version_string); - this->verId_db[version_id.e].setver_status(status); - this->proc_cusver(); - this->CusVer_tlm(); + this->verId_db[version_id.e].val = version_string; + this->verId_db[version_id.e].status = status; + } // ---------------------------------------------------------------------- // Handler implementations for commands @@ -111,174 +94,25 @@ void Version :: void Version :: VERSION_cmdHandler( FwOpcodeType opCode, - U32 cmdSeq, - Svc::VersionType version_type + U32 cmdSeq ) { - //FW_ASSERT(version_type <= Svc::VersionType::ALL); - switch(version_type) { - case (Svc::VersionType::PROJECT): - this->ProjVer_tlm(); - break; - - case (Svc::VersionType::FRAMEWORK): - this->FwVer_tlm(); - break; - - case (Svc::VersionType::LIBRARY): - this->LibVer_tlm(); - break; - - case (Svc::VersionType::CUSTOM): - this->CusVer_tlm(); - break; - - case (Svc::VersionType::ALL): - this->ProjVer_tlm(); - this->FwVer_tlm(); - this->LibVer_tlm(); - this->CusVer_tlm(); - break; - default: - FW_ASSERT(0,version_type); - break; - } + Fw::LogStringArg version_string(Project::Version::FRAMEWORK_VERSION); + this->log_ACTIVITY_LO_FRAMEWORK_VERSION(version_string); + + version_string = Project::Version::PROJECT_VERSION; + this->log_ACTIVITY_LO_PROJECT_VERSION(version_string); this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); } - // ---------------------------------------------------------------------- - // implementations for internal functions - // ---------------------------------------------------------------------- - //Process libs - void Version :: proc_libver() { - num_lib_elem = sizeof(Project::Version::LIBRARY_VERSIONS)/sizeof(Project::Version::LIBRARY_VERSIONS[0]); - /* - //Store lib array locally - for(U8 i = 0; i < num_lib_elem ; i++) { - lib_ver_arr[i] = Project::Version::LIBRARY_VERSIONS[i]; - } - */ - } - - //Process Custom Versions - void Version :: proc_cusver() { - num_cus_elem = sizeof(this->verId_db)/sizeof(this->verId_db[0]); - } - //functions to log tlm on versions - void Version :: FwVer_tlm() { - Fw::LogStringArg fw_evr = (Project::Version::FRAMEWORK_VERSION); - this->log_ACTIVITY_LO_FRAMEWORK_VERSION(fw_evr); - Fw::TlmString fw_eha = (Project::Version::FRAMEWORK_VERSION); - this->tlmWrite_FRAMEWORK_VERSION(fw_eha); - } + //function to log tlm on versions + void Version :: Version_tlm() { + Fw::TlmString version_string(Project::Version::FRAMEWORK_VERSION); + this->tlmWrite_FRAMEWORK_VERSION(version_string); - void Version :: ProjVer_tlm() { - Fw::LogStringArg proj_evr = Project::Version::PROJECT_VERSION; - this->log_ACTIVITY_LO_PROJECT_VERSION(proj_evr); - Fw::TlmString proj_eha= Project::Version::PROJECT_VERSION; - this->tlmWrite_PROJECT_VERSION(proj_eha); - } - - void Version :: LibVer_tlm() { - - for (U8 i = 0; i < num_lib_elem; i++) { - //Emit EVR TLM on library versions - this->log_ACTIVITY_LO_LIBRARY_VERSIONS(Fw::LogStringArg(Project::Version::LIBRARY_VERSIONS[i])); - - //Write to EHAs - switch(i) { - case VER_SLOT_00: - this->tlmWrite_LIBRARY_VERSION_01(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i])); - break; - case VER_SLOT_01: - this->tlmWrite_LIBRARY_VERSION_02(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i])); - break; - case VER_SLOT_02: - this->tlmWrite_LIBRARY_VERSION_03(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i])); - break; - case VER_SLOT_03: - this->tlmWrite_LIBRARY_VERSION_04(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i])); - break; - case VER_SLOT_04: - this->tlmWrite_LIBRARY_VERSION_05(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i])); - break; - case VER_SLOT_05: - this->tlmWrite_LIBRARY_VERSION_06(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i])); - break; - case VER_SLOT_06: - this->tlmWrite_LIBRARY_VERSION_07(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i])); - break; - case VER_SLOT_07: - this->tlmWrite_LIBRARY_VERSION_08(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i])); - break; - case VER_SLOT_08: - this->tlmWrite_LIBRARY_VERSION_09(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i])); - break; - case VER_SLOT_09: - this->tlmWrite_LIBRARY_VERSION_10(Fw::TlmString(Project::Version::LIBRARY_VERSIONS[i])); - break; - default: - //It is possible to have more than 10 library versions; however design agreed to only - // provide 10 TLM channels for it - break; - } - } - - } - - void Version :: CusVer_tlm() { - - //Process custom version TLM only if verbosity is enabled and there are any valid writes to it; - // it doesn't necessarily have to be consecutive - for ( U8 i = 0; - (m_enable == true) && (num_cus_elem != 0) && (i < Svc::VersionCfg::VersionEnum::NUM_CONSTANTS); - i++) { - - if(this->verId_db[i].getver_val() != "no_ver") { //Write TLM for valid writes - - //Emit EVR TLM on library versions - this->log_ACTIVITY_LO_CUSTOM_VERSIONS(this->verId_db[i].getver_enum(), this->verId_db[i].getver_val()); - - //Write to EHAs - switch(i) { - case VER_SLOT_00: - this->tlmWrite_CUSTOM_VERSION_01(verId_db[i]); - break; - case VER_SLOT_01: - this->tlmWrite_CUSTOM_VERSION_02(verId_db[i]); - break; - case VER_SLOT_02: - this->tlmWrite_CUSTOM_VERSION_03(verId_db[i]); - break; - case VER_SLOT_03: - this->tlmWrite_CUSTOM_VERSION_04(verId_db[i]); - break; - case VER_SLOT_04: - this->tlmWrite_CUSTOM_VERSION_05(verId_db[i]); - break; - case VER_SLOT_05: - this->tlmWrite_CUSTOM_VERSION_06(verId_db[i]); - break; - case VER_SLOT_06: - this->tlmWrite_CUSTOM_VERSION_07(verId_db[i]); - break; - case VER_SLOT_07: - this->tlmWrite_CUSTOM_VERSION_08(verId_db[i]); - break; - case VER_SLOT_08: - this->tlmWrite_CUSTOM_VERSION_09(verId_db[i]); - break; - case VER_SLOT_09: - this->tlmWrite_CUSTOM_VERSION_10(verId_db[i]); - break; - default: - //There are only 10 enum slots available, so can assert here - FW_ASSERT(0,i); - break; - } - } - } + version_string = Project::Version::PROJECT_VERSION; + this->tlmWrite_PROJECT_VERSION(version_string); } } diff --git a/Svc/Version/Version.fpp b/Svc/Version/Version.fpp index 7d50c68d2f..5b4677a59b 100644 --- a/Svc/Version/Version.fpp +++ b/Svc/Version/Version.fpp @@ -13,30 +13,13 @@ module Svc { FAILURE = 1 @< Failure to get version } - @ An enumeration for Version Type - enum VersionType { - PROJECT = 0 @< project version - FRAMEWORK = 1 - LIBRARY = 2 - CUSTOM = 3 - ALL = 4 - } - - @ Port for setting and getting Versions port Vers( version_id: VersionCfg.VersionEnum @< The entry to access ref version_string: string @< The value to be passed ref status: VersionStatus @< The command response argument - ) + ) - @Data Structure for custom version Tlm - struct CusVerDb { - ver_enum: VersionCfg.VersionEnum - ver_val: string size 80 - ver_status : VersionStatus - } - passive component Version { ############################################################################## @@ -44,7 +27,7 @@ module Svc { ############################################################################## @ Run port - #guarded input port run: [1] Svc.Sched + guarded input port run: [1] Svc.Sched @ Mutexed Port to get values guarded input port getVersion: Svc.Vers @@ -52,26 +35,24 @@ module Svc { @ Mutexed Port to set values guarded input port setVersion: Svc.Vers - @ A command to enable or disable EVR verbosity and Telemetry + @ A command to enable or disable Version telemetry guarded command ENABLE( enable: VersionEnabled @< whether or not Version telemetry is enabled ) \ opcode 0 @ Report version as EVR - guarded command VERSION( - version_type: VersionType @*/ bool startup_done; - U32 num_lib_elem; //number of library versions - U32 num_cus_elem; //number of custom versions - //const char* lib_ver_arr[]; // Store library versions internally - - // An enumeration for TLM slot access - enum VerSlot { - VER_SLOT_00 = 0, - VER_SLOT_01, - VER_SLOT_02, - VER_SLOT_03, - VER_SLOT_04, - VER_SLOT_05, - VER_SLOT_06, - VER_SLOT_07, - VER_SLOT_08, - VER_SLOT_09 - }; - }; } From 8c53be48065dbf2a39ce33266267f4dc7d17b7a0 Mon Sep 17 00:00:00 2001 From: Shivaly Date: Thu, 20 Jun 2024 17:47:06 -0700 Subject: [PATCH 10/37] Revert "FP-2604 : Updates based on changes made by Thomas to version.hpp" This reverts commit d1c48ca3227258b7232ba1637859d7482420a769. --- Svc/Version/Version.cpp | 12 ++++++------ Svc/Version/test/ut/VersionTester.cpp | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Svc/Version/Version.cpp b/Svc/Version/Version.cpp index 628f10889c..c8f956e55c 100644 --- a/Svc/Version/Version.cpp +++ b/Svc/Version/Version.cpp @@ -6,7 +6,7 @@ #include "FpConfig.hpp" #include "Svc/Version/Version.hpp" -#include "versions/version.hpp" //autogenerated file containing hardcoded project and framework versions +#include //autogenerated file containing hardcoded project and framework versions namespace Svc { @@ -42,7 +42,7 @@ void Version ::run_handler(const NATIVE_INT_TYPE portNum, U32 context) { Version_tlm(); //TODO: Need to add libraries and user defined versions here as well if (startup_done == false) { //Send EVR once at startup - this->log_ACTIVITY_LO_STARTUP_EVR(Fw::LogStringArg(Project::Version::PROJECT_VERSION),Fw::LogStringArg(Project::Version::FRAMEWORK_VERSION)); + this->log_ACTIVITY_LO_STARTUP_EVR((PROJECT_VERSION),(FRAMEWORK_VERSION)); startup_done = true; } } @@ -97,10 +97,10 @@ void Version :: U32 cmdSeq ) { - Fw::LogStringArg version_string(Project::Version::FRAMEWORK_VERSION); + Fw::LogStringArg version_string(FRAMEWORK_VERSION); this->log_ACTIVITY_LO_FRAMEWORK_VERSION(version_string); - version_string = Project::Version::PROJECT_VERSION; + version_string = PROJECT_VERSION; this->log_ACTIVITY_LO_PROJECT_VERSION(version_string); this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); @@ -108,10 +108,10 @@ void Version :: //function to log tlm on versions void Version :: Version_tlm() { - Fw::TlmString version_string(Project::Version::FRAMEWORK_VERSION); + Fw::TlmString version_string(FRAMEWORK_VERSION); this->tlmWrite_FRAMEWORK_VERSION(version_string); - version_string = Project::Version::PROJECT_VERSION; + version_string = PROJECT_VERSION; this->tlmWrite_PROJECT_VERSION(version_string); } diff --git a/Svc/Version/test/ut/VersionTester.cpp b/Svc/Version/test/ut/VersionTester.cpp index 5d1f9edad1..0b321fa599 100644 --- a/Svc/Version/test/ut/VersionTester.cpp +++ b/Svc/Version/test/ut/VersionTester.cpp @@ -5,7 +5,7 @@ // ====================================================================== #include "VersionTester.hpp" -#include "versions/version.hpp" +#include namespace Svc { @@ -38,7 +38,7 @@ namespace Svc { void VersionTester :: test_startup() { this->invoke_to_run(0,0); ASSERT_EVENTS_STARTUP_EVR_SIZE(1); - ASSERT_EVENTS_STARTUP_EVR(0,Project::Version::FRAMEWORK_VERSION,Project::Version::PROJECT_VERSION); + ASSERT_EVENTS_STARTUP_EVR(0,FRAMEWORK_VERSION,PROJECT_VERSION); } // ---------------------------------------------------------------------- @@ -56,8 +56,8 @@ namespace Svc { this->sendCmd_ENABLE(0,cmd_seq,VersionEnabled::ENABLED); this->invoke_to_run(0,0); ASSERT_CMD_RESPONSE (0, 0, 9, Fw::CmdResponse::OK); - ASSERT_TLM_FRAMEWORK_VERSION(0, Project::Version::FRAMEWORK_VERSION); - ASSERT_TLM_PROJECT_VERSION(0, Project::Version::PROJECT_VERSION); + ASSERT_TLM_FRAMEWORK_VERSION(0, FRAMEWORK_VERSION); + ASSERT_TLM_PROJECT_VERSION(0, PROJECT_VERSION); } void VersionTester :: @@ -68,7 +68,7 @@ namespace Svc { this->invoke_to_run(0,0); ASSERT_CMD_RESPONSE (0, 0, 9, Fw::CmdResponse::OK); ASSERT_EVENTS_FRAMEWORK_VERSION_SIZE(1); - ASSERT_EVENTS_FRAMEWORK_VERSION(0, Project::Version::FRAMEWORK_VERSION); + ASSERT_EVENTS_FRAMEWORK_VERSION(0, FRAMEWORK_VERSION); } void VersionTester :: test_commands() { From 33dd9220d1817b0455d566b2eb98ae4b2f774467 Mon Sep 17 00:00:00 2001 From: Shivaly Date: Thu, 20 Jun 2024 17:48:08 -0700 Subject: [PATCH 11/37] Revert "FP-2604: Updates to Version module and UTs" This reverts commit 8d30c55ae2f103d952ef4b8a1dd81f0db3851f07. --- Svc/Version/CMakeLists.txt | 8 - Svc/Version/Version.cpp | 8 - Svc/Version/Version.fpp | 9 - Svc/Version/Version.hpp | 1 - Svc/Version/test/ut/VersionTestMain.cpp | 27 --- Svc/Version/test/ut/VersionTester.cpp | 168 ------------------- Svc/Version/test/ut/VersionTester.hpp | 91 ---------- Svc/Version/test/ut/VersionTesterHelpers.cpp | 82 --------- config/VersionCfg.fpp | 2 - 9 files changed, 396 deletions(-) delete mode 100644 Svc/Version/test/ut/VersionTestMain.cpp delete mode 100644 Svc/Version/test/ut/VersionTester.cpp delete mode 100644 Svc/Version/test/ut/VersionTester.hpp delete mode 100644 Svc/Version/test/ut/VersionTesterHelpers.cpp diff --git a/Svc/Version/CMakeLists.txt b/Svc/Version/CMakeLists.txt index 49072b3df7..3a52208a05 100644 --- a/Svc/Version/CMakeLists.txt +++ b/Svc/Version/CMakeLists.txt @@ -20,11 +20,3 @@ set(MOD_DEPS ) register_fprime_module() - -set(UT_SOURCE_FILES - "${CMAKE_CURRENT_LIST_DIR}/Version.fpp" - "${CMAKE_CURRENT_LIST_DIR}/test/ut/VersionTester.cpp" - "${CMAKE_CURRENT_LIST_DIR}/test/ut/VersionTestMain.cpp" -) -set (UT_AUTO_HELPERS ON) -register_fprime_ut() diff --git a/Svc/Version/Version.cpp b/Svc/Version/Version.cpp index c8f956e55c..94582c8ece 100644 --- a/Svc/Version/Version.cpp +++ b/Svc/Version/Version.cpp @@ -18,11 +18,8 @@ namespace Svc { Version(const char* const compName) : VersionComponentBase(compName), m_enable(true) { - startup_done = false; - Svc::VersPortStrings::StringSize80 ver_str = "no_ver"; // initialize all entries to stale for (FwIndexType id = 0; id < Svc::VersionCfg::VersionEnum::NUM_CONSTANTS; id++) { - this->verId_db[id].val = ver_str; this->verId_db[id].status = VersionStatus::FAILURE; } } @@ -40,11 +37,6 @@ namespace Svc { void Version ::run_handler(const NATIVE_INT_TYPE portNum, U32 context) { if(m_enable) { Version_tlm(); - //TODO: Need to add libraries and user defined versions here as well - if (startup_done == false) { //Send EVR once at startup - this->log_ACTIVITY_LO_STARTUP_EVR((PROJECT_VERSION),(FRAMEWORK_VERSION)); - startup_done = true; - } } } diff --git a/Svc/Version/Version.fpp b/Svc/Version/Version.fpp index 5b4677a59b..7f51c0235d 100644 --- a/Svc/Version/Version.fpp +++ b/Svc/Version/Version.fpp @@ -45,15 +45,6 @@ module Svc { guarded command VERSION \ opcode 1 - @ Version of the git repository. - event STARTUP_EVR( - proj_version: string size 40 @< project version - frm_version: string size 40 @< framework version - ) \ - severity activity low \ - id 2 \ - format "Project Version: [{}] Framework Version: [{}]" - @ Version of the git repository. event FRAMEWORK_VERSION( version: string size 40 @< version string diff --git a/Svc/Version/Version.hpp b/Svc/Version/Version.hpp index 5ebd5b12ac..3e10ca971e 100644 --- a/Svc/Version/Version.hpp +++ b/Svc/Version/Version.hpp @@ -99,7 +99,6 @@ namespace Svc { private: void Version_tlm(); bool m_enable; /*!*/ - bool startup_done; }; } diff --git a/Svc/Version/test/ut/VersionTestMain.cpp b/Svc/Version/test/ut/VersionTestMain.cpp deleted file mode 100644 index b90ab2bdfe..0000000000 --- a/Svc/Version/test/ut/VersionTestMain.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// ====================================================================== -// \title VersionTestMain.cpp -// \author sreddy -// \brief cpp file for Version component test main function -// ====================================================================== - -#include "VersionTester.hpp" - -TEST(Nominal, test_startup) { - Svc::VersionTester tester; - tester.test_startup(); -} - -TEST(Nominal, test_ports) { - Svc::VersionTester tester; - tester.test_ports(); -} - -TEST(Nominal, test_cmds) { - Svc::VersionTester tester; - tester.test_commands(); -} - -int main(int argc, char** argv) { - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/Svc/Version/test/ut/VersionTester.cpp b/Svc/Version/test/ut/VersionTester.cpp deleted file mode 100644 index 0b321fa599..0000000000 --- a/Svc/Version/test/ut/VersionTester.cpp +++ /dev/null @@ -1,168 +0,0 @@ -// ====================================================================== -// \title VersionTester.cpp -// \author sreddy -// \brief cpp file for Version component test harness implementation class -// ====================================================================== - -#include "VersionTester.hpp" -#include - -namespace Svc { - - // ---------------------------------------------------------------------- - // Construction and destruction - // ---------------------------------------------------------------------- - - VersionTester :: - VersionTester() : - VersionGTestBase("VersionTester", VersionTester::MAX_HISTORY_SIZE), - component("Version") - { - this->initComponents(); - this->connectPorts(); - } - - VersionTester :: - ~VersionTester() - { - - } - - // ---------------------------------------------------------------------- - // Tests - // ---------------------------------------------------------------------- - - // ---------------------------------------------------------------------- - // Test STARTUP - // ---------------------------------------------------------------------- - void VersionTester :: test_startup() { - this->invoke_to_run(0,0); - ASSERT_EVENTS_STARTUP_EVR_SIZE(1); - ASSERT_EVENTS_STARTUP_EVR(0,FRAMEWORK_VERSION,PROJECT_VERSION); - } - - // ---------------------------------------------------------------------- - // Test Commands - // ---------------------------------------------------------------------- - void VersionTester :: - test_enable() - { - U32 cmd_seq = 9; - this->sendCmd_ENABLE(0,cmd_seq,VersionEnabled::DISABLED); - this->invoke_to_run(0,0); - ASSERT_CMD_RESPONSE (0, 0, 9, Fw::CmdResponse::OK); - - cmd_seq = 9; - this->sendCmd_ENABLE(0,cmd_seq,VersionEnabled::ENABLED); - this->invoke_to_run(0,0); - ASSERT_CMD_RESPONSE (0, 0, 9, Fw::CmdResponse::OK); - ASSERT_TLM_FRAMEWORK_VERSION(0, FRAMEWORK_VERSION); - ASSERT_TLM_PROJECT_VERSION(0, PROJECT_VERSION); - } - - void VersionTester :: - test_versions() - { - U32 cmd_seq = 9; - this->sendCmd_VERSION(0,cmd_seq); - this->invoke_to_run(0,0); - ASSERT_CMD_RESPONSE (0, 0, 9, Fw::CmdResponse::OK); - ASSERT_EVENTS_FRAMEWORK_VERSION_SIZE(1); - ASSERT_EVENTS_FRAMEWORK_VERSION(0, FRAMEWORK_VERSION); - } - - void VersionTester :: test_commands() { - this->test_enable(); - this->test_versions(); - } - - // ---------------------------------------------------------------------- - // Test User Ports - // ---------------------------------------------------------------------- - - void VersionTester :: test_setVer() { - - Svc::VersionStatus status = Svc::VersionStatus::OK; - Svc::VersPortStrings::StringSize80 set_ver_0 = "ver_0"; - Svc::VersPortStrings::StringSize80 set_ver_6 = "ver_6"; - Svc::VersPortStrings::StringSize80 set_ver_3 = "ver_3"; - Svc::VersPortStrings::StringSize80 set_ver_9 = "ver_9"; - - this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_00, set_ver_0, status); - status = Svc::VersionStatus::FAILURE; - this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_03, set_ver_3, status); - this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_06, set_ver_6, status); - status = Svc::VersionStatus::OK; - this->invoke_to_setVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_09, set_ver_9, status); - } - - void VersionTester :: test_getVer() { - - Svc::VersionStatus status; - Svc::VersPortStrings::StringSize80 get_ver; - - this->invoke_to_getVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_00, get_ver, status); - ASSERT_EQ(get_ver,"ver_0"); - ASSERT_EQ(status,Svc::VersionStatus::OK); - - this->invoke_to_getVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_03, get_ver, status); - ASSERT_EQ(get_ver,"ver_3"); - ASSERT_EQ(status,Svc::VersionStatus::FAILURE); - - this->invoke_to_getVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_06, get_ver, status); - ASSERT_EQ(get_ver,"ver_6"); - ASSERT_EQ(status,Svc::VersionStatus::FAILURE); - - this->invoke_to_getVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_09, get_ver, status); - ASSERT_EQ(get_ver,"ver_9"); - ASSERT_EQ(status,Svc::VersionStatus::OK); - - this->invoke_to_getVersion(0, Svc::VersionCfg::VersionEnum::PROJECT_VERSION_05, get_ver, status); - ASSERT_EQ(get_ver,"no_ver"); - ASSERT_EQ(status,Svc::VersionStatus::FAILURE); - } - - void VersionTester::test_ports() { - this->test_setVer(); - this->test_getVer(); - } - - -// ---------------------------------------------------------------------- -// Helper methods -// ---------------------------------------------------------------------- - /* - void VersionTester::connectPorts() { - // Connect custom ports - this->connect_to_run(0, this->component.get_run_InputPort(0)); - this->connect_to_getVersion (0, this->component.get_getVersion_InputPort(0)); - this->connect_to_setVersion (0, this->component.get_setVersion_InputPort(0)); - - // CmdIn - this->connect_to_cmdIn (0, this->component.get_cmdIn_InputPort(0)); - - // CmdReg - this->component.set_cmdRegOut_OutputPort(0,this->get_from_cmdRegOut(0)); - - // CmdStatus - this->component.set_cmdResponseOut_OutputPort(0, this->get_from_cmdResponseOut(0)); - - // Tlm - this->component.set_tlmOut_OutputPort(0, this->get_from_tlmOut(0)); - - // Time - this->component.set_timeCaller_OutputPort(0, this->get_from_timeCaller(0)); - - // Log - this->component.set_logOut_OutputPort(0, this->get_from_logOut(0)); - - // LogText - this->component.set_logTextOut_OutputPort(0, this->get_from_logTextOut(0)); - } - - void VersionTester::initComponents() { - this->init(); - this->component.init(0); - } - */ -} \ No newline at end of file diff --git a/Svc/Version/test/ut/VersionTester.hpp b/Svc/Version/test/ut/VersionTester.hpp deleted file mode 100644 index e96aaeb8c3..0000000000 --- a/Svc/Version/test/ut/VersionTester.hpp +++ /dev/null @@ -1,91 +0,0 @@ -// ====================================================================== -// \title VersionTester.hpp -// \author sreddy -// \brief hpp file for Version component test harness implementation class -// ====================================================================== - -#ifndef Svc_VersionTester_HPP -#define Svc_VersionTester_HPP - -#include "Svc/Version/VersionGTestBase.hpp" -#include "Svc/Version/Version.hpp" - -namespace Svc { - - class VersionTester : - public VersionGTestBase - { - - public: - - // ---------------------------------------------------------------------- - // Constants - // ---------------------------------------------------------------------- - - // Maximum size of histories storing events, telemetry, and port outputs - static const FwSizeType MAX_HISTORY_SIZE = 10; - - // Instance ID supplied to the component instance under test - static const FwEnumStoreType TEST_INSTANCE_ID = 0; - - public: - - // ---------------------------------------------------------------------- - // Construction and destruction - // ---------------------------------------------------------------------- - - //! Construct object VersionTester - VersionTester(); - - //! Destroy object VersionTester - ~VersionTester(); - - public: - - // ---------------------------------------------------------------------- - // Tests - // ---------------------------------------------------------------------- - - //! test startup EVR - void test_startup(); - - //! test enable command - void test_enable(); - //! test version command - void test_versions(); - //! test all commands - void test_commands(); - - //! test get version - void test_getVer(); - //! test set version - void test_setVer(); - //!test all ports - void test_ports(); - - private: - - // ---------------------------------------------------------------------- - // Helper functions - // ---------------------------------------------------------------------- - - //! Connect ports - void connectPorts(); - - //! Initialize components - void initComponents(); - - private: - - // ---------------------------------------------------------------------- - // Member variables - // ---------------------------------------------------------------------- - - //! The component under test - Version component; - - }; - -} - -#endif diff --git a/Svc/Version/test/ut/VersionTesterHelpers.cpp b/Svc/Version/test/ut/VersionTesterHelpers.cpp deleted file mode 100644 index dcced4dbde..0000000000 --- a/Svc/Version/test/ut/VersionTesterHelpers.cpp +++ /dev/null @@ -1,82 +0,0 @@ -// ====================================================================== -// \title VersionTesterHelpers.cpp -// \author Generated by fpp-to-cpp -// \brief cpp file for Version component test harness helper functions -// ====================================================================== - -#include "VersionTester.hpp" - -namespace Svc { - - // ---------------------------------------------------------------------- - // Helper functions - // ---------------------------------------------------------------------- - - void VersionTester :: - connectPorts() - { - // Connect special input ports - - this->connect_to_cmdIn( - 0, - this->component.get_cmdIn_InputPort(0) - ); - - // Connect special output ports - - this->component.set_cmdRegOut_OutputPort( - 0, - this->get_from_cmdRegOut(0) - ); - - this->component.set_cmdResponseOut_OutputPort( - 0, - this->get_from_cmdResponseOut(0) - ); - - this->component.set_logOut_OutputPort( - 0, - this->get_from_logOut(0) - ); - - this->component.set_logTextOut_OutputPort( - 0, - this->get_from_logTextOut(0) - ); - - this->component.set_timeCaller_OutputPort( - 0, - this->get_from_timeCaller(0) - ); - - this->component.set_tlmOut_OutputPort( - 0, - this->get_from_tlmOut(0) - ); - - // Connect typed input ports - - this->connect_to_getVersion( - 0, - this->component.get_getVersion_InputPort(0) - ); - - this->connect_to_run( - 0, - this->component.get_run_InputPort(0) - ); - - this->connect_to_setVersion( - 0, - this->component.get_setVersion_InputPort(0) - ); - } - - void VersionTester :: - initComponents() - { - this->init(); - this->component.init(VersionTester::TEST_INSTANCE_ID); - } - -} diff --git a/config/VersionCfg.fpp b/config/VersionCfg.fpp index 09795464ff..b990d8f699 100644 --- a/config/VersionCfg.fpp +++ b/config/VersionCfg.fpp @@ -14,8 +14,6 @@ module Svc { @ Entry 1 PROJECT_VERSION_01 @ Entry 2 - PROJECT_VERSION_02 - @ Entry 3 PROJECT_VERSION_03 @ Entry 4 PROJECT_VERSION_04 From 11eabfe6b4b4c24240c68611a2ae68b795702a33 Mon Sep 17 00:00:00 2001 From: Shivaly Date: Thu, 20 Jun 2024 17:49:16 -0700 Subject: [PATCH 12/37] Revert "2604: Updates to user defined versions" This reverts commit 25ede54f21c03c46eac0af78d27661ee11663146. --- Svc/Version/Version.cpp | 32 +------------------------------- Svc/Version/Version.fpp | 19 ------------------- Svc/Version/Version.hpp | 35 +---------------------------------- config/CMakeLists.txt | 1 - config/VersionCfg.fpp | 34 ---------------------------------- 5 files changed, 2 insertions(+), 119 deletions(-) delete mode 100644 config/VersionCfg.fpp diff --git a/Svc/Version/Version.cpp b/Svc/Version/Version.cpp index 94582c8ece..05aca609b0 100644 --- a/Svc/Version/Version.cpp +++ b/Svc/Version/Version.cpp @@ -18,10 +18,7 @@ namespace Svc { Version(const char* const compName) : VersionComponentBase(compName), m_enable(true) { - // initialize all entries to stale - for (FwIndexType id = 0; id < Svc::VersionCfg::VersionEnum::NUM_CONSTANTS; id++) { - this->verId_db[id].status = VersionStatus::FAILURE; - } + } Version :: @@ -40,33 +37,6 @@ void Version ::run_handler(const NATIVE_INT_TYPE portNum, U32 context) { } } -void Version :: - getVersion_handler( - FwIndexType portNum, - const Svc::VersionCfg::VersionEnum& version_id, - Svc::VersPortStrings::StringSize80& version_string, - Svc::VersionStatus& status - ) - { - FW_ASSERT(version_id.isValid(),version_id.e); - version_string = this->verId_db[version_id.e].val; - status = this->verId_db[version_id.e].status ; - - } - - void Version :: - setVersion_handler( - FwIndexType portNum, - const Svc::VersionCfg::VersionEnum& version_id, - Svc::VersPortStrings::StringSize80& version_string, - Svc::VersionStatus& status - ) - { - FW_ASSERT(version_id.isValid(),version_id.e); - this->verId_db[version_id.e].val = version_string; - this->verId_db[version_id.e].status = status; - - } // ---------------------------------------------------------------------- // Handler implementations for commands // ---------------------------------------------------------------------- diff --git a/Svc/Version/Version.fpp b/Svc/Version/Version.fpp index 7f51c0235d..1f92073f85 100644 --- a/Svc/Version/Version.fpp +++ b/Svc/Version/Version.fpp @@ -6,20 +6,7 @@ module Svc { DISABLED = 0 ENABLED = 1 } - - @ An enumeration for version status - enum VersionStatus { - OK = 0 @< Version was good - FAILURE = 1 @< Failure to get version - } - @ Port for setting and getting Versions - port Vers( - version_id: VersionCfg.VersionEnum @< The entry to access - ref version_string: string @< The value to be passed - ref status: VersionStatus @< The command response argument - ) - passive component Version { ############################################################################## @@ -28,12 +15,6 @@ module Svc { @ Run port guarded input port run: [1] Svc.Sched - - @ Mutexed Port to get values - guarded input port getVersion: Svc.Vers - - @ Mutexed Port to set values - guarded input port setVersion: Svc.Vers @ A command to enable or disable Version telemetry guarded command ENABLE( diff --git a/Svc/Version/Version.hpp b/Svc/Version/Version.hpp index 3e10ca971e..52a74feba2 100644 --- a/Svc/Version/Version.hpp +++ b/Svc/Version/Version.hpp @@ -22,7 +22,7 @@ namespace Svc { // ---------------------------------------------------------------------- //! Construct Version object - explicit Version( + Version( const char* const compName //!< The component name ); @@ -40,40 +40,7 @@ namespace Svc { run_handler(const NATIVE_INT_TYPE portNum, /*!< The port number*/ U32 context /*!< The call order*/ ) override; - - //! Handler implementation for getVersion - //! - //! Mutexed Port to get values - void getVersion_handler( - FwIndexType portNum, //!< The port number - const Svc::VersionCfg::VersionEnum& version_id, //!< The entry to access - Svc::VersPortStrings::StringSize80& version_string, //!< The value to be passed - Svc::VersionStatus& status //!< The command response argument - ) override; - - //! Handler implementation for setVersion - //! - //! Mutexed Port to set values - void setVersion_handler( - FwIndexType portNum, //!< The port number - const Svc::VersionCfg::VersionEnum& version_id, //!< The entry to access - Svc::VersPortStrings::StringSize80& version_string, //!< The value to be passed - Svc::VersionStatus& status //!< The command response argument - ) override; - - //! \struct t_dbStruct - //! \brief PolyDb database structure - //! - //! This structure stores the latest values of the measurements. - //! The statuses are all initialized to MeasurementStatus::STALE by the constructor. - //! - - struct verArr { - VersionStatus status; //!< last status of measurement - VersPortStrings::StringSize80 val; //!< the last value of the measurement - } verId_db[Svc::VersionCfg::VersionEnum::NUM_CONSTANTS]; - private: // ---------------------------------------------------------------------- // Handler implementations for commands diff --git a/config/CMakeLists.txt b/config/CMakeLists.txt index a63d68471d..e45152b631 100644 --- a/config/CMakeLists.txt +++ b/config/CMakeLists.txt @@ -8,6 +8,5 @@ set(SOURCE_FILES "${CMAKE_CURRENT_LIST_DIR}/DpCfg.fpp" "${CMAKE_CURRENT_LIST_DIR}/FpConfig.fpp" "${CMAKE_CURRENT_LIST_DIR}/PolyDbCfg.fpp" - "${CMAKE_CURRENT_LIST_DIR}/VersionCfg.fpp" ) register_fprime_module(config) diff --git a/config/VersionCfg.fpp b/config/VersionCfg.fpp deleted file mode 100644 index b990d8f699..0000000000 --- a/config/VersionCfg.fpp +++ /dev/null @@ -1,34 +0,0 @@ -# ====================================================================== -# FPP file for Version configuration -# ====================================================================== - -module Svc { - - module VersionCfg { - - @ Define a set of PolyDb entries on a project-specific - @ basis. - enum VersionEnum: U32 { - @ Entry 0 - PROJECT_VERSION_00 - @ Entry 1 - PROJECT_VERSION_01 - @ Entry 2 - PROJECT_VERSION_03 - @ Entry 4 - PROJECT_VERSION_04 - @ Entry 5 - PROJECT_VERSION_05 - @ Entry 6 - PROJECT_VERSION_06 - @ Entry 7 - PROJECT_VERSION_07 - @ Entry 8 - PROJECT_VERSION_08 - @ Entry 9 - PROJECT_VERSION_09 - } - - } - -} \ No newline at end of file From 9193a20eb70e9014c5bb87c3326f5866c0b14fac Mon Sep 17 00:00:00 2001 From: Shivaly Date: Thu, 20 Jun 2024 17:58:52 -0700 Subject: [PATCH 13/37] Revert "2604: Fixed bug in version" This reverts commit 2e6715497faeac669501e403658ca7b057d33d59. --- .../Python/src/fprime_ac/utils/version.py | 8 +-- Svc/Version/Version.cpp | 53 +---------------- Svc/Version/Version.fpp | 59 +++++-------------- Svc/Version/Version.hpp | 37 ------------ cmake/target/version.cmake | 1 + 5 files changed, 20 insertions(+), 138 deletions(-) diff --git a/Autocoders/Python/src/fprime_ac/utils/version.py b/Autocoders/Python/src/fprime_ac/utils/version.py index 2c662646a8..b332790b4c 100644 --- a/Autocoders/Python/src/fprime_ac/utils/version.py +++ b/Autocoders/Python/src/fprime_ac/utils/version.py @@ -21,8 +21,6 @@ def get_version_str(working_dir, fallback=FALLBACK_VERSION): output = subprocess.check_output( ["git", "describe", "--tags", "--always"], cwd=working_dir ) - #print ("Msg3: output string : ",output) - #print ("Msg4: output string reformatted: ",output.strip().decode("ascii")) return output.strip().decode("ascii") except Exception: return fallback @@ -38,9 +36,8 @@ def get_fprime_version(): Version of fprime framework """ fprime_directory = os.environ.get( - "FPRIME_FRAMEWORK_PATH", os.path.dirname(__file__)) - #print("Msg1: fprime_directory for version: ", fprime_directory) - + "FPRIME_FRAMEWORK_PATH", os.path.dirname(__file__) + ) return get_version_str(working_dir=fprime_directory, fallback=FALLBACK_VERSION) @@ -57,7 +54,6 @@ def get_project_version(fallback=FALLBACK_VERSION): Version of fprime framework """ fprime_directory = os.environ.get("FPRIME_PROJECT_ROOT", os.path.dirname(__file__)) - #print("Msg1: fprime_directory for project : ", fprime_directory, "and _file_ : ",__file__) return get_version_str(working_dir=fprime_directory, fallback=fallback) diff --git a/Svc/Version/Version.cpp b/Svc/Version/Version.cpp index 05aca609b0..8077fc3061 100644 --- a/Svc/Version/Version.cpp +++ b/Svc/Version/Version.cpp @@ -6,7 +6,6 @@ #include "FpConfig.hpp" #include "Svc/Version/Version.hpp" -#include //autogenerated file containing hardcoded project and framework versions namespace Svc { @@ -16,7 +15,7 @@ namespace Svc { Version :: Version(const char* const compName) : - VersionComponentBase(compName), m_enable(true) + VersionComponentBase(compName) { } @@ -27,54 +26,4 @@ namespace Svc { } -// ---------------------------------------------------------------------- -// Handler implementations for user-defined typed input ports -// ---------------------------------------------------------------------- - -void Version ::run_handler(const NATIVE_INT_TYPE portNum, U32 context) { - if(m_enable) { - Version_tlm(); - } -} - - // ---------------------------------------------------------------------- - // Handler implementations for commands - // ---------------------------------------------------------------------- - - void Version :: - ENABLE_cmdHandler( - FwOpcodeType opCode, - U32 cmdSeq, - Svc::VersionEnabled enable - ) - { - m_enable = (enable == VersionEnabled::ENABLED); - this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); - } - - //Command handler to EVR versions - void Version :: - VERSION_cmdHandler( - FwOpcodeType opCode, - U32 cmdSeq - ) - { - Fw::LogStringArg version_string(FRAMEWORK_VERSION); - this->log_ACTIVITY_LO_FRAMEWORK_VERSION(version_string); - - version_string = PROJECT_VERSION; - this->log_ACTIVITY_LO_PROJECT_VERSION(version_string); - - this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); - } - - //function to log tlm on versions - void Version :: Version_tlm() { - Fw::TlmString version_string(FRAMEWORK_VERSION); - this->tlmWrite_FRAMEWORK_VERSION(version_string); - - version_string = PROJECT_VERSION; - this->tlmWrite_PROJECT_VERSION(version_string); - } - } diff --git a/Svc/Version/Version.fpp b/Svc/Version/Version.fpp index 1f92073f85..12a9d622ec 100644 --- a/Svc/Version/Version.fpp +++ b/Svc/Version/Version.fpp @@ -1,52 +1,25 @@ module Svc { - - @ Tracks versions for project, framework and user defined versions etc - - enum VersionEnabled { - DISABLED = 0 - ENABLED = 1 - } - + @ Tracks veramework, user defined versions etc passive component Version { ############################################################################## #### Uncomment the following examples to start customizing your component #### ############################################################################## - - @ Run port - guarded input port run: [1] Svc.Sched - - @ A command to enable or disable Version telemetry - guarded command ENABLE( - enable: VersionEnabled @< whether or not Version telemetry is enabled - ) \ - opcode 0 - - @ Report version as EVR - guarded command VERSION \ - opcode 1 - - @ Version of the git repository. - event FRAMEWORK_VERSION( - version: string size 40 @< version string - ) \ - severity activity low \ - id 0 \ - format "Framework Version: [{}]" - - @ Version of the git repository. - event PROJECT_VERSION( - version: string size 40 @< version string - ) \ - severity activity low \ - id 1 \ - format "Project Version: [{}]" - - @ Software framework version - telemetry FRAMEWORK_VERSION: string size 40 id 0 - - @ Software project version - telemetry PROJECT_VERSION: string size 40 id 1 + + # @ Example async command + # async command COMMAND_NAME(param_name: U32) + + # @ Example telemetry counter + # telemetry ExampleCounter: U64 + + # @ Example event + # event ExampleStateEvent(example_state: Fw.On) severity activity high id 0 format "State set to {}" + + # @ Example port: receiving calls from the rate group + # sync input port run: Svc.Sched + + # @ Example parameter + # param PARAMETER_NAME: U32 ############################################################################### # Standard AC Ports: Required for Channels, Events, Commands, and Parameters # diff --git a/Svc/Version/Version.hpp b/Svc/Version/Version.hpp index 52a74feba2..191c1099fd 100644 --- a/Svc/Version/Version.hpp +++ b/Svc/Version/Version.hpp @@ -29,43 +29,6 @@ namespace Svc { //! Destroy Version object ~Version(); - PRIVATE: - // ---------------------------------------------------------------------- - // Handler implementations for user-defined typed input ports - // ---------------------------------------------------------------------- - - //! Handler implementation for run - //! - void - run_handler(const NATIVE_INT_TYPE portNum, /*!< The port number*/ - U32 context /*!< The call order*/ - ) override; - - private: - // ---------------------------------------------------------------------- - // Handler implementations for commands - // ---------------------------------------------------------------------- - - //! Handler implementation for command ENABLE - //! - //! A command to enable or disable Version telemetry - void ENABLE_cmdHandler( - FwOpcodeType opCode, //!< The opcode - U32 cmdSeq, //!< The command sequence number - Svc::VersionEnabled enable //!< whether or not Version telemetry is enabled - ) override; - - //! Handler implementation for command VERSION - //! - //! Report version as EVR - void VERSION_cmdHandler( - FwOpcodeType opCode, //!< The opcode - U32 cmdSeq //!< The command sequence number - ) override; - - private: - void Version_tlm(); - bool m_enable; /*!*/ }; } diff --git a/cmake/target/version.cmake b/cmake/target/version.cmake index 8945e35d35..1274629cf4 100644 --- a/cmake/target/version.cmake +++ b/cmake/target/version.cmake @@ -25,6 +25,7 @@ function(version_add_global_target TARGET) "${FPRIME_VERSION_INFO_SCRIPT}" "${OUTPUT_DIR}" "${OPTIONAL_CHECK_ARG}" COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${OUTPUT_HPP}.tmp" "${OUTPUT_HPP}" COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${OUTPUT_JSON}.tmp" "${OUTPUT_JSON}" + WORKING_DIRECTORY "${FPRIME_PROJECT_ROOT}" ) endfunction() From aaadbab8d4651e03b9491e9fd4f4b24758f5114f Mon Sep 17 00:00:00 2001 From: Shivaly Date: Thu, 20 Jun 2024 18:03:52 -0700 Subject: [PATCH 14/37] Revert "2604: SDD in Progress" This reverts commit 2a5dba39de076ec7af3739aba42d321bf67ab5c5. --- Svc/CMakeLists.txt | 7 ++-- Svc/Version/CMakeLists.txt | 22 ------------ Svc/Version/Version.cpp | 29 ---------------- Svc/Version/Version.fpp | 55 ------------------------------ Svc/Version/Version.hpp | 36 -------------------- Svc/Version/docs/sdd.md | 70 -------------------------------------- 6 files changed, 4 insertions(+), 215 deletions(-) delete mode 100644 Svc/Version/CMakeLists.txt delete mode 100644 Svc/Version/Version.cpp delete mode 100644 Svc/Version/Version.fpp delete mode 100644 Svc/Version/Version.hpp delete mode 100644 Svc/Version/docs/sdd.md diff --git a/Svc/CMakeLists.txt b/Svc/CMakeLists.txt index 662388806c..21049f8672 100644 --- a/Svc/CMakeLists.txt +++ b/Svc/CMakeLists.txt @@ -54,6 +54,7 @@ if (FPRIME_ENABLE_TEXT_LOGGERS) add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/ActiveTextLogger/") endif() -add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/PosixTime/") -add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/LinuxTimer/") -add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Version/") \ No newline at end of file +if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux" OR ${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") + add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/PosixTime/") + add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/LinuxTimer/") +endif() diff --git a/Svc/Version/CMakeLists.txt b/Svc/Version/CMakeLists.txt deleted file mode 100644 index 3a52208a05..0000000000 --- a/Svc/Version/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -#### -# F prime CMakeLists.txt: -# -# SOURCE_FILES: combined list of source and autocoding files -# MOD_DEPS: (optional) module dependencies -# UT_SOURCE_FILES: list of source files for unit tests -# -#### -set(SOURCE_FILES - "${CMAKE_CURRENT_LIST_DIR}/Version.fpp" - "${CMAKE_CURRENT_LIST_DIR}/Version.cpp" -) - -# Uncomment and add any modules that this component depends on, else -# they might not be available when cmake tries to build this component. - -set(MOD_DEPS - Os - version -) - -register_fprime_module() diff --git a/Svc/Version/Version.cpp b/Svc/Version/Version.cpp deleted file mode 100644 index 8077fc3061..0000000000 --- a/Svc/Version/Version.cpp +++ /dev/null @@ -1,29 +0,0 @@ -// ====================================================================== -// \title Version.cpp -// \author sreddy -// \brief cpp file for Version component implementation class -// ====================================================================== - -#include "FpConfig.hpp" -#include "Svc/Version/Version.hpp" - -namespace Svc { - - // ---------------------------------------------------------------------- - // Component construction and destruction - // ---------------------------------------------------------------------- - - Version :: - Version(const char* const compName) : - VersionComponentBase(compName) - { - - } - - Version :: - ~Version() - { - - } - -} diff --git a/Svc/Version/Version.fpp b/Svc/Version/Version.fpp deleted file mode 100644 index 12a9d622ec..0000000000 --- a/Svc/Version/Version.fpp +++ /dev/null @@ -1,55 +0,0 @@ -module Svc { - @ Tracks veramework, user defined versions etc - passive component Version { - - ############################################################################## - #### Uncomment the following examples to start customizing your component #### - ############################################################################## - - # @ Example async command - # async command COMMAND_NAME(param_name: U32) - - # @ Example telemetry counter - # telemetry ExampleCounter: U64 - - # @ Example event - # event ExampleStateEvent(example_state: Fw.On) severity activity high id 0 format "State set to {}" - - # @ Example port: receiving calls from the rate group - # sync input port run: Svc.Sched - - # @ Example parameter - # param PARAMETER_NAME: U32 - - ############################################################################### - # Standard AC Ports: Required for Channels, Events, Commands, and Parameters # - ############################################################################### - @ Port for requesting the current time - time get port timeCaller - - @ Port for sending command registrations - command reg port cmdRegOut - - @ Port for receiving commands - command recv port cmdIn - - @ Port for sending command responses - command resp port cmdResponseOut - - @ 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 - - } -} \ No newline at end of file diff --git a/Svc/Version/Version.hpp b/Svc/Version/Version.hpp deleted file mode 100644 index 191c1099fd..0000000000 --- a/Svc/Version/Version.hpp +++ /dev/null @@ -1,36 +0,0 @@ -// ====================================================================== -// \title Version.hpp -// \author sreddy -// \brief hpp file for Version component implementation class -// ====================================================================== - -#ifndef Svc_Version_HPP -#define Svc_Version_HPP - -#include "Svc/Version/VersionComponentAc.hpp" - -namespace Svc { - - class Version : - public VersionComponentBase - { - - public: - - // ---------------------------------------------------------------------- - // Component construction and destruction - // ---------------------------------------------------------------------- - - //! Construct Version object - Version( - const char* const compName //!< The component name - ); - - //! Destroy Version object - ~Version(); - - }; - -} - -#endif diff --git a/Svc/Version/docs/sdd.md b/Svc/Version/docs/sdd.md deleted file mode 100644 index e0b5c84b29..0000000000 --- a/Svc/Version/docs/sdd.md +++ /dev/null @@ -1,70 +0,0 @@ -# Svc::Version - -Tracks versions for framework,project, libraries and user defined project specific versions. - -## 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 - -| Name | Description | Validation | -|---|---|---| -|SVC-VERSION-001|`Svc::Version` shall create an EVR indicating versions of framework, project and libary at start-up and on command| This is to provide transparency to users on versions being used| -|SVC-VERSION-002|`Svc::Version` shall provide a telemetry channel on framework version| Accessiblity to versions being used| -|SVC-VERSION-003|`Svc::Version` shall provide a telemetry channel on project version| Accessiblity to versions being used| -|SVC-VERSION-004|`Svc::Version` shall provide a telemetry channel on library version| Accessiblity to versions being used| -|SVC-VERSION-005|`Svc::Version` shall provide an interface for users to set custom versions.| Enables projects to set hardware and FPGA versions as needed| - -## Change Log -| Date | Description | -|---|---| -|---| Initial Draft | \ No newline at end of file From 5d372d43d0e821f19733d43a2511089399257973 Mon Sep 17 00:00:00 2001 From: Shivaly Date: Fri, 21 Jun 2024 10:51:01 -0700 Subject: [PATCH 15/37] Making fork identical to the latest fprime devel branch --- Svc/CMakeLists.txt | 6 ++---- cmake/target/version.cmake | 1 - 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/Svc/CMakeLists.txt b/Svc/CMakeLists.txt index 21049f8672..44cbf884a7 100644 --- a/Svc/CMakeLists.txt +++ b/Svc/CMakeLists.txt @@ -54,7 +54,5 @@ if (FPRIME_ENABLE_TEXT_LOGGERS) add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/ActiveTextLogger/") endif() -if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux" OR ${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") - add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/PosixTime/") - add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/LinuxTimer/") -endif() +add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/PosixTime/") +add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/LinuxTimer/") diff --git a/cmake/target/version.cmake b/cmake/target/version.cmake index 1274629cf4..8945e35d35 100644 --- a/cmake/target/version.cmake +++ b/cmake/target/version.cmake @@ -25,7 +25,6 @@ function(version_add_global_target TARGET) "${FPRIME_VERSION_INFO_SCRIPT}" "${OUTPUT_DIR}" "${OPTIONAL_CHECK_ARG}" COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${OUTPUT_HPP}.tmp" "${OUTPUT_HPP}" COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${OUTPUT_JSON}.tmp" "${OUTPUT_JSON}" - WORKING_DIRECTORY "${FPRIME_PROJECT_ROOT}" ) endfunction() From b548ebb50f450ddf6ef4601fecb71c8abcf217bc Mon Sep 17 00:00:00 2001 From: Shivaly Date: Wed, 24 Jul 2024 13:39:24 -0700 Subject: [PATCH 16/37] FP-2784 : Trace modules --- Fw/CMakeLists.txt | 3 +- Fw/Cfg/SerIds.hpp | 1 + Fw/Com/ComPacket.hpp | 1 + Fw/Trace/CMakeLists.txt | 16 ++++ Fw/Trace/Trace.fpp | 19 +++++ Fw/Trace/TraceBuffer.cpp | 44 +++++++++++ Fw/Trace/TraceBuffer.hpp | 44 +++++++++++ Fw/Trace/TracePacket.cpp | 92 ++++++++++++++++++++++ Fw/Trace/TracePacket.hpp | 41 ++++++++++ Fw/Trace/docs/sdd.md | 25 ++++++ Svc/CMakeLists.txt | 1 + Svc/TraceLogger/CMakeLists.txt | 14 ++++ Svc/TraceLogger/TraceLogger.cpp | 135 ++++++++++++++++++++++++++++++++ Svc/TraceLogger/TraceLogger.fpp | 66 ++++++++++++++++ Svc/TraceLogger/TraceLogger.hpp | 132 +++++++++++++++++++++++++++++++ config/FpConfig.fpp | 1 + config/FpConfig.h | 9 +++ 17 files changed, 643 insertions(+), 1 deletion(-) create mode 100644 Fw/Trace/CMakeLists.txt create mode 100644 Fw/Trace/Trace.fpp create mode 100644 Fw/Trace/TraceBuffer.cpp create mode 100644 Fw/Trace/TraceBuffer.hpp create mode 100644 Fw/Trace/TracePacket.cpp create mode 100644 Fw/Trace/TracePacket.hpp create mode 100644 Fw/Trace/docs/sdd.md create mode 100644 Svc/TraceLogger/CMakeLists.txt create mode 100644 Svc/TraceLogger/TraceLogger.cpp create mode 100644 Svc/TraceLogger/TraceLogger.fpp create mode 100644 Svc/TraceLogger/TraceLogger.hpp diff --git a/Fw/CMakeLists.txt b/Fw/CMakeLists.txt index 86291b9083..3f6b9b762f 100644 --- a/Fw/CMakeLists.txt +++ b/Fw/CMakeLists.txt @@ -1,5 +1,5 @@ # Module subdirectories -set(FPRIME_FRAMEWORK_MODULES Fw_Prm Fw_Cmd Fw_Log Fw_Tlm Fw_Com Fw_Time Fw_Port Fw_Types Fw_Cfg CACHE INTERNAL "Fw mods") +set(FPRIME_FRAMEWORK_MODULES Fw_Prm Fw_Cmd Fw_Trace Fw_Log Fw_Tlm Fw_Com Fw_Time Fw_Port Fw_Types Fw_Cfg CACHE INTERNAL "Fw mods") # Port subdirectories add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Buffer/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Cmd/") @@ -10,6 +10,7 @@ add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Logger/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Prm/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Time/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Tlm/") +add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Trace/") # Framework subdirectories add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Cfg/") diff --git a/Fw/Cfg/SerIds.hpp b/Fw/Cfg/SerIds.hpp index 421922dfa9..ed4a32890d 100644 --- a/Fw/Cfg/SerIds.hpp +++ b/Fw/Cfg/SerIds.hpp @@ -51,6 +51,7 @@ namespace Fw { FW_TYPEID_PRM_BUFF = 46, //!< Parameter Buffer type id FW_TYPEID_PRM_STR = 47, //!< Parameter string type id FW_TYPEID_FILE_BUFF = 48, //!< File piece Buffer type id + FW_TYPEID_TRACE_BUFF= 49, //!< Trace Buffer type id // Other types diff --git a/Fw/Com/ComPacket.hpp b/Fw/Com/ComPacket.hpp index 2179eb9da8..80d1c007d9 100644 --- a/Fw/Com/ComPacket.hpp +++ b/Fw/Com/ComPacket.hpp @@ -26,6 +26,7 @@ namespace Fw { FW_PACKET_PACKETIZED_TLM, // !< Packetized telemetry packet type FW_PACKET_DP, //!< Data product packet FW_PACKET_IDLE, // !< Idle packet + FW_PACKET_TRACE, // !< Trace packet FW_PACKET_UNKNOWN = 0xFF // !< Unknown packet } ComPacketType; diff --git a/Fw/Trace/CMakeLists.txt b/Fw/Trace/CMakeLists.txt new file mode 100644 index 0000000000..e70b8cfd57 --- /dev/null +++ b/Fw/Trace/CMakeLists.txt @@ -0,0 +1,16 @@ +#### +# F prime CMakeLists.txt: +# +# SOURCE_FILES: combined list of source and autocoding files +# MOD_DEPS: (optional) module dependencies +# +#### +set(MOD_DEPS + Fw/Com +) +set(SOURCE_FILES + "${CMAKE_CURRENT_LIST_DIR}/TraceBuffer.cpp" + "${CMAKE_CURRENT_LIST_DIR}/TracePacket.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Trace.fpp" +) +register_fprime_module() \ No newline at end of file diff --git a/Fw/Trace/Trace.fpp b/Fw/Trace/Trace.fpp new file mode 100644 index 0000000000..cce009280e --- /dev/null +++ b/Fw/Trace/Trace.fpp @@ -0,0 +1,19 @@ +module Fw { + + type TraceBuffer + + @Enum representing trace Types + @TODO: Talk with Tim to figure out what enums we'd want for trace types + enum TraceType { + FULL = 1 @< A full log file downliked + ABRIDGED = 2 @< An abridged version of trace + } + + @ Port for sending Traces + port Trace( + $id: FwTraceIdType @< Trace ID + ref timeTag: Fw.Time @< Time Tag + $type: TraceType @< The trace type argument + ref args: TraceBuffer @< Buffer containing serialized trace entry + ) +} \ No newline at end of file diff --git a/Fw/Trace/TraceBuffer.cpp b/Fw/Trace/TraceBuffer.cpp new file mode 100644 index 0000000000..4eb3345c3a --- /dev/null +++ b/Fw/Trace/TraceBuffer.cpp @@ -0,0 +1,44 @@ +#include +#include + +namespace Fw { + + TraceBuffer::TraceBuffer(const U8 *args, NATIVE_UINT_TYPE size) { + SerializeStatus stat = SerializeBufferBase::setBuff(args,size); + FW_ASSERT(FW_SERIALIZE_OK == stat, static_cast(stat)); + } + + TraceBuffer::TraceBuffer() { + } + + TraceBuffer::~TraceBuffer() { + } + + TraceBuffer::TraceBuffer(const TraceBuffer& other) : Fw::SerializeBufferBase() { + SerializeStatus stat = SerializeBufferBase::setBuff(other.m_bufferData,other.getBuffLength()); + FW_ASSERT(FW_SERIALIZE_OK == stat, static_cast(stat)); + } + + TraceBuffer& TraceBuffer::operator=(const TraceBuffer& other) { + if(this == &other) { + return *this; + } + + SerializeStatus stat = SerializeBufferBase::setBuff(other.m_bufferData,other.getBuffLength()); + FW_ASSERT(FW_SERIALIZE_OK == stat, static_cast(stat)); + return *this; + } + + NATIVE_UINT_TYPE TraceBuffer::getBuffCapacity() const { + return sizeof(this->m_bufferData); + } + + const U8* TraceBuffer::getBuffAddr() const { + return this->m_bufferData; + } + + U8* TraceBuffer::getBuffAddr() { + return this->m_bufferData; + } + +} diff --git a/Fw/Trace/TraceBuffer.hpp b/Fw/Trace/TraceBuffer.hpp new file mode 100644 index 0000000000..b45acc6e73 --- /dev/null +++ b/Fw/Trace/TraceBuffer.hpp @@ -0,0 +1,44 @@ +/* + * TraceBuffer.hpp + * + * Author: sreddy + */ + +/* + * Description: + * This object contains the TraceBuffer type, used for storing trace entries + */ +#ifndef FW_TRACE_BUFFER_HPP +#define FW_TRACE_BUFFER_HPP + +#include +#include +#include + +namespace Fw { + + class TraceBuffer : public SerializeBufferBase { + public: + + enum { + SERIALIZED_TYPE_ID = FW_TYPEID_TRACE_BUFF, + SERIALIZED_SIZE = FW_TRACE_BUFFER_MAX_SIZE + sizeof(FwBuffSizeType) + }; + + TraceBuffer(const U8 *args, NATIVE_UINT_TYPE size); + TraceBuffer(); + TraceBuffer(const TraceBuffer& other); + virtual ~TraceBuffer(); + TraceBuffer& operator=(const TraceBuffer& other); + + NATIVE_UINT_TYPE getBuffCapacity() const; // !< returns capacity, not current size, of buffer + U8* getBuffAddr(); + const U8* getBuffAddr() const; + + private: + U8 m_bufferData[FW_TRACE_BUFFER_MAX_SIZE]; // command argument buffer + }; + +} + +#endif \ No newline at end of file diff --git a/Fw/Trace/TracePacket.cpp b/Fw/Trace/TracePacket.cpp new file mode 100644 index 0000000000..c3a9ce0bdd --- /dev/null +++ b/Fw/Trace/TracePacket.cpp @@ -0,0 +1,92 @@ +/* + * TracePacket.cpp + * + */ + +#include +#include + +namespace Fw { + + TracePacket::TracePacket() : m_id(0) { + this->m_type = FW_PACKET_TRACE; + } + + TracePacket::~TracePacket() { + } + + SerializeStatus TracePacket::serialize(SerializeBufferBase& buffer) const { + + SerializeStatus stat = ComPacket::serializeBase(buffer); + if (stat != FW_SERIALIZE_OK) { + return stat; + } + + stat = buffer.serialize(this->m_id); + if (stat != FW_SERIALIZE_OK) { + return stat; + } + + stat = buffer.serialize(this->m_timeTag); + if (stat != FW_SERIALIZE_OK) { + return stat; + } + + // We want to add data but not size for the ground software + return buffer.serialize(this->m_traceBuffer.getBuffAddr(),m_traceBuffer.getBuffLength(),true); + + } + + SerializeStatus TracePacket::deserialize(SerializeBufferBase& buffer) { + SerializeStatus stat = deserializeBase(buffer); + if (stat != FW_SERIALIZE_OK) { + return stat; + } + + stat = buffer.deserialize(this->m_id); + if (stat != FW_SERIALIZE_OK) { + return stat; + } + + stat = buffer.deserialize(this->m_timeTag); + if (stat != FW_SERIALIZE_OK) { + return stat; + } + + // remainder of buffer must be telemetry value + NATIVE_UINT_TYPE size = buffer.getBuffLeft(); + stat = buffer.deserialize(this->m_traceBuffer.getBuffAddr(),size,true); + if (stat == FW_SERIALIZE_OK) { + // Shouldn't fail + stat = this->m_traceBuffer.setBuffLen(size); + FW_ASSERT(stat == FW_SERIALIZE_OK,static_cast(stat)); + } + return stat; + } + + void TracePacket::setId(FwTraceIdType id) { + this->m_id = id; + } + + void TracePacket::setTraceBuffer(const TraceBuffer& buffer) { + this->m_traceBuffer = buffer; + } + + void TracePacket::setTimeTag(const Fw::Time& timeTag) { + this->m_timeTag = timeTag; + } + + FwTraceIdType TracePacket::getId() { + return this->m_id; + } + + Fw::Time& TracePacket::getTimeTag() { + return this->m_timeTag; + } + + TraceBuffer& TracePacket::getTraceBuffer() { + return this->m_traceBuffer; + } + + +} /* namespace Fw */ diff --git a/Fw/Trace/TracePacket.hpp b/Fw/Trace/TracePacket.hpp new file mode 100644 index 0000000000..4d642198f9 --- /dev/null +++ b/Fw/Trace/TracePacket.hpp @@ -0,0 +1,41 @@ +/* + * TracePacket.hpp + * + * Author: sreddy + */ + +#ifndef TRACEPACKET_HPP_ +#define TRACEPACKET_HPP_ + +#include +#include +#include + +namespace Fw { + + class TracePacket : public ComPacket { + public: + + TracePacket(); + virtual ~TracePacket(); + + SerializeStatus serialize(SerializeBufferBase& buffer) const; //!< serialize contents + SerializeStatus deserialize(SerializeBufferBase& buffer); + + void setId(FwTraceIdType id); + void setTraceBuffer(const TraceBuffer& buffer); + void setTimeTag(const Fw::Time& timeTag); + + FwTraceIdType getId(); + Fw::Time& getTimeTag(); + TraceBuffer& getTraceBuffer(); + + protected: + FwTraceIdType m_id; // !< Channel id + Fw::Time m_timeTag; // !< time tag + TraceBuffer m_traceBuffer; // !< serialized argument data + }; + +} /* namespace Fw */ + +#endif /* TRACEPACKET_HPP_ */ diff --git a/Fw/Trace/docs/sdd.md b/Fw/Trace/docs/sdd.md new file mode 100644 index 0000000000..802a29e6f7 --- /dev/null +++ b/Fw/Trace/docs/sdd.md @@ -0,0 +1,25 @@ +\page FwTracePort Fw::Trace Port +# Fw::Trace Port + +## 1. Introduction +The `Fw::Trace` port is used to pass serialized trace log values with time tags to record diagnostic data that indicates the order of execution in software. + +## 2. Requirements +Trace Requirements in FPrime: +1. F’Prime shall provide a feature called Trace to log diagnostic information on various points of software execution. + - It is a way to create time correlation events as a reaction for resetting software. +2. Trace shall provide a port to log the following: + - Event ID : A unique identifier recording a “Trace Event” + - Time Tag : Caputes a high precision timestamp + - Client Data : A small sample of user arguments recorded into trace buffer +3. Trace shall create trace points and log events in software automatically for thread switching(?) and ...TBD, ask Tim +4. Trace shall provide a port for other components or user defined points to log events during software execution. +5. Trace shall record log events in an in-memory logger with data products to dump the buffers +6. Trace shall store data on a per thread basis so there is only one write to the buffer, preventing a need for mutual exclusion. +7. Trace shall maintain a double buffer, one for logs collected in the previous run before the latest reset and the other for current autopsy events. This way during init a data product can be generated for the trace events from prior run while actively collecting current trace logs. +8. Trace logs shall be stored in recoverable memory so they can be preserved over resets +9. Trace shall write the trace data (stored in buffers) to data products upon boot initialization, a reset and by ground command +10. Trace shall provide a ground command to dump trace logs upon request. +11. Trace shall provide a command to enable/disable Trace logging as it can consume significant code and processing +12. Trace entries shall be put in a dictionary so ground systems can automatically decode trace data + diff --git a/Svc/CMakeLists.txt b/Svc/CMakeLists.txt index 44cbf884a7..d5cdef2d28 100644 --- a/Svc/CMakeLists.txt +++ b/Svc/CMakeLists.txt @@ -46,6 +46,7 @@ add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/StaticMemory/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/TlmChan/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/TlmPacketizer/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/SystemResources/") +add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/TraceLogger/") # Text logger components included by default, # but can be disabled if FW_ENABLE_TEXT_LOGGING=0 is desired. diff --git a/Svc/TraceLogger/CMakeLists.txt b/Svc/TraceLogger/CMakeLists.txt new file mode 100644 index 0000000000..3ea5b8f0af --- /dev/null +++ b/Svc/TraceLogger/CMakeLists.txt @@ -0,0 +1,14 @@ +#### +# F prime CMakeLists.txt: +# +# SOURCE_FILES: combined list of source and autocoding files +# MOD_DEPS: (optional) module dependencies +# +# Note: using PROJECT_NAME as EXECUTABLE_NAME +#### +set(SOURCE_FILES + "${CMAKE_CURRENT_LIST_DIR}/TraceLogger.fpp" + "${CMAKE_CURRENT_LIST_DIR}/TraceLogger.cpp" +) + +register_fprime_module() diff --git a/Svc/TraceLogger/TraceLogger.cpp b/Svc/TraceLogger/TraceLogger.cpp new file mode 100644 index 0000000000..011fbee2f8 --- /dev/null +++ b/Svc/TraceLogger/TraceLogger.cpp @@ -0,0 +1,135 @@ +// ====================================================================== +// \title TraceLogger.cpp +// \author sreddy +// \brief cpp file for TraceLogger component implementation class +// ====================================================================== + +#include "Svc/TraceLogger/TraceLogger.hpp" +#include "FpConfig.hpp" +#include +#include +#include +#include +#include +#include +#include + +namespace Svc { + + // ---------------------------------------------------------------------- + // Component construction and destruction + // ---------------------------------------------------------------------- + + TraceLogger :: TraceLogger(const char* const compName) : + TraceLoggerComponentBase(compName), + m_log_file(), + m_mode(CLOSED), + m_fileName(), + m_maxFileSize(0), + m_byteCount(0), + m_log_init(false) + { + } + + TraceLogger ::~TraceLogger() {} + + void TraceLogger :: + init(NATIVE_INT_TYPE queueDepth, NATIVE_INT_TYPE instance) + { + TraceLoggerComponentBase::init(queueDepth,instance); + } + + bool TraceLogger :: set_log_file(const char* fileName, const U32 maxSize) { + FW_ASSERT(fileName != nullptr); + //If a file is already open then close it + if(this->m_mode == OPEN) { + this->m_mode = CLOSED; + this->m_log_file.close(); + } + + //If file name is too large then return failure + U32 fileNameSize = Fw::StringUtils::string_length(fileName, Fw::String::STRING_SIZE); + if (fileNameSize == Fw::String::STRING_SIZE) { + return false; + } + // Check if file already exists, and if it does try to tack on a suffix. + // Quit after 10 suffix addition tries (first try is w/ the original name). + bool failedSuffix = false; + while (Os::FileSystem::getFileSize(fileNameFinal,tmp) == Os::FileSystem::OP_OK) { + + // If the file name was the max size, then can't append a suffix, + // so just fail: + if (fileNameSize == (Fw::String::STRING_SIZE-1)) { + return false; + } + + // Not able to create a new non-existing file in maxBackups tries, then mark that it failed: + if (suffix >= maxBackups) { + failedSuffix = true; + break; + } + + NATIVE_INT_TYPE stat = snprintf(fileNameFinal,Fw::String::STRING_SIZE, + "%s%" PRIu32,fileName,suffix); + + // If there was error, then just fail: + if (stat <= 0) { + return false; + } + + // There should never be truncation: + FW_ASSERT(stat < Fw::String::STRING_SIZE); + + ++suffix; + } + + // If failed trying to make a new file, just use the original file + if (failedSuffix) { + (void) strncpy(fileNameFinal,fileName, + Fw::String::STRING_SIZE); + fileNameFinal[Fw::String::STRING_SIZE-1] = 0; + } + + // Open the file (using CREATE so that it truncates an already existing file): + Os::File::Status stat = this->m_file.open(fileNameFinal, Os::File::OPEN_CREATE, Os::File::OverwriteType::NO_OVERWRITE); + + // Bad status when trying to open the file: + if (stat != Os::File::OP_OK) { + return false; + } + + this->m_currentFileSize = 0; + this->m_maxFileSize = maxSize; + this->m_fileName = fileNameFinal; + this->m_openFile = true; + + return true; + } + } + // ---------------------------------------------------------------------- + // Handler implementations for user-defined typed input ports + // ---------------------------------------------------------------------- + + void TraceLogger ::TraceBufferLogger_handler(FwIndexType portNum, + FwTraceIdType id, + Fw::Time& timeTag, + const Fw::TraceType& type, + Fw::TraceBuffer& args) { + // TODO + } + + // ---------------------------------------------------------------------- + // Handler implementations for commands + // ---------------------------------------------------------------------- + + void TraceLogger ::EnableTrace_cmdHandler(FwOpcodeType opCode, U32 cmdSeq) { + // TODO + this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); + } + + void TraceLogger ::DumpTraceDp_cmdHandler(FwOpcodeType opCode, U32 cmdSeq) { + // TODO + this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); + } + +} // namespace Svc diff --git a/Svc/TraceLogger/TraceLogger.fpp b/Svc/TraceLogger/TraceLogger.fpp new file mode 100644 index 0000000000..b6d799f7d7 --- /dev/null +++ b/Svc/TraceLogger/TraceLogger.fpp @@ -0,0 +1,66 @@ +module Svc { + + @ Component to record Trace Data + active component TraceLogger { + + # ---------------------------------------------------------------------- + # Types + # ---------------------------------------------------------------------- + enum Enabled { + DISABLED = 0 @< Disabled state + ENABLED = 1 @< Enabled state + } + + # ---------------------------------------------------------------------- + # General ports + # ---------------------------------------------------------------------- + @ Logging Port + async input port TraceBufferLogger: Fw.Trace @< Input Trace port to write to file + + # ---------------------------------------------------------------------- + # Commands + # ---------------------------------------------------------------------- + @ Enable or disable trace + async command EnableTrace \ + opcode 0x00 + + @ Dump Trace to a data product + async command DumpTraceDp\ + opcode 0x01 + + # ---------------------------------------------------------------------- + # Events + # ---------------------------------------------------------------------- + @ Trace logging status + event TraceStatus( + $status: Enabled @< Status of Trace + ) \ + severity diagnostic \ + id 0x00 \ + format "Trace has been {}." + + # ---------------------------------------------------------------------- + # Special ports + # ---------------------------------------------------------------------- + + @ Command registration port + command reg port cmdRegOut + + @ Command received port + command recv port cmdIn + + @ Command response port + command resp port cmdResponseOut + + @ Event port + event port logOut + + @ Text event port + text event port LogText + + @ Time get port + time get port timeCaller + + + } +} \ No newline at end of file diff --git a/Svc/TraceLogger/TraceLogger.hpp b/Svc/TraceLogger/TraceLogger.hpp new file mode 100644 index 0000000000..e078c3c506 --- /dev/null +++ b/Svc/TraceLogger/TraceLogger.hpp @@ -0,0 +1,132 @@ +// ====================================================================== +// \title TraceLogger.hpp +// \author sreddy +// \brief hpp file for TraceLogger component implementation class +// ====================================================================== + +#ifndef Svc_TraceLogger_HPP +#define Svc_TraceLogger_HPP + +#include "Svc/TraceLogger/TraceLoggerComponentAc.hpp" +#include +#include + +// some limits.h don't have PATH_MAX +#ifdef PATH_MAX +#define FILE_PATH_MAX PATH_MAX +#else +#define FILE_PATH_MAX 255 +#endif + +// some limits.h don't have NAME_MAX +#ifdef NAME_MAX +#define FILE_NAME_MAX NAME_MAX +#else +#define FILE_NAME_MAX 255 +#endif + +namespace Svc { + +class TraceLogger : public TraceLoggerComponentBase { + public: + // ---------------------------------------------------------------------- + // Component construction and destruction + // ---------------------------------------------------------------------- + + //! Construct TraceLogger object + TraceLogger(const char* const compName //!< The component name + ); + + //! \brief Component initialization routine + //! + //! The initialization function calls the initialization + //! routine for the base class. + //! + //! \param queueDepth the depth of the message queue for the component + //! \param instance: instance identifier. Default: 0. + void init(NATIVE_INT_TYPE queueDepth, NATIVE_INT_TYPE instance = 0); + + //! \brief Set log file and max size + //! + //! This is to create a log file to write all the trace buffers to. + //! The file will not be written to once the max size is hit. + //! + //! \param fileName The name of the file to create. Must be less than 80 characters. + //! \param maxSize The max size of the file + //! + //! \return true if creating the file was successful, false otherwise + bool set_log_file(const char* fileName, const U32 maxSize); + + //! Destroy TraceLogger object + ~TraceLogger(); + + PRIVATE: + // ---------------------------------------------------------------------- + // Handler implementations for user-defined typed input ports + // ---------------------------------------------------------------------- + + //! Handler implementation for TraceBufferLogger + //! + //! Logging Port + //! Input Trace port to write to file + void TraceBufferLogger_handler(FwIndexType portNum, //!< The port number + FwTraceIdType id, //!< Trace ID + Fw::Time& timeTag, //!< Time Tag + const Fw::TraceType& type, //!< The trace type argument + Fw::TraceBuffer& args //!< Buffer containing serialized trace entry + ) override; + + PRIVATE: + // ---------------------------------------------------------------------- + // Handler implementations for commands + // ---------------------------------------------------------------------- + + //! Handler implementation for command EnableTrace + //! + //! Enable or disable trace + void EnableTrace_cmdHandler(FwOpcodeType opCode, //!< The opcode + U32 cmdSeq //!< The command sequence number + ) override; + + //! Handler implementation for command DumpTraceDp + //! + //! Dump Trace to a data product + void DumpTraceDp_cmdHandler(FwOpcodeType opCode, //!< The opcode + U32 cmdSeq //!< The command sequence number + ) override; + // ---------------------------------------------------------------------- + // Member Variables + // ---------------------------------------------------------------------- + + enum FileMode { + CLOSED = 0, + OPEN = 1 + }; + + // The filename data: + Os::File m_log_file; //Log file + FileMode m_mode; // file mode + CHAR m_fileName[FILE_NAME_MAX + FILE_PATH_MAX]; //File name + U32 m_maxFileSize; //max file size + U32 m_byteCount; //current byte count of the file + bool m_log_init; //Is logfile initialize + + // ---------------------------------------------------------------------- + // File functions: + // ---------------------------------------------------------------------- + void openFile( + ); + + void closeFile( + ); + + void writeToFile( + const char *const data, + U16 size + ); + + }; + +} // namespace Svc + +#endif diff --git a/config/FpConfig.fpp b/config/FpConfig.fpp index c1c00f997c..a4edd4955d 100644 --- a/config/FpConfig.fpp +++ b/config/FpConfig.fpp @@ -13,3 +13,4 @@ type FwSizeType type FwTimeBaseStoreType type FwTimeContextStoreType type FwTlmPacketizeIdType +type FwTraceIdType diff --git a/config/FpConfig.h b/config/FpConfig.h index a280264cd3..ff474d53c2 100644 --- a/config/FpConfig.h +++ b/config/FpConfig.h @@ -82,6 +82,10 @@ typedef U32 FwOpcodeType; typedef U32 FwChanIdType; #define PRI_FwChanIdType PRIu32 +// The type of a trace identifier +typedef U32 FwTraceIdType; +#define PRI_FwTraceIdType PRIu32 + // The type of an event identifier typedef U32 FwEventIdType; #define PRI_FwEventIdType PRIu32 @@ -316,6 +320,11 @@ typedef FwIndexType FwQueueSizeType; #define FW_TLM_STRING_MAX_SIZE 40 //!< Max size of channelized telemetry string type #endif +// Specifies the size of the buffer that contains the serialized trace value. +#ifndef FW_TRACE_BUFFER_MAX_SIZE +#define FW_TRACE_BUFFER_MAX_SIZE 64 //!< Character array size for Fw::String +#endif + // Specifies the size of the buffer that contains the serialized parameter value. #ifndef FW_PARAM_BUFFER_MAX_SIZE #define FW_PARAM_BUFFER_MAX_SIZE (FW_COM_BUFFER_MAX_SIZE - sizeof(FwPrmIdType) - sizeof(FwPacketDescriptorType)) From 0f0692a99661673757bb2c8345781c83c18c2517 Mon Sep 17 00:00:00 2001 From: Shivaly Date: Wed, 4 Sep 2024 15:00:43 -0700 Subject: [PATCH 17/37] FP-2784: Trace devel --- Ref/Top/RefTopology.cpp | 1 + Svc/TraceLogger/TraceLogger.cpp | 97 +++++++++++-------- Svc/TraceLogger/TraceLogger.fpp | 17 +++- Svc/TraceLogger/TraceLogger.hpp | 25 ++++- Svc/TraceLogger/test/ut/TraceLoggerTester.cpp | 23 ++++- config/TraceLoggerCfg.fpp | 19 +++- 6 files changed, 129 insertions(+), 53 deletions(-) diff --git a/Ref/Top/RefTopology.cpp b/Ref/Top/RefTopology.cpp index 91bc825a23..edf5b1d75b 100644 --- a/Ref/Top/RefTopology.cpp +++ b/Ref/Top/RefTopology.cpp @@ -140,6 +140,7 @@ void configureTopology() { //Configure Trace Logger filename to be used for storing trace data traceLogger.configure("TraceFile.dat"); + traceLogger.filter(0xF,Svc::TraceLogger_Enable::ENABLE); } // Public functions for use in main program are namespaced with deployment name Ref diff --git a/Svc/TraceLogger/TraceLogger.cpp b/Svc/TraceLogger/TraceLogger.cpp index c716041224..f30e378390 100644 --- a/Svc/TraceLogger/TraceLogger.cpp +++ b/Svc/TraceLogger/TraceLogger.cpp @@ -30,7 +30,8 @@ namespace Svc { m_maxFileSize(0), m_byteCount(0), m_log_init(false), - m_enable_trace(true) + m_enable_trace(true), + m_traceFilter(0) { m_file_buffer.setData(m_file_data); m_file_buffer.setSize(FW_TRACE_MAX_SER_SIZE); @@ -51,6 +52,7 @@ namespace Svc { } void TraceLogger::set_log_file(const char* fileName, const U32 maxSize) { + FW_ASSERT(fileName != nullptr); //If a file is already open then close it if(this->m_mode == OPEN) { @@ -79,10 +81,26 @@ namespace Svc { } void TraceLogger::configure(const char* file) { - printf("HERE1: Configure, set file name\n"); + //printf("HERE1: Configure, set file name\n"); this->set_log_file(file); } + void TraceLogger::filter(U16 traceType_bitmask, bool enable){ + if(traceType_bitmask == 0){ + //TODO: Figure out if this should be made an illegal entry? + // + } + + if(enable == true) { + this->m_traceFilter |= traceType_bitmask; + } + else { //disable + U16 mask = 0xFFFF ^ traceType_bitmask; + this->m_traceFilter &= mask; + } + + } + void TraceLogger::write_log_file(U8* data, U32 size) { //Write data to the trace logger @@ -90,21 +108,24 @@ namespace Svc { if(this->m_enable_trace && this->m_mode == OPEN){ //&& size > 0){ - //TODO: Figure out how to write to a circular file especially when data size varies between each typeId //Check if the file size exceeds U32 expected_byte_count = this->m_byteCount+size; if (expected_byte_count > this->m_maxFileSize) { //Rewrite file - //Plan is to make it a circular file - } - else { - FwSignedSizeType writeSize = size; - printf ("WRITING TO FILE HERE\n"); - Os::File::Status stat = this->m_log_file.write(reinterpret_cast(data),writeSize,Os::File::WAIT); - // Assert if file is not already open - FW_ASSERT(stat != Os::File::NOT_OPENED); - this->m_byteCount += (size); + //Current design supports writing to a circular file + //printf ("File will be overwritten. Seeking beginning of file\n"); + (void)this->m_log_file.seek(0,Os::FileInterface::SeekType::ABSOLUTE); } + //else { + FwSignedSizeType writeSize = size; + FwSignedSizeType fileSize; + (void) this->m_log_file.position(fileSize); + //printf ("WRITING TO FILE HERE. File position is: %lld\n",fileSize); + Os::File::Status stat = this->m_log_file.write(reinterpret_cast(data),writeSize,Os::File::WAIT); + // Assert if file is not already open + FW_ASSERT(stat != Os::File::NOT_OPENED); + this->m_byteCount += (size); + //} } } // ---------------------------------------------------------------------- @@ -117,29 +138,13 @@ namespace Svc { const Fw::TraceCfg::TraceType& type, Fw::TraceBuffer& args) { - /* TODO: Figure out what to do with trace types - const char *traceTypeString = "UNKNOWN"; - switch (type.e) { - case Fw::TraceType::USER: - traceTypeString = "ABRIDGED"; - break; - case Fw::TraceType::FULL: - traceTypeString = "FULL"; - break; - } - - //snprintf(sizeof(FwTraceIdType)+sizeof(timeTag)+sizeof(args) - */ - - /* TODO: Perhaps create a trace packet, serialize and then write to File? Discuss with Tim - //Format Trace data - Fw::TracePacket trace_packet; - trace_packet.setId(id); - trace_packet.setTimeTag(timeTag); - trace_packet.setTraceBuffer(args); - trace_packet.toString; - args. - */ + FW_ASSERT(type.isValid()); + U16 bit_mask = static_cast (FILTER_BIT << type.e); + //Only log data that is enabled by either config or user + if(!(this->m_traceFilter & bit_mask)) { + //TODO: Should we generate an event here, letting user know that this specific filter is disabled? + return; + } //Make a call to reset Fw::SerializeBufferBase& buf_ref = m_file_buffer.getSerializeRepr(); @@ -147,11 +152,16 @@ namespace Svc { buf_ref.serialize(id); buf_ref.serialize(timeTag); buf_ref.serialize(args); - printf("Buffer size is :%d, Buffer capacity is: %d\n",m_file_buffer.getSize(),m_file_buffer.getBuffCapacity()); + //printf("Buffer size is :%d, Full buffer length: %d\n",m_file_buffer.getSize(),buf_ref.getBuffLength()); + //Note: Because its a circular file we're writing the full buffer capacatiy to the file + // instead of the actual buffer size (variable based on number of args). This will + // ensure when the file is overwritten, we preserve old records this->write_log_file(m_file_buffer.getData(),m_file_buffer.getSize()); + // If we choose not to use circular file write then use the below line instead. + //this->write_log_file(m_file_buffer.getData(),buf_ref.getBuffLength()); /* - //convert trace data to string + //convert trace data to string to make it readable std::string args_text; args.toString(args_text); char textStr[FW_TRACE_BUFFER_MAX_SIZE]; @@ -169,8 +179,9 @@ namespace Svc { // Handler implementations for commands // ---------------------------------------------------------------------- - void TraceLogger ::EnableTrace_cmdHandler(FwOpcodeType opCode, U32 cmdSeq, bool enable) { - + void TraceLogger ::EnableTrace_cmdHandler(FwOpcodeType opCode, U32 cmdSeq, Svc::TraceLogger_Enable enable) { + + FW_ASSERT(enable.isValid()); this->m_enable_trace = enable; this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); } @@ -179,5 +190,11 @@ namespace Svc { // TODO this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); } - + void TraceLogger ::FilterTrace_cmdHandler(FwOpcodeType opCode, + U32 cmdSeq, + U16 bitmask, + Svc::TraceLogger_Enable enable) { + this->filter(bitmask,enable); + this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); + } } // namespace Svc diff --git a/Svc/TraceLogger/TraceLogger.fpp b/Svc/TraceLogger/TraceLogger.fpp index 782328339c..03c868e50e 100644 --- a/Svc/TraceLogger/TraceLogger.fpp +++ b/Svc/TraceLogger/TraceLogger.fpp @@ -6,9 +6,9 @@ module Svc { # ---------------------------------------------------------------------- # Types # ---------------------------------------------------------------------- - enum Enabled { - DISABLED = 0 @< Disabled state - ENABLED = 1 @< Enabled state + enum Enable { + DISABLE = 0 @< Disabled state + ENABLE = 1 @< Enabled state } # ---------------------------------------------------------------------- @@ -22,7 +22,7 @@ module Svc { # ---------------------------------------------------------------------- @ Enable or disable trace async command EnableTrace ( - enable : bool + $enable : Enable )\ opcode 0x00 @@ -30,12 +30,19 @@ module Svc { async command DumpTraceDp\ opcode 0x01 + @Select which trace types to be logged + async command FilterTrace ( + bitmask: U16 @< TraceTypes to filter on + $enable : Enable @< enable or disable filtering + )\ + opcode 0x02 + # ---------------------------------------------------------------------- # Events # ---------------------------------------------------------------------- @ Trace logging status event TraceStatus( - $status: Enabled @< Status of Trace + $status: Enable @< Status of Trace ) \ severity diagnostic \ id 0x00 \ diff --git a/Svc/TraceLogger/TraceLogger.hpp b/Svc/TraceLogger/TraceLogger.hpp index 2c99702052..1c7e675596 100644 --- a/Svc/TraceLogger/TraceLogger.hpp +++ b/Svc/TraceLogger/TraceLogger.hpp @@ -29,6 +29,9 @@ //Max size of the Trace buffer including metadata (id,timetag,arguments) static const FwSizeType FW_TRACE_MAX_SER_SIZE = (FW_TRACE_BUFFER_MAX_SIZE + sizeof(FwTraceIdType) + Fw::Time::SERIALIZED_SIZE); +//Mask bit for filtering on trace types +static const U16 FILTER_BIT = 1; + namespace Svc { @@ -69,6 +72,14 @@ class TraceLogger : public TraceLoggerComponentBase { //! \param file file where traces are stored. void configure(const char* file); + //! \brief Trace Logger filter method + //! + //! The filter method selects which trace types to be logged and which to ignore. + //! + //! \param tracetypes provides bitmasks for tracetypes to select. + //! \param enable to turn on/off filtering . + void filter(U16 traceType_bitmask,bool enable); + //! Destroy TraceLogger object ~TraceLogger(); @@ -98,7 +109,7 @@ class TraceLogger : public TraceLoggerComponentBase { //! Enable or disable trace void EnableTrace_cmdHandler(FwOpcodeType opCode, //!< The opcode U32 cmdSeq, //!< The command sequence number - bool enable) override; + Svc::TraceLogger_Enable enable) override; //! Handler implementation for command DumpTraceDp //! @@ -106,6 +117,16 @@ class TraceLogger : public TraceLoggerComponentBase { void DumpTraceDp_cmdHandler(FwOpcodeType opCode, //!< The opcode U32 cmdSeq //!< The command sequence number ) override; + + //! Handler implementation for command FilterTrace + //! + //! Select which trace types to be logged + void FilterTrace_cmdHandler(FwOpcodeType opCode, //!< The opcode + U32 cmdSeq, //!< The command sequence number + U16 bitmask, //!< TraceTypes to log on + Svc::TraceLogger_Enable enable //!< enable or disable logging + ) override; + // ---------------------------------------------------------------------- // Member Variables // ---------------------------------------------------------------------- @@ -125,6 +146,8 @@ class TraceLogger : public TraceLoggerComponentBase { bool m_enable_trace; //Is trace logging enabled U8 m_file_data[FW_TRACE_MAX_SER_SIZE]; //Holds a max size including metadata Fw::Buffer m_file_buffer; + //filter trace types + U16 m_traceFilter; //Select which trace types to allow logging // ---------------------------------------------------------------------- // File functions: diff --git a/Svc/TraceLogger/test/ut/TraceLoggerTester.cpp b/Svc/TraceLogger/test/ut/TraceLoggerTester.cpp index e1dbd044dd..d1800db9f7 100644 --- a/Svc/TraceLogger/test/ut/TraceLoggerTester.cpp +++ b/Svc/TraceLogger/test/ut/TraceLoggerTester.cpp @@ -27,6 +27,7 @@ TraceLoggerTester ::~TraceLoggerTester() {} // ---------------------------------------------------------------------- void TraceLoggerTester::test_startup(){ this->component.configure("TraceFile.dat"); + this->component.filter(0xF,Svc::TraceLogger_Enable::ENABLE); } void TraceLoggerTester ::test_file() { Fw::Time timeTag; @@ -36,7 +37,7 @@ void TraceLoggerTester ::test_file() { timeTag.getUSeconds(); U8 buffer[5]= {1,2,3,4,5}; Fw::TraceBuffer trace_buffer(buffer,sizeof(buffer)); - printf("Invoking the port here:\n"); + printf("Test File Writes, including exercising circular buffer fill\n"); this->invoke_to_TraceBufferLogger(0,1,timeTag,Fw::TraceCfg::TraceType::MESSAGE_QUEUE,trace_buffer); this->component.doDispatch(); @@ -44,7 +45,25 @@ void TraceLoggerTester ::test_file() { Fw::TraceBuffer trace_buffer_1(buffer_1,sizeof(buffer_1)); this->invoke_to_TraceBufferLogger(0,2,timeTag,Fw::TraceCfg::TraceType::MESSAGE_QUEUE,trace_buffer_1); this->component.doDispatch(); - + this->invoke_to_TraceBufferLogger(0,3,timeTag,Fw::TraceCfg::TraceType::MESSAGE_DEQUEUE,trace_buffer_1); + this->component.doDispatch(); + this->invoke_to_TraceBufferLogger(0,4,timeTag,Fw::TraceCfg::TraceType::USER,trace_buffer_1); + this->component.doDispatch(); + this->invoke_to_TraceBufferLogger(0,5,timeTag,Fw::TraceCfg::TraceType::PORT_CALL,trace_buffer_1); + this->component.doDispatch(); + printf("Test Trace Type Filter\n"); + this->sendCmd_FilterTrace(0,1,0x6,Svc::TraceLogger_Enable::DISABLE); + this->component.doDispatch(); + ASSERT_CMD_RESPONSE(0, 2, 1, Fw::CmdResponse::OK); + this->invoke_to_TraceBufferLogger(0,6,timeTag,Fw::TraceCfg::TraceType::USER,trace_buffer_1); + this->component.doDispatch(); + this->invoke_to_TraceBufferLogger(0,7,timeTag,Fw::TraceCfg::TraceType::MESSAGE_DEQUEUE,trace_buffer_1); + this->component.doDispatch(); + printf("EXEC last data write\n"); + this->invoke_to_TraceBufferLogger(0,8,timeTag,Fw::TraceCfg::TraceType::MESSAGE_QUEUE,trace_buffer_1); + this->component.doDispatch(); + this->invoke_to_TraceBufferLogger(0,9,timeTag,Fw::TraceCfg::TraceType::MESSAGE_QUEUE,trace_buffer_1); + this->component.doDispatch(); } } // namespace Svc diff --git a/config/TraceLoggerCfg.fpp b/config/TraceLoggerCfg.fpp index 920c5b4fc7..debb27ed0c 100644 --- a/config/TraceLoggerCfg.fpp +++ b/config/TraceLoggerCfg.fpp @@ -1,18 +1,27 @@ # ====================================================================== # FPP file for Version configuration # ====================================================================== +# From Design review, it was requested that we add more trace types such as +# interrupts, exceptions, context switch,queue add/remove, EVRs, +# semaphore takes(?), stack trace, DMAs +# Also consider adding adding state machine transitions, timer acquisition +# and release traces, and EVRS to the category of traces that are automated. +# Also consider what a potential IO trace could look like. A ring buffer for IO +# is always requested for 1553 and recently M-Bus on Psyche. Presumably a +# limited IO trace of some could be packaged with the autopsy log and be useful. module Fw { module TraceCfg { @Enum representing trace Types - @TODO: Talk with Tim to figure out what enums we'd want for trace types + @Note: Trace Types are configurable by the project and defined here. + @ It is stored as a bitmask that will be used for log filtering. enum TraceType { - MESSAGE_QUEUE = 1 @< Trace type of message wait - MESSAGE_DEQUEUE = 2 @< Trace type of message dequeue - PORT_CALL = 3 @< Trace type of port invocations - USER = 4 @< user invoked trace + MESSAGE_QUEUE = 0 @< Trace type of message wait + MESSAGE_DEQUEUE = 1 @< Trace type of message dequeue + PORT_CALL = 2 @< Trace type of port invocations + USER = 3 @< user invoked trace } } From a94b8f789b44e32fdb0c44398a4757439b31dd35 Mon Sep 17 00:00:00 2001 From: Shivaly Date: Mon, 9 Sep 2024 13:11:25 -0700 Subject: [PATCH 18/37] FP-2784: Updates including Tim's suggestions --- Svc/TraceLogger/TraceFile.dat | Bin 0 -> 1632 bytes Svc/TraceLogger/TraceLogger.cpp | 66 +++++++++++------- Svc/TraceLogger/TraceLogger.hpp | 5 +- Svc/TraceLogger/test/ut/TraceLoggerTester.cpp | 49 ++++++++----- config/FpConfig.h | 5 ++ config/TraceLoggerCfg.fpp | 16 +++-- 6 files changed, 93 insertions(+), 48 deletions(-) create mode 100644 Svc/TraceLogger/TraceFile.dat diff --git a/Svc/TraceLogger/TraceFile.dat b/Svc/TraceLogger/TraceFile.dat new file mode 100644 index 0000000000000000000000000000000000000000..a6ea7190c163d0248ff93ba878dfb77aa2c68e10 GIT binary patch literal 1632 zcmZQzU|?iG0<4To%q*-o%qK8|gdI-Y&j-;kzQhTCuyPn5oi2c?e<8~PRu{kOOisQ=H}?S4J?ON+d5HVIq=U;?pVfLm0}+#_<;?lX7a{U4#>!3+xv5Iq_m3@oGJ W0nbmM{K7gK9w_0#HX0s?@Bjc9=QE!G literal 0 HcmV?d00001 diff --git a/Svc/TraceLogger/TraceLogger.cpp b/Svc/TraceLogger/TraceLogger.cpp index f30e378390..de76874b98 100644 --- a/Svc/TraceLogger/TraceLogger.cpp +++ b/Svc/TraceLogger/TraceLogger.cpp @@ -30,11 +30,13 @@ namespace Svc { m_maxFileSize(0), m_byteCount(0), m_log_init(false), - m_enable_trace(true), + //m_enable_trace(true), m_traceFilter(0) { m_file_buffer.setData(m_file_data); m_file_buffer.setSize(FW_TRACE_MAX_SER_SIZE); + + m_enable_trace = (FW_TRACE_RECORD_TRACE == true) ? true : false; } TraceLogger::~TraceLogger() { @@ -53,31 +55,33 @@ namespace Svc { void TraceLogger::set_log_file(const char* fileName, const U32 maxSize) { - FW_ASSERT(fileName != nullptr); - //If a file is already open then close it - if(this->m_mode == OPEN) { - this->m_mode = CLOSED; - this->m_log_file.close(); - } + if(this->m_enable_trace == true) { + FW_ASSERT(fileName != nullptr); + //If a file is already open then close it + if(this->m_mode == OPEN) { + this->m_mode = CLOSED; + this->m_log_file.close(); + } - //If file name is too large then return failure - U32 fileNameSize = Fw::StringUtils::string_length(fileName, Fw::String::STRING_SIZE); - if (fileNameSize == Fw::String::STRING_SIZE) { - this->m_enable_trace = false; - } - - Os::File::Status stat = this->m_log_file.open(fileName, Os::File::OPEN_CREATE, Os::File::OverwriteType::OVERWRITE); + //If file name is too large then return failure + FwSizeType fileNameSize = Fw::StringUtils::string_length(fileName, static_cast(Fw::String::STRING_SIZE)); + if (fileNameSize == Fw::String::STRING_SIZE) { + this->m_enable_trace = false; + } + + Os::File::Status stat = this->m_log_file.open(fileName, Os::File::OPEN_CREATE, Os::File::OverwriteType::OVERWRITE); - // Bad status when trying to open the file: - if (stat != Os::File::OP_OK) { - this->m_enable_trace = false; - this->log_WARNING_LO_TraceFileOpenError(static_cast(fileName)); - } + // Bad status when trying to open the file: + if (stat != Os::File::OP_OK) { + this->m_enable_trace = false; + this->log_WARNING_LO_TraceFileOpenError(static_cast(fileName)); + } - this->m_byteCount = 0; - this->m_maxFileSize = maxSize; - this->m_fileName = fileName; - this->m_mode = OPEN; + this->m_byteCount = 0; + this->m_maxFileSize = maxSize; + this->m_fileName = fileName; + this->m_mode = OPEN; + } } void TraceLogger::configure(const char* file) { @@ -87,7 +91,7 @@ namespace Svc { void TraceLogger::filter(U16 traceType_bitmask, bool enable){ if(traceType_bitmask == 0){ - //TODO: Figure out if this should be made an illegal entry? + //TODO: Figure out if this should be made an illegal entry or just ignore it? // } @@ -115,6 +119,7 @@ namespace Svc { //Current design supports writing to a circular file //printf ("File will be overwritten. Seeking beginning of file\n"); (void)this->m_log_file.seek(0,Os::FileInterface::SeekType::ABSOLUTE); + this->m_byteCount = 0; } //else { FwSignedSizeType writeSize = size; @@ -125,6 +130,7 @@ namespace Svc { // Assert if file is not already open FW_ASSERT(stat != Os::File::NOT_OPENED); this->m_byteCount += (size); + //} } } @@ -140,6 +146,7 @@ namespace Svc { FW_ASSERT(type.isValid()); U16 bit_mask = static_cast (FILTER_BIT << type.e); + U32 traceSize = 0; //Only log data that is enabled by either config or user if(!(this->m_traceFilter & bit_mask)) { //TODO: Should we generate an event here, letting user know that this specific filter is disabled? @@ -151,12 +158,19 @@ namespace Svc { buf_ref.resetSer(); buf_ref.serialize(id); buf_ref.serialize(timeTag); - buf_ref.serialize(args); + if(FW_TRACE_RECORD_MINIMAL == false) { + buf_ref.serialize(args); + traceSize = m_file_buffer.getSize(); //Record max size of each trace record for circular file + } + else { + traceSize = buf_ref.getBuffLength(); //Record only id & timetag + printf("File size %d",buf_ref.getBuffLength()); + } //printf("Buffer size is :%d, Full buffer length: %d\n",m_file_buffer.getSize(),buf_ref.getBuffLength()); //Note: Because its a circular file we're writing the full buffer capacatiy to the file // instead of the actual buffer size (variable based on number of args). This will // ensure when the file is overwritten, we preserve old records - this->write_log_file(m_file_buffer.getData(),m_file_buffer.getSize()); + this->write_log_file(m_file_buffer.getData(),traceSize); // If we choose not to use circular file write then use the below line instead. //this->write_log_file(m_file_buffer.getData(),buf_ref.getBuffLength()); diff --git a/Svc/TraceLogger/TraceLogger.hpp b/Svc/TraceLogger/TraceLogger.hpp index 1c7e675596..fac5b00289 100644 --- a/Svc/TraceLogger/TraceLogger.hpp +++ b/Svc/TraceLogger/TraceLogger.hpp @@ -26,6 +26,9 @@ #define FILE_NAME_MAX 255 #endif +constexpr bool FW_TRACE_RECORD_TRACE = true; +constexpr bool FW_TRACE_RECORD_MINIMAL = false; + //Max size of the Trace buffer including metadata (id,timetag,arguments) static const FwSizeType FW_TRACE_MAX_SER_SIZE = (FW_TRACE_BUFFER_MAX_SIZE + sizeof(FwTraceIdType) + Fw::Time::SERIALIZED_SIZE); @@ -63,7 +66,7 @@ class TraceLogger : public TraceLoggerComponentBase { //! \param maxSize The max size of the file //! //! \return true if creating the file was successful, false otherwise - void set_log_file(const char* fileName, const U32 maxSize=2048); + void set_log_file(const char* fileName, const U32 maxSize=FW_TRACE_FILE_MAX_SIZE); //! \brief Trace Logger configure method //! diff --git a/Svc/TraceLogger/test/ut/TraceLoggerTester.cpp b/Svc/TraceLogger/test/ut/TraceLoggerTester.cpp index d1800db9f7..39ac4b74a2 100644 --- a/Svc/TraceLogger/test/ut/TraceLoggerTester.cpp +++ b/Svc/TraceLogger/test/ut/TraceLoggerTester.cpp @@ -35,35 +35,50 @@ void TraceLoggerTester ::test_file() { timeTag.getContext(); timeTag.getSeconds(); timeTag.getUSeconds(); - U8 buffer[5]= {1,2,3,4,5}; - Fw::TraceBuffer trace_buffer(buffer,sizeof(buffer)); + printf("Test File Writes, including exercising circular buffer fill\n"); - - this->invoke_to_TraceBufferLogger(0,1,timeTag,Fw::TraceCfg::TraceType::MESSAGE_QUEUE,trace_buffer); + + //Write to file until it circles back to the beginning into 2 entries + int file_entries = (FW_TRACE_FILE_MAX_SIZE / FW_TRACE_MAX_SER_SIZE)+2; + U8 type_entry = 0; //to interate over trace type + U8 buffer[11] = {0x15,0x26,0x37,0x48,0x59,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF}; //arguments to write + Fw::TraceBuffer trace_buffer_args(buffer,sizeof(buffer)); + + for (int i = 0; i < file_entries; i++) { + type_entry = (type_entry+1) % 4; + this->invoke_to_TraceBufferLogger(0,i,timeTag,static_cast(type_entry),trace_buffer_args); + this->component.doDispatch(); + + } + + printf("Test Trace Type Filter\n"); + //Filter out message_dequeue and port_call + this->sendCmd_FilterTrace(0,1,0x6,Svc::TraceLogger_Enable::DISABLE); this->component.doDispatch(); - U8 buffer_1[11] = {0x15,0x26,0x37,0x48,0x59,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF}; - Fw::TraceBuffer trace_buffer_1(buffer_1,sizeof(buffer_1)); - this->invoke_to_TraceBufferLogger(0,2,timeTag,Fw::TraceCfg::TraceType::MESSAGE_QUEUE,trace_buffer_1); + ASSERT_CMD_RESPONSE(0, 2, 1, Fw::CmdResponse::OK); + this->invoke_to_TraceBufferLogger(0,0xAA,timeTag,Fw::TraceCfg::TraceType::MESSAGE_QUEUE,trace_buffer_args); this->component.doDispatch(); - this->invoke_to_TraceBufferLogger(0,3,timeTag,Fw::TraceCfg::TraceType::MESSAGE_DEQUEUE,trace_buffer_1); + this->invoke_to_TraceBufferLogger(0,0xBB,timeTag,Fw::TraceCfg::TraceType::MESSAGE_DEQUEUE,trace_buffer_args); this->component.doDispatch(); - this->invoke_to_TraceBufferLogger(0,4,timeTag,Fw::TraceCfg::TraceType::USER,trace_buffer_1); + this->invoke_to_TraceBufferLogger(0,0xCC,timeTag,Fw::TraceCfg::TraceType::PORT_CALL,trace_buffer_args); this->component.doDispatch(); - this->invoke_to_TraceBufferLogger(0,5,timeTag,Fw::TraceCfg::TraceType::PORT_CALL,trace_buffer_1); + this->invoke_to_TraceBufferLogger(0,0xDD,timeTag,Fw::TraceCfg::TraceType::USER,trace_buffer_args); this->component.doDispatch(); - printf("Test Trace Type Filter\n"); - this->sendCmd_FilterTrace(0,1,0x6,Svc::TraceLogger_Enable::DISABLE); + + //enable all trace type filters and ensure they're received + //Filter out message_dequeue and port_call + this->sendCmd_FilterTrace(0,1,0xF,Svc::TraceLogger_Enable::ENABLE); this->component.doDispatch(); ASSERT_CMD_RESPONSE(0, 2, 1, Fw::CmdResponse::OK); - this->invoke_to_TraceBufferLogger(0,6,timeTag,Fw::TraceCfg::TraceType::USER,trace_buffer_1); + this->invoke_to_TraceBufferLogger(0,0xAA,timeTag,Fw::TraceCfg::TraceType::MESSAGE_QUEUE,trace_buffer_args); this->component.doDispatch(); - this->invoke_to_TraceBufferLogger(0,7,timeTag,Fw::TraceCfg::TraceType::MESSAGE_DEQUEUE,trace_buffer_1); + this->invoke_to_TraceBufferLogger(0,0xBB,timeTag,Fw::TraceCfg::TraceType::MESSAGE_DEQUEUE,trace_buffer_args); this->component.doDispatch(); - printf("EXEC last data write\n"); - this->invoke_to_TraceBufferLogger(0,8,timeTag,Fw::TraceCfg::TraceType::MESSAGE_QUEUE,trace_buffer_1); + this->invoke_to_TraceBufferLogger(0,0xCC,timeTag,Fw::TraceCfg::TraceType::PORT_CALL,trace_buffer_args); this->component.doDispatch(); - this->invoke_to_TraceBufferLogger(0,9,timeTag,Fw::TraceCfg::TraceType::MESSAGE_QUEUE,trace_buffer_1); + this->invoke_to_TraceBufferLogger(0,0xDD,timeTag,Fw::TraceCfg::TraceType::USER,trace_buffer_args); this->component.doDispatch(); + } } // namespace Svc diff --git a/config/FpConfig.h b/config/FpConfig.h index d23a20d9f2..6fb15c61dd 100644 --- a/config/FpConfig.h +++ b/config/FpConfig.h @@ -327,6 +327,11 @@ typedef FwIndexType FwQueueSizeType; #define FW_TRACE_BUFFER_MAX_SIZE 257 #endif +// Specifies the size of the file that contains the serialized trace value. +#ifndef FW_TRACE_FILE_MAX_SIZE +#define FW_TRACE_FILE_MAX_SIZE 2720000 +#endif + // Specifies the size of the buffer that contains the serialized parameter value. #ifndef FW_PARAM_BUFFER_MAX_SIZE diff --git a/config/TraceLoggerCfg.fpp b/config/TraceLoggerCfg.fpp index debb27ed0c..e87b977849 100644 --- a/config/TraceLoggerCfg.fpp +++ b/config/TraceLoggerCfg.fpp @@ -9,20 +9,28 @@ # Also consider what a potential IO trace could look like. A ring buffer for IO # is always requested for 1553 and recently M-Bus on Psyche. Presumably a # limited IO trace of some could be packaged with the autopsy log and be useful. + +#Note: Trace Types are configurable by the project and defined here. +# It is stored as a bitmask that will be used for log filtering. +# Current design allows a max of 16 trace types module Fw { module TraceCfg { - @Enum representing trace Types - @Note: Trace Types are configurable by the project and defined here. - @ It is stored as a bitmask that will be used for log filtering. + @Enum representing trace Types (aka Trace Categories) enum TraceType { MESSAGE_QUEUE = 0 @< Trace type of message wait MESSAGE_DEQUEUE = 1 @< Trace type of message dequeue PORT_CALL = 2 @< Trace type of port invocations USER = 3 @< user invoked trace + #=====Do Not Delete above======# + INTERRUPTS = 4 @Trace type for interrupts handled + CONTEXT_SWITCH = 5 @Trace type for context switching + EVENTS = 6 @Trace type for Events generated + SEMAPHORES = 7 @trace type for semaphores taken + STATE_MACHINE = 8 @trace type for state machine transitions + MAX_TRACE_TYPES = 9 } } - } \ No newline at end of file From 3e2879726cd912fd2692a389fcbecbe936cc2e12 Mon Sep 17 00:00:00 2001 From: Shivaly Date: Wed, 18 Sep 2024 10:17:43 -0700 Subject: [PATCH 19/37] FP-2784: Updates based on discussions with Tim --- Ref/Top/RefTopology.cpp | 2 +- Svc/CMakeLists.txt | 2 +- Svc/TraceLogger/CMakeLists.txt | 29 --- Svc/TraceLogger/TraceFile.dat | Bin 1632 -> 0 bytes Svc/TraceLogger/TraceLogger.cpp | 214 ------------------ Svc/TraceLogger/TraceLogger.fpp | 83 ------- Svc/TraceLogger/TraceLogger.hpp | 173 -------------- .../test/ut/TraceLoggerTestMain.cpp | 23 -- Svc/TraceLogger/test/ut/TraceLoggerTester.cpp | 84 ------- Svc/TraceLogger/test/ut/TraceLoggerTester.hpp | 72 ------ .../test/ut/TraceLoggerTesterHelpers.cpp | 42 ---- config/CMakeLists.txt | 2 +- config/FpConfig.h | 6 - config/TraceLoggerCfg.fpp | 36 --- 14 files changed, 3 insertions(+), 765 deletions(-) delete mode 100644 Svc/TraceLogger/CMakeLists.txt delete mode 100644 Svc/TraceLogger/TraceFile.dat delete mode 100644 Svc/TraceLogger/TraceLogger.cpp delete mode 100644 Svc/TraceLogger/TraceLogger.fpp delete mode 100644 Svc/TraceLogger/TraceLogger.hpp delete mode 100644 Svc/TraceLogger/test/ut/TraceLoggerTestMain.cpp delete mode 100644 Svc/TraceLogger/test/ut/TraceLoggerTester.cpp delete mode 100644 Svc/TraceLogger/test/ut/TraceLoggerTester.hpp delete mode 100644 Svc/TraceLogger/test/ut/TraceLoggerTesterHelpers.cpp delete mode 100644 config/TraceLoggerCfg.fpp diff --git a/Ref/Top/RefTopology.cpp b/Ref/Top/RefTopology.cpp index ea1cf4fc53..320eeae269 100644 --- a/Ref/Top/RefTopology.cpp +++ b/Ref/Top/RefTopology.cpp @@ -139,7 +139,7 @@ void configureTopology() { //tlmSend.setPacketList(RefPacketsPkts, RefPacketsIgnore, 1); //Configure Trace Logger filename to be used for storing trace data - traceLogger.configure("TraceFile.dat"); + traceLogger.configure("TraceFile.dat",2720000); traceLogger.filter(0xF,Svc::TraceLogger_Enable::ENABLE); } diff --git a/Svc/CMakeLists.txt b/Svc/CMakeLists.txt index d7945d31c3..ecc4b95d52 100644 --- a/Svc/CMakeLists.txt +++ b/Svc/CMakeLists.txt @@ -47,7 +47,7 @@ add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/TlmChan/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/TlmPacketizer/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/SystemResources/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Ports/VersionPorts") -add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/TraceLogger/") +add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/TraceFileLogger/") # Text logger components included by default, # but can be disabled if FW_ENABLE_TEXT_LOGGING=0 is desired. diff --git a/Svc/TraceLogger/CMakeLists.txt b/Svc/TraceLogger/CMakeLists.txt deleted file mode 100644 index c7fa9cb5d1..0000000000 --- a/Svc/TraceLogger/CMakeLists.txt +++ /dev/null @@ -1,29 +0,0 @@ -#### -# F prime CMakeLists.txt: -# -# SOURCE_FILES: combined list of source and autocoding files -# MOD_DEPS: (optional) module dependencies -# -# Note: using PROJECT_NAME as EXECUTABLE_NAME -#### -set(SOURCE_FILES - "${CMAKE_CURRENT_LIST_DIR}/TraceLogger.fpp" - "${CMAKE_CURRENT_LIST_DIR}/TraceLogger.cpp" -) - -register_fprime_module() - -set(UT_SOURCE_FILES - "${CMAKE_CURRENT_LIST_DIR}/TraceLogger.fpp" - "${CMAKE_CURRENT_LIST_DIR}/test/ut/TraceLoggerTester.cpp" - "${CMAKE_CURRENT_LIST_DIR}/test/ut/TraceLoggerTestMain.cpp" -) - -set(UT_MOD_DEPS - Fw/Buffer - STest -) - -set(UT_AUTO_HELPERS ON) -register_fprime_ut() - diff --git a/Svc/TraceLogger/TraceFile.dat b/Svc/TraceLogger/TraceFile.dat deleted file mode 100644 index a6ea7190c163d0248ff93ba878dfb77aa2c68e10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1632 zcmZQzU|?iG0<4To%q*-o%qK8|gdI-Y&j-;kzQhTCuyPn5oi2c?e<8~PRu{kOOisQ=H}?S4J?ON+d5HVIq=U;?pVfLm0}+#_<;?lX7a{U4#>!3+xv5Iq_m3@oGJ W0nbmM{K7gK9w_0#HX0s?@Bjc9=QE!G diff --git a/Svc/TraceLogger/TraceLogger.cpp b/Svc/TraceLogger/TraceLogger.cpp deleted file mode 100644 index de76874b98..0000000000 --- a/Svc/TraceLogger/TraceLogger.cpp +++ /dev/null @@ -1,214 +0,0 @@ -// ====================================================================== -// \title TraceLogger.cpp -// \author sreddy -// \brief cpp file for TraceLogger component implementation class -// ====================================================================== - -#include "Svc/TraceLogger/TraceLogger.hpp" -#include "FpConfig.hpp" -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace Svc { - - // ---------------------------------------------------------------------- - // Component construction and destruction - // ---------------------------------------------------------------------- - - TraceLogger::TraceLogger(const char* const compName) : - TraceLoggerComponentBase(compName), - m_log_file(), - m_mode(CLOSED), - m_fileName(), - m_maxFileSize(0), - m_byteCount(0), - m_log_init(false), - //m_enable_trace(true), - m_traceFilter(0) - { - m_file_buffer.setData(m_file_data); - m_file_buffer.setSize(FW_TRACE_MAX_SER_SIZE); - - m_enable_trace = (FW_TRACE_RECORD_TRACE == true) ? true : false; - } - - TraceLogger::~TraceLogger() { - if(OPEN == this->m_mode) { - //Close file - this->m_log_file.close(); - this->m_mode = CLOSED; - } - } - - void TraceLogger :: - init(NATIVE_INT_TYPE queueDepth, NATIVE_INT_TYPE instance) - { - TraceLoggerComponentBase::init(queueDepth,instance); - } - - void TraceLogger::set_log_file(const char* fileName, const U32 maxSize) { - - if(this->m_enable_trace == true) { - FW_ASSERT(fileName != nullptr); - //If a file is already open then close it - if(this->m_mode == OPEN) { - this->m_mode = CLOSED; - this->m_log_file.close(); - } - - //If file name is too large then return failure - FwSizeType fileNameSize = Fw::StringUtils::string_length(fileName, static_cast(Fw::String::STRING_SIZE)); - if (fileNameSize == Fw::String::STRING_SIZE) { - this->m_enable_trace = false; - } - - Os::File::Status stat = this->m_log_file.open(fileName, Os::File::OPEN_CREATE, Os::File::OverwriteType::OVERWRITE); - - // Bad status when trying to open the file: - if (stat != Os::File::OP_OK) { - this->m_enable_trace = false; - this->log_WARNING_LO_TraceFileOpenError(static_cast(fileName)); - } - - this->m_byteCount = 0; - this->m_maxFileSize = maxSize; - this->m_fileName = fileName; - this->m_mode = OPEN; - } - } - - void TraceLogger::configure(const char* file) { - //printf("HERE1: Configure, set file name\n"); - this->set_log_file(file); - } - - void TraceLogger::filter(U16 traceType_bitmask, bool enable){ - if(traceType_bitmask == 0){ - //TODO: Figure out if this should be made an illegal entry or just ignore it? - // - } - - if(enable == true) { - this->m_traceFilter |= traceType_bitmask; - } - else { //disable - U16 mask = 0xFFFF ^ traceType_bitmask; - this->m_traceFilter &= mask; - } - - } - - void TraceLogger::write_log_file(U8* data, U32 size) { - - //Write data to the trace logger - FW_ASSERT(data != nullptr); - - if(this->m_enable_trace && this->m_mode == OPEN){ //&& size > 0){ - - //Check if the file size exceeds - U32 expected_byte_count = this->m_byteCount+size; - if (expected_byte_count > this->m_maxFileSize) { - //Rewrite file - //Current design supports writing to a circular file - //printf ("File will be overwritten. Seeking beginning of file\n"); - (void)this->m_log_file.seek(0,Os::FileInterface::SeekType::ABSOLUTE); - this->m_byteCount = 0; - } - //else { - FwSignedSizeType writeSize = size; - FwSignedSizeType fileSize; - (void) this->m_log_file.position(fileSize); - //printf ("WRITING TO FILE HERE. File position is: %lld\n",fileSize); - Os::File::Status stat = this->m_log_file.write(reinterpret_cast(data),writeSize,Os::File::WAIT); - // Assert if file is not already open - FW_ASSERT(stat != Os::File::NOT_OPENED); - this->m_byteCount += (size); - - //} - } - } - // ---------------------------------------------------------------------- - // Handler implementations for user-defined typed input ports - // ---------------------------------------------------------------------- - - void TraceLogger::TraceBufferLogger_handler(FwIndexType portNum, - FwTraceIdType id, - Fw::Time& timeTag, - const Fw::TraceCfg::TraceType& type, - Fw::TraceBuffer& args) { - - FW_ASSERT(type.isValid()); - U16 bit_mask = static_cast (FILTER_BIT << type.e); - U32 traceSize = 0; - //Only log data that is enabled by either config or user - if(!(this->m_traceFilter & bit_mask)) { - //TODO: Should we generate an event here, letting user know that this specific filter is disabled? - return; - } - - //Make a call to reset - Fw::SerializeBufferBase& buf_ref = m_file_buffer.getSerializeRepr(); - buf_ref.resetSer(); - buf_ref.serialize(id); - buf_ref.serialize(timeTag); - if(FW_TRACE_RECORD_MINIMAL == false) { - buf_ref.serialize(args); - traceSize = m_file_buffer.getSize(); //Record max size of each trace record for circular file - } - else { - traceSize = buf_ref.getBuffLength(); //Record only id & timetag - printf("File size %d",buf_ref.getBuffLength()); - } - //printf("Buffer size is :%d, Full buffer length: %d\n",m_file_buffer.getSize(),buf_ref.getBuffLength()); - //Note: Because its a circular file we're writing the full buffer capacatiy to the file - // instead of the actual buffer size (variable based on number of args). This will - // ensure when the file is overwritten, we preserve old records - this->write_log_file(m_file_buffer.getData(),traceSize); - // If we choose not to use circular file write then use the below line instead. - //this->write_log_file(m_file_buffer.getData(),buf_ref.getBuffLength()); - - /* - //convert trace data to string to make it readable - std::string args_text; - args.toString(args_text); - char textStr[FW_TRACE_BUFFER_MAX_SIZE]; - U32 packet_size = static_cast (snprintf(textStr, - FW_TRACE_BUFFER_MAX_SIZE, - "ID: %" PRI_FwTraceIdType" TimeBase: %" PRI_FwTimeBaseStoreType "Time:%" PRId32 ",%" PRId32 "Args: %s\n", - id, static_cast(timeTag.getTimeBase()),timeTag.getSeconds(),timeTag.getUSeconds(),args_text.c_str())); - printf("Trace buffer logger invoked HERE\n"); - //textStr += args_text; - this->write_log_file(reinterpret_cast(textStr),packet_size); - */ - } - - // ---------------------------------------------------------------------- - // Handler implementations for commands - // ---------------------------------------------------------------------- - - void TraceLogger ::EnableTrace_cmdHandler(FwOpcodeType opCode, U32 cmdSeq, Svc::TraceLogger_Enable enable) { - - FW_ASSERT(enable.isValid()); - this->m_enable_trace = enable; - this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); - } - - void TraceLogger ::DumpTraceDp_cmdHandler(FwOpcodeType opCode, U32 cmdSeq) { - // TODO - this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); - } - void TraceLogger ::FilterTrace_cmdHandler(FwOpcodeType opCode, - U32 cmdSeq, - U16 bitmask, - Svc::TraceLogger_Enable enable) { - this->filter(bitmask,enable); - this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); - } -} // namespace Svc diff --git a/Svc/TraceLogger/TraceLogger.fpp b/Svc/TraceLogger/TraceLogger.fpp deleted file mode 100644 index 03c868e50e..0000000000 --- a/Svc/TraceLogger/TraceLogger.fpp +++ /dev/null @@ -1,83 +0,0 @@ -module Svc { - - @ Component to record Trace Data - active component TraceLogger { - - # ---------------------------------------------------------------------- - # Types - # ---------------------------------------------------------------------- - enum Enable { - DISABLE = 0 @< Disabled state - ENABLE = 1 @< Enabled state - } - - # ---------------------------------------------------------------------- - # General ports - # ---------------------------------------------------------------------- - @ Logging Port - async input port TraceBufferLogger: Fw.Trace @< Input Trace port to write to file - - # ---------------------------------------------------------------------- - # Commands - # ---------------------------------------------------------------------- - @ Enable or disable trace - async command EnableTrace ( - $enable : Enable - )\ - opcode 0x00 - - @ Dump Trace to a data product - async command DumpTraceDp\ - opcode 0x01 - - @Select which trace types to be logged - async command FilterTrace ( - bitmask: U16 @< TraceTypes to filter on - $enable : Enable @< enable or disable filtering - )\ - opcode 0x02 - - # ---------------------------------------------------------------------- - # Events - # ---------------------------------------------------------------------- - @ Trace logging status - event TraceStatus( - $status: Enable @< Status of Trace - ) \ - severity diagnostic \ - id 0x00 \ - format "Trace has been {}." - - @Trace File open error - event TraceFileOpenError( - $fileName: string @ -#include -#include - -// some limits.h don't have PATH_MAX -#ifdef PATH_MAX -#define FILE_PATH_MAX PATH_MAX -#else -#define FILE_PATH_MAX 255 -#endif - -// some limits.h don't have NAME_MAX -#ifdef NAME_MAX -#define FILE_NAME_MAX NAME_MAX -#else -#define FILE_NAME_MAX 255 -#endif - -constexpr bool FW_TRACE_RECORD_TRACE = true; -constexpr bool FW_TRACE_RECORD_MINIMAL = false; - -//Max size of the Trace buffer including metadata (id,timetag,arguments) -static const FwSizeType FW_TRACE_MAX_SER_SIZE = (FW_TRACE_BUFFER_MAX_SIZE + sizeof(FwTraceIdType) + Fw::Time::SERIALIZED_SIZE); - -//Mask bit for filtering on trace types -static const U16 FILTER_BIT = 1; - - -namespace Svc { - -class TraceLogger : public TraceLoggerComponentBase { - public: - // ---------------------------------------------------------------------- - // Component construction and destruction - // ---------------------------------------------------------------------- - - //! Construct TraceLogger object - TraceLogger(const char* const compName //!< The component name - ); - - //! \brief Component initialization routine - //! - //! The initialization function calls the initialization - //! routine for the base class. - //! - //! \param queueDepth the depth of the message queue for the component - //! \param instance: instance identifier. Default: 0. - void init(NATIVE_INT_TYPE queueDepth, NATIVE_INT_TYPE instance = 0); - - //! \brief Set log file and max size - //! - //! This is to create a log file to write all the trace buffers to. - //! The file will not be written to once the max size is hit. - //! - //! \param fileName The name of the file to create. Must be less than 80 characters. - //! \param maxSize The max size of the file - //! - //! \return true if creating the file was successful, false otherwise - void set_log_file(const char* fileName, const U32 maxSize=FW_TRACE_FILE_MAX_SIZE); - - //! \brief Trace Logger configure method - //! - //! The configure method stores the file name to log traces. - //! - //! \param file file where traces are stored. - void configure(const char* file); - - //! \brief Trace Logger filter method - //! - //! The filter method selects which trace types to be logged and which to ignore. - //! - //! \param tracetypes provides bitmasks for tracetypes to select. - //! \param enable to turn on/off filtering . - void filter(U16 traceType_bitmask,bool enable); - - //! Destroy TraceLogger object - ~TraceLogger(); - - PRIVATE: - // ---------------------------------------------------------------------- - // Handler implementations for user-defined typed input ports - // ---------------------------------------------------------------------- - - //! Handler implementation for TraceBufferLogger - //! - //! Logging Port - //! Input Trace port to write to file - void TraceBufferLogger_handler(FwIndexType portNum, //!< The port number - FwTraceIdType id, //!< Trace ID - Fw::Time& timeTag, //!< Time Tag - const Fw::TraceCfg::TraceType& type, //!< The trace type argument - Fw::TraceBuffer& args //!< Buffer containing serialized trace entry - ) override; - - PRIVATE: - // ---------------------------------------------------------------------- - // Handler implementations for commands - // ---------------------------------------------------------------------- - - //! Handler implementation for command EnableTrace - //! - //! Enable or disable trace - void EnableTrace_cmdHandler(FwOpcodeType opCode, //!< The opcode - U32 cmdSeq, //!< The command sequence number - Svc::TraceLogger_Enable enable) override; - - //! Handler implementation for command DumpTraceDp - //! - //! Dump Trace to a data product - void DumpTraceDp_cmdHandler(FwOpcodeType opCode, //!< The opcode - U32 cmdSeq //!< The command sequence number - ) override; - - //! Handler implementation for command FilterTrace - //! - //! Select which trace types to be logged - void FilterTrace_cmdHandler(FwOpcodeType opCode, //!< The opcode - U32 cmdSeq, //!< The command sequence number - U16 bitmask, //!< TraceTypes to log on - Svc::TraceLogger_Enable enable //!< enable or disable logging - ) override; - - // ---------------------------------------------------------------------- - // Member Variables - // ---------------------------------------------------------------------- - - enum FileMode { - CLOSED = 0, - OPEN = 1 - }; - - // The filename data: - Os::File m_log_file; //Log file - FileMode m_mode; // file mode - Fw::String m_fileName; //File name - U32 m_maxFileSize; //max file size - U32 m_byteCount; //current byte count of the file - bool m_log_init; //Is logfile initialized - bool m_enable_trace; //Is trace logging enabled - U8 m_file_data[FW_TRACE_MAX_SER_SIZE]; //Holds a max size including metadata - Fw::Buffer m_file_buffer; - //filter trace types - U16 m_traceFilter; //Select which trace types to allow logging - - // ---------------------------------------------------------------------- - // File functions: - // ---------------------------------------------------------------------- - void openFile( - ); - - void closeFile( - ); - - void write_log_file( - U8* data, - U32 size - ); - - }; - -} // namespace Svc - -#endif diff --git a/Svc/TraceLogger/test/ut/TraceLoggerTestMain.cpp b/Svc/TraceLogger/test/ut/TraceLoggerTestMain.cpp deleted file mode 100644 index a37fc930f5..0000000000 --- a/Svc/TraceLogger/test/ut/TraceLoggerTestMain.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// ====================================================================== -// \title TraceLoggerTestMain.cpp -// \author sreddy -// \brief cpp file for TraceLogger component test main function -// ====================================================================== - -#include "TraceLoggerTester.hpp" - -TEST(Nominal, test_startup) { - Svc::TraceLoggerTester tester; - tester.test_startup(); -} - -TEST(Nominal, test_log_file) { - Svc::TraceLoggerTester tester; - tester.test_startup(); - tester.test_file(); -} - -int main(int argc, char** argv) { - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/Svc/TraceLogger/test/ut/TraceLoggerTester.cpp b/Svc/TraceLogger/test/ut/TraceLoggerTester.cpp deleted file mode 100644 index 39ac4b74a2..0000000000 --- a/Svc/TraceLogger/test/ut/TraceLoggerTester.cpp +++ /dev/null @@ -1,84 +0,0 @@ -// ====================================================================== -// \title TraceLoggerTester.cpp -// \author sreddy -// \brief cpp file for TraceLogger component test harness implementation class -// ====================================================================== - -#include "TraceLoggerTester.hpp" -#include -#include - -namespace Svc { - -// ---------------------------------------------------------------------- -// Construction and destruction -// ---------------------------------------------------------------------- - -TraceLoggerTester ::TraceLoggerTester() - : TraceLoggerGTestBase("TraceLoggerTester", TraceLoggerTester::MAX_HISTORY_SIZE), component("TraceLogger") { - this->initComponents(); - this->connectPorts(); -} - -TraceLoggerTester ::~TraceLoggerTester() {} - -// ---------------------------------------------------------------------- -// Tests -// ---------------------------------------------------------------------- -void TraceLoggerTester::test_startup(){ - this->component.configure("TraceFile.dat"); - this->component.filter(0xF,Svc::TraceLogger_Enable::ENABLE); -} -void TraceLoggerTester ::test_file() { - Fw::Time timeTag; - timeTag.getTimeBase(); - timeTag.getContext(); - timeTag.getSeconds(); - timeTag.getUSeconds(); - - printf("Test File Writes, including exercising circular buffer fill\n"); - - //Write to file until it circles back to the beginning into 2 entries - int file_entries = (FW_TRACE_FILE_MAX_SIZE / FW_TRACE_MAX_SER_SIZE)+2; - U8 type_entry = 0; //to interate over trace type - U8 buffer[11] = {0x15,0x26,0x37,0x48,0x59,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF}; //arguments to write - Fw::TraceBuffer trace_buffer_args(buffer,sizeof(buffer)); - - for (int i = 0; i < file_entries; i++) { - type_entry = (type_entry+1) % 4; - this->invoke_to_TraceBufferLogger(0,i,timeTag,static_cast(type_entry),trace_buffer_args); - this->component.doDispatch(); - - } - - printf("Test Trace Type Filter\n"); - //Filter out message_dequeue and port_call - this->sendCmd_FilterTrace(0,1,0x6,Svc::TraceLogger_Enable::DISABLE); - this->component.doDispatch(); - ASSERT_CMD_RESPONSE(0, 2, 1, Fw::CmdResponse::OK); - this->invoke_to_TraceBufferLogger(0,0xAA,timeTag,Fw::TraceCfg::TraceType::MESSAGE_QUEUE,trace_buffer_args); - this->component.doDispatch(); - this->invoke_to_TraceBufferLogger(0,0xBB,timeTag,Fw::TraceCfg::TraceType::MESSAGE_DEQUEUE,trace_buffer_args); - this->component.doDispatch(); - this->invoke_to_TraceBufferLogger(0,0xCC,timeTag,Fw::TraceCfg::TraceType::PORT_CALL,trace_buffer_args); - this->component.doDispatch(); - this->invoke_to_TraceBufferLogger(0,0xDD,timeTag,Fw::TraceCfg::TraceType::USER,trace_buffer_args); - this->component.doDispatch(); - - //enable all trace type filters and ensure they're received - //Filter out message_dequeue and port_call - this->sendCmd_FilterTrace(0,1,0xF,Svc::TraceLogger_Enable::ENABLE); - this->component.doDispatch(); - ASSERT_CMD_RESPONSE(0, 2, 1, Fw::CmdResponse::OK); - this->invoke_to_TraceBufferLogger(0,0xAA,timeTag,Fw::TraceCfg::TraceType::MESSAGE_QUEUE,trace_buffer_args); - this->component.doDispatch(); - this->invoke_to_TraceBufferLogger(0,0xBB,timeTag,Fw::TraceCfg::TraceType::MESSAGE_DEQUEUE,trace_buffer_args); - this->component.doDispatch(); - this->invoke_to_TraceBufferLogger(0,0xCC,timeTag,Fw::TraceCfg::TraceType::PORT_CALL,trace_buffer_args); - this->component.doDispatch(); - this->invoke_to_TraceBufferLogger(0,0xDD,timeTag,Fw::TraceCfg::TraceType::USER,trace_buffer_args); - this->component.doDispatch(); - -} - -} // namespace Svc diff --git a/Svc/TraceLogger/test/ut/TraceLoggerTester.hpp b/Svc/TraceLogger/test/ut/TraceLoggerTester.hpp deleted file mode 100644 index 9d6adc8f78..0000000000 --- a/Svc/TraceLogger/test/ut/TraceLoggerTester.hpp +++ /dev/null @@ -1,72 +0,0 @@ -// ====================================================================== -// \title TraceLoggerTester.hpp -// \author sreddy -// \brief hpp file for TraceLogger component test harness implementation class -// ====================================================================== - -#ifndef Svc_TraceLoggerTester_HPP -#define Svc_TraceLoggerTester_HPP - -#include "Svc/TraceLogger/TraceLogger.hpp" -#include "Svc/TraceLogger/TraceLoggerGTestBase.hpp" - -namespace Svc { - -class TraceLoggerTester : public TraceLoggerGTestBase { - public: - // ---------------------------------------------------------------------- - // Constants - // ---------------------------------------------------------------------- - - // Maximum size of histories storing events, telemetry, and port outputs - static const FwSizeType MAX_HISTORY_SIZE = 10; - - // Instance ID supplied to the component instance under test - static const FwEnumStoreType TEST_INSTANCE_ID = 0; - - // Queue depth supplied to the component instance under test - static const FwQueueSizeType TEST_INSTANCE_QUEUE_DEPTH = 10; - - public: - // ---------------------------------------------------------------------- - // Construction and destruction - // ---------------------------------------------------------------------- - - //! Construct object TraceLoggerTester - TraceLoggerTester(); - - //! Destroy object TraceLoggerTester - ~TraceLoggerTester(); - - public: - // ---------------------------------------------------------------------- - // Tests - // ---------------------------------------------------------------------- - - //! To do - void test_startup(); - void test_file(); - - private: - // ---------------------------------------------------------------------- - // Helper functions - // ---------------------------------------------------------------------- - - //! Connect ports - void connectPorts(); - - //! Initialize components - void initComponents(); - - private: - // ---------------------------------------------------------------------- - // Member variables - // ---------------------------------------------------------------------- - - //! The component under test - TraceLogger component; -}; - -} // namespace Svc - -#endif diff --git a/Svc/TraceLogger/test/ut/TraceLoggerTesterHelpers.cpp b/Svc/TraceLogger/test/ut/TraceLoggerTesterHelpers.cpp deleted file mode 100644 index cada9ff14e..0000000000 --- a/Svc/TraceLogger/test/ut/TraceLoggerTesterHelpers.cpp +++ /dev/null @@ -1,42 +0,0 @@ -// ====================================================================== -// \title TraceLoggerTesterHelpers.cpp -// \author Generated by fpp-to-cpp -// \brief cpp file for TraceLogger component test harness helper functions -// ====================================================================== - -#include "TraceLoggerTester.hpp" - -namespace Svc { - -// ---------------------------------------------------------------------- -// Helper functions -// ---------------------------------------------------------------------- - -void TraceLoggerTester ::connectPorts() { - // Connect special input ports - - this->connect_to_cmdIn(0, this->component.get_cmdIn_InputPort(0)); - - // Connect special output ports - - this->component.set_LogText_OutputPort(0, this->get_from_LogText(0)); - - this->component.set_cmdRegOut_OutputPort(0, this->get_from_cmdRegOut(0)); - - this->component.set_cmdResponseOut_OutputPort(0, this->get_from_cmdResponseOut(0)); - - this->component.set_logOut_OutputPort(0, this->get_from_logOut(0)); - - this->component.set_timeCaller_OutputPort(0, this->get_from_timeCaller(0)); - - // Connect typed input ports - - this->connect_to_TraceBufferLogger(0, this->component.get_TraceBufferLogger_InputPort(0)); -} - -void TraceLoggerTester ::initComponents() { - this->init(); - this->component.init(TraceLoggerTester::TEST_INSTANCE_QUEUE_DEPTH, TraceLoggerTester::TEST_INSTANCE_ID); -} - -} // namespace Svc diff --git a/config/CMakeLists.txt b/config/CMakeLists.txt index 25ce3dac18..fd06715a8e 100644 --- a/config/CMakeLists.txt +++ b/config/CMakeLists.txt @@ -9,6 +9,6 @@ set(SOURCE_FILES "${CMAKE_CURRENT_LIST_DIR}/FpConfig.fpp" "${CMAKE_CURRENT_LIST_DIR}/PolyDbCfg.fpp" "${CMAKE_CURRENT_LIST_DIR}/VersionCfg.fpp" - "${CMAKE_CURRENT_LIST_DIR}/TraceLoggerCfg.fpp" + "${CMAKE_CURRENT_LIST_DIR}/TraceCfg.fpp" ) register_fprime_module(config) diff --git a/config/FpConfig.h b/config/FpConfig.h index 6fb15c61dd..8ea1a77732 100644 --- a/config/FpConfig.h +++ b/config/FpConfig.h @@ -327,12 +327,6 @@ typedef FwIndexType FwQueueSizeType; #define FW_TRACE_BUFFER_MAX_SIZE 257 #endif -// Specifies the size of the file that contains the serialized trace value. -#ifndef FW_TRACE_FILE_MAX_SIZE -#define FW_TRACE_FILE_MAX_SIZE 2720000 -#endif - - // Specifies the size of the buffer that contains the serialized parameter value. #ifndef FW_PARAM_BUFFER_MAX_SIZE #define FW_PARAM_BUFFER_MAX_SIZE (FW_COM_BUFFER_MAX_SIZE - sizeof(FwPrmIdType) - sizeof(FwPacketDescriptorType)) diff --git a/config/TraceLoggerCfg.fpp b/config/TraceLoggerCfg.fpp deleted file mode 100644 index e87b977849..0000000000 --- a/config/TraceLoggerCfg.fpp +++ /dev/null @@ -1,36 +0,0 @@ -# ====================================================================== -# FPP file for Version configuration -# ====================================================================== -# From Design review, it was requested that we add more trace types such as -# interrupts, exceptions, context switch,queue add/remove, EVRs, -# semaphore takes(?), stack trace, DMAs -# Also consider adding adding state machine transitions, timer acquisition -# and release traces, and EVRS to the category of traces that are automated. -# Also consider what a potential IO trace could look like. A ring buffer for IO -# is always requested for 1553 and recently M-Bus on Psyche. Presumably a -# limited IO trace of some could be packaged with the autopsy log and be useful. - -#Note: Trace Types are configurable by the project and defined here. -# It is stored as a bitmask that will be used for log filtering. -# Current design allows a max of 16 trace types - -module Fw { - - module TraceCfg { - - @Enum representing trace Types (aka Trace Categories) - enum TraceType { - MESSAGE_QUEUE = 0 @< Trace type of message wait - MESSAGE_DEQUEUE = 1 @< Trace type of message dequeue - PORT_CALL = 2 @< Trace type of port invocations - USER = 3 @< user invoked trace - #=====Do Not Delete above======# - INTERRUPTS = 4 @Trace type for interrupts handled - CONTEXT_SWITCH = 5 @Trace type for context switching - EVENTS = 6 @Trace type for Events generated - SEMAPHORES = 7 @trace type for semaphores taken - STATE_MACHINE = 8 @trace type for state machine transitions - MAX_TRACE_TYPES = 9 - } - } -} \ No newline at end of file From e70c568bfa029992f643de6e021db202c14f75ff Mon Sep 17 00:00:00 2001 From: Shivaly Date: Wed, 18 Sep 2024 10:19:39 -0700 Subject: [PATCH 20/37] FP-2784: Change TraceLogger to TraceFileLogger to distinguish between file logging and future memory logging --- Svc/TraceFileLogger/CMakeLists.txt | 29 +++ Svc/TraceFileLogger/TraceFile.dat | Bin 0 -> 1632 bytes Svc/TraceFileLogger/TraceFileLogger.cpp | 214 ++++++++++++++++++ Svc/TraceFileLogger/TraceFileLogger.fpp | 83 +++++++ Svc/TraceFileLogger/TraceFileLogger.hpp | 173 ++++++++++++++ .../test/ut/TraceFileLoggerTestMain.cpp | 23 ++ .../test/ut/TraceFileLoggerTester.cpp | 84 +++++++ .../test/ut/TraceFileLoggerTester.hpp | 72 ++++++ .../test/ut/TraceFileLoggerTesterHelpers.cpp | 42 ++++ 9 files changed, 720 insertions(+) create mode 100644 Svc/TraceFileLogger/CMakeLists.txt create mode 100644 Svc/TraceFileLogger/TraceFile.dat create mode 100644 Svc/TraceFileLogger/TraceFileLogger.cpp create mode 100644 Svc/TraceFileLogger/TraceFileLogger.fpp create mode 100644 Svc/TraceFileLogger/TraceFileLogger.hpp create mode 100644 Svc/TraceFileLogger/test/ut/TraceFileLoggerTestMain.cpp create mode 100644 Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp create mode 100644 Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.hpp create mode 100644 Svc/TraceFileLogger/test/ut/TraceFileLoggerTesterHelpers.cpp diff --git a/Svc/TraceFileLogger/CMakeLists.txt b/Svc/TraceFileLogger/CMakeLists.txt new file mode 100644 index 0000000000..beb7b1ac5a --- /dev/null +++ b/Svc/TraceFileLogger/CMakeLists.txt @@ -0,0 +1,29 @@ +#### +# F prime CMakeLists.txt: +# +# SOURCE_FILES: combined list of source and autocoding files +# MOD_DEPS: (optional) module dependencies +# +# Note: using PROJECT_NAME as EXECUTABLE_NAME +#### +set(SOURCE_FILES + "${CMAKE_CURRENT_LIST_DIR}/TraceFileLogger.fpp" + "${CMAKE_CURRENT_LIST_DIR}/TraceFileLogger.cpp" +) + +register_fprime_module() + +set(UT_SOURCE_FILES + "${CMAKE_CURRENT_LIST_DIR}/TraceLogger.fpp" + "${CMAKE_CURRENT_LIST_DIR}/test/ut/TraceFileLoggerTester.cpp" + "${CMAKE_CURRENT_LIST_DIR}/test/ut/TraceFileLoggerTestMain.cpp" +) + +set(UT_MOD_DEPS + Fw/Buffer + STest +) + +set(UT_AUTO_HELPERS ON) +register_fprime_ut() + diff --git a/Svc/TraceFileLogger/TraceFile.dat b/Svc/TraceFileLogger/TraceFile.dat new file mode 100644 index 0000000000000000000000000000000000000000..a6ea7190c163d0248ff93ba878dfb77aa2c68e10 GIT binary patch literal 1632 zcmZQzU|?iG0<4To%q*-o%qK8|gdI-Y&j-;kzQhTCuyPn5oi2c?e<8~PRu{kOOisQ=H}?S4J?ON+d5HVIq=U;?pVfLm0}+#_<;?lX7a{U4#>!3+xv5Iq_m3@oGJ W0nbmM{K7gK9w_0#HX0s?@Bjc9=QE!G literal 0 HcmV?d00001 diff --git a/Svc/TraceFileLogger/TraceFileLogger.cpp b/Svc/TraceFileLogger/TraceFileLogger.cpp new file mode 100644 index 0000000000..d6a726ce93 --- /dev/null +++ b/Svc/TraceFileLogger/TraceFileLogger.cpp @@ -0,0 +1,214 @@ +// ====================================================================== +// \title TraceFileLogger.cpp +// \author sreddy +// \brief cpp file for TraceFileLogger component implementation class +// ====================================================================== + +#include "Svc/TraceFileLogger/TraceFileLogger.hpp" +#include "FpConfig.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Svc { + + // ---------------------------------------------------------------------- + // Component construction and destruction + // ---------------------------------------------------------------------- + + TraceFileLogger::TraceFileLogger(const char* const compName) : + TraceFileLoggerComponentBase(compName), + m_log_file(), + m_mode(CLOSED), + m_fileName(), + m_maxFileSize(0), + m_byteCount(0), + m_log_init(false), + //m_enable_trace(true), + m_traceFilter(0) + { + m_file_buffer.setData(m_file_data); + m_file_buffer.setSize(FW_TRACE_MAX_SER_SIZE); + + m_enable_trace = (FW_TRACE_RECORD_TRACE == true) ? true : false; + } + + TraceFileLogger::~TraceFileLogger() { + if(OPEN == this->m_mode) { + //Close file + this->m_log_file.close(); + this->m_mode = CLOSED; + } + } + + void TraceFileLogger :: + init(NATIVE_INT_TYPE queueDepth, NATIVE_INT_TYPE instance) + { + TraceFileLoggerComponentBase::init(queueDepth,instance); + } + + void TraceFileLogger::set_log_file(const char* fileName, const U32 maxSize) { + + if(this->m_enable_trace == true) { + FW_ASSERT(fileName != nullptr); + //If a file is already open then close it + if(this->m_mode == OPEN) { + this->m_mode = CLOSED; + this->m_log_file.close(); + } + + //If file name is too large then return failure + FwSizeType fileNameSize = Fw::StringUtils::string_length(fileName, static_cast(Fw::String::STRING_SIZE)); + if (fileNameSize == Fw::String::STRING_SIZE) { + this->m_enable_trace = false; + } + + Os::File::Status stat = this->m_log_file.open(fileName, Os::File::OPEN_CREATE, Os::File::OverwriteType::OVERWRITE); + + // Bad status when trying to open the file: + if (stat != Os::File::OP_OK) { + this->m_enable_trace = false; + this->log_WARNING_LO_TraceFileOpenError(static_cast(fileName)); + } + + this->m_byteCount = 0; + this->m_maxFileSize = maxSize; + this->m_fileName = fileName; + this->m_mode = OPEN; + } + } + + void TraceFileLogger::configure(const char* file, const U32 maxSize) { + //printf("HERE1: Configure, set file name\n"); + this->set_log_file(file,maxSize); + } + + void TraceFileLogger::filter(U16 traceType_bitmask, bool enable){ + if(traceType_bitmask == 0){ + //TODO: Figure out if this should be made an illegal entry or just ignore it? + // + } + + if(enable == true) { + this->m_traceFilter |= traceType_bitmask; + } + else { //disable + U16 mask = 0xFFFF ^ traceType_bitmask; + this->m_traceFilter &= mask; + } + + } + + void TraceFileLogger::write_log_file(U8* data, U32 size) { + + //Write data to the trace logger + FW_ASSERT(data != nullptr); + + if(this->m_enable_trace && this->m_mode == OPEN){ //&& size > 0){ + + //Check if the file size exceeds + U32 expected_byte_count = this->m_byteCount+size; + if (expected_byte_count > this->m_maxFileSize) { + //Rewrite file + //Current design supports writing to a circular file + //printf ("File will be overwritten. Seeking beginning of file\n"); + (void)this->m_log_file.seek(0,Os::FileInterface::SeekType::ABSOLUTE); + this->m_byteCount = 0; + } + //else { + FwSignedSizeType writeSize = size; + FwSignedSizeType fileSize; + (void) this->m_log_file.position(fileSize); + //printf ("WRITING TO FILE HERE. File position is: %lld\n",fileSize); + Os::File::Status stat = this->m_log_file.write(reinterpret_cast(data),writeSize,Os::File::WAIT); + // Assert if file is not already open + FW_ASSERT(stat != Os::File::NOT_OPENED); + this->m_byteCount += (size); + + //} + } + } + // ---------------------------------------------------------------------- + // Handler implementations for user-defined typed input ports + // ---------------------------------------------------------------------- + + void TraceFileLogger::TraceBufferLogger_handler(FwIndexType portNum, + FwTraceIdType id, + Fw::Time& timeTag, + const Fw::TraceCfg::TraceType& type, + Fw::TraceBuffer& args) { + + FW_ASSERT(type.isValid()); + U16 bit_mask = static_cast (FILTER_BIT << type.e); + U32 traceSize = 0; + //Only log data that is enabled by either config or user + if(!(this->m_traceFilter & bit_mask)) { + //TODO: Should we generate an event here, letting user know that this specific filter is disabled? + return; + } + + //Make a call to reset + Fw::SerializeBufferBase& buf_ref = m_file_buffer.getSerializeRepr(); + buf_ref.resetSer(); + buf_ref.serialize(id); + buf_ref.serialize(timeTag); + if(FW_TRACE_RECORD_MINIMAL == false) { + buf_ref.serialize(args); + traceSize = m_file_buffer.getSize(); //Record max size of each trace record for circular file + } + else { + traceSize = buf_ref.getBuffLength(); //Record only id & timetag + printf("File size %d",buf_ref.getBuffLength()); + } + //printf("Buffer size is :%d, Full buffer length: %d\n",m_file_buffer.getSize(),buf_ref.getBuffLength()); + //Note: Because its a circular file we're writing the full buffer capacatiy to the file + // instead of the actual buffer size (variable based on number of args). This will + // ensure when the file is overwritten, we preserve old records + this->write_log_file(m_file_buffer.getData(),traceSize); + // If we choose not to use circular file write then use the below line instead. + //this->write_log_file(m_file_buffer.getData(),buf_ref.getBuffLength()); + + /* + //convert trace data to string to make it readable + std::string args_text; + args.toString(args_text); + char textStr[FW_TRACE_BUFFER_MAX_SIZE]; + U32 packet_size = static_cast (snprintf(textStr, + FW_TRACE_BUFFER_MAX_SIZE, + "ID: %" PRI_FwTraceIdType" TimeBase: %" PRI_FwTimeBaseStoreType "Time:%" PRId32 ",%" PRId32 "Args: %s\n", + id, static_cast(timeTag.getTimeBase()),timeTag.getSeconds(),timeTag.getUSeconds(),args_text.c_str())); + printf("Trace buffer logger invoked HERE\n"); + //textStr += args_text; + this->write_log_file(reinterpret_cast(textStr),packet_size); + */ + } + + // ---------------------------------------------------------------------- + // Handler implementations for commands + // ---------------------------------------------------------------------- + + void TraceFileLogger ::EnableTrace_cmdHandler(FwOpcodeType opCode, U32 cmdSeq, Svc::TraceFileLogger_Enable enable) { + + FW_ASSERT(enable.isValid()); + this->m_enable_trace = enable; + this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); + } + + void TraceFileLogger ::DumpTraceDp_cmdHandler(FwOpcodeType opCode, U32 cmdSeq) { + // TODO + this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); + } + void TraceFileLogger ::FilterTrace_cmdHandler(FwOpcodeType opCode, + U32 cmdSeq, + U16 bitmask, + Svc::TraceFileLogger_Enable enable) { + this->filter(bitmask,enable); + this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); + } +} // namespace Svc diff --git a/Svc/TraceFileLogger/TraceFileLogger.fpp b/Svc/TraceFileLogger/TraceFileLogger.fpp new file mode 100644 index 0000000000..d9fa84f182 --- /dev/null +++ b/Svc/TraceFileLogger/TraceFileLogger.fpp @@ -0,0 +1,83 @@ +module Svc { + + @ Component to record Trace Data + active component TraceFileLogger { + + # ---------------------------------------------------------------------- + # Types + # ---------------------------------------------------------------------- + enum Enable { + DISABLE = 0 @< Disabled state + ENABLE = 1 @< Enabled state + } + + # ---------------------------------------------------------------------- + # General ports + # ---------------------------------------------------------------------- + @ Logging Port + async input port TraceBufferLogger: Fw.Trace @< Input Trace port to write to file + + # ---------------------------------------------------------------------- + # Commands + # ---------------------------------------------------------------------- + @ Enable or disable trace + async command EnableTrace ( + $enable : Enable + )\ + opcode 0x00 + + @ Dump Trace to a data product + async command DumpTraceDp\ + opcode 0x01 + + @Select which trace types to be logged + async command FilterTrace ( + bitmask: U16 @< TraceTypes to filter on + $enable : Enable @< enable or disable filtering + )\ + opcode 0x02 + + # ---------------------------------------------------------------------- + # Events + # ---------------------------------------------------------------------- + @ Trace logging status + event TraceStatus( + $status: Enable @< Status of Trace + ) \ + severity diagnostic \ + id 0x00 \ + format "Trace has been {}." + + @Trace File open error + event TraceFileOpenError( + $fileName: string @ +#include +#include + +// some limits.h don't have PATH_MAX +#ifdef PATH_MAX +#define FILE_PATH_MAX PATH_MAX +#else +#define FILE_PATH_MAX 255 +#endif + +// some limits.h don't have NAME_MAX +#ifdef NAME_MAX +#define FILE_NAME_MAX NAME_MAX +#else +#define FILE_NAME_MAX 255 +#endif + +constexpr bool FW_TRACE_RECORD_TRACE = true; +constexpr bool FW_TRACE_RECORD_MINIMAL = false; + +//Max size of the Trace buffer including metadata (id,timetag,arguments) +static const FwSizeType FW_TRACE_MAX_SER_SIZE = (FW_TRACE_BUFFER_MAX_SIZE + sizeof(FwTraceIdType) + Fw::Time::SERIALIZED_SIZE); + +//Mask bit for filtering on trace types +static const U16 FILTER_BIT = 1; + + +namespace Svc { + +class TraceFileLogger : public TraceFileLoggerComponentBase { + public: + // ---------------------------------------------------------------------- + // Component construction and destruction + // ---------------------------------------------------------------------- + + //! Construct TraceFileLogger object + TraceFileLogger(const char* const compName //!< The component name + ); + + //! \brief Component initialization routine + //! + //! The initialization function calls the initialization + //! routine for the base class. + //! + //! \param queueDepth the depth of the message queue for the component + //! \param instance: instance identifier. Default: 0. + void init(NATIVE_INT_TYPE queueDepth, NATIVE_INT_TYPE instance = 0); + + //! \brief Set log file and max size + //! + //! This is to create a log file to write all the trace buffers to. + //! The file will not be written to once the max size is hit. + //! + //! \param fileName The name of the file to create. Must be less than 80 characters. + //! \param maxSize The max size of the file + //! + //! \return true if creating the file was successful, false otherwise + void set_log_file(const char* fileName, const U32 maxSize); + + //! \brief Trace Logger configure method + //! + //! The configure method stores the file name to log traces. + //! + //! \param file file where traces are stored. + void configure(const char* file, const U32 maxSize); + + //! \brief Trace Logger filter method + //! + //! The filter method selects which trace types to be logged and which to ignore. + //! + //! \param tracetypes provides bitmasks for tracetypes to select. + //! \param enable to turn on/off filtering . + void filter(U16 traceType_bitmask,bool enable); + + //! Destroy TraceFileLogger object + ~TraceFileLogger(); + + PRIVATE: + // ---------------------------------------------------------------------- + // Handler implementations for user-defined typed input ports + // ---------------------------------------------------------------------- + + //! Handler implementation for TraceBufferLogger + //! + //! Logging Port + //! Input Trace port to write to file + void TraceBufferLogger_handler(FwIndexType portNum, //!< The port number + FwTraceIdType id, //!< Trace ID + Fw::Time& timeTag, //!< Time Tag + const Fw::TraceCfg::TraceType& type, //!< The trace type argument + Fw::TraceBuffer& args //!< Buffer containing serialized trace entry + ) override; + + PRIVATE: + // ---------------------------------------------------------------------- + // Handler implementations for commands + // ---------------------------------------------------------------------- + + //! Handler implementation for command EnableTrace + //! + //! Enable or disable trace + void EnableTrace_cmdHandler(FwOpcodeType opCode, //!< The opcode + U32 cmdSeq, //!< The command sequence number + Svc::TraceFileLogger_Enable enable) override; + + //! Handler implementation for command DumpTraceDp + //! + //! Dump Trace to a data product + void DumpTraceDp_cmdHandler(FwOpcodeType opCode, //!< The opcode + U32 cmdSeq //!< The command sequence number + ) override; + + //! Handler implementation for command FilterTrace + //! + //! Select which trace types to be logged + void FilterTrace_cmdHandler(FwOpcodeType opCode, //!< The opcode + U32 cmdSeq, //!< The command sequence number + U16 bitmask, //!< TraceTypes to log on + Svc::TraceFileLogger_Enable enable //!< enable or disable logging + ) override; + + // ---------------------------------------------------------------------- + // Member Variables + // ---------------------------------------------------------------------- + + enum FileMode { + CLOSED = 0, + OPEN = 1 + }; + + // The filename data: + Os::File m_log_file; //Log file + FileMode m_mode; // file mode + Fw::String m_fileName; //File name + U32 m_maxFileSize; //max file size + U32 m_byteCount; //current byte count of the file + bool m_log_init; //Is logfile initialized + bool m_enable_trace; //Is trace logging enabled + U8 m_file_data[FW_TRACE_MAX_SER_SIZE]; //Holds a max size including metadata + Fw::Buffer m_file_buffer; + //filter trace types + U16 m_traceFilter; //Select which trace types to allow logging + + // ---------------------------------------------------------------------- + // File functions: + // ---------------------------------------------------------------------- + void openFile( + ); + + void closeFile( + ); + + void write_log_file( + U8* data, + U32 size + ); + + }; + +} // namespace Svc + +#endif diff --git a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTestMain.cpp b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTestMain.cpp new file mode 100644 index 0000000000..51251baa80 --- /dev/null +++ b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTestMain.cpp @@ -0,0 +1,23 @@ +// ====================================================================== +// \title TraceLoggerTestMain.cpp +// \author sreddy +// \brief cpp file for TraceLogger component test main function +// ====================================================================== + +#include "TraceFileLoggerTester.hpp" + +TEST(Nominal, test_startup) { + Svc::TraceLoggerTester tester; + tester.test_startup(); +} + +TEST(Nominal, test_log_file) { + Svc::TraceLoggerTester tester; + tester.test_startup(); + tester.test_file(); +} + +int main(int argc, char** argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp new file mode 100644 index 0000000000..39ac4b74a2 --- /dev/null +++ b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp @@ -0,0 +1,84 @@ +// ====================================================================== +// \title TraceLoggerTester.cpp +// \author sreddy +// \brief cpp file for TraceLogger component test harness implementation class +// ====================================================================== + +#include "TraceLoggerTester.hpp" +#include +#include + +namespace Svc { + +// ---------------------------------------------------------------------- +// Construction and destruction +// ---------------------------------------------------------------------- + +TraceLoggerTester ::TraceLoggerTester() + : TraceLoggerGTestBase("TraceLoggerTester", TraceLoggerTester::MAX_HISTORY_SIZE), component("TraceLogger") { + this->initComponents(); + this->connectPorts(); +} + +TraceLoggerTester ::~TraceLoggerTester() {} + +// ---------------------------------------------------------------------- +// Tests +// ---------------------------------------------------------------------- +void TraceLoggerTester::test_startup(){ + this->component.configure("TraceFile.dat"); + this->component.filter(0xF,Svc::TraceLogger_Enable::ENABLE); +} +void TraceLoggerTester ::test_file() { + Fw::Time timeTag; + timeTag.getTimeBase(); + timeTag.getContext(); + timeTag.getSeconds(); + timeTag.getUSeconds(); + + printf("Test File Writes, including exercising circular buffer fill\n"); + + //Write to file until it circles back to the beginning into 2 entries + int file_entries = (FW_TRACE_FILE_MAX_SIZE / FW_TRACE_MAX_SER_SIZE)+2; + U8 type_entry = 0; //to interate over trace type + U8 buffer[11] = {0x15,0x26,0x37,0x48,0x59,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF}; //arguments to write + Fw::TraceBuffer trace_buffer_args(buffer,sizeof(buffer)); + + for (int i = 0; i < file_entries; i++) { + type_entry = (type_entry+1) % 4; + this->invoke_to_TraceBufferLogger(0,i,timeTag,static_cast(type_entry),trace_buffer_args); + this->component.doDispatch(); + + } + + printf("Test Trace Type Filter\n"); + //Filter out message_dequeue and port_call + this->sendCmd_FilterTrace(0,1,0x6,Svc::TraceLogger_Enable::DISABLE); + this->component.doDispatch(); + ASSERT_CMD_RESPONSE(0, 2, 1, Fw::CmdResponse::OK); + this->invoke_to_TraceBufferLogger(0,0xAA,timeTag,Fw::TraceCfg::TraceType::MESSAGE_QUEUE,trace_buffer_args); + this->component.doDispatch(); + this->invoke_to_TraceBufferLogger(0,0xBB,timeTag,Fw::TraceCfg::TraceType::MESSAGE_DEQUEUE,trace_buffer_args); + this->component.doDispatch(); + this->invoke_to_TraceBufferLogger(0,0xCC,timeTag,Fw::TraceCfg::TraceType::PORT_CALL,trace_buffer_args); + this->component.doDispatch(); + this->invoke_to_TraceBufferLogger(0,0xDD,timeTag,Fw::TraceCfg::TraceType::USER,trace_buffer_args); + this->component.doDispatch(); + + //enable all trace type filters and ensure they're received + //Filter out message_dequeue and port_call + this->sendCmd_FilterTrace(0,1,0xF,Svc::TraceLogger_Enable::ENABLE); + this->component.doDispatch(); + ASSERT_CMD_RESPONSE(0, 2, 1, Fw::CmdResponse::OK); + this->invoke_to_TraceBufferLogger(0,0xAA,timeTag,Fw::TraceCfg::TraceType::MESSAGE_QUEUE,trace_buffer_args); + this->component.doDispatch(); + this->invoke_to_TraceBufferLogger(0,0xBB,timeTag,Fw::TraceCfg::TraceType::MESSAGE_DEQUEUE,trace_buffer_args); + this->component.doDispatch(); + this->invoke_to_TraceBufferLogger(0,0xCC,timeTag,Fw::TraceCfg::TraceType::PORT_CALL,trace_buffer_args); + this->component.doDispatch(); + this->invoke_to_TraceBufferLogger(0,0xDD,timeTag,Fw::TraceCfg::TraceType::USER,trace_buffer_args); + this->component.doDispatch(); + +} + +} // namespace Svc diff --git a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.hpp b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.hpp new file mode 100644 index 0000000000..5be712f951 --- /dev/null +++ b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.hpp @@ -0,0 +1,72 @@ +// ====================================================================== +// \title TraceLoggerTester.hpp +// \author sreddy +// \brief hpp file for TraceLogger component test harness implementation class +// ====================================================================== + +#ifndef Svc_TraceFileLoggerTester_HPP +#define Svc_TraceFileLoggerTester_HPP + +#include "Svc/TraceLogger/TraceFileLogger.hpp" +#include "Svc/TraceLogger/TraceFileLoggerGTestBase.hpp" + +namespace Svc { + +class TraceLoggerTester : public TraceLoggerGTestBase { + public: + // ---------------------------------------------------------------------- + // Constants + // ---------------------------------------------------------------------- + + // Maximum size of histories storing events, telemetry, and port outputs + static const FwSizeType MAX_HISTORY_SIZE = 10; + + // Instance ID supplied to the component instance under test + static const FwEnumStoreType TEST_INSTANCE_ID = 0; + + // Queue depth supplied to the component instance under test + static const FwQueueSizeType TEST_INSTANCE_QUEUE_DEPTH = 10; + + public: + // ---------------------------------------------------------------------- + // Construction and destruction + // ---------------------------------------------------------------------- + + //! Construct object TraceLoggerTester + TraceLoggerTester(); + + //! Destroy object TraceLoggerTester + ~TraceLoggerTester(); + + public: + // ---------------------------------------------------------------------- + // Tests + // ---------------------------------------------------------------------- + + //! To do + void test_startup(); + void test_file(); + + private: + // ---------------------------------------------------------------------- + // Helper functions + // ---------------------------------------------------------------------- + + //! Connect ports + void connectPorts(); + + //! Initialize components + void initComponents(); + + private: + // ---------------------------------------------------------------------- + // Member variables + // ---------------------------------------------------------------------- + + //! The component under test + TraceLogger component; +}; + +} // namespace Svc + +#endif diff --git a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTesterHelpers.cpp b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTesterHelpers.cpp new file mode 100644 index 0000000000..ed718c3705 --- /dev/null +++ b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTesterHelpers.cpp @@ -0,0 +1,42 @@ +// ====================================================================== +// \title TraceLoggerTesterHelpers.cpp +// \author Generated by fpp-to-cpp +// \brief cpp file for TraceLogger component test harness helper functions +// ====================================================================== + +#include "TraceFileLoggerTester.hpp" + +namespace Svc { + +// ---------------------------------------------------------------------- +// Helper functions +// ---------------------------------------------------------------------- + +void TraceLoggerTester ::connectPorts() { + // Connect special input ports + + this->connect_to_cmdIn(0, this->component.get_cmdIn_InputPort(0)); + + // Connect special output ports + + this->component.set_LogText_OutputPort(0, this->get_from_LogText(0)); + + this->component.set_cmdRegOut_OutputPort(0, this->get_from_cmdRegOut(0)); + + this->component.set_cmdResponseOut_OutputPort(0, this->get_from_cmdResponseOut(0)); + + this->component.set_logOut_OutputPort(0, this->get_from_logOut(0)); + + this->component.set_timeCaller_OutputPort(0, this->get_from_timeCaller(0)); + + // Connect typed input ports + + this->connect_to_TraceBufferLogger(0, this->component.get_TraceBufferLogger_InputPort(0)); +} + +void TraceLoggerTester ::initComponents() { + this->init(); + this->component.init(TraceLoggerTester::TEST_INSTANCE_QUEUE_DEPTH, TraceLoggerTester::TEST_INSTANCE_ID); +} + +} // namespace Svc From d30244b0af8aa83159e52607f60a174fc40769a3 Mon Sep 17 00:00:00 2001 From: Shivaly Date: Mon, 23 Sep 2024 18:02:44 -0700 Subject: [PATCH 21/37] FP-2784: Add trace ID filtering and other changes --- Fw/Trace/CMakeLists.txt | 2 +- Fw/Trace/{TracePacket.cpp => TraceEntity.cpp} | 24 +++--- Fw/Trace/{TracePacket.hpp => TraceEntity.hpp} | 8 +- Svc/TraceFileLogger/ArrayProc.cpp | 73 ++++++++++++++++++ Svc/TraceFileLogger/ArrayProc.hpp | 77 +++++++++++++++++++ Svc/TraceFileLogger/CMakeLists.txt | 3 +- Svc/TraceFileLogger/TraceFileLogger.cpp | 50 +++++++++--- Svc/TraceFileLogger/TraceFileLogger.fpp | 8 +- Svc/TraceFileLogger/TraceFileLogger.hpp | 27 ++++++- .../test/ut/TraceFileLoggerTestMain.cpp | 8 +- .../test/ut/TraceFileLoggerTester.cpp | 28 +++---- .../test/ut/TraceFileLoggerTester.hpp | 23 +++--- .../test/ut/TraceFileLoggerTesterHelpers.cpp | 10 +-- 13 files changed, 278 insertions(+), 63 deletions(-) rename Fw/Trace/{TracePacket.cpp => TraceEntity.cpp} (75%) rename Fw/Trace/{TracePacket.hpp => TraceEntity.hpp} (87%) create mode 100644 Svc/TraceFileLogger/ArrayProc.cpp create mode 100644 Svc/TraceFileLogger/ArrayProc.hpp diff --git a/Fw/Trace/CMakeLists.txt b/Fw/Trace/CMakeLists.txt index e70b8cfd57..06606bc1a4 100644 --- a/Fw/Trace/CMakeLists.txt +++ b/Fw/Trace/CMakeLists.txt @@ -10,7 +10,7 @@ set(MOD_DEPS ) set(SOURCE_FILES "${CMAKE_CURRENT_LIST_DIR}/TraceBuffer.cpp" - "${CMAKE_CURRENT_LIST_DIR}/TracePacket.cpp" + "${CMAKE_CURRENT_LIST_DIR}/TraceEntity.cpp" "${CMAKE_CURRENT_LIST_DIR}/Trace.fpp" ) register_fprime_module() \ No newline at end of file diff --git a/Fw/Trace/TracePacket.cpp b/Fw/Trace/TraceEntity.cpp similarity index 75% rename from Fw/Trace/TracePacket.cpp rename to Fw/Trace/TraceEntity.cpp index c3a9ce0bdd..2fa87dff31 100644 --- a/Fw/Trace/TracePacket.cpp +++ b/Fw/Trace/TraceEntity.cpp @@ -1,21 +1,21 @@ /* - * TracePacket.cpp + * TraceEntity.cpp * */ -#include +#include #include namespace Fw { - TracePacket::TracePacket() : m_id(0) { + TraceEntity::TraceEntity() : m_id(0) { this->m_type = FW_PACKET_TRACE; } - TracePacket::~TracePacket() { + TraceEntity::~TraceEntity() { } - SerializeStatus TracePacket::serialize(SerializeBufferBase& buffer) const { + SerializeStatus TraceEntity::serialize(SerializeBufferBase& buffer) const { SerializeStatus stat = ComPacket::serializeBase(buffer); if (stat != FW_SERIALIZE_OK) { @@ -37,7 +37,7 @@ namespace Fw { } - SerializeStatus TracePacket::deserialize(SerializeBufferBase& buffer) { + SerializeStatus TraceEntity::deserialize(SerializeBufferBase& buffer) { SerializeStatus stat = deserializeBase(buffer); if (stat != FW_SERIALIZE_OK) { return stat; @@ -64,27 +64,27 @@ namespace Fw { return stat; } - void TracePacket::setId(FwTraceIdType id) { + void TraceEntity::setId(FwTraceIdType id) { this->m_id = id; } - void TracePacket::setTraceBuffer(const TraceBuffer& buffer) { + void TraceEntity::setTraceBuffer(const TraceBuffer& buffer) { this->m_traceBuffer = buffer; } - void TracePacket::setTimeTag(const Fw::Time& timeTag) { + void TraceEntity::setTimeTag(const Fw::Time& timeTag) { this->m_timeTag = timeTag; } - FwTraceIdType TracePacket::getId() { + FwTraceIdType TraceEntity::getId() { return this->m_id; } - Fw::Time& TracePacket::getTimeTag() { + Fw::Time& TraceEntity::getTimeTag() { return this->m_timeTag; } - TraceBuffer& TracePacket::getTraceBuffer() { + TraceBuffer& TraceEntity::getTraceBuffer() { return this->m_traceBuffer; } diff --git a/Fw/Trace/TracePacket.hpp b/Fw/Trace/TraceEntity.hpp similarity index 87% rename from Fw/Trace/TracePacket.hpp rename to Fw/Trace/TraceEntity.hpp index 4d642198f9..df49e59a2a 100644 --- a/Fw/Trace/TracePacket.hpp +++ b/Fw/Trace/TraceEntity.hpp @@ -1,5 +1,5 @@ /* - * TracePacket.hpp + * TraceEntity.hpp * * Author: sreddy */ @@ -13,11 +13,11 @@ namespace Fw { - class TracePacket : public ComPacket { + class TraceEntity : public ComPacket { public: - TracePacket(); - virtual ~TracePacket(); + TraceEntity(); + virtual ~TraceEntity(); SerializeStatus serialize(SerializeBufferBase& buffer) const; //!< serialize contents SerializeStatus deserialize(SerializeBufferBase& buffer); diff --git a/Svc/TraceFileLogger/ArrayProc.cpp b/Svc/TraceFileLogger/ArrayProc.cpp new file mode 100644 index 0000000000..d6d12552cb --- /dev/null +++ b/Svc/TraceFileLogger/ArrayProc.cpp @@ -0,0 +1,73 @@ +// \copyright +// Copyright 2009-2015, by the California Institute of Technology. +// ALL RIGHTS RESERVED. United States Government Sponsorship +// acknowledged. + +#include +#include +#include +#include +#include +#include + + +namespace Svc { + + // ---------------------------------------------------------------------- + // Initialization/Exiting + // ---------------------------------------------------------------------- + + ArrayProc::ArrayProc() : + m_currentSize(0),m_maxSize(10),m_storedArray(NULL) + { + } + ArrayProc::~ArrayProc() + { + } + + // ---------------------------------------------------------------------- + // Member Functions + // ---------------------------------------------------------------------- + + ArrayProc::set_array(U32 *array_ptr, U8 array_size) : + m_currentSize(0) + { + m_storedArray = array_ptr; + m_maxSize = array_size; + } + + bool ArrayProc::add_element(U32 element) { + if (m_currentSize < m_maxSize) { + this->m_storedArray[m_currentSize] = element; + this->m_currentSize++; + return true; + } + return false; + } + + bool ArrayProc::delete_element(U32 element) { + + U8 elementIndex = 0; + bool elementExists = this->search_array(element,&elementIndex); + if (elementExists == false) { + return false; + } + else { + for(U8 i = elementIndex; i < this->m_currentSize, i++) { + this->m_storedArray[i] = this->m_storedArray[i+1]; + } + this->m_currentSize--; + return true; + } + } + + bool ArrayProc::search_array(U32 element, U8 *index) { + for(U8 i = 0 ; i < m_currentSize ; i++) { + if(this->m_storedArray[i] = element) { + if (index != NULL) *index = i; + return true; + } + } + return false; + } +} // namespace Svc diff --git a/Svc/TraceFileLogger/ArrayProc.hpp b/Svc/TraceFileLogger/ArrayProc.hpp new file mode 100644 index 0000000000..a53d18db63 --- /dev/null +++ b/Svc/TraceFileLogger/ArrayProc.hpp @@ -0,0 +1,77 @@ +// \copyright +// Copyright 2009-2015, by the California Institute of Technology. +// ALL RIGHTS RESERVED. United States Government Sponsorship +// acknowledged. + +#ifndef SVCARRAYPROC_HPP_ +#define SVCARRAYPROC_HPP_ + +#include + +namespace Svc { + + //! \class ArrayProc + //! \brief ArrayProc struct + //! + //! The object is used for supporting array functions. Making it a struct so all + //! members are public, for ease of use in object composition. + + struct ArrayProc { + + //! \brief Constructor + //! + ArrayProc(); + + //! \brief Destructor + //! + ~ArrayProc(); + + // ---------------------------------------------------------------------- + // Member Functions + // ---------------------------------------------------------------------- + + //! \brief Set pointer to the array + //! + //! \param element value to be added to the array + //! + //! \return true if adding an eleemnt to the array was successful, false otherwise + bool set_array(U32 *array_ptr, U8 array_size); + + //! \brief Add an element to the array + //! + //! \param element value to be added to the array + //! + //! \return true if adding an eleemnt to the array was successful, false otherwise + bool add_element(U32 element); + + //! \brief Delete element from the array and shift the rest of the array up + //! + //! \param element value to be deleted from the array + //! + //! \return true if deleting an eleemnt from the array was successful, false otherwise + bool delete_element(U32 element); + + //! \brief Search for an element in the array + //! + //! \param element value to be searched in the array + //! \param arrayIndex returns the index where (if) the array element exists + //! + //! \return true if the eleemnt is found in the array, false otherwise + bool search_array(U32 element, U8 *index); + + // ---------------------------------------------------------------------- + // Member Variables + // ---------------------------------------------------------------------- + + //Max size of the array + U8 m_maxSize; + + //Current Array Size + U8 m_currentSize; + + //Array + U32 *m_storedArray; + }; + +} +#endif /* SVCARRAYPROC_HPP_ */ diff --git a/Svc/TraceFileLogger/CMakeLists.txt b/Svc/TraceFileLogger/CMakeLists.txt index beb7b1ac5a..80fae8ac4d 100644 --- a/Svc/TraceFileLogger/CMakeLists.txt +++ b/Svc/TraceFileLogger/CMakeLists.txt @@ -9,12 +9,13 @@ set(SOURCE_FILES "${CMAKE_CURRENT_LIST_DIR}/TraceFileLogger.fpp" "${CMAKE_CURRENT_LIST_DIR}/TraceFileLogger.cpp" + "${CMAKE_CURRENT_LIST_DIR}/ArrayProc.cpp" ) register_fprime_module() set(UT_SOURCE_FILES - "${CMAKE_CURRENT_LIST_DIR}/TraceLogger.fpp" + "${CMAKE_CURRENT_LIST_DIR}/TraceFileLogger.fpp" "${CMAKE_CURRENT_LIST_DIR}/test/ut/TraceFileLoggerTester.cpp" "${CMAKE_CURRENT_LIST_DIR}/test/ut/TraceFileLoggerTestMain.cpp" ) diff --git a/Svc/TraceFileLogger/TraceFileLogger.cpp b/Svc/TraceFileLogger/TraceFileLogger.cpp index d6a726ce93..46559bfe17 100644 --- a/Svc/TraceFileLogger/TraceFileLogger.cpp +++ b/Svc/TraceFileLogger/TraceFileLogger.cpp @@ -14,7 +14,7 @@ #include #include #include -#include +#include namespace Svc { @@ -30,13 +30,16 @@ namespace Svc { m_maxFileSize(0), m_byteCount(0), m_log_init(false), - //m_enable_trace(true), - m_traceFilter(0) + m_traceFilter(0) { - m_file_buffer.setData(m_file_data); - m_file_buffer.setSize(FW_TRACE_MAX_SER_SIZE); - - m_enable_trace = (FW_TRACE_RECORD_TRACE == true) ? true : false; + this->m_enable_trace = (FW_TRACE_RECORD_TRACE == true) ? true : false; + + //Set data and size for file buffer + this->m_file_buffer.setData(m_file_data); + this->m_file_buffer.setSize(FW_TRACE_MAX_SER_SIZE); + + //Set array to process trace id filtering + this->filterTraceId.set_array(traceId_array,sizeof(traceId_array)); } TraceFileLogger::~TraceFileLogger() { @@ -55,8 +58,9 @@ namespace Svc { void TraceFileLogger::set_log_file(const char* fileName, const U32 maxSize) { + FW_ASSERT(fileName != nullptr); + if(this->m_enable_trace == true) { - FW_ASSERT(fileName != nullptr); //If a file is already open then close it if(this->m_mode == OPEN) { this->m_mode = CLOSED; @@ -86,6 +90,7 @@ namespace Svc { void TraceFileLogger::configure(const char* file, const U32 maxSize) { //printf("HERE1: Configure, set file name\n"); + FW_ASSERT(file != nullptr); this->set_log_file(file,maxSize); } @@ -134,6 +139,18 @@ namespace Svc { //} } } + + void TraceFileLogger::process_traceId_storage(U32 traceId,bool enable) { + if (enable == false) { + //Add trace ID to the list (if it doesn't already exist) to stop logging it + (void)this->filterTraceId.add_element(traceId); + } + else{ + //Remove trace ID from list (if its in the list) to start logging it + (void)this->filterTraceId.delete_element(traceId); + } + } + // ---------------------------------------------------------------------- // Handler implementations for user-defined typed input ports // ---------------------------------------------------------------------- @@ -147,11 +164,16 @@ namespace Svc { FW_ASSERT(type.isValid()); U16 bit_mask = static_cast (FILTER_BIT << type.e); U32 traceSize = 0; - //Only log data that is enabled by either config or user + + //Only log trace types that are enabled by either config or user if(!(this->m_traceFilter & bit_mask)) { //TODO: Should we generate an event here, letting user know that this specific filter is disabled? return; } + //Only log trace Ids that're not filtered out + if(this->filterTraceId.search_array(id,NULL)) { + return; + } //Make a call to reset Fw::SerializeBufferBase& buf_ref = m_file_buffer.getSerializeRepr(); @@ -189,6 +211,7 @@ namespace Svc { */ } + // ---------------------------------------------------------------------- // Handler implementations for commands // ---------------------------------------------------------------------- @@ -211,4 +234,13 @@ namespace Svc { this->filter(bitmask,enable); this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); } + + void TraceFileLogger ::DisableTraceId_cmdHandler(FwOpcodeType opCode, + U32 cmdSeq, + U32 traceId, + Svc::TraceFileLogger_Enable enable) { + //Add/remove trace IDs from the array + this->process_traceId_storage(traceId,static_cast(enable)); + this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); + } } // namespace Svc diff --git a/Svc/TraceFileLogger/TraceFileLogger.fpp b/Svc/TraceFileLogger/TraceFileLogger.fpp index d9fa84f182..931107beb7 100644 --- a/Svc/TraceFileLogger/TraceFileLogger.fpp +++ b/Svc/TraceFileLogger/TraceFileLogger.fpp @@ -20,7 +20,7 @@ module Svc { # ---------------------------------------------------------------------- # Commands # ---------------------------------------------------------------------- - @ Enable or disable trace + @ Enable or disable logging all trace async command EnableTrace ( $enable : Enable )\ @@ -37,6 +37,12 @@ module Svc { )\ opcode 0x02 + @ Enable or disable trace logging by id, can disable up to 10 IDs + async command DisableTraceId ( + $traceId : U32 @< Trace ID to enable/disable + $enable : Enable + )\ + opcode 0x03 # ---------------------------------------------------------------------- # Events # ---------------------------------------------------------------------- diff --git a/Svc/TraceFileLogger/TraceFileLogger.hpp b/Svc/TraceFileLogger/TraceFileLogger.hpp index 049212c838..8bc88ee70c 100644 --- a/Svc/TraceFileLogger/TraceFileLogger.hpp +++ b/Svc/TraceFileLogger/TraceFileLogger.hpp @@ -8,6 +8,7 @@ #define Svc_TraceFileLogger_HPP #include "Svc/TraceFileLogger/TraceFileLoggerComponentAc.hpp" +#include "Svc/TraceFileLogger/ArrayProc.hpp" #include #include #include @@ -26,8 +27,10 @@ #define FILE_NAME_MAX 255 #endif -constexpr bool FW_TRACE_RECORD_TRACE = true; -constexpr bool FW_TRACE_RECORD_MINIMAL = false; +// Trace ID Filter size +#ifndef FILTER_TRACEID_SIZE +#define FILTER_TRACEID_SIZE 10 +#endif //Max size of the Trace buffer including metadata (id,timetag,arguments) static const FwSizeType FW_TRACE_MAX_SER_SIZE = (FW_TRACE_BUFFER_MAX_SIZE + sizeof(FwTraceIdType) + Fw::Time::SERIALIZED_SIZE); @@ -83,6 +86,16 @@ class TraceFileLogger : public TraceFileLoggerComponentBase { //! \param enable to turn on/off filtering . void filter(U16 traceType_bitmask,bool enable); + //! \brief Process trace ID storage method + //! + //! The process trace ID storage lets you add/remove trace IDs from the array + //! that is used to evaluate which trace IDs to be ignored while logging + //! + //! \param tracetypes provides bitmasks for tracetypes to select. + //! \param enable to turn on/off filtering . + void process_traceId_storage(U32 traceId, bool enable); + + //! Destroy TraceFileLogger object ~TraceFileLogger(); @@ -130,6 +143,13 @@ class TraceFileLogger : public TraceFileLoggerComponentBase { Svc::TraceFileLogger_Enable enable //!< enable or disable logging ) override; + //! Handler implementation for command DisableTraceId + //! + //! Enable or disable trace logging by id, can disable up to 10 IDs + void DisableTraceId_cmdHandler(FwOpcodeType opCode, //!< The opcode + U32 cmdSeq, //!< The command sequence number + U32 traceId, //!< Trace ID to enable/disable + Svc::TraceFileLogger_Enable enable) override; // ---------------------------------------------------------------------- // Member Variables // ---------------------------------------------------------------------- @@ -151,6 +171,9 @@ class TraceFileLogger : public TraceFileLoggerComponentBase { Fw::Buffer m_file_buffer; //filter trace types U16 m_traceFilter; //Select which trace types to allow logging + //Array to filter on traceIds + U32 traceId_array[FILTER_TRACEID_SIZE]; + ArrayProc filterTraceId; // ---------------------------------------------------------------------- // File functions: diff --git a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTestMain.cpp b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTestMain.cpp index 51251baa80..6ac2c98f9b 100644 --- a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTestMain.cpp +++ b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTestMain.cpp @@ -1,18 +1,18 @@ // ====================================================================== -// \title TraceLoggerTestMain.cpp +// \title TraceFileLoggerTestMain.cpp // \author sreddy -// \brief cpp file for TraceLogger component test main function +// \brief cpp file for TraceFileLogger component test main function // ====================================================================== #include "TraceFileLoggerTester.hpp" TEST(Nominal, test_startup) { - Svc::TraceLoggerTester tester; + Svc::TraceFileLoggerTester tester; tester.test_startup(); } TEST(Nominal, test_log_file) { - Svc::TraceLoggerTester tester; + Svc::TraceFileLoggerTester tester; tester.test_startup(); tester.test_file(); } diff --git a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp index 39ac4b74a2..5bf084001e 100644 --- a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp +++ b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp @@ -1,11 +1,11 @@ // ====================================================================== -// \title TraceLoggerTester.cpp +// \title TraceFileLoggerTester.cpp // \author sreddy -// \brief cpp file for TraceLogger component test harness implementation class +// \brief cpp file for TraceFileLogger component test harness implementation class // ====================================================================== -#include "TraceLoggerTester.hpp" -#include +#include "TraceFileLoggerTester.hpp" +#include #include namespace Svc { @@ -14,22 +14,22 @@ namespace Svc { // Construction and destruction // ---------------------------------------------------------------------- -TraceLoggerTester ::TraceLoggerTester() - : TraceLoggerGTestBase("TraceLoggerTester", TraceLoggerTester::MAX_HISTORY_SIZE), component("TraceLogger") { +TraceFileLoggerTester ::TraceFileLoggerTester() + : TraceFileLoggerGTestBase("TraceFileLoggerTester", TraceFileLoggerTester::MAX_HISTORY_SIZE), component("TraceFileLogger") { this->initComponents(); this->connectPorts(); } -TraceLoggerTester ::~TraceLoggerTester() {} +TraceFileLoggerTester ::~TraceFileLoggerTester() {} // ---------------------------------------------------------------------- // Tests // ---------------------------------------------------------------------- -void TraceLoggerTester::test_startup(){ - this->component.configure("TraceFile.dat"); - this->component.filter(0xF,Svc::TraceLogger_Enable::ENABLE); +void TraceFileLoggerTester::test_startup(){ + this->component.configure("TraceFile.dat",2720000); + this->component.filter(0xF,Svc::TraceFileLogger_Enable::ENABLE); } -void TraceLoggerTester ::test_file() { +void TraceFileLoggerTester ::test_file() { Fw::Time timeTag; timeTag.getTimeBase(); timeTag.getContext(); @@ -39,7 +39,7 @@ void TraceLoggerTester ::test_file() { printf("Test File Writes, including exercising circular buffer fill\n"); //Write to file until it circles back to the beginning into 2 entries - int file_entries = (FW_TRACE_FILE_MAX_SIZE / FW_TRACE_MAX_SER_SIZE)+2; + int file_entries = (TEST_TRACE_FILE_SIZE_MAX / FW_TRACE_MAX_SER_SIZE)+2; U8 type_entry = 0; //to interate over trace type U8 buffer[11] = {0x15,0x26,0x37,0x48,0x59,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF}; //arguments to write Fw::TraceBuffer trace_buffer_args(buffer,sizeof(buffer)); @@ -53,7 +53,7 @@ void TraceLoggerTester ::test_file() { printf("Test Trace Type Filter\n"); //Filter out message_dequeue and port_call - this->sendCmd_FilterTrace(0,1,0x6,Svc::TraceLogger_Enable::DISABLE); + this->sendCmd_FilterTrace(0,1,0x6,Svc::TraceFileLogger_Enable::DISABLE); this->component.doDispatch(); ASSERT_CMD_RESPONSE(0, 2, 1, Fw::CmdResponse::OK); this->invoke_to_TraceBufferLogger(0,0xAA,timeTag,Fw::TraceCfg::TraceType::MESSAGE_QUEUE,trace_buffer_args); @@ -67,7 +67,7 @@ void TraceLoggerTester ::test_file() { //enable all trace type filters and ensure they're received //Filter out message_dequeue and port_call - this->sendCmd_FilterTrace(0,1,0xF,Svc::TraceLogger_Enable::ENABLE); + this->sendCmd_FilterTrace(0,1,0xF,Svc::TraceFileLogger_Enable::ENABLE); this->component.doDispatch(); ASSERT_CMD_RESPONSE(0, 2, 1, Fw::CmdResponse::OK); this->invoke_to_TraceBufferLogger(0,0xAA,timeTag,Fw::TraceCfg::TraceType::MESSAGE_QUEUE,trace_buffer_args); diff --git a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.hpp b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.hpp index 5be712f951..ff80274955 100644 --- a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.hpp +++ b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.hpp @@ -1,18 +1,18 @@ // ====================================================================== -// \title TraceLoggerTester.hpp +// \title TraceFileLoggerTester.hpp // \author sreddy -// \brief hpp file for TraceLogger component test harness implementation class +// \brief hpp file for TraceFileLogger component test harness implementation class // ====================================================================== #ifndef Svc_TraceFileLoggerTester_HPP #define Svc_TraceFileLoggerTester_HPP -#include "Svc/TraceLogger/TraceFileLogger.hpp" -#include "Svc/TraceLogger/TraceFileLoggerGTestBase.hpp" +#include "Svc/TraceFileLogger/TraceFileLogger.hpp" +#include "Svc/TraceFileLogger/TraceFileLoggerGTestBase.hpp" namespace Svc { -class TraceLoggerTester : public TraceLoggerGTestBase { +class TraceFileLoggerTester : public TraceFileLoggerGTestBase { public: // ---------------------------------------------------------------------- // Constants @@ -27,16 +27,19 @@ class TraceLoggerTester : public TraceLoggerGTestBase { // Queue depth supplied to the component instance under test static const FwQueueSizeType TEST_INSTANCE_QUEUE_DEPTH = 10; + //File size to store Trace data + static const U32 TEST_TRACE_FILE_SIZE_MAX = 2720000; + public: // ---------------------------------------------------------------------- // Construction and destruction // ---------------------------------------------------------------------- - //! Construct object TraceLoggerTester - TraceLoggerTester(); + //! Construct object TraceFileLoggerTester + TraceFileLoggerTester(); - //! Destroy object TraceLoggerTester - ~TraceLoggerTester(); + //! Destroy object TraceFileLoggerTester + ~TraceFileLoggerTester(); public: // ---------------------------------------------------------------------- @@ -64,7 +67,7 @@ class TraceLoggerTester : public TraceLoggerGTestBase { // ---------------------------------------------------------------------- //! The component under test - TraceLogger component; + TraceFileLogger component; }; } // namespace Svc diff --git a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTesterHelpers.cpp b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTesterHelpers.cpp index ed718c3705..34ad10c232 100644 --- a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTesterHelpers.cpp +++ b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTesterHelpers.cpp @@ -1,7 +1,7 @@ // ====================================================================== -// \title TraceLoggerTesterHelpers.cpp +// \title TraceFileLoggerTesterHelpers.cpp // \author Generated by fpp-to-cpp -// \brief cpp file for TraceLogger component test harness helper functions +// \brief cpp file for TraceFileLogger component test harness helper functions // ====================================================================== #include "TraceFileLoggerTester.hpp" @@ -12,7 +12,7 @@ namespace Svc { // Helper functions // ---------------------------------------------------------------------- -void TraceLoggerTester ::connectPorts() { +void TraceFileLoggerTester ::connectPorts() { // Connect special input ports this->connect_to_cmdIn(0, this->component.get_cmdIn_InputPort(0)); @@ -34,9 +34,9 @@ void TraceLoggerTester ::connectPorts() { this->connect_to_TraceBufferLogger(0, this->component.get_TraceBufferLogger_InputPort(0)); } -void TraceLoggerTester ::initComponents() { +void TraceFileLoggerTester ::initComponents() { this->init(); - this->component.init(TraceLoggerTester::TEST_INSTANCE_QUEUE_DEPTH, TraceLoggerTester::TEST_INSTANCE_ID); + this->component.init(TraceFileLoggerTester::TEST_INSTANCE_QUEUE_DEPTH, TraceFileLoggerTester::TEST_INSTANCE_ID); } } // namespace Svc From 3e0b5467031602c867ec1cdffd14453ea23b54cf Mon Sep 17 00:00:00 2001 From: Shivaly Date: Mon, 23 Sep 2024 18:04:31 -0700 Subject: [PATCH 22/37] FP-2784: Add compiler time flags for trace logging config full/minimal/off --- config/FpConfig.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/config/FpConfig.h b/config/FpConfig.h index 8ea1a77732..54a762033d 100644 --- a/config/FpConfig.h +++ b/config/FpConfig.h @@ -197,6 +197,17 @@ typedef FwIndexType FwQueueSizeType; //!< for multi-note systems) #endif +//Trace configurations +//Configure Trace to off, full and minimal +#ifndef FW_TRACE_RECORD_TRACE +#define FW_TRACE_RECORD_TRACE 1 +#endif + +#ifndef FW_TRACE_RECORD_MINIMAL +#define FW_TRACE_RECORD_MINIMAL 0 +#endif + + // Component Facilities // Serialization From 15cb9710746a7a93bef287ddb4ea4c1a3d9a293d Mon Sep 17 00:00:00 2001 From: Shivaly Date: Mon, 23 Sep 2024 18:25:22 -0700 Subject: [PATCH 23/37] FP-2784: Spell check error fixes --- Fw/Trace/TraceEntity.hpp | 6 ++-- Fw/Trace/docs/sdd.md | 2 +- Svc/TraceFileLogger/ArrayProc.hpp | 8 ++--- Svc/TraceFileLogger/TraceFileLogger.cpp | 4 +-- Svc/TraceFileLogger/TraceFileLogger.hpp | 12 +++---- .../test/ut/TraceFileLoggerTester.cpp | 2 +- config/TraceCfg.fpp | 36 +++++++++++++++++++ 7 files changed, 53 insertions(+), 17 deletions(-) create mode 100644 config/TraceCfg.fpp diff --git a/Fw/Trace/TraceEntity.hpp b/Fw/Trace/TraceEntity.hpp index df49e59a2a..f8ff0d27e5 100644 --- a/Fw/Trace/TraceEntity.hpp +++ b/Fw/Trace/TraceEntity.hpp @@ -4,8 +4,8 @@ * Author: sreddy */ -#ifndef TRACEPACKET_HPP_ -#define TRACEPACKET_HPP_ +#ifndef TRACEENTITY_HPP_ +#define TRACEENTITY_HPP_ #include #include @@ -38,4 +38,4 @@ namespace Fw { } /* namespace Fw */ -#endif /* TRACEPACKET_HPP_ */ +#endif /* TRACEENTITY_HPP_ */ diff --git a/Fw/Trace/docs/sdd.md b/Fw/Trace/docs/sdd.md index 802a29e6f7..55b23e0351 100644 --- a/Fw/Trace/docs/sdd.md +++ b/Fw/Trace/docs/sdd.md @@ -10,7 +10,7 @@ Trace Requirements in FPrime: - It is a way to create time correlation events as a reaction for resetting software. 2. Trace shall provide a port to log the following: - Event ID : A unique identifier recording a “Trace Event” - - Time Tag : Caputes a high precision timestamp + - Time Tag : Captures a high precision timestamp - Client Data : A small sample of user arguments recorded into trace buffer 3. Trace shall create trace points and log events in software automatically for thread switching(?) and ...TBD, ask Tim 4. Trace shall provide a port for other components or user defined points to log events during software execution. diff --git a/Svc/TraceFileLogger/ArrayProc.hpp b/Svc/TraceFileLogger/ArrayProc.hpp index a53d18db63..ba404adab8 100644 --- a/Svc/TraceFileLogger/ArrayProc.hpp +++ b/Svc/TraceFileLogger/ArrayProc.hpp @@ -34,21 +34,21 @@ namespace Svc { //! //! \param element value to be added to the array //! - //! \return true if adding an eleemnt to the array was successful, false otherwise + //! \return true if adding an element to the array was successful, false otherwise bool set_array(U32 *array_ptr, U8 array_size); //! \brief Add an element to the array //! //! \param element value to be added to the array //! - //! \return true if adding an eleemnt to the array was successful, false otherwise + //! \return true if adding an element to the array was successful, false otherwise bool add_element(U32 element); //! \brief Delete element from the array and shift the rest of the array up //! //! \param element value to be deleted from the array //! - //! \return true if deleting an eleemnt from the array was successful, false otherwise + //! \return true if deleting an element from the array was successful, false otherwise bool delete_element(U32 element); //! \brief Search for an element in the array @@ -56,7 +56,7 @@ namespace Svc { //! \param element value to be searched in the array //! \param arrayIndex returns the index where (if) the array element exists //! - //! \return true if the eleemnt is found in the array, false otherwise + //! \return true if the element is found in the array, false otherwise bool search_array(U32 element, U8 *index); // ---------------------------------------------------------------------- diff --git a/Svc/TraceFileLogger/TraceFileLogger.cpp b/Svc/TraceFileLogger/TraceFileLogger.cpp index 46559bfe17..76b5181572 100644 --- a/Svc/TraceFileLogger/TraceFileLogger.cpp +++ b/Svc/TraceFileLogger/TraceFileLogger.cpp @@ -170,7 +170,7 @@ namespace Svc { //TODO: Should we generate an event here, letting user know that this specific filter is disabled? return; } - //Only log trace Ids that're not filtered out + //Only log trace Ids that are not filtered out if(this->filterTraceId.search_array(id,NULL)) { return; } @@ -189,7 +189,7 @@ namespace Svc { printf("File size %d",buf_ref.getBuffLength()); } //printf("Buffer size is :%d, Full buffer length: %d\n",m_file_buffer.getSize(),buf_ref.getBuffLength()); - //Note: Because its a circular file we're writing the full buffer capacatiy to the file + //Note: Because its a circular file we're writing the full buffer capacity to the file // instead of the actual buffer size (variable based on number of args). This will // ensure when the file is overwritten, we preserve old records this->write_log_file(m_file_buffer.getData(),traceSize); diff --git a/Svc/TraceFileLogger/TraceFileLogger.hpp b/Svc/TraceFileLogger/TraceFileLogger.hpp index 8bc88ee70c..1ee9e98429 100644 --- a/Svc/TraceFileLogger/TraceFileLogger.hpp +++ b/Svc/TraceFileLogger/TraceFileLogger.hpp @@ -27,9 +27,9 @@ #define FILE_NAME_MAX 255 #endif -// Trace ID Filter size -#ifndef FILTER_TRACEID_SIZE -#define FILTER_TRACEID_SIZE 10 +// Trace ID filter array size +#ifndef FILTER_TRACE_ID_SIZE +#define FILTER_TRACE_ID_SIZE 10 #endif //Max size of the Trace buffer including metadata (id,timetag,arguments) @@ -82,7 +82,7 @@ class TraceFileLogger : public TraceFileLoggerComponentBase { //! //! The filter method selects which trace types to be logged and which to ignore. //! - //! \param tracetypes provides bitmasks for tracetypes to select. + //! \param traceType_bitmask provides bitmask for trace types to select. //! \param enable to turn on/off filtering . void filter(U16 traceType_bitmask,bool enable); @@ -91,7 +91,7 @@ class TraceFileLogger : public TraceFileLoggerComponentBase { //! The process trace ID storage lets you add/remove trace IDs from the array //! that is used to evaluate which trace IDs to be ignored while logging //! - //! \param tracetypes provides bitmasks for tracetypes to select. + //! \param traceId which trace id to enable / disable. //! \param enable to turn on/off filtering . void process_traceId_storage(U32 traceId, bool enable); @@ -172,7 +172,7 @@ class TraceFileLogger : public TraceFileLoggerComponentBase { //filter trace types U16 m_traceFilter; //Select which trace types to allow logging //Array to filter on traceIds - U32 traceId_array[FILTER_TRACEID_SIZE]; + U32 traceId_array[FILTER_TRACE_ID_SIZE]; ArrayProc filterTraceId; // ---------------------------------------------------------------------- diff --git a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp index 5bf084001e..f505e117c7 100644 --- a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp +++ b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp @@ -40,7 +40,7 @@ void TraceFileLoggerTester ::test_file() { //Write to file until it circles back to the beginning into 2 entries int file_entries = (TEST_TRACE_FILE_SIZE_MAX / FW_TRACE_MAX_SER_SIZE)+2; - U8 type_entry = 0; //to interate over trace type + U8 type_entry = 0; //to iterate over trace type U8 buffer[11] = {0x15,0x26,0x37,0x48,0x59,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF}; //arguments to write Fw::TraceBuffer trace_buffer_args(buffer,sizeof(buffer)); diff --git a/config/TraceCfg.fpp b/config/TraceCfg.fpp new file mode 100644 index 0000000000..5ed90760dd --- /dev/null +++ b/config/TraceCfg.fpp @@ -0,0 +1,36 @@ +# ====================================================================== +# FPP file for Version configuration +# ====================================================================== +# From Design review, it was requested that we add more trace types such as +# interrupts, exceptions, context switch,queue add/remove, EVRs, +# semaphore takes(?), stack trace, DMAs +# Also consider adding adding state machine transitions, timer acquisition +# and release traces, and EVRS to the category of traces that are automated. +# Also consider what a potential IO trace could look like. A ring buffer for IO +# is always requested for 1553 and recently M-Bus on Psyche. Presumably a +# limited IO trace of some could be packaged with the autopsy log and be useful. + +#Note: Trace Types are configurable by the project and defined here. +# It is stored as a bitmask that will be used for log filtering. +# Current design allows a max of 16 trace types + +module Fw { + + module TraceCfg { + + @Enum representing trace Types (aka Trace Categories) + enum TraceType { + MESSAGE_QUEUE = 0 @< Trace type of message wait + MESSAGE_DEQUEUE = 1 @< Trace type of message dequeue + PORT_CALL = 2 @< Trace type of port invocations + USER = 3 @< user invoked trace + #=====Do Not Delete above======# + INTERRUPTS = 4 @ Date: Mon, 23 Sep 2024 18:38:02 -0700 Subject: [PATCH 24/37] FP-2784: Typo updates to processing arrays --- Svc/TraceFileLogger/ArrayProc.cpp | 9 ++++----- Svc/TraceFileLogger/ArrayProc.hpp | 8 ++++---- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/Svc/TraceFileLogger/ArrayProc.cpp b/Svc/TraceFileLogger/ArrayProc.cpp index d6d12552cb..14f6c8491b 100644 --- a/Svc/TraceFileLogger/ArrayProc.cpp +++ b/Svc/TraceFileLogger/ArrayProc.cpp @@ -18,7 +18,7 @@ namespace Svc { // ---------------------------------------------------------------------- ArrayProc::ArrayProc() : - m_currentSize(0),m_maxSize(10),m_storedArray(NULL) + m_maxSize(10),m_currentSize(0),m_storedArray(NULL) { } ArrayProc::~ArrayProc() @@ -29,8 +29,7 @@ namespace Svc { // Member Functions // ---------------------------------------------------------------------- - ArrayProc::set_array(U32 *array_ptr, U8 array_size) : - m_currentSize(0) + void ArrayProc::set_array(U32 *array_ptr, U8 array_size) { m_storedArray = array_ptr; m_maxSize = array_size; @@ -53,7 +52,7 @@ namespace Svc { return false; } else { - for(U8 i = elementIndex; i < this->m_currentSize, i++) { + for(U8 i = elementIndex; i < this->m_currentSize ; i++) { this->m_storedArray[i] = this->m_storedArray[i+1]; } this->m_currentSize--; @@ -63,7 +62,7 @@ namespace Svc { bool ArrayProc::search_array(U32 element, U8 *index) { for(U8 i = 0 ; i < m_currentSize ; i++) { - if(this->m_storedArray[i] = element) { + if(this->m_storedArray[i] == element) { if (index != NULL) *index = i; return true; } diff --git a/Svc/TraceFileLogger/ArrayProc.hpp b/Svc/TraceFileLogger/ArrayProc.hpp index ba404adab8..0d2e3bd2d5 100644 --- a/Svc/TraceFileLogger/ArrayProc.hpp +++ b/Svc/TraceFileLogger/ArrayProc.hpp @@ -32,10 +32,10 @@ namespace Svc { //! \brief Set pointer to the array //! - //! \param element value to be added to the array - //! - //! \return true if adding an element to the array was successful, false otherwise - bool set_array(U32 *array_ptr, U8 array_size); + //! \param array_ptr pointer to the array to be used + //! \param array_size array size + //! + void set_array(U32 *array_ptr, U8 array_size); //! \brief Add an element to the array //! From acf1982afed068d6330c7631142eb846da94d668 Mon Sep 17 00:00:00 2001 From: Shivaly Date: Thu, 26 Sep 2024 15:59:42 -0700 Subject: [PATCH 25/37] FP-2784: scrubbing comments etc --- Svc/TraceFileLogger/TraceFileLogger.cpp | 12 +++++++----- Svc/TraceFileLogger/TraceFileLogger.hpp | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Svc/TraceFileLogger/TraceFileLogger.cpp b/Svc/TraceFileLogger/TraceFileLogger.cpp index 76b5181572..afc09f4c5f 100644 --- a/Svc/TraceFileLogger/TraceFileLogger.cpp +++ b/Svc/TraceFileLogger/TraceFileLogger.cpp @@ -141,8 +141,10 @@ namespace Svc { } void TraceFileLogger::process_traceId_storage(U32 traceId,bool enable) { - if (enable == false) { - //Add trace ID to the list (if it doesn't already exist) to stop logging it + + //Add trace ID to the list (if it doesn't already exist) to stop logging it + if (enable == false && + (this->filterTraceId.search_array(traceId, nullptr) == false)) { (void)this->filterTraceId.add_element(traceId); } else{ @@ -170,8 +172,8 @@ namespace Svc { //TODO: Should we generate an event here, letting user know that this specific filter is disabled? return; } - //Only log trace Ids that are not filtered out - if(this->filterTraceId.search_array(id,NULL)) { + //Only log trace Ids that are not in the list + if(this->filterTraceId.search_array(id,nullptr)) { return; } @@ -193,7 +195,7 @@ namespace Svc { // instead of the actual buffer size (variable based on number of args). This will // ensure when the file is overwritten, we preserve old records this->write_log_file(m_file_buffer.getData(),traceSize); - // If we choose not to use circular file write then use the below line instead. + // If we choose not to use circular file write then use below instead. //this->write_log_file(m_file_buffer.getData(),buf_ref.getBuffLength()); /* diff --git a/Svc/TraceFileLogger/TraceFileLogger.hpp b/Svc/TraceFileLogger/TraceFileLogger.hpp index 1ee9e98429..d7e35cf09b 100644 --- a/Svc/TraceFileLogger/TraceFileLogger.hpp +++ b/Svc/TraceFileLogger/TraceFileLogger.hpp @@ -172,7 +172,7 @@ class TraceFileLogger : public TraceFileLoggerComponentBase { //filter trace types U16 m_traceFilter; //Select which trace types to allow logging //Array to filter on traceIds - U32 traceId_array[FILTER_TRACE_ID_SIZE]; + U32 traceId_array[FILTER_TRACE_ID_SIZE] = {0}; ArrayProc filterTraceId; // ---------------------------------------------------------------------- From 6486bd3d70afc7023cd5df72cb038cc58f773883 Mon Sep 17 00:00:00 2001 From: Shivaly Date: Wed, 2 Oct 2024 10:04:52 -0700 Subject: [PATCH 26/37] FP-2784 : UT updates in progress --- Ref/Top/RefTopology.cpp | 4 +- Svc/TraceFileLogger/TraceFileLogger.cpp | 14 +- Svc/TraceFileLogger/TraceFileLogger.hpp | 2 +- .../test/ut/TraceFileLoggerTestMain.cpp | 12 + .../test/ut/TraceFileLoggerTester.cpp | 275 +++++++++++++++++- .../test/ut/TraceFileLoggerTester.hpp | 11 +- 6 files changed, 296 insertions(+), 22 deletions(-) diff --git a/Ref/Top/RefTopology.cpp b/Ref/Top/RefTopology.cpp index 93938e4d48..d6dd2007b6 100644 --- a/Ref/Top/RefTopology.cpp +++ b/Ref/Top/RefTopology.cpp @@ -138,9 +138,9 @@ void configureTopology() { // Note: Uncomment when using Svc:TlmPacketizer //tlmSend.setPacketList(RefPacketsPkts, RefPacketsIgnore, 1); - //Configure Trace Logger filename to be used for storing trace data + //Configure Trace Logger filename and size to be used for storing trace data traceLogger.configure("TraceFile.dat",2720000); - traceLogger.filter(0xF,Svc::TraceLogger_Enable::ENABLE); + traceLogger.filterTraceType(0xF,Svc::TraceLogger_Enable::ENABLE); } // Public functions for use in main program are namespaced with deployment name Ref diff --git a/Svc/TraceFileLogger/TraceFileLogger.cpp b/Svc/TraceFileLogger/TraceFileLogger.cpp index afc09f4c5f..6881695b29 100644 --- a/Svc/TraceFileLogger/TraceFileLogger.cpp +++ b/Svc/TraceFileLogger/TraceFileLogger.cpp @@ -33,6 +33,7 @@ namespace Svc { m_traceFilter(0) { this->m_enable_trace = (FW_TRACE_RECORD_TRACE == true) ? true : false; + ::memset(m_file_data, 0, sizeof(m_file_data)); //Set data and size for file buffer this->m_file_buffer.setData(m_file_data); @@ -94,7 +95,9 @@ namespace Svc { this->set_log_file(file,maxSize); } - void TraceFileLogger::filter(U16 traceType_bitmask, bool enable){ + // The filter method selects which trace types to be logged and which to ignore. + // The bit mask is based on the enum list for trace type in TraceCfg.fpp + void TraceFileLogger::filterTraceType(U16 traceType_bitmask, bool enable){ if(traceType_bitmask == 0){ //TODO: Figure out if this should be made an illegal entry or just ignore it? // @@ -143,9 +146,10 @@ namespace Svc { void TraceFileLogger::process_traceId_storage(U32 traceId,bool enable) { //Add trace ID to the list (if it doesn't already exist) to stop logging it - if (enable == false && - (this->filterTraceId.search_array(traceId, nullptr) == false)) { - (void)this->filterTraceId.add_element(traceId); + if (enable == false) { + if(this->filterTraceId.search_array(traceId, nullptr) == false) { + (void)this->filterTraceId.add_element(traceId); + } } else{ //Remove trace ID from list (if its in the list) to start logging it @@ -233,7 +237,7 @@ namespace Svc { U32 cmdSeq, U16 bitmask, Svc::TraceFileLogger_Enable enable) { - this->filter(bitmask,enable); + this->filterTraceType(bitmask,enable); this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); } diff --git a/Svc/TraceFileLogger/TraceFileLogger.hpp b/Svc/TraceFileLogger/TraceFileLogger.hpp index d7e35cf09b..cb7ee0ce23 100644 --- a/Svc/TraceFileLogger/TraceFileLogger.hpp +++ b/Svc/TraceFileLogger/TraceFileLogger.hpp @@ -84,7 +84,7 @@ class TraceFileLogger : public TraceFileLoggerComponentBase { //! //! \param traceType_bitmask provides bitmask for trace types to select. //! \param enable to turn on/off filtering . - void filter(U16 traceType_bitmask,bool enable); + void filterTraceType(U16 traceType_bitmask,bool enable); //! \brief Process trace ID storage method //! diff --git a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTestMain.cpp b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTestMain.cpp index 6ac2c98f9b..52e19d3a1c 100644 --- a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTestMain.cpp +++ b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTestMain.cpp @@ -17,6 +17,18 @@ TEST(Nominal, test_log_file) { tester.test_file(); } +TEST(Nominal, test_filter_tracy_type) { + Svc::TraceFileLoggerTester tester; + tester.test_startup(); + tester.test_filter_trace_type(); +} + +TEST(Nominal, test_filter_tracy_id) { + Svc::TraceFileLoggerTester tester; + tester.test_startup(); + tester.test_filter_trace_id(); +} + int main(int argc, char** argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); diff --git a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp index f505e117c7..359971d8eb 100644 --- a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp +++ b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp @@ -7,7 +7,9 @@ #include "TraceFileLoggerTester.hpp" #include #include - +#include +#include +#include namespace Svc { // ---------------------------------------------------------------------- @@ -26,36 +28,92 @@ TraceFileLoggerTester ::~TraceFileLoggerTester() {} // Tests // ---------------------------------------------------------------------- void TraceFileLoggerTester::test_startup(){ - this->component.configure("TraceFile.dat",2720000); - this->component.filter(0xF,Svc::TraceFileLogger_Enable::ENABLE); + this->component.configure("TraceFileTest.dat",TEST_TRACE_FILE_SIZE_MAX); + this->component.filterTraceType(0xF,Svc::TraceFileLogger_Enable::ENABLE); } + void TraceFileLoggerTester ::test_file() { Fw::Time timeTag; - timeTag.getTimeBase(); - timeTag.getContext(); - timeTag.getSeconds(); - timeTag.getUSeconds(); + U8 trace_id; + U16 time_store_type; + //U8 time_context_type; + U8 time_secs; + U8 time_usecs; + U8 arg_size; + std::array arg_check; + U8* arg_check_ptr = &arg_check[0]; printf("Test File Writes, including exercising circular buffer fill\n"); - //Write to file until it circles back to the beginning into 2 entries - int file_entries = (TEST_TRACE_FILE_SIZE_MAX / FW_TRACE_MAX_SER_SIZE)+2; + U16 total_records = (TEST_TRACE_FILE_SIZE_MAX / FW_TRACE_MAX_SER_SIZE); + U16 file_entries = total_records+2; U8 type_entry = 0; //to iterate over trace type - U8 buffer[11] = {0x15,0x26,0x37,0x48,0x59,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF}; //arguments to write - Fw::TraceBuffer trace_buffer_args(buffer,sizeof(buffer)); + std::array buffer = {0x15,0x26,0x37,0x48,0x59,170,0xBB,0xCC,0xDD,0xEE,0xFF}; //arguments to write + U8 *buff_ptr = &buffer[0]; + Fw::TraceBuffer trace_buffer_args(buff_ptr,buffer.size()); for (int i = 0; i < file_entries; i++) { type_entry = (type_entry+1) % 4; + timeTag.set(TB_DONT_CARE ,i,i+10); this->invoke_to_TraceBufferLogger(0,i,timeTag,static_cast(type_entry),trace_buffer_args); this->component.doDispatch(); - } + //Read file to the storage buffer + this->read_file(); + //Iterate through the buffer and verify contents + for(U16 i = 0 ; i < total_records ; i++ ) { + //Verify Type ID + U16 buff_ptr = i*FW_TRACE_MAX_SER_SIZE; + memcpy(&trace_id,&storage_buffer[buff_ptr+3],sizeof(trace_id)); + if(i == 0 || i == 1) { ASSERT_EQ(trace_id,total_records+i);} + else ASSERT_EQ(trace_id,i); + + //Verify Time Tag + memcpy(&time_store_type,&storage_buffer[buff_ptr+4],sizeof(time_store_type)); + memcpy(&time_secs,&storage_buffer[buff_ptr+10],sizeof(time_secs)); + memcpy(&time_usecs,&storage_buffer[buff_ptr+14],sizeof(time_usecs)); + ASSERT_EQ(time_store_type,TB_DONT_CARE); + if(i == 0 || i == 1) { + ASSERT_EQ(time_secs,total_records+i); + ASSERT_EQ(time_usecs,total_records+i+10); + } + else { + ASSERT_EQ(time_secs,i); + ASSERT_EQ(time_usecs,i+10); + + } + + //Verify Arguments + memcpy(&arg_size,&storage_buffer[buff_ptr+16],sizeof(arg_size)); + memcpy(arg_check_ptr,&storage_buffer[buff_ptr+17],arg_check.size()); + ASSERT_EQ(arg_size,sizeof(buffer)); + ASSERT_TRUE(arg_check == buffer); + } + +} + +void TraceFileLoggerTester :: test_filter_trace_type() { printf("Test Trace Type Filter\n"); + Fw::Time timeTag; + U8 trace_id; + U16 time_store_type; + U8 time_secs; + U8 time_usecs; + U8 arg_size; + std::array arg_check; + U8* arg_check_ptr = &arg_check[0]; + std::array buffer = {0x15,0x26,0x37,0x48,0x59,170,0xBB,0xCC,0xDD,0xEE,0xFF}; //arguments to write + U8 *buff_ptr = &buffer[0]; + Fw::TraceBuffer trace_buffer_args(buff_ptr,buffer.size()); + timeTag.set(TB_DONT_CARE ,0xBE,0xEF); + + //Filter out message_dequeue and port_call this->sendCmd_FilterTrace(0,1,0x6,Svc::TraceFileLogger_Enable::DISABLE); this->component.doDispatch(); ASSERT_CMD_RESPONSE(0, 2, 1, Fw::CmdResponse::OK); + this->invoke_to_TraceBufferLogger(0,0xAA,timeTag,Fw::TraceCfg::TraceType::MESSAGE_QUEUE,trace_buffer_args); this->component.doDispatch(); this->invoke_to_TraceBufferLogger(0,0xBB,timeTag,Fw::TraceCfg::TraceType::MESSAGE_DEQUEUE,trace_buffer_args); @@ -79,6 +137,199 @@ void TraceFileLoggerTester ::test_file() { this->invoke_to_TraceBufferLogger(0,0xDD,timeTag,Fw::TraceCfg::TraceType::USER,trace_buffer_args); this->component.doDispatch(); + this->read_file(); + U16 total_records = (this->file_size / FW_TRACE_MAX_SER_SIZE); + printf ("TOTAL RECORDS : %d \n", total_records); + + //Iterate through buffer and verify contents + for(U16 i = 0 ; i < total_records ; i++ ) { + + U16 buff_ptr = i*FW_TRACE_MAX_SER_SIZE; + memcpy(&trace_id,&storage_buffer[buff_ptr+3],sizeof(trace_id)); + //Verify Trace ID + switch(i) { + case 0: + ASSERT_EQ(trace_id,0xAA); + break; + case 1: + ASSERT_EQ(trace_id,0xDD); + break; + case 2: + ASSERT_EQ(trace_id,0xAA); + break; + case 3: + ASSERT_EQ(trace_id,0xBB); + break; + case 4: + ASSERT_EQ(trace_id,0xCC); + break; + case 5: + ASSERT_EQ(trace_id,0xDD); + break; + } + + //Verify time tag + memcpy(&time_store_type,&storage_buffer[buff_ptr+4],sizeof(time_store_type)); + memcpy(&time_secs,&storage_buffer[buff_ptr+10],sizeof(time_secs)); + memcpy(&time_usecs,&storage_buffer[buff_ptr+14],sizeof(time_usecs)); + ASSERT_EQ(time_secs, 0xBE); + ASSERT_EQ(time_usecs, 0xEF); + ASSERT_EQ(time_store_type,0xFFFF); + + //Verify Arguments + memcpy(&arg_size,&storage_buffer[buff_ptr+16],sizeof(arg_size)); + memcpy(arg_check_ptr,&storage_buffer[buff_ptr+17],arg_check.size()); + ASSERT_EQ(arg_size,sizeof(buffer)); //size of the arguments + ASSERT_TRUE(arg_check == buffer); //Buffer data matches + + } +} + +void TraceFileLoggerTester :: test_filter_trace_id() { + printf("Test Trace ID Filtering Capability\n"); + Fw::Time timeTag; + U8 trace_id; + U16 time_store_type; + U8 time_secs; + U8 time_usecs; + U8 arg_size; + std::array arg_check; + U8* arg_check_ptr = &arg_check[0]; + std::array buffer = {0x15,0x26,0x37,0x48,0x59,170,0xBB,0xCC,0xDD,0xEE,0xFF}; //arguments to write + U8 *buff_ptr = &buffer[0]; + Fw::TraceBuffer trace_buffer_args(buff_ptr,buffer.size()); + timeTag.set(TB_DONT_CARE ,0xBE,0xEF); + + /* + 1. Send a few trace ids + 2. Verify they exist in log file + 3. Send command to disable a few trace ids; verify array + 4. Write to buffer logger and ensure they're filtered out + 5. Write duplicate commands and check trace id array that ids are unique + 6. Enable trace ids again, verify array + 7. Verify file that all of them exist. + */ + + //Filter out trace ids 0xAA and 0xDD + this->sendCmd_DisableTraceId(0,1,0xAA,Svc::TraceFileLogger_Enable::DISABLE); + this->component.doDispatch(); + ASSERT_CMD_RESPONSE(0, 3, 1, Fw::CmdResponse::OK); + this->sendCmd_DisableTraceId(0,1,0xDD,Svc::TraceFileLogger_Enable::DISABLE); + this->component.doDispatch(); + ASSERT_CMD_RESPONSE(0, 3, 1, Fw::CmdResponse::OK); + + //Verify Array + ASSERT_EQ(this->component.traceId_array[0], 0xAA); + ASSERT_EQ(this->component.traceId_array[1], 0xDD); + + //Send command with duplicate traceID and ensure the array only contains unique trace IDs + this->sendCmd_DisableTraceId(0,1,0xDD,Svc::TraceFileLogger_Enable::DISABLE); + this->component.doDispatch(); + ASSERT_CMD_RESPONSE(0, 3, 1, Fw::CmdResponse::OK); + + //Verify Array + ASSERT_EQ(this->component.traceId_array[0], 0xAA); + ASSERT_EQ(this->component.traceId_array[1], 0xDD); + ASSERT_EQ(this->component.traceId_array[3], 0x00); + + this->invoke_to_TraceBufferLogger(0,0xAA,timeTag,Fw::TraceCfg::TraceType::MESSAGE_QUEUE,trace_buffer_args); + this->component.doDispatch(); + this->invoke_to_TraceBufferLogger(0,0xBB,timeTag,Fw::TraceCfg::TraceType::MESSAGE_DEQUEUE,trace_buffer_args); + this->component.doDispatch(); + this->invoke_to_TraceBufferLogger(0,0xCC,timeTag,Fw::TraceCfg::TraceType::PORT_CALL,trace_buffer_args); + this->component.doDispatch(); + this->invoke_to_TraceBufferLogger(0,0xDD,timeTag,Fw::TraceCfg::TraceType::USER,trace_buffer_args); + this->component.doDispatch(); + + //Filter out trace ids 0xAA and 0xDD + this->sendCmd_DisableTraceId(0,1,0xAA,Svc::TraceFileLogger_Enable::ENABLE); + this->component.doDispatch(); + ASSERT_CMD_RESPONSE(0, 3, 1, Fw::CmdResponse::OK); + this->sendCmd_DisableTraceId(0,1,0xDD,Svc::TraceFileLogger_Enable::ENABLE); + this->component.doDispatch(); + ASSERT_CMD_RESPONSE(0, 3, 1, Fw::CmdResponse::OK); + this->sendCmd_DisableTraceId(0,1,0xCC,Svc::TraceFileLogger_Enable::DISABLE); + this->component.doDispatch(); + ASSERT_CMD_RESPONSE(0, 3, 1, Fw::CmdResponse::OK); + + //enable all trace type filters and ensure they're received + this->invoke_to_TraceBufferLogger(0,0xAA,timeTag,Fw::TraceCfg::TraceType::MESSAGE_QUEUE,trace_buffer_args); + this->component.doDispatch(); + this->invoke_to_TraceBufferLogger(0,0xBB,timeTag,Fw::TraceCfg::TraceType::MESSAGE_DEQUEUE,trace_buffer_args); + this->component.doDispatch(); + this->invoke_to_TraceBufferLogger(0,0xCC,timeTag,Fw::TraceCfg::TraceType::PORT_CALL,trace_buffer_args); + this->component.doDispatch(); + this->invoke_to_TraceBufferLogger(0,0xDD,timeTag,Fw::TraceCfg::TraceType::USER,trace_buffer_args); + this->component.doDispatch(); + + this->read_file(); + U16 total_records = (this->file_size / FW_TRACE_MAX_SER_SIZE); + printf ("TOTAL RECORDS : %d \n", total_records); + + //Iterate through buffer and verify contents + for(U16 i = 0 ; i < total_records ; i++ ) { + + U16 buff_ptr = i*FW_TRACE_MAX_SER_SIZE; + memcpy(&trace_id,&storage_buffer[buff_ptr+3],sizeof(trace_id)); + //Verify Trace ID + switch(i) { + case 0: + ASSERT_EQ(trace_id,0xBB); + break; + case 1: + ASSERT_EQ(trace_id,0xCC); + break; + case 2: + ASSERT_EQ(trace_id,0xAA); + break; + case 3: + ASSERT_EQ(trace_id,0xBB); + break; + case 4: + ASSERT_EQ(trace_id,0xDD); + break; + default: + FW_ASSERT(false); + } + + //Verify time tag + memcpy(&time_store_type,&storage_buffer[buff_ptr+4],sizeof(time_store_type)); + memcpy(&time_secs,&storage_buffer[buff_ptr+10],sizeof(time_secs)); + memcpy(&time_usecs,&storage_buffer[buff_ptr+14],sizeof(time_usecs)); + ASSERT_EQ(time_secs, 0xBE); + ASSERT_EQ(time_usecs, 0xEF); + ASSERT_EQ(time_store_type,0xFFFF); + + //Verify Arguments + memcpy(&arg_size,&storage_buffer[buff_ptr+16],sizeof(arg_size)); + memcpy(arg_check_ptr,&storage_buffer[buff_ptr+17],arg_check.size()); + ASSERT_EQ(arg_size,sizeof(buffer)); //size of the arguments + ASSERT_TRUE(arg_check == buffer); //Buffer data matches + } +} + +void TraceFileLoggerTester :: read_file() { + std::ifstream trace_file("TraceFileTest.dat");//,std::ios::binary); + + trace_file.seekg(0, std::ios::end); + std::streamsize size = trace_file.tellg(); // Get the size of the file + printf("Size of the trace_file is %ld\n",size); + this->file_size = size; + trace_file.seekg(0, std::ios::beg); + + storage_buffer.resize(size); + fill(storage_buffer.begin(),storage_buffer.end(),0); + trace_file.read(reinterpret_cast(storage_buffer.data()),size); + + trace_file.close(); + + /* + for(U8 byte : storage_buffer) { + //std::cout << byte << " "; + printf("0x%X ",(byte)); + + } + */ } } // namespace Svc diff --git a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.hpp b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.hpp index ff80274955..841d0d39b8 100644 --- a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.hpp +++ b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.hpp @@ -9,7 +9,7 @@ #include "Svc/TraceFileLogger/TraceFileLogger.hpp" #include "Svc/TraceFileLogger/TraceFileLoggerGTestBase.hpp" - +#include namespace Svc { class TraceFileLoggerTester : public TraceFileLoggerGTestBase { @@ -28,7 +28,7 @@ class TraceFileLoggerTester : public TraceFileLoggerGTestBase { static const FwQueueSizeType TEST_INSTANCE_QUEUE_DEPTH = 10; //File size to store Trace data - static const U32 TEST_TRACE_FILE_SIZE_MAX = 2720000; + static const U32 TEST_TRACE_FILE_SIZE_MAX = 27200; public: // ---------------------------------------------------------------------- @@ -49,6 +49,11 @@ class TraceFileLoggerTester : public TraceFileLoggerGTestBase { //! To do void test_startup(); void test_file(); + //Read trace file into a buffer + void read_file(); + //Test trace filtering commands + void test_filter_trace_id(); + void test_filter_trace_type(); private: // ---------------------------------------------------------------------- @@ -68,6 +73,8 @@ class TraceFileLoggerTester : public TraceFileLoggerGTestBase { //! The component under test TraceFileLogger component; + std::vector storage_buffer; + U16 file_size; }; } // namespace Svc From 64844f41c0965504424d680c431eea5f2b62c10b Mon Sep 17 00:00:00 2001 From: Shivaly Date: Thu, 3 Oct 2024 11:25:01 -0700 Subject: [PATCH 27/37] FP-2784: Updates to UTs and command name clarification --- Svc/TraceFileLogger/TraceFileLogger.cpp | 2 +- Svc/TraceFileLogger/TraceFileLogger.fpp | 2 +- Svc/TraceFileLogger/TraceFileLogger.hpp | 2 +- .../test/ut/TraceFileLoggerTestMain.cpp | 6 +- .../test/ut/TraceFileLoggerTester.cpp | 68 ++++++++++++++++++- .../test/ut/TraceFileLoggerTester.hpp | 1 + 6 files changed, 73 insertions(+), 8 deletions(-) diff --git a/Svc/TraceFileLogger/TraceFileLogger.cpp b/Svc/TraceFileLogger/TraceFileLogger.cpp index 6881695b29..9416c9fd2e 100644 --- a/Svc/TraceFileLogger/TraceFileLogger.cpp +++ b/Svc/TraceFileLogger/TraceFileLogger.cpp @@ -233,7 +233,7 @@ namespace Svc { // TODO this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); } - void TraceFileLogger ::FilterTrace_cmdHandler(FwOpcodeType opCode, + void TraceFileLogger ::FilterTraceType_cmdHandler(FwOpcodeType opCode, U32 cmdSeq, U16 bitmask, Svc::TraceFileLogger_Enable enable) { diff --git a/Svc/TraceFileLogger/TraceFileLogger.fpp b/Svc/TraceFileLogger/TraceFileLogger.fpp index 931107beb7..9edac5f4e7 100644 --- a/Svc/TraceFileLogger/TraceFileLogger.fpp +++ b/Svc/TraceFileLogger/TraceFileLogger.fpp @@ -31,7 +31,7 @@ module Svc { opcode 0x01 @Select which trace types to be logged - async command FilterTrace ( + async command FilterTraceType ( bitmask: U16 @< TraceTypes to filter on $enable : Enable @< enable or disable filtering )\ diff --git a/Svc/TraceFileLogger/TraceFileLogger.hpp b/Svc/TraceFileLogger/TraceFileLogger.hpp index cb7ee0ce23..aea6aa2e5e 100644 --- a/Svc/TraceFileLogger/TraceFileLogger.hpp +++ b/Svc/TraceFileLogger/TraceFileLogger.hpp @@ -137,7 +137,7 @@ class TraceFileLogger : public TraceFileLoggerComponentBase { //! Handler implementation for command FilterTrace //! //! Select which trace types to be logged - void FilterTrace_cmdHandler(FwOpcodeType opCode, //!< The opcode + void FilterTraceType_cmdHandler(FwOpcodeType opCode, //!< The opcode U32 cmdSeq, //!< The command sequence number U16 bitmask, //!< TraceTypes to log on Svc::TraceFileLogger_Enable enable //!< enable or disable logging diff --git a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTestMain.cpp b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTestMain.cpp index 52e19d3a1c..fb2ffdb04b 100644 --- a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTestMain.cpp +++ b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTestMain.cpp @@ -17,16 +17,18 @@ TEST(Nominal, test_log_file) { tester.test_file(); } -TEST(Nominal, test_filter_tracy_type) { +TEST(Nominal, test_filter_trace_type) { Svc::TraceFileLoggerTester tester; tester.test_startup(); tester.test_filter_trace_type(); } -TEST(Nominal, test_filter_tracy_id) { +TEST(Nominal, test_filter_trace_id) { Svc::TraceFileLoggerTester tester; tester.test_startup(); tester.test_filter_trace_id(); + tester.test_startup(); + tester.test_trace_enable(); } int main(int argc, char** argv) { diff --git a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp index 359971d8eb..16df49c844 100644 --- a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp +++ b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp @@ -29,7 +29,7 @@ TraceFileLoggerTester ::~TraceFileLoggerTester() {} // ---------------------------------------------------------------------- void TraceFileLoggerTester::test_startup(){ this->component.configure("TraceFileTest.dat",TEST_TRACE_FILE_SIZE_MAX); - this->component.filterTraceType(0xF,Svc::TraceFileLogger_Enable::ENABLE); + this->component.filterTraceType(0xF,Svc::TraceFileLogger_Enable::ENABLE); //enable all trace types } void TraceFileLoggerTester ::test_file() { @@ -110,7 +110,7 @@ void TraceFileLoggerTester :: test_filter_trace_type() { //Filter out message_dequeue and port_call - this->sendCmd_FilterTrace(0,1,0x6,Svc::TraceFileLogger_Enable::DISABLE); + this->sendCmd_FilterTraceType(0,1,0x6,Svc::TraceFileLogger_Enable::DISABLE); this->component.doDispatch(); ASSERT_CMD_RESPONSE(0, 2, 1, Fw::CmdResponse::OK); @@ -125,7 +125,7 @@ void TraceFileLoggerTester :: test_filter_trace_type() { //enable all trace type filters and ensure they're received //Filter out message_dequeue and port_call - this->sendCmd_FilterTrace(0,1,0xF,Svc::TraceFileLogger_Enable::ENABLE); + this->sendCmd_FilterTraceType(0,1,0xF,Svc::TraceFileLogger_Enable::ENABLE); this->component.doDispatch(); ASSERT_CMD_RESPONSE(0, 2, 1, Fw::CmdResponse::OK); this->invoke_to_TraceBufferLogger(0,0xAA,timeTag,Fw::TraceCfg::TraceType::MESSAGE_QUEUE,trace_buffer_args); @@ -306,8 +306,70 @@ void TraceFileLoggerTester :: test_filter_trace_id() { ASSERT_EQ(arg_size,sizeof(buffer)); //size of the arguments ASSERT_TRUE(arg_check == buffer); //Buffer data matches } + + //Cleanup + this->sendCmd_DisableTraceId(0,1,0xCC,Svc::TraceFileLogger_Enable::ENABLE); + this->component.doDispatch(); + ASSERT_CMD_RESPONSE(0, 3, 1, Fw::CmdResponse::OK); +} + +void TraceFileLoggerTester :: test_trace_enable() { + printf("Test Trace Enable command\n"); + + /* + 1. Send command to disable trace + 2. Make port calls to fileLogger + 3. Verify file size is 0 + 4. Send command to enable trace + 5. Make port calls to fileLogger + 6. Verify file size matches the number of records sent + */ + + Fw::Time timeTag; + timeTag.set(TB_DONT_CARE ,0xBE,0xEF); + std::array buffer = {0x15,0x26,0x37,0x48,0x59,170,0xBB,0xCC,0xDD,0xEE,0xFF}; //arguments to write + U8 *buff_ptr = &buffer[0]; + Fw::TraceBuffer trace_buffer_args(buff_ptr,buffer.size()); + + //Disable trace and verify nothing gets written to the file + this->sendCmd_EnableTrace(0,1,Svc::TraceFileLogger_Enable::DISABLE); + this->component.doDispatch(); + ASSERT_CMD_RESPONSE(0, 3, 1, Fw::CmdResponse::OK); + + //Write to file logger + this->invoke_to_TraceBufferLogger(0,0xAB,timeTag,Fw::TraceCfg::TraceType::MESSAGE_QUEUE,trace_buffer_args); + this->component.doDispatch(); + this->invoke_to_TraceBufferLogger(0,0xBC,timeTag,Fw::TraceCfg::TraceType::MESSAGE_DEQUEUE,trace_buffer_args); + this->component.doDispatch(); + this->invoke_to_TraceBufferLogger(0,0xCD,timeTag,Fw::TraceCfg::TraceType::PORT_CALL,trace_buffer_args); + this->component.doDispatch(); + this->invoke_to_TraceBufferLogger(0,0xDE,timeTag,Fw::TraceCfg::TraceType::USER,trace_buffer_args); + this->component.doDispatch(); + + this->read_file(); + ASSERT_EQ(this->file_size,0); + + //Enable trace and verify file logger writes to the file + this->sendCmd_EnableTrace(0,1,Svc::TraceFileLogger_Enable::ENABLE); + this->component.doDispatch(); + ASSERT_CMD_RESPONSE(0, 3, 1, Fw::CmdResponse::OK); + + //Write to file logger + this->invoke_to_TraceBufferLogger(0,0xFE,timeTag,Fw::TraceCfg::TraceType::MESSAGE_QUEUE,trace_buffer_args); + this->component.doDispatch(); + this->invoke_to_TraceBufferLogger(0,0xED,timeTag,Fw::TraceCfg::TraceType::MESSAGE_DEQUEUE,trace_buffer_args); + this->component.doDispatch(); + this->invoke_to_TraceBufferLogger(0,0xDC,timeTag,Fw::TraceCfg::TraceType::PORT_CALL,trace_buffer_args); + this->component.doDispatch(); + this->invoke_to_TraceBufferLogger(0,0xCB,timeTag,Fw::TraceCfg::TraceType::USER,trace_buffer_args); + this->component.doDispatch(); + + this->read_file(); + ASSERT_EQ(this->file_size,(FW_TRACE_MAX_SER_SIZE*4)); + } +//Read log file into a buffer for analysis void TraceFileLoggerTester :: read_file() { std::ifstream trace_file("TraceFileTest.dat");//,std::ios::binary); diff --git a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.hpp b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.hpp index 841d0d39b8..183f741e7e 100644 --- a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.hpp +++ b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.hpp @@ -54,6 +54,7 @@ class TraceFileLoggerTester : public TraceFileLoggerGTestBase { //Test trace filtering commands void test_filter_trace_id(); void test_filter_trace_type(); + void test_trace_enable(); private: // ---------------------------------------------------------------------- From 2dbf9936ecdfd30a37242f4dc7d2b47983c2eb2b Mon Sep 17 00:00:00 2001 From: Shivaly Date: Tue, 15 Oct 2024 12:01:16 -0700 Subject: [PATCH 28/37] FP-2784: Updates based on bugs found during UTs and code coverage --- Svc/TraceFileLogger/ArrayProc.cpp | 16 ++-- Svc/TraceFileLogger/ArrayProc.hpp | 8 +- Svc/TraceFileLogger/TraceFileLogger.cpp | 61 ++++++------- Svc/TraceFileLogger/TraceFileLogger.fpp | 10 +-- Svc/TraceFileLogger/TraceFileLogger.hpp | 8 +- .../test/ut/TraceFileLoggerTestMain.cpp | 9 ++ .../test/ut/TraceFileLoggerTester.cpp | 86 +++++++++++++------ .../test/ut/TraceFileLoggerTester.hpp | 3 +- 8 files changed, 119 insertions(+), 82 deletions(-) diff --git a/Svc/TraceFileLogger/ArrayProc.cpp b/Svc/TraceFileLogger/ArrayProc.cpp index 14f6c8491b..7772ea2f49 100644 --- a/Svc/TraceFileLogger/ArrayProc.cpp +++ b/Svc/TraceFileLogger/ArrayProc.cpp @@ -18,7 +18,7 @@ namespace Svc { // ---------------------------------------------------------------------- ArrayProc::ArrayProc() : - m_maxSize(10),m_currentSize(0),m_storedArray(NULL) + m_maxIndex(10),m_currentIndex(0),m_storedArray(NULL) { } ArrayProc::~ArrayProc() @@ -32,13 +32,13 @@ namespace Svc { void ArrayProc::set_array(U32 *array_ptr, U8 array_size) { m_storedArray = array_ptr; - m_maxSize = array_size; + m_maxIndex = array_size; } bool ArrayProc::add_element(U32 element) { - if (m_currentSize < m_maxSize) { - this->m_storedArray[m_currentSize] = element; - this->m_currentSize++; + if (m_currentIndex < m_maxIndex) { + this->m_storedArray[m_currentIndex] = element; + this->m_currentIndex++; return true; } return false; @@ -52,16 +52,16 @@ namespace Svc { return false; } else { - for(U8 i = elementIndex; i < this->m_currentSize ; i++) { + for(U8 i = elementIndex; i < this->m_currentIndex ; i++) { this->m_storedArray[i] = this->m_storedArray[i+1]; } - this->m_currentSize--; + this->m_currentIndex--; return true; } } bool ArrayProc::search_array(U32 element, U8 *index) { - for(U8 i = 0 ; i < m_currentSize ; i++) { + for(U8 i = 0 ; i < m_currentIndex ; i++) { if(this->m_storedArray[i] == element) { if (index != NULL) *index = i; return true; diff --git a/Svc/TraceFileLogger/ArrayProc.hpp b/Svc/TraceFileLogger/ArrayProc.hpp index 0d2e3bd2d5..ee4f609aa8 100644 --- a/Svc/TraceFileLogger/ArrayProc.hpp +++ b/Svc/TraceFileLogger/ArrayProc.hpp @@ -33,7 +33,7 @@ namespace Svc { //! \brief Set pointer to the array //! //! \param array_ptr pointer to the array to be used - //! \param array_size array size + //! \param array_size Max array index //! void set_array(U32 *array_ptr, U8 array_size); @@ -64,10 +64,10 @@ namespace Svc { // ---------------------------------------------------------------------- //Max size of the array - U8 m_maxSize; + U8 m_maxIndex; - //Current Array Size - U8 m_currentSize; + //Current Array Index + U8 m_currentIndex; //Array U32 *m_storedArray; diff --git a/Svc/TraceFileLogger/TraceFileLogger.cpp b/Svc/TraceFileLogger/TraceFileLogger.cpp index 9416c9fd2e..f760ad0c47 100644 --- a/Svc/TraceFileLogger/TraceFileLogger.cpp +++ b/Svc/TraceFileLogger/TraceFileLogger.cpp @@ -32,6 +32,7 @@ namespace Svc { m_log_init(false), m_traceFilter(0) { + //Initialize data file this->m_enable_trace = (FW_TRACE_RECORD_TRACE == true) ? true : false; ::memset(m_file_data, 0, sizeof(m_file_data)); @@ -40,7 +41,7 @@ namespace Svc { this->m_file_buffer.setSize(FW_TRACE_MAX_SER_SIZE); //Set array to process trace id filtering - this->filterTraceId.set_array(traceId_array,sizeof(traceId_array)); + this->filterTraceId.set_array(traceId_array,FILTER_TRACE_ID_SIZE); } TraceFileLogger::~TraceFileLogger() { @@ -52,7 +53,7 @@ namespace Svc { } void TraceFileLogger :: - init(NATIVE_INT_TYPE queueDepth, NATIVE_INT_TYPE instance) + init(FwSizeType queueDepth, FwEnumStoreType instance) { TraceFileLoggerComponentBase::init(queueDepth,instance); } @@ -70,8 +71,9 @@ namespace Svc { //If file name is too large then return failure FwSizeType fileNameSize = Fw::StringUtils::string_length(fileName, static_cast(Fw::String::STRING_SIZE)); - if (fileNameSize == Fw::String::STRING_SIZE) { + if (fileNameSize >= Fw::String::STRING_SIZE) { this->m_enable_trace = false; + return; } Os::File::Status stat = this->m_log_file.open(fileName, Os::File::OPEN_CREATE, Os::File::OverwriteType::OVERWRITE); @@ -90,17 +92,15 @@ namespace Svc { } void TraceFileLogger::configure(const char* file, const U32 maxSize) { - //printf("HERE1: Configure, set file name\n"); FW_ASSERT(file != nullptr); this->set_log_file(file,maxSize); } // The filter method selects which trace types to be logged and which to ignore. // The bit mask is based on the enum list for trace type in TraceCfg.fpp - void TraceFileLogger::filterTraceType(U16 traceType_bitmask, bool enable){ + Fw::CmdResponse TraceFileLogger::filterTraceType(U16 traceType_bitmask, bool enable){ if(traceType_bitmask == 0){ - //TODO: Figure out if this should be made an illegal entry or just ignore it? - // + return Fw::CmdResponse::VALIDATION_ERROR; } if(enable == true) { @@ -110,6 +110,7 @@ namespace Svc { U16 mask = 0xFFFF ^ traceType_bitmask; this->m_traceFilter &= mask; } + return Fw::CmdResponse::OK; } @@ -125,7 +126,6 @@ namespace Svc { if (expected_byte_count > this->m_maxFileSize) { //Rewrite file //Current design supports writing to a circular file - //printf ("File will be overwritten. Seeking beginning of file\n"); (void)this->m_log_file.seek(0,Os::FileInterface::SeekType::ABSOLUTE); this->m_byteCount = 0; } @@ -133,7 +133,6 @@ namespace Svc { FwSignedSizeType writeSize = size; FwSignedSizeType fileSize; (void) this->m_log_file.position(fileSize); - //printf ("WRITING TO FILE HERE. File position is: %lld\n",fileSize); Os::File::Status stat = this->m_log_file.write(reinterpret_cast(data),writeSize,Os::File::WAIT); // Assert if file is not already open FW_ASSERT(stat != Os::File::NOT_OPENED); @@ -143,17 +142,27 @@ namespace Svc { } } - void TraceFileLogger::process_traceId_storage(U32 traceId,bool enable) { + Fw::CmdResponse TraceFileLogger::process_traceId_storage(U32 traceId,bool enable) { //Add trace ID to the list (if it doesn't already exist) to stop logging it + bool IdProcessed = false; if (enable == false) { if(this->filterTraceId.search_array(traceId, nullptr) == false) { - (void)this->filterTraceId.add_element(traceId); + IdProcessed = this->filterTraceId.add_element(traceId); + } + else { + IdProcessed = true; //adding a duplicate element is ignored } } else{ //Remove trace ID from list (if its in the list) to start logging it - (void)this->filterTraceId.delete_element(traceId); + IdProcessed = this->filterTraceId.delete_element(traceId); + } + if(IdProcessed == false) { + return Fw::CmdResponse::VALIDATION_ERROR; + } + else { + return Fw::CmdResponse::OK; } } @@ -192,29 +201,14 @@ namespace Svc { } else { traceSize = buf_ref.getBuffLength(); //Record only id & timetag - printf("File size %d",buf_ref.getBuffLength()); } - //printf("Buffer size is :%d, Full buffer length: %d\n",m_file_buffer.getSize(),buf_ref.getBuffLength()); //Note: Because its a circular file we're writing the full buffer capacity to the file // instead of the actual buffer size (variable based on number of args). This will // ensure when the file is overwritten, we preserve old records this->write_log_file(m_file_buffer.getData(),traceSize); // If we choose not to use circular file write then use below instead. //this->write_log_file(m_file_buffer.getData(),buf_ref.getBuffLength()); - - /* - //convert trace data to string to make it readable - std::string args_text; - args.toString(args_text); - char textStr[FW_TRACE_BUFFER_MAX_SIZE]; - U32 packet_size = static_cast (snprintf(textStr, - FW_TRACE_BUFFER_MAX_SIZE, - "ID: %" PRI_FwTraceIdType" TimeBase: %" PRI_FwTimeBaseStoreType "Time:%" PRId32 ",%" PRId32 "Args: %s\n", - id, static_cast(timeTag.getTimeBase()),timeTag.getSeconds(),timeTag.getUSeconds(),args_text.c_str())); - printf("Trace buffer logger invoked HERE\n"); - //textStr += args_text; - this->write_log_file(reinterpret_cast(textStr),packet_size); - */ + } @@ -230,23 +224,22 @@ namespace Svc { } void TraceFileLogger ::DumpTraceDp_cmdHandler(FwOpcodeType opCode, U32 cmdSeq) { - // TODO this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); } void TraceFileLogger ::FilterTraceType_cmdHandler(FwOpcodeType opCode, U32 cmdSeq, U16 bitmask, Svc::TraceFileLogger_Enable enable) { - this->filterTraceType(bitmask,enable); - this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); + Fw::CmdResponse processStatus = this->filterTraceType(bitmask,enable); + this->cmdResponse_out(opCode, cmdSeq, processStatus); } - void TraceFileLogger ::DisableTraceId_cmdHandler(FwOpcodeType opCode, + void TraceFileLogger ::FilterTraceId_cmdHandler(FwOpcodeType opCode, U32 cmdSeq, U32 traceId, Svc::TraceFileLogger_Enable enable) { //Add/remove trace IDs from the array - this->process_traceId_storage(traceId,static_cast(enable)); - this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); + Fw::CmdResponse processStatus = this->process_traceId_storage(traceId,static_cast(enable)); + this->cmdResponse_out(opCode, cmdSeq, processStatus); } } // namespace Svc diff --git a/Svc/TraceFileLogger/TraceFileLogger.fpp b/Svc/TraceFileLogger/TraceFileLogger.fpp index 9edac5f4e7..9ddb4c35e7 100644 --- a/Svc/TraceFileLogger/TraceFileLogger.fpp +++ b/Svc/TraceFileLogger/TraceFileLogger.fpp @@ -30,17 +30,17 @@ module Svc { async command DumpTraceDp\ opcode 0x01 - @Select which trace types to be logged + @Select which trace types to be enabled or disabled for logging async command FilterTraceType ( bitmask: U16 @< TraceTypes to filter on $enable : Enable @< enable or disable filtering )\ opcode 0x02 - @ Enable or disable trace logging by id, can disable up to 10 IDs - async command DisableTraceId ( - $traceId : U32 @< Trace ID to enable/disable - $enable : Enable + @ Select which Trace Ids to be enabled or disabled for logging, can disable up to 10 IDs + async command FilterTraceId ( + $traceId : U32 @< Trace ID + $enable : Enable @< enable or disable trace ID )\ opcode 0x03 # ---------------------------------------------------------------------- diff --git a/Svc/TraceFileLogger/TraceFileLogger.hpp b/Svc/TraceFileLogger/TraceFileLogger.hpp index aea6aa2e5e..7558f51475 100644 --- a/Svc/TraceFileLogger/TraceFileLogger.hpp +++ b/Svc/TraceFileLogger/TraceFileLogger.hpp @@ -58,7 +58,7 @@ class TraceFileLogger : public TraceFileLoggerComponentBase { //! //! \param queueDepth the depth of the message queue for the component //! \param instance: instance identifier. Default: 0. - void init(NATIVE_INT_TYPE queueDepth, NATIVE_INT_TYPE instance = 0); + void init(FwSizeType queueDepth, FwEnumStoreType instance = 0); //! \brief Set log file and max size //! @@ -84,7 +84,7 @@ class TraceFileLogger : public TraceFileLoggerComponentBase { //! //! \param traceType_bitmask provides bitmask for trace types to select. //! \param enable to turn on/off filtering . - void filterTraceType(U16 traceType_bitmask,bool enable); + Fw::CmdResponse filterTraceType(U16 traceType_bitmask,bool enable); //! \brief Process trace ID storage method //! @@ -93,7 +93,7 @@ class TraceFileLogger : public TraceFileLoggerComponentBase { //! //! \param traceId which trace id to enable / disable. //! \param enable to turn on/off filtering . - void process_traceId_storage(U32 traceId, bool enable); + Fw::CmdResponse process_traceId_storage(U32 traceId, bool enable); //! Destroy TraceFileLogger object @@ -146,7 +146,7 @@ class TraceFileLogger : public TraceFileLoggerComponentBase { //! Handler implementation for command DisableTraceId //! //! Enable or disable trace logging by id, can disable up to 10 IDs - void DisableTraceId_cmdHandler(FwOpcodeType opCode, //!< The opcode + void FilterTraceId_cmdHandler(FwOpcodeType opCode, //!< The opcode U32 cmdSeq, //!< The command sequence number U32 traceId, //!< Trace ID to enable/disable Svc::TraceFileLogger_Enable enable) override; diff --git a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTestMain.cpp b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTestMain.cpp index fb2ffdb04b..951aeddcc5 100644 --- a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTestMain.cpp +++ b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTestMain.cpp @@ -27,10 +27,19 @@ TEST(Nominal, test_filter_trace_id) { Svc::TraceFileLoggerTester tester; tester.test_startup(); tester.test_filter_trace_id(); +} + +TEST(Nominal, test_trace_enable) { + Svc::TraceFileLoggerTester tester; tester.test_startup(); tester.test_trace_enable(); } +TEST(Nominal, test_code_coverage) { + Svc::TraceFileLoggerTester tester; + tester.test_startup(); + tester.test_code_coverage(); +} int main(int argc, char** argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); diff --git a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp index 16df49c844..66bd342d35 100644 --- a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp +++ b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp @@ -183,6 +183,12 @@ void TraceFileLoggerTester :: test_filter_trace_type() { ASSERT_TRUE(arg_check == buffer); //Buffer data matches } + + //Test command filter trace type with 0 bitmask + this->sendCmd_FilterTraceType(0,1,0x0,Svc::TraceFileLogger_Enable::DISABLE); + this->component.doDispatch(); + ASSERT_CMD_RESPONSE_SIZE(3); + ASSERT_CMD_RESPONSE(2, 2, 1, Fw::CmdResponse::VALIDATION_ERROR); } void TraceFileLoggerTester :: test_filter_trace_id() { @@ -205,27 +211,27 @@ void TraceFileLoggerTester :: test_filter_trace_id() { 2. Verify they exist in log file 3. Send command to disable a few trace ids; verify array 4. Write to buffer logger and ensure they're filtered out - 5. Write duplicate commands and check trace id array that ids are unique + 5. Write duplicate commands and check trace id array contains unique ids 6. Enable trace ids again, verify array 7. Verify file that all of them exist. */ //Filter out trace ids 0xAA and 0xDD - this->sendCmd_DisableTraceId(0,1,0xAA,Svc::TraceFileLogger_Enable::DISABLE); + this->sendCmd_FilterTraceId(0,1,0xAA,Svc::TraceFileLogger_Enable::DISABLE); this->component.doDispatch(); ASSERT_CMD_RESPONSE(0, 3, 1, Fw::CmdResponse::OK); - this->sendCmd_DisableTraceId(0,1,0xDD,Svc::TraceFileLogger_Enable::DISABLE); + this->sendCmd_FilterTraceId(0,1,0xDD,Svc::TraceFileLogger_Enable::DISABLE); this->component.doDispatch(); - ASSERT_CMD_RESPONSE(0, 3, 1, Fw::CmdResponse::OK); + ASSERT_CMD_RESPONSE(1, 3, 1, Fw::CmdResponse::OK); //Verify Array ASSERT_EQ(this->component.traceId_array[0], 0xAA); ASSERT_EQ(this->component.traceId_array[1], 0xDD); //Send command with duplicate traceID and ensure the array only contains unique trace IDs - this->sendCmd_DisableTraceId(0,1,0xDD,Svc::TraceFileLogger_Enable::DISABLE); + this->sendCmd_FilterTraceId(0,1,0xDD,Svc::TraceFileLogger_Enable::DISABLE); this->component.doDispatch(); - ASSERT_CMD_RESPONSE(0, 3, 1, Fw::CmdResponse::OK); + ASSERT_CMD_RESPONSE(2, 3, 1, Fw::CmdResponse::OK); //Verify Array ASSERT_EQ(this->component.traceId_array[0], 0xAA); @@ -242,15 +248,15 @@ void TraceFileLoggerTester :: test_filter_trace_id() { this->component.doDispatch(); //Filter out trace ids 0xAA and 0xDD - this->sendCmd_DisableTraceId(0,1,0xAA,Svc::TraceFileLogger_Enable::ENABLE); + this->sendCmd_FilterTraceId(0,1,0xAA,Svc::TraceFileLogger_Enable::ENABLE); this->component.doDispatch(); - ASSERT_CMD_RESPONSE(0, 3, 1, Fw::CmdResponse::OK); - this->sendCmd_DisableTraceId(0,1,0xDD,Svc::TraceFileLogger_Enable::ENABLE); + ASSERT_CMD_RESPONSE(3, 3, 1, Fw::CmdResponse::OK); + this->sendCmd_FilterTraceId(0,1,0xDD,Svc::TraceFileLogger_Enable::ENABLE); this->component.doDispatch(); - ASSERT_CMD_RESPONSE(0, 3, 1, Fw::CmdResponse::OK); - this->sendCmd_DisableTraceId(0,1,0xCC,Svc::TraceFileLogger_Enable::DISABLE); + ASSERT_CMD_RESPONSE(4, 3, 1, Fw::CmdResponse::OK); + this->sendCmd_FilterTraceId(0,1,0xCC,Svc::TraceFileLogger_Enable::DISABLE); this->component.doDispatch(); - ASSERT_CMD_RESPONSE(0, 3, 1, Fw::CmdResponse::OK); + ASSERT_CMD_RESPONSE(5, 3, 1, Fw::CmdResponse::OK); //enable all trace type filters and ensure they're received this->invoke_to_TraceBufferLogger(0,0xAA,timeTag,Fw::TraceCfg::TraceType::MESSAGE_QUEUE,trace_buffer_args); @@ -264,7 +270,6 @@ void TraceFileLoggerTester :: test_filter_trace_id() { this->read_file(); U16 total_records = (this->file_size / FW_TRACE_MAX_SER_SIZE); - printf ("TOTAL RECORDS : %d \n", total_records); //Iterate through buffer and verify contents for(U16 i = 0 ; i < total_records ; i++ ) { @@ -306,11 +311,21 @@ void TraceFileLoggerTester :: test_filter_trace_id() { ASSERT_EQ(arg_size,sizeof(buffer)); //size of the arguments ASSERT_TRUE(arg_check == buffer); //Buffer data matches } - + //Cleanup - this->sendCmd_DisableTraceId(0,1,0xCC,Svc::TraceFileLogger_Enable::ENABLE); + this->sendCmd_FilterTraceId(0,1,0xCC,Svc::TraceFileLogger_Enable::ENABLE); this->component.doDispatch(); - ASSERT_CMD_RESPONSE(0, 3, 1, Fw::CmdResponse::OK); + ASSERT_CMD_RESPONSE(6, 3, 1, Fw::CmdResponse::OK); + + //Verify command error when the storage array is full + for(U8 i = 0; i <= this->component.filterTraceId.m_maxIndex; i++){ + this->sendCmd_FilterTraceId(0,1,i+1,Svc::TraceFileLogger_Enable::DISABLE); + this->component.doDispatch(); + if (i < this->component.filterTraceId.m_maxIndex) + ASSERT_CMD_RESPONSE(7+i, 3, 1, Fw::CmdResponse::OK); + else + ASSERT_CMD_RESPONSE(7+i, 3, 1, Fw::CmdResponse::VALIDATION_ERROR); + } } void TraceFileLoggerTester :: test_trace_enable() { @@ -334,7 +349,7 @@ void TraceFileLoggerTester :: test_trace_enable() { //Disable trace and verify nothing gets written to the file this->sendCmd_EnableTrace(0,1,Svc::TraceFileLogger_Enable::DISABLE); this->component.doDispatch(); - ASSERT_CMD_RESPONSE(0, 3, 1, Fw::CmdResponse::OK); + ASSERT_CMD_RESPONSE(0, 0, 1, Fw::CmdResponse::OK); //Write to file logger this->invoke_to_TraceBufferLogger(0,0xAB,timeTag,Fw::TraceCfg::TraceType::MESSAGE_QUEUE,trace_buffer_args); @@ -352,7 +367,7 @@ void TraceFileLoggerTester :: test_trace_enable() { //Enable trace and verify file logger writes to the file this->sendCmd_EnableTrace(0,1,Svc::TraceFileLogger_Enable::ENABLE); this->component.doDispatch(); - ASSERT_CMD_RESPONSE(0, 3, 1, Fw::CmdResponse::OK); + ASSERT_CMD_RESPONSE(0, 0, 1, Fw::CmdResponse::OK); //Write to file logger this->invoke_to_TraceBufferLogger(0,0xFE,timeTag,Fw::TraceCfg::TraceType::MESSAGE_QUEUE,trace_buffer_args); @@ -367,6 +382,33 @@ void TraceFileLoggerTester :: test_trace_enable() { this->read_file(); ASSERT_EQ(this->file_size,(FW_TRACE_MAX_SER_SIZE*4)); +} +//Test code coverage - Corner cases +void TraceFileLoggerTester :: test_code_coverage() { + + //Test if file already open during init, it will open a clean file + //Run one of the previous tests that leaves a non-zero file size + this->test_trace_enable(); + ASSERT_NE(this->file_size,0); + //Recall setting up log file + this->component.set_log_file("TraceFileTest.dat",TEST_TRACE_FILE_SIZE_MAX); + this->read_file(); + ASSERT_EQ(this->file_size,0); + + //Test if file open fails a warning EVR is generated + //set file mode to closed + printf("Is file closed : %d",this->component.m_mode); + this->component.m_enable_trace = true; + this->component.m_mode = TraceFileLogger::FileMode::CLOSED; + this->component.set_log_file("TraceFileTest.dat",TEST_TRACE_FILE_SIZE_MAX); + ASSERT_EVENTS_TraceFileOpenError(0,"TraceFileTest.dat"); + + //Test file name >= 256 characters creates error + this->component.m_enable_trace = true; + this->component.set_log_file("BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",TEST_TRACE_FILE_SIZE_MAX); + ASSERT_EQ(this->component.m_enable_trace,false); + + } //Read log file into a buffer for analysis @@ -384,14 +426,6 @@ void TraceFileLoggerTester :: read_file() { trace_file.read(reinterpret_cast(storage_buffer.data()),size); trace_file.close(); - - /* - for(U8 byte : storage_buffer) { - //std::cout << byte << " "; - printf("0x%X ",(byte)); - - } - */ } } // namespace Svc diff --git a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.hpp b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.hpp index 183f741e7e..496dbc5704 100644 --- a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.hpp +++ b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.hpp @@ -19,7 +19,7 @@ class TraceFileLoggerTester : public TraceFileLoggerGTestBase { // ---------------------------------------------------------------------- // Maximum size of histories storing events, telemetry, and port outputs - static const FwSizeType MAX_HISTORY_SIZE = 10; + static const FwSizeType MAX_HISTORY_SIZE = 20; // Instance ID supplied to the component instance under test static const FwEnumStoreType TEST_INSTANCE_ID = 0; @@ -55,6 +55,7 @@ class TraceFileLoggerTester : public TraceFileLoggerGTestBase { void test_filter_trace_id(); void test_filter_trace_type(); void test_trace_enable(); + void test_code_coverage(); private: // ---------------------------------------------------------------------- From b42e62c56cec9eaac681a5b61155c4138ab795b4 Mon Sep 17 00:00:00 2001 From: Shivaly Date: Tue, 15 Oct 2024 14:04:03 -0700 Subject: [PATCH 29/37] FP-2784: Fix trace references in Ref --- Fw/Trace/TraceBuffer.cpp | 2 +- Ref/Top/RefTopology.cpp | 4 ++-- Ref/Top/instances.fpp | 7 ++++++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Fw/Trace/TraceBuffer.cpp b/Fw/Trace/TraceBuffer.cpp index 0e66526dbd..c130d35b52 100644 --- a/Fw/Trace/TraceBuffer.cpp +++ b/Fw/Trace/TraceBuffer.cpp @@ -1,7 +1,7 @@ #include #include #include -#include +#include namespace Fw { diff --git a/Ref/Top/RefTopology.cpp b/Ref/Top/RefTopology.cpp index d6dd2007b6..6b7cc65b80 100644 --- a/Ref/Top/RefTopology.cpp +++ b/Ref/Top/RefTopology.cpp @@ -139,8 +139,8 @@ void configureTopology() { //tlmSend.setPacketList(RefPacketsPkts, RefPacketsIgnore, 1); //Configure Trace Logger filename and size to be used for storing trace data - traceLogger.configure("TraceFile.dat",2720000); - traceLogger.filterTraceType(0xF,Svc::TraceLogger_Enable::ENABLE); + trace.configure("TraceFile.dat",2720000); + trace.filterTraceType(0xF,Svc::TraceFileLogger_Enable::ENABLE); } // Public functions for use in main program are namespaced with deployment name Ref diff --git a/Ref/Top/instances.fpp b/Ref/Top/instances.fpp index 4ce12de9f3..9d429d4873 100644 --- a/Ref/Top/instances.fpp +++ b/Ref/Top/instances.fpp @@ -105,6 +105,12 @@ module Ref { instance typeDemo: Ref.TypeDemo base id 0x1100 + instance trace: Svc.TraceFileLogger base id 0x4E00 \ + queue size Default.QUEUE_SIZE \ + stack size Default.STACK_SIZE \ + priority 96 + + # ---------------------------------------------------------------------- # Queued component instances # ---------------------------------------------------------------------- @@ -166,6 +172,5 @@ module Ref { instance version: Svc.Version base id 0x4D00 - instance trace: Svc.TraceLogger base id 0x4E00 } From 9e10a49ae6d908a01a28e2c21370abf30f571c8d Mon Sep 17 00:00:00 2001 From: Shivaly Date: Tue, 15 Oct 2024 15:04:28 -0700 Subject: [PATCH 30/37] FP-2784: Few uwpdates based on CodeQL warnings --- Fw/Trace/TraceBuffer.hpp | 2 +- Svc/TraceFileLogger/ArrayProc.cpp | 4 ++-- Svc/TraceFileLogger/ArrayProc.hpp | 6 +++--- Svc/TraceFileLogger/TraceFileLogger.cpp | 8 ++++---- config/TraceCfg.fpp | 4 ++-- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Fw/Trace/TraceBuffer.hpp b/Fw/Trace/TraceBuffer.hpp index dd7dd79ca3..084e5465a9 100644 --- a/Fw/Trace/TraceBuffer.hpp +++ b/Fw/Trace/TraceBuffer.hpp @@ -44,4 +44,4 @@ namespace Fw { } -#endif \ No newline at end of file +#endif diff --git a/Svc/TraceFileLogger/ArrayProc.cpp b/Svc/TraceFileLogger/ArrayProc.cpp index 7772ea2f49..d58f44498c 100644 --- a/Svc/TraceFileLogger/ArrayProc.cpp +++ b/Svc/TraceFileLogger/ArrayProc.cpp @@ -18,7 +18,7 @@ namespace Svc { // ---------------------------------------------------------------------- ArrayProc::ArrayProc() : - m_maxIndex(10),m_currentIndex(0),m_storedArray(NULL) + m_maxIndex(10),m_currentIndex(0),m_storedArray(nullptr) { } ArrayProc::~ArrayProc() @@ -63,7 +63,7 @@ namespace Svc { bool ArrayProc::search_array(U32 element, U8 *index) { for(U8 i = 0 ; i < m_currentIndex ; i++) { if(this->m_storedArray[i] == element) { - if (index != NULL) *index = i; + if (index != nullptr) *index = i; return true; } } diff --git a/Svc/TraceFileLogger/ArrayProc.hpp b/Svc/TraceFileLogger/ArrayProc.hpp index ee4f609aa8..c1f324bfc3 100644 --- a/Svc/TraceFileLogger/ArrayProc.hpp +++ b/Svc/TraceFileLogger/ArrayProc.hpp @@ -3,8 +3,8 @@ // ALL RIGHTS RESERVED. United States Government Sponsorship // acknowledged. -#ifndef SVCARRAYPROC_HPP_ -#define SVCARRAYPROC_HPP_ +#ifndef SVC_ARRAY_PROC_HPP_ +#define SVC_ARRAY_PROC_HPP_ #include @@ -74,4 +74,4 @@ namespace Svc { }; } -#endif /* SVCARRAYPROC_HPP_ */ +#endif /* SVC_ARRAY_PROC_HPP_ */ diff --git a/Svc/TraceFileLogger/TraceFileLogger.cpp b/Svc/TraceFileLogger/TraceFileLogger.cpp index f760ad0c47..c2895dc0ae 100644 --- a/Svc/TraceFileLogger/TraceFileLogger.cpp +++ b/Svc/TraceFileLogger/TraceFileLogger.cpp @@ -186,17 +186,17 @@ namespace Svc { return; } //Only log trace Ids that are not in the list - if(this->filterTraceId.search_array(id,nullptr)) { + if(this->filterTraceId.search_array(id,nullptr) == true) { return; } //Make a call to reset Fw::SerializeBufferBase& buf_ref = m_file_buffer.getSerializeRepr(); buf_ref.resetSer(); - buf_ref.serialize(id); - buf_ref.serialize(timeTag); + (void)buf_ref.serialize(id); + (void)buf_ref.serialize(timeTag); if(FW_TRACE_RECORD_MINIMAL == false) { - buf_ref.serialize(args); + (void)buf_ref.serialize(args); traceSize = m_file_buffer.getSize(); //Record max size of each trace record for circular file } else { diff --git a/config/TraceCfg.fpp b/config/TraceCfg.fpp index 5ed90760dd..3fef29e1ca 100644 --- a/config/TraceCfg.fpp +++ b/config/TraceCfg.fpp @@ -3,8 +3,8 @@ # ====================================================================== # From Design review, it was requested that we add more trace types such as # interrupts, exceptions, context switch,queue add/remove, EVRs, -# semaphore takes(?), stack trace, DMAs -# Also consider adding adding state machine transitions, timer acquisition +# semaphore takes(?), stack trace, DMA +# Also consider adding state machine transitions, timer acquisition # and release traces, and EVRS to the category of traces that are automated. # Also consider what a potential IO trace could look like. A ring buffer for IO # is always requested for 1553 and recently M-Bus on Psyche. Presumably a From ca35e215d7743ffc246440af194bf8be3ccd073d Mon Sep 17 00:00:00 2001 From: Shivaly Date: Tue, 15 Oct 2024 15:40:58 -0700 Subject: [PATCH 31/37] FP-2784: Fix spell check errors --- Fw/Trace/TraceEntity.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Fw/Trace/TraceEntity.hpp b/Fw/Trace/TraceEntity.hpp index f8ff0d27e5..9dbbc25cf4 100644 --- a/Fw/Trace/TraceEntity.hpp +++ b/Fw/Trace/TraceEntity.hpp @@ -4,8 +4,8 @@ * Author: sreddy */ -#ifndef TRACEENTITY_HPP_ -#define TRACEENTITY_HPP_ +#ifndef TRACE_ENTITY_HPP_ +#define TRACE_ENTITY_HPP_ #include #include @@ -38,4 +38,4 @@ namespace Fw { } /* namespace Fw */ -#endif /* TRACEENTITY_HPP_ */ +#endif /* TRACE_ENTITY_HPP_ */ From 753995428ae43eeabb429cf66c826635122a3756 Mon Sep 17 00:00:00 2001 From: Shivaly Date: Tue, 15 Oct 2024 15:47:16 -0700 Subject: [PATCH 32/37] FP-2784: Deframer cmake file accidentally got altered --- Svc/Deframer/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Svc/Deframer/CMakeLists.txt b/Svc/Deframer/CMakeLists.txt index 1e37f07cb6..6df9e8c344 100644 --- a/Svc/Deframer/CMakeLists.txt +++ b/Svc/Deframer/CMakeLists.txt @@ -41,5 +41,5 @@ set(UT_SOURCE_FILES "${CMAKE_CURRENT_LIST_DIR}/test/ut-fprime-protocol/DeframerTestMain.cpp" "${CMAKE_CURRENT_LIST_DIR}/test/ut-fprime-protocol/UplinkFrame.cpp" ) -set( STest) +set(UT_MOD_DEPS STest) register_fprime_ut(Svc_Deframer_fprime_protocol) From 7d4e9e4969bb9a69c35bcc6895f405b6ce08a552 Mon Sep 17 00:00:00 2001 From: Shivaly Date: Tue, 15 Oct 2024 17:16:31 -0700 Subject: [PATCH 33/37] FP-2784: Try fixing CI error --- Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp index 66bd342d35..21e8eab75f 100644 --- a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp +++ b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp @@ -10,6 +10,7 @@ #include #include #include +#include namespace Svc { // ---------------------------------------------------------------------- From f3479d11950c4d4025ada537c5cc95d74bc9f4c8 Mon Sep 17 00:00:00 2001 From: Shivaly Date: Tue, 15 Oct 2024 18:09:49 -0700 Subject: [PATCH 34/37] FP-2784: Corrected codeql error --- Svc/TraceFileLogger/ArrayProc.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Svc/TraceFileLogger/ArrayProc.cpp b/Svc/TraceFileLogger/ArrayProc.cpp index d58f44498c..2ca0c58722 100644 --- a/Svc/TraceFileLogger/ArrayProc.cpp +++ b/Svc/TraceFileLogger/ArrayProc.cpp @@ -63,7 +63,9 @@ namespace Svc { bool ArrayProc::search_array(U32 element, U8 *index) { for(U8 i = 0 ; i < m_currentIndex ; i++) { if(this->m_storedArray[i] == element) { - if (index != nullptr) *index = i; + if (index != nullptr) { + *index = i; + } return true; } } From 6bc9b927f8819a27111c36c9a36d144b1194f2d0 Mon Sep 17 00:00:00 2001 From: Shivaly Date: Wed, 16 Oct 2024 14:21:48 -0700 Subject: [PATCH 35/37] FP-2784: Cleanup --- Svc/TraceFileLogger/ArrayProc.cpp | 1 + Svc/TraceFileLogger/TraceFile.dat | Bin 1632 -> 0 bytes Svc/TraceFileLogger/TraceFileLogger.cpp | 5 +---- 3 files changed, 2 insertions(+), 4 deletions(-) delete mode 100644 Svc/TraceFileLogger/TraceFile.dat diff --git a/Svc/TraceFileLogger/ArrayProc.cpp b/Svc/TraceFileLogger/ArrayProc.cpp index 2ca0c58722..98aee633ee 100644 --- a/Svc/TraceFileLogger/ArrayProc.cpp +++ b/Svc/TraceFileLogger/ArrayProc.cpp @@ -31,6 +31,7 @@ namespace Svc { void ArrayProc::set_array(U32 *array_ptr, U8 array_size) { + FW_ASSERT(array_ptr != nullptr); m_storedArray = array_ptr; m_maxIndex = array_size; } diff --git a/Svc/TraceFileLogger/TraceFile.dat b/Svc/TraceFileLogger/TraceFile.dat deleted file mode 100644 index a6ea7190c163d0248ff93ba878dfb77aa2c68e10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1632 zcmZQzU|?iG0<4To%q*-o%qK8|gdI-Y&j-;kzQhTCuyPn5oi2c?e<8~PRu{kOOisQ=H}?S4J?ON+d5HVIq=U;?pVfLm0}+#_<;?lX7a{U4#>!3+xv5Iq_m3@oGJ W0nbmM{K7gK9w_0#HX0s?@Bjc9=QE!G diff --git a/Svc/TraceFileLogger/TraceFileLogger.cpp b/Svc/TraceFileLogger/TraceFileLogger.cpp index c2895dc0ae..802d8119bd 100644 --- a/Svc/TraceFileLogger/TraceFileLogger.cpp +++ b/Svc/TraceFileLogger/TraceFileLogger.cpp @@ -129,7 +129,6 @@ namespace Svc { (void)this->m_log_file.seek(0,Os::FileInterface::SeekType::ABSOLUTE); this->m_byteCount = 0; } - //else { FwSignedSizeType writeSize = size; FwSignedSizeType fileSize; (void) this->m_log_file.position(fileSize); @@ -137,8 +136,6 @@ namespace Svc { // Assert if file is not already open FW_ASSERT(stat != Os::File::NOT_OPENED); this->m_byteCount += (size); - - //} } } @@ -204,7 +201,7 @@ namespace Svc { } //Note: Because its a circular file we're writing the full buffer capacity to the file // instead of the actual buffer size (variable based on number of args). This will - // ensure when the file is overwritten, we preserve old records + // ensure when the file is overwritten, we preserve older records this->write_log_file(m_file_buffer.getData(),traceSize); // If we choose not to use circular file write then use below instead. //this->write_log_file(m_file_buffer.getData(),buf_ref.getBuffLength()); From 97af364e4cef9af48cc8b980fe481fd04c17ff24 Mon Sep 17 00:00:00 2001 From: Shivaly Date: Thu, 17 Oct 2024 12:18:14 -0700 Subject: [PATCH 36/37] FP-2784: Updates based on Tim's review comments --- Fw/Com/ComPacket.hpp | 1 - Fw/Trace/CMakeLists.txt | 2 +- Fw/Trace/TraceBuffer.cpp | 7 +- Fw/Trace/TraceEntity.cpp | 92 ------------------- Fw/Trace/TraceEntity.hpp | 41 --------- Fw/Trace/docs/sdd.md | 2 +- Ref/Top/instances.fpp | 6 +- Svc/TraceFileLogger/TraceFileLogger.cpp | 6 +- .../test/ut/TraceFileLoggerTester.cpp | 2 +- 9 files changed, 7 insertions(+), 152 deletions(-) delete mode 100644 Fw/Trace/TraceEntity.cpp delete mode 100644 Fw/Trace/TraceEntity.hpp diff --git a/Fw/Com/ComPacket.hpp b/Fw/Com/ComPacket.hpp index 80d1c007d9..2179eb9da8 100644 --- a/Fw/Com/ComPacket.hpp +++ b/Fw/Com/ComPacket.hpp @@ -26,7 +26,6 @@ namespace Fw { FW_PACKET_PACKETIZED_TLM, // !< Packetized telemetry packet type FW_PACKET_DP, //!< Data product packet FW_PACKET_IDLE, // !< Idle packet - FW_PACKET_TRACE, // !< Trace packet FW_PACKET_UNKNOWN = 0xFF // !< Unknown packet } ComPacketType; diff --git a/Fw/Trace/CMakeLists.txt b/Fw/Trace/CMakeLists.txt index 06606bc1a4..3aea88dd16 100644 --- a/Fw/Trace/CMakeLists.txt +++ b/Fw/Trace/CMakeLists.txt @@ -10,7 +10,7 @@ set(MOD_DEPS ) set(SOURCE_FILES "${CMAKE_CURRENT_LIST_DIR}/TraceBuffer.cpp" - "${CMAKE_CURRENT_LIST_DIR}/TraceEntity.cpp" + "${CMAKE_CURRENT_LIST_DIR}/TraceEntry.cpp" "${CMAKE_CURRENT_LIST_DIR}/Trace.fpp" ) register_fprime_module() \ No newline at end of file diff --git a/Fw/Trace/TraceBuffer.cpp b/Fw/Trace/TraceBuffer.cpp index c130d35b52..1c469d6bd0 100644 --- a/Fw/Trace/TraceBuffer.cpp +++ b/Fw/Trace/TraceBuffer.cpp @@ -6,6 +6,7 @@ namespace Fw { TraceBuffer::TraceBuffer(const U8 *args, NATIVE_UINT_TYPE size) { + FW_ASSERT(args != nullptr); SerializeStatus stat = SerializeBufferBase::setBuff(args,size); FW_ASSERT(FW_SERIALIZE_OK == stat, static_cast(stat)); } @@ -50,11 +51,5 @@ namespace Fw { std::string str_format(reinterpret_cast(this->m_bufferData),this->getBuffLength()); text += str_format; - /*char temp_text[1]; - for (NATIVE_UINT_TYPE i = 0; i < this->getBuffLength(); i++) { - //snprintf(temp_text,sizeof(temp_text),"%d",this->m_bufferData[i]); - temp_text[0] = static_cast(this->m_bufferData[i]); - text[i] = temp_text[0]; - }*/ } } diff --git a/Fw/Trace/TraceEntity.cpp b/Fw/Trace/TraceEntity.cpp deleted file mode 100644 index 2fa87dff31..0000000000 --- a/Fw/Trace/TraceEntity.cpp +++ /dev/null @@ -1,92 +0,0 @@ -/* - * TraceEntity.cpp - * - */ - -#include -#include - -namespace Fw { - - TraceEntity::TraceEntity() : m_id(0) { - this->m_type = FW_PACKET_TRACE; - } - - TraceEntity::~TraceEntity() { - } - - SerializeStatus TraceEntity::serialize(SerializeBufferBase& buffer) const { - - SerializeStatus stat = ComPacket::serializeBase(buffer); - if (stat != FW_SERIALIZE_OK) { - return stat; - } - - stat = buffer.serialize(this->m_id); - if (stat != FW_SERIALIZE_OK) { - return stat; - } - - stat = buffer.serialize(this->m_timeTag); - if (stat != FW_SERIALIZE_OK) { - return stat; - } - - // We want to add data but not size for the ground software - return buffer.serialize(this->m_traceBuffer.getBuffAddr(),m_traceBuffer.getBuffLength(),true); - - } - - SerializeStatus TraceEntity::deserialize(SerializeBufferBase& buffer) { - SerializeStatus stat = deserializeBase(buffer); - if (stat != FW_SERIALIZE_OK) { - return stat; - } - - stat = buffer.deserialize(this->m_id); - if (stat != FW_SERIALIZE_OK) { - return stat; - } - - stat = buffer.deserialize(this->m_timeTag); - if (stat != FW_SERIALIZE_OK) { - return stat; - } - - // remainder of buffer must be telemetry value - NATIVE_UINT_TYPE size = buffer.getBuffLeft(); - stat = buffer.deserialize(this->m_traceBuffer.getBuffAddr(),size,true); - if (stat == FW_SERIALIZE_OK) { - // Shouldn't fail - stat = this->m_traceBuffer.setBuffLen(size); - FW_ASSERT(stat == FW_SERIALIZE_OK,static_cast(stat)); - } - return stat; - } - - void TraceEntity::setId(FwTraceIdType id) { - this->m_id = id; - } - - void TraceEntity::setTraceBuffer(const TraceBuffer& buffer) { - this->m_traceBuffer = buffer; - } - - void TraceEntity::setTimeTag(const Fw::Time& timeTag) { - this->m_timeTag = timeTag; - } - - FwTraceIdType TraceEntity::getId() { - return this->m_id; - } - - Fw::Time& TraceEntity::getTimeTag() { - return this->m_timeTag; - } - - TraceBuffer& TraceEntity::getTraceBuffer() { - return this->m_traceBuffer; - } - - -} /* namespace Fw */ diff --git a/Fw/Trace/TraceEntity.hpp b/Fw/Trace/TraceEntity.hpp deleted file mode 100644 index 9dbbc25cf4..0000000000 --- a/Fw/Trace/TraceEntity.hpp +++ /dev/null @@ -1,41 +0,0 @@ -/* - * TraceEntity.hpp - * - * Author: sreddy - */ - -#ifndef TRACE_ENTITY_HPP_ -#define TRACE_ENTITY_HPP_ - -#include -#include -#include - -namespace Fw { - - class TraceEntity : public ComPacket { - public: - - TraceEntity(); - virtual ~TraceEntity(); - - SerializeStatus serialize(SerializeBufferBase& buffer) const; //!< serialize contents - SerializeStatus deserialize(SerializeBufferBase& buffer); - - void setId(FwTraceIdType id); - void setTraceBuffer(const TraceBuffer& buffer); - void setTimeTag(const Fw::Time& timeTag); - - FwTraceIdType getId(); - Fw::Time& getTimeTag(); - TraceBuffer& getTraceBuffer(); - - protected: - FwTraceIdType m_id; // !< Channel id - Fw::Time m_timeTag; // !< time tag - TraceBuffer m_traceBuffer; // !< serialized argument data - }; - -} /* namespace Fw */ - -#endif /* TRACE_ENTITY_HPP_ */ diff --git a/Fw/Trace/docs/sdd.md b/Fw/Trace/docs/sdd.md index 55b23e0351..59d7a35ec6 100644 --- a/Fw/Trace/docs/sdd.md +++ b/Fw/Trace/docs/sdd.md @@ -12,7 +12,7 @@ Trace Requirements in FPrime: - Event ID : A unique identifier recording a “Trace Event” - Time Tag : Captures a high precision timestamp - Client Data : A small sample of user arguments recorded into trace buffer -3. Trace shall create trace points and log events in software automatically for thread switching(?) and ...TBD, ask Tim +3. Trace shall create trace points and log events in software automatically for thread switching and port calls (in and out), and message queue and dequeue. 4. Trace shall provide a port for other components or user defined points to log events during software execution. 5. Trace shall record log events in an in-memory logger with data products to dump the buffers 6. Trace shall store data on a per thread basis so there is only one write to the buffer, preventing a need for mutual exclusion. diff --git a/Ref/Top/instances.fpp b/Ref/Top/instances.fpp index 9d429d4873..51c35737e6 100644 --- a/Ref/Top/instances.fpp +++ b/Ref/Top/instances.fpp @@ -105,12 +105,11 @@ module Ref { instance typeDemo: Ref.TypeDemo base id 0x1100 - instance trace: Svc.TraceFileLogger base id 0x4E00 \ + instance trace: Svc.TraceFileLogger base id 0x1200 \ queue size Default.QUEUE_SIZE \ stack size Default.STACK_SIZE \ priority 96 - # ---------------------------------------------------------------------- # Queued component instances # ---------------------------------------------------------------------- @@ -135,9 +134,9 @@ module Ref { instance sendBuffComp: Ref.SendBuff base id 0x2600 \ queue size Default.QUEUE_SIZE + - # ---------------------------------------------------------------------- # Passive component instances # ---------------------------------------------------------------------- @@ -172,5 +171,4 @@ module Ref { instance version: Svc.Version base id 0x4D00 - } diff --git a/Svc/TraceFileLogger/TraceFileLogger.cpp b/Svc/TraceFileLogger/TraceFileLogger.cpp index 802d8119bd..b0ce422926 100644 --- a/Svc/TraceFileLogger/TraceFileLogger.cpp +++ b/Svc/TraceFileLogger/TraceFileLogger.cpp @@ -14,7 +14,7 @@ #include #include #include -#include +#include namespace Svc { @@ -179,7 +179,6 @@ namespace Svc { //Only log trace types that are enabled by either config or user if(!(this->m_traceFilter & bit_mask)) { - //TODO: Should we generate an event here, letting user know that this specific filter is disabled? return; } //Only log trace Ids that are not in the list @@ -203,9 +202,6 @@ namespace Svc { // instead of the actual buffer size (variable based on number of args). This will // ensure when the file is overwritten, we preserve older records this->write_log_file(m_file_buffer.getData(),traceSize); - // If we choose not to use circular file write then use below instead. - //this->write_log_file(m_file_buffer.getData(),buf_ref.getBuffLength()); - } diff --git a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp index 21e8eab75f..b73857ffac 100644 --- a/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp +++ b/Svc/TraceFileLogger/test/ut/TraceFileLoggerTester.cpp @@ -5,7 +5,7 @@ // ====================================================================== #include "TraceFileLoggerTester.hpp" -#include +#include #include #include #include From 179127e3131b04535ee9c675f8309411837ffde4 Mon Sep 17 00:00:00 2001 From: Shivaly Date: Thu, 17 Oct 2024 12:22:47 -0700 Subject: [PATCH 37/37] FP-2784: Oops forgot to add the modified files --- Fw/Trace/TraceEntry.cpp | 91 +++++++++++++++++++++++++++++++++++++++++ Fw/Trace/TraceEntry.hpp | 41 +++++++++++++++++++ 2 files changed, 132 insertions(+) create mode 100644 Fw/Trace/TraceEntry.cpp create mode 100644 Fw/Trace/TraceEntry.hpp diff --git a/Fw/Trace/TraceEntry.cpp b/Fw/Trace/TraceEntry.cpp new file mode 100644 index 0000000000..6f195f1b2e --- /dev/null +++ b/Fw/Trace/TraceEntry.cpp @@ -0,0 +1,91 @@ +/* + * TraceEntry.cpp + * + */ + +#include +#include + +namespace Fw { + + TraceEntry::TraceEntry() : m_id(0) { + } + + TraceEntry::~TraceEntry() { + } + + SerializeStatus TraceEntry::serialize(SerializeBufferBase& buffer) const { + + SerializeStatus stat = ComPacket::serializeBase(buffer); + if (stat != FW_SERIALIZE_OK) { + return stat; + } + + stat = buffer.serialize(this->m_id); + if (stat != FW_SERIALIZE_OK) { + return stat; + } + + stat = buffer.serialize(this->m_timeTag); + if (stat != FW_SERIALIZE_OK) { + return stat; + } + + // We want to add data but not size for the ground software + return buffer.serialize(this->m_traceBuffer.getBuffAddr(),m_traceBuffer.getBuffLength(),true); + + } + + SerializeStatus TraceEntry::deserialize(SerializeBufferBase& buffer) { + SerializeStatus stat = deserializeBase(buffer); + if (stat != FW_SERIALIZE_OK) { + return stat; + } + + stat = buffer.deserialize(this->m_id); + if (stat != FW_SERIALIZE_OK) { + return stat; + } + + stat = buffer.deserialize(this->m_timeTag); + if (stat != FW_SERIALIZE_OK) { + return stat; + } + + // remainder of buffer must be telemetry value + NATIVE_UINT_TYPE size = buffer.getBuffLeft(); + stat = buffer.deserialize(this->m_traceBuffer.getBuffAddr(),size,true); + if (stat == FW_SERIALIZE_OK) { + // Shouldn't fail + stat = this->m_traceBuffer.setBuffLen(size); + FW_ASSERT(stat == FW_SERIALIZE_OK,static_cast(stat)); + } + return stat; + } + + void TraceEntry::setId(FwTraceIdType id) { + this->m_id = id; + } + + void TraceEntry::setTraceBuffer(const TraceBuffer& buffer) { + this->m_traceBuffer = buffer; + } + + void TraceEntry::setTimeTag(const Fw::Time& timeTag) { + this->m_timeTag = timeTag; + } + + FwTraceIdType TraceEntry::getId() { + return this->m_id; + } + + Fw::Time& TraceEntry::getTimeTag() { + return this->m_timeTag; + } + + TraceBuffer& TraceEntry::getTraceBuffer() { + return this->m_traceBuffer; + } + + +} /* namespace Fw */ diff --git a/Fw/Trace/TraceEntry.hpp b/Fw/Trace/TraceEntry.hpp new file mode 100644 index 0000000000..65b8c479b7 --- /dev/null +++ b/Fw/Trace/TraceEntry.hpp @@ -0,0 +1,41 @@ +/* + * TraceEntry.hpp + * + * Author: sreddy + */ + +#ifndef TRACE_ENTRY_HPP_ +#define TRACE_ENTRY_HPP_ + +#include +#include +#include + +namespace Fw { + + class TraceEntry : public ComPacket { + public: + + TraceEntry(); + virtual ~TraceEntry(); + + SerializeStatus serialize(SerializeBufferBase& buffer) const; //!< serialize contents + SerializeStatus deserialize(SerializeBufferBase& buffer); + + void setId(FwTraceIdType id); + void setTraceBuffer(const TraceBuffer& buffer); + void setTimeTag(const Fw::Time& timeTag); + + FwTraceIdType getId(); + Fw::Time& getTimeTag(); + TraceBuffer& getTraceBuffer(); + + protected: + FwTraceIdType m_id; // !< Channel id + Fw::Time m_timeTag; // !< time tag + TraceBuffer m_traceBuffer; // !< serialized argument data + }; + +} /* namespace Fw */ + +#endif /* TRACE_ENTRY_HPP_ */